summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/command/upgrade.php51
-rw-r--r--core/css/fixes.css4
-rw-r--r--core/css/select2/select2-spinner.gifbin0 -> 1849 bytes
-rw-r--r--core/css/select2/select2.css646
-rw-r--r--core/css/select2/select2.pngbin0 -> 613 bytes
-rw-r--r--core/css/select2/select2x2.pngbin0 -> 845 bytes
-rw-r--r--core/css/styles.css14
-rw-r--r--core/js/js.js1
-rw-r--r--core/js/jstz.js358
-rw-r--r--core/js/select2/LICENSE18
-rw-r--r--core/js/select2/README.md90
-rw-r--r--core/js/select2/bower.json8
-rw-r--r--core/js/select2/component.json66
-rw-r--r--core/js/select2/composer.json29
-rw-r--r--core/js/select2/package.json20
-rwxr-xr-xcore/js/select2/release.sh79
-rw-r--r--core/js/select2/select2-bootstrap.css87
-rw-r--r--core/js/select2/select2.jquery.json36
-rw-r--r--core/js/select2/select2.js3448
-rw-r--r--core/js/select2/select2_locale_ar.js17
-rw-r--r--core/js/select2/select2_locale_bg.js18
-rw-r--r--core/js/select2/select2_locale_ca.js17
-rw-r--r--core/js/select2/select2_locale_cs.js49
-rw-r--r--core/js/select2/select2_locale_da.js17
-rw-r--r--core/js/select2/select2_locale_de.js15
-rw-r--r--core/js/select2/select2_locale_el.js17
-rw-r--r--core/js/select2/select2_locale_en.js.template18
-rw-r--r--core/js/select2/select2_locale_es.js15
-rw-r--r--core/js/select2/select2_locale_et.js17
-rw-r--r--core/js/select2/select2_locale_eu.js43
-rw-r--r--core/js/select2/select2_locale_fa.js19
-rw-r--r--core/js/select2/select2_locale_fi.js28
-rw-r--r--core/js/select2/select2_locale_fr.js16
-rw-r--r--core/js/select2/select2_locale_gl.js43
-rw-r--r--core/js/select2/select2_locale_he.js17
-rw-r--r--core/js/select2/select2_locale_hr.js22
-rw-r--r--core/js/select2/select2_locale_hu.js15
-rw-r--r--core/js/select2/select2_locale_id.js17
-rw-r--r--core/js/select2/select2_locale_is.js15
-rw-r--r--core/js/select2/select2_locale_it.js15
-rw-r--r--core/js/select2/select2_locale_ja.js15
-rw-r--r--core/js/select2/select2_locale_ka.js17
-rw-r--r--core/js/select2/select2_locale_ko.js17
-rw-r--r--core/js/select2/select2_locale_lt.js24
-rw-r--r--core/js/select2/select2_locale_lv.js17
-rw-r--r--core/js/select2/select2_locale_mk.js17
-rw-r--r--core/js/select2/select2_locale_ms.js17
-rw-r--r--core/js/select2/select2_locale_nl.js15
-rw-r--r--core/js/select2/select2_locale_no.js18
-rw-r--r--core/js/select2/select2_locale_pl.js22
-rw-r--r--core/js/select2/select2_locale_pt-BR.js15
-rw-r--r--core/js/select2/select2_locale_pt-PT.js15
-rw-r--r--core/js/select2/select2_locale_ro.js15
-rw-r--r--core/js/select2/select2_locale_rs.js17
-rw-r--r--core/js/select2/select2_locale_ru.js21
-rw-r--r--core/js/select2/select2_locale_sk.js48
-rw-r--r--core/js/select2/select2_locale_sv.js17
-rw-r--r--core/js/select2/select2_locale_th.js17
-rw-r--r--core/js/select2/select2_locale_tr.js17
-rw-r--r--core/js/select2/select2_locale_uk.js23
-rw-r--r--core/js/select2/select2_locale_vi.js18
-rw-r--r--core/js/select2/select2_locale_zh-CN.js14
-rwxr-xr-xcore/js/select2/select2_locale_zh-TW.js14
-rw-r--r--core/js/setupchecks.js71
-rw-r--r--core/js/visitortimezone.js5
-rw-r--r--core/l10n/af_ZA.php36
-rw-r--r--core/l10n/ar.php3
-rw-r--r--core/l10n/ast.php3
-rw-r--r--core/l10n/bg_BG.php10
-rw-r--r--core/l10n/bn_BD.php12
-rw-r--r--core/l10n/ca.php3
-rw-r--r--core/l10n/cs_CZ.php10
-rw-r--r--core/l10n/cy_GB.php2
-rw-r--r--core/l10n/da.php30
-rw-r--r--core/l10n/de.php6
-rw-r--r--core/l10n/de_CH.php3
-rw-r--r--core/l10n/de_DE.php18
-rw-r--r--core/l10n/el.php3
-rw-r--r--core/l10n/en_GB.php22
-rw-r--r--core/l10n/eo.php2
-rw-r--r--core/l10n/es.php22
-rw-r--r--core/l10n/es_AR.php3
-rw-r--r--core/l10n/es_MX.php3
-rw-r--r--core/l10n/et_EE.php3
-rw-r--r--core/l10n/eu.php3
-rw-r--r--core/l10n/fa.php3
-rw-r--r--core/l10n/fi_FI.php17
-rw-r--r--core/l10n/fil.php5
-rw-r--r--core/l10n/fr.php19
-rw-r--r--core/l10n/gl.php3
-rw-r--r--core/l10n/he.php2
-rw-r--r--core/l10n/hi.php1
-rw-r--r--core/l10n/hr.php3
-rw-r--r--core/l10n/hu_HU.php3
-rw-r--r--core/l10n/ia.php1
-rw-r--r--core/l10n/id.php2
-rw-r--r--core/l10n/is.php1
-rw-r--r--core/l10n/it.php6
-rw-r--r--core/l10n/ja.php3
-rw-r--r--core/l10n/ka_GE.php2
-rw-r--r--core/l10n/km.php2
-rw-r--r--core/l10n/ko.php3
-rw-r--r--core/l10n/ku_IQ.php1
-rw-r--r--core/l10n/lb.php1
-rw-r--r--core/l10n/lt_LT.php3
-rw-r--r--core/l10n/lv.php3
-rw-r--r--core/l10n/mk.php1
-rw-r--r--core/l10n/ms_MY.php1
-rw-r--r--core/l10n/mt_MT.php5
-rw-r--r--core/l10n/my_MM.php1
-rw-r--r--core/l10n/nb_NO.php3
-rw-r--r--core/l10n/nl.php18
-rw-r--r--core/l10n/nn_NO.php3
-rw-r--r--core/l10n/oc.php1
-rw-r--r--core/l10n/pl.php10
-rw-r--r--core/l10n/pt_BR.php18
-rw-r--r--core/l10n/pt_PT.php10
-rw-r--r--core/l10n/ro.php2
-rw-r--r--core/l10n/ru.php3
-rw-r--r--core/l10n/si_LK.php1
-rw-r--r--core/l10n/sk_SK.php6
-rw-r--r--core/l10n/sl.php6
-rw-r--r--core/l10n/sq.php2
-rw-r--r--core/l10n/sr.php2
-rw-r--r--core/l10n/sr@latin.php1
-rw-r--r--core/l10n/sv.php3
-rw-r--r--core/l10n/ta_LK.php1
-rw-r--r--core/l10n/th_TH.php1
-rw-r--r--core/l10n/tr.php6
-rw-r--r--core/l10n/ug.php1
-rw-r--r--core/l10n/uk.php2
-rw-r--r--core/l10n/ur_PK.php1
-rw-r--r--core/l10n/vi.php1
-rw-r--r--core/l10n/zh_CN.php3
-rw-r--r--core/l10n/zh_HK.php1
-rw-r--r--core/l10n/zh_TW.php3
-rw-r--r--core/register_command.php2
-rw-r--r--core/routes.php3
-rw-r--r--core/setup/controller.php9
-rw-r--r--core/templates/error.php4
-rw-r--r--core/templates/exception.php29
-rw-r--r--core/templates/login.php2
142 files changed, 6232 insertions, 126 deletions
diff --git a/core/command/upgrade.php b/core/command/upgrade.php
index d037082c5e8..5b9432d631b 100644
--- a/core/command/upgrade.php
+++ b/core/command/upgrade.php
@@ -9,6 +9,7 @@
namespace OC\Core\Command;
use OC\Updater;
+use OCP\IConfig;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -22,6 +23,20 @@ class Upgrade extends Command {
const ERROR_UP_TO_DATE = 3;
const ERROR_INVALID_ARGUMENTS = 4;
+ public $upgradeFailed = false;
+
+ /**
+ * @var IConfig
+ */
+ private $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ $this->config = $config;
+ }
+
protected function configure() {
$this
->setName('upgrade')
@@ -48,14 +63,6 @@ class Upgrade extends Command {
*/
protected function execute(InputInterface $input, OutputInterface $output) {
- require_once \OC::$SERVERROOT . '/lib/base.php';
-
- // Don't do anything if ownCloud has not been installed
- if(!\OC_Config::getValue('installed', false)) {
- $output->writeln('<error>ownCloud has not yet been installed</error>');
- return self::ERROR_NOT_INSTALLED;
- }
-
$simulateStepEnabled = true;
$updateStepEnabled = true;
@@ -75,6 +82,7 @@ class Upgrade extends Command {
}
if(\OC::checkUpgrade(false)) {
+ $self = $this;
$updater = new Updater();
$updater->setSimulateStepEnabled($simulateStepEnabled);
@@ -83,15 +91,14 @@ class Upgrade extends Command {
$updater->listen('\OC\Updater', 'maintenanceStart', function () use($output) {
$output->writeln('<info>Turned on maintenance mode</info>');
});
- $updater->listen('\OC\Updater', 'maintenanceEnd', function () use($output, $updateStepEnabled) {
- $output->writeln('<info>Turned off maintenance mode</info>');
- if (!$updateStepEnabled) {
- $output->writeln('<info>Update simulation successful</info>');
- }
- else {
- $output->writeln('<info>Update successful</info>');
- }
- });
+ $updater->listen('\OC\Updater', 'maintenanceEnd',
+ function () use($output, $updateStepEnabled, $self) {
+ $output->writeln('<info>Turned off maintenance mode</info>');
+ $mode = $updateStepEnabled ? 'Update' : 'Update simulation';
+ $status = $self->upgradeFailed ? 'failed' : 'successful';
+ $message = "<info>$mode $status</info>";
+ $output->writeln($message);
+ });
$updater->listen('\OC\Updater', 'dbUpgrade', function () use($output) {
$output->writeln('<info>Updated database</info>');
});
@@ -102,9 +109,9 @@ class Upgrade extends Command {
$output->writeln('<info>Disabled incompatible apps: ' . implode(', ', $appList) . '</info>');
});
- $updater->listen('\OC\Updater', 'failure', function ($message) use($output) {
- $output->writeln($message);
- \OC_Config::setValue('maintenance', false);
+ $updater->listen('\OC\Updater', 'failure', function ($message) use($output, $self) {
+ $output->writeln("<error>$message</error>");
+ $self->upgradeFailed = true;
});
$updater->upgrade();
@@ -112,7 +119,7 @@ class Upgrade extends Command {
$this->postUpgradeCheck($input, $output);
return self::ERROR_SUCCESS;
- } else if(\OC_Config::getValue('maintenance', false)) {
+ } else if($this->config->getSystemValue('maintenance', false)) {
//Possible scenario: ownCloud core is updated but an app failed
$output->writeln('<warning>ownCloud is in maintenance mode</warning>');
$output->write('<comment>Maybe an upgrade is already in process. Please check the '
@@ -134,7 +141,7 @@ class Upgrade extends Command {
* @param OutputInterface $output output interface
*/
protected function postUpgradeCheck(InputInterface $input, OutputInterface $output) {
- $trustedDomains = \OC_Config::getValue('trusted_domains', array());
+ $trustedDomains = $this->config->getSystemValue('trusted_domains', array());
if (empty($trustedDomains)) {
$output->write(
'<warning>The setting "trusted_domains" could not be ' .
diff --git a/core/css/fixes.css b/core/css/fixes.css
index 5aba741b64b..0f1584c623f 100644
--- a/core/css/fixes.css
+++ b/core/css/fixes.css
@@ -15,8 +15,8 @@ select {
font-family: Frutiger, Calibri, 'Myriad Pro', Myriad, Arial, sans-serif;
}
-.lte8 .delete-icon { background-image: url('../img/actions/delete.png'); }
-.lte8 .delete-icon:hover, .delete-icon:focus {
+.lte8 .icon-delete { background-image: url('../img/actions/delete.png'); }
+.lte8 .icon-delete:hover, .icon-delete:focus {
background-image: url('../img/actions/delete-hover.png');
}
diff --git a/core/css/select2/select2-spinner.gif b/core/css/select2/select2-spinner.gif
new file mode 100644
index 00000000000..5b33f7e54f4
--- /dev/null
+++ b/core/css/select2/select2-spinner.gif
Binary files differ
diff --git a/core/css/select2/select2.css b/core/css/select2/select2.css
new file mode 100644
index 00000000000..1eb4d229f6d
--- /dev/null
+++ b/core/css/select2/select2.css
@@ -0,0 +1,646 @@
+/*
+Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014
+*/
+.select2-container {
+ margin: 0;
+ position: relative;
+ display: inline-block;
+ /* inline-block for ie7 */
+ zoom: 1;
+ *display: inline;
+ vertical-align: middle;
+}
+
+.select2-container,
+.select2-drop,
+.select2-search,
+.select2-search input {
+ /*
+ Force border-box so that % widths fit the parent
+ container without overlap because of margin/padding.
+ More Info : http://www.quirksmode.org/css/box.html
+ */
+ -webkit-box-sizing: border-box; /* webkit */
+ -moz-box-sizing: border-box; /* firefox */
+ box-sizing: border-box; /* css3 */
+}
+
+.select2-container .select2-choice {
+ display: block;
+ height: 26px;
+ padding: 0 0 0 8px;
+ overflow: hidden;
+ position: relative;
+
+ border: 1px solid #aaa;
+ white-space: nowrap;
+ line-height: 26px;
+ color: #444;
+ text-decoration: none;
+
+ border-radius: 4px;
+
+ background-clip: padding-box;
+
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ background-color: #fff;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
+ background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
+ background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
+ background-image: linear-gradient(to top, #eee 0%, #fff 50%);
+}
+
+.select2-container.select2-drop-above .select2-choice {
+ border-bottom-color: #aaa;
+
+ border-radius: 0 0 4px 4px;
+
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
+ background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
+ background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
+ background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
+}
+
+.select2-container.select2-allowclear .select2-choice .select2-chosen {
+ margin-right: 42px;
+}
+
+.select2-container .select2-choice > .select2-chosen {
+ margin-right: 26px;
+ display: block;
+ overflow: hidden;
+
+ white-space: nowrap;
+
+ text-overflow: ellipsis;
+ float: none;
+ width: auto;
+}
+
+.select2-container .select2-choice abbr {
+ display: none;
+ width: 12px;
+ height: 12px;
+ position: absolute;
+ right: 24px;
+ top: 8px;
+
+ font-size: 1px;
+ text-decoration: none;
+
+ border: 0;
+ background: url('select2.png') right top no-repeat;
+ cursor: pointer;
+ outline: 0;
+}
+
+.select2-container.select2-allowclear .select2-choice abbr {
+ display: inline-block;
+}
+
+.select2-container .select2-choice abbr:hover {
+ background-position: right -11px;
+ cursor: pointer;
+}
+
+.select2-drop-mask {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ position: fixed;
+ left: 0;
+ top: 0;
+ min-height: 100%;
+ min-width: 100%;
+ height: auto;
+ width: auto;
+ opacity: 0;
+ z-index: 9998;
+ /* styles required for IE to work */
+ background-color: #fff;
+ filter: alpha(opacity=0);
+}
+
+.select2-drop {
+ width: 100%;
+ margin-top: -1px;
+ position: absolute;
+ z-index: 9999;
+ top: 100%;
+
+ background: #fff;
+ color: #000;
+ border: 1px solid #aaa;
+ border-top: 0;
+
+ border-radius: 0 0 4px 4px;
+
+ -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+ box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+}
+
+.select2-drop.select2-drop-above {
+ margin-top: 1px;
+ border-top: 1px solid #aaa;
+ border-bottom: 0;
+
+ border-radius: 4px 4px 0 0;
+
+ -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+ box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+}
+
+.select2-drop-active {
+ border: 1px solid #5897fb;
+ border-top: none;
+}
+
+.select2-drop.select2-drop-above.select2-drop-active {
+ border-top: 1px solid #5897fb;
+}
+
+.select2-drop-auto-width {
+ border-top: 1px solid #aaa;
+ width: auto;
+}
+
+.select2-drop-auto-width .select2-search {
+ padding-top: 4px;
+}
+
+.select2-container .select2-choice .select2-arrow {
+ display: inline-block;
+ width: 18px;
+ height: 100%;
+ position: absolute;
+ right: 0;
+ top: 0;
+
+ border-left: 1px solid #aaa;
+ border-radius: 0 4px 4px 0;
+
+ background-clip: padding-box;
+
+ background: #ccc;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
+ background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+ background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
+ background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
+}
+
+.select2-container .select2-choice .select2-arrow b {
+ display: block;
+ width: 100%;
+ height: 100%;
+ background: url('select2.png') no-repeat 0 1px;
+}
+
+.select2-search {
+ display: inline-block;
+ width: 100%;
+ min-height: 26px;
+ margin: 0;
+ padding-left: 4px;
+ padding-right: 4px;
+
+ position: relative;
+ z-index: 10000;
+
+ white-space: nowrap;
+}
+
+.select2-search input {
+ width: 100%;
+ height: auto !important;
+ min-height: 26px;
+ padding: 4px 20px 4px 5px;
+ margin: 0;
+
+ outline: 0;
+ font-family: sans-serif;
+ font-size: 1em;
+
+ border: 1px solid #aaa;
+ border-radius: 0;
+
+ -webkit-box-shadow: none;
+ box-shadow: none;
+
+ background: #fff url('select2.png') no-repeat 100% -22px;
+ background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+ background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ 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;
+}
+
+.select2-search input.select2-active {
+ background: #fff url('select2-spinner.gif') no-repeat 100%;
+ background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+ background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+ background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
+}
+
+.select2-container-active .select2-choice,
+.select2-container-active .select2-choices {
+ border: 1px solid #5897fb;
+ outline: none;
+
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+ box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+}
+
+.select2-dropdown-open .select2-choice {
+ border-bottom-color: transparent;
+ -webkit-box-shadow: 0 1px 0 #fff inset;
+ box-shadow: 0 1px 0 #fff inset;
+
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+
+ background-color: #eee;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
+ background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
+ background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+ background-image: linear-gradient(to top, #fff 0%, #eee 50%);
+}
+
+.select2-dropdown-open.select2-drop-above .select2-choice,
+.select2-dropdown-open.select2-drop-above .select2-choices {
+ border: 1px solid #5897fb;
+ border-top-color: transparent;
+
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
+ background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
+ background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+ background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
+}
+
+.select2-dropdown-open .select2-choice .select2-arrow {
+ background: transparent;
+ border-left: none;
+ filter: none;
+}
+.select2-dropdown-open .select2-choice .select2-arrow b {
+ background-position: -18px 1px;
+}
+
+.select2-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+
+/* results */
+.select2-results {
+ max-height: 200px;
+ padding: 0 0 0 4px;
+ margin: 4px 4px 4px 0;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+.select2-results ul.select2-result-sub {
+ margin: 0;
+ padding-left: 0;
+}
+
+.select2-results li {
+ list-style: none;
+ display: list-item;
+ background-image: none;
+}
+
+.select2-results li.select2-result-with-children > .select2-result-label {
+ font-weight: bold;
+}
+
+.select2-results .select2-result-label {
+ padding: 3px 7px 4px;
+ margin: 0;
+ cursor: pointer;
+
+ min-height: 1em;
+
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.select2-results-dept-1 .select2-result-label { padding-left: 20px }
+.select2-results-dept-2 .select2-result-label { padding-left: 40px }
+.select2-results-dept-3 .select2-result-label { padding-left: 60px }
+.select2-results-dept-4 .select2-result-label { padding-left: 80px }
+.select2-results-dept-5 .select2-result-label { padding-left: 100px }
+.select2-results-dept-6 .select2-result-label { padding-left: 110px }
+.select2-results-dept-7 .select2-result-label { padding-left: 120px }
+
+.select2-results .select2-highlighted {
+ background: #3875d7;
+ color: #fff;
+}
+
+.select2-results li em {
+ background: #feffde;
+ font-style: normal;
+}
+
+.select2-results .select2-highlighted em {
+ background: transparent;
+}
+
+.select2-results .select2-highlighted ul {
+ background: #fff;
+ color: #000;
+}
+
+
+.select2-results .select2-no-results,
+.select2-results .select2-searching,
+.select2-results .select2-selection-limit {
+ background: #f4f4f4;
+ display: list-item;
+ padding-left: 5px;
+}
+
+/*
+disabled look for disabled choices in the results dropdown
+*/
+.select2-results .select2-disabled.select2-highlighted {
+ color: #666;
+ background: #f4f4f4;
+ display: list-item;
+ cursor: default;
+}
+.select2-results .select2-disabled {
+ background: #f4f4f4;
+ display: list-item;
+ cursor: default;
+}
+
+.select2-results .select2-selected {
+ display: none;
+}
+
+.select2-more-results.select2-active {
+ background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
+}
+
+.select2-more-results {
+ background: #f4f4f4;
+ display: list-item;
+}
+
+/* disabled styles */
+
+.select2-container.select2-container-disabled .select2-choice {
+ background-color: #f4f4f4;
+ background-image: none;
+ border: 1px solid #ddd;
+ cursor: default;
+}
+
+.select2-container.select2-container-disabled .select2-choice .select2-arrow {
+ background-color: #f4f4f4;
+ background-image: none;
+ border-left: 0;
+}
+
+.select2-container.select2-container-disabled .select2-choice abbr {
+ display: none;
+}
+
+
+/* multiselect */
+
+.select2-container-multi .select2-choices {
+ height: auto !important;
+ height: 1%;
+ margin: 0;
+ padding: 0;
+ position: relative;
+
+ border: 1px solid #aaa;
+ cursor: text;
+ overflow: hidden;
+
+ background-color: #fff;
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
+ background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
+ background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
+ background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
+}
+
+.select2-locked {
+ padding: 3px 5px 3px 5px !important;
+}
+
+.select2-container-multi .select2-choices {
+ min-height: 26px;
+}
+
+.select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #5897fb;
+ outline: none;
+
+ -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+ box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+}
+.select2-container-multi .select2-choices li {
+ float: left;
+ list-style: none;
+}
+html[dir="rtl"] .select2-container-multi .select2-choices li
+{
+ float: right;
+}
+.select2-container-multi .select2-choices .select2-search-field {
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input {
+ padding: 5px;
+ margin: 1px 0;
+
+ font-family: sans-serif;
+ font-size: 100%;
+ color: #666;
+ outline: 0;
+ border: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ background: transparent !important;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input.select2-active {
+ background: #fff url('select2-spinner.gif') no-repeat 100% !important;
+}
+
+.select2-default {
+ color: #999 !important;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice {
+ padding: 3px 5px 3px 18px;
+ margin: 3px 0 3px 5px;
+ position: relative;
+
+ line-height: 13px;
+ color: #333;
+ cursor: default;
+ border: 1px solid #aaaaaa;
+
+ border-radius: 3px;
+
+ -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+ box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+
+ background-clip: padding-box;
+
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ background-color: #e4e4e4;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
+ 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%);
+}
+html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
+{
+ margin-left: 0;
+ margin-right: 5px;
+}
+.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
+ cursor: default;
+}
+.select2-container-multi .select2-choices .select2-search-choice-focus {
+ background: #d4d4d4;
+}
+
+.select2-search-choice-close {
+ display: block;
+ width: 12px;
+ height: 13px;
+ position: absolute;
+ right: 3px;
+ top: 4px;
+
+ font-size: 1px;
+ outline: none;
+ background: url('select2.png') right top no-repeat;
+}
+html[dir="rtl"] .select2-search-choice-close {
+ right: auto;
+ left: 3px;
+}
+
+.select2-container-multi .select2-search-choice-close {
+ left: 3px;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
+ background-position: right -11px;
+}
+.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
+ background-position: right -11px;
+}
+
+/* disabled styles */
+.select2-container-multi.select2-container-disabled .select2-choices {
+ background-color: #f4f4f4;
+ background-image: none;
+ border: 1px solid #ddd;
+ cursor: default;
+}
+
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
+ padding: 3px 5px 3px 5px;
+ border: 1px solid #ddd;
+ background-image: none;
+ background-color: #f4f4f4;
+}
+
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
+ background: none;
+}
+/* end multiselect */
+
+
+.select2-result-selectable .select2-match,
+.select2-result-unselectable .select2-match {
+ text-decoration: underline;
+}
+
+.select2-offscreen, .select2-offscreen:focus {
+ clip: rect(0 0 0 0) !important;
+ width: 1px !important;
+ height: 1px !important;
+ border: 0 !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ overflow: hidden !important;
+ position: absolute !important;
+ outline: 0 !important;
+ left: 0px !important;
+ top: 0px !important;
+}
+
+.select2-display-none {
+ display: none;
+}
+
+.select2-measure-scrollbar {
+ position: absolute;
+ top: -10000px;
+ left: -10000px;
+ width: 100px;
+ height: 100px;
+ overflow: scroll;
+}
+
+/* Retina-ize icons */
+
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
+ .select2-search input,
+ .select2-search-choice-close,
+ .select2-container .select2-choice abbr,
+ .select2-container .select2-choice .select2-arrow b {
+ background-image: url('select2x2.png') !important;
+ background-repeat: no-repeat !important;
+ background-size: 60px 40px !important;
+ }
+
+ .select2-search input {
+ background-position: 100% -21px !important;
+ }
+}
diff --git a/core/css/select2/select2.png b/core/css/select2/select2.png
new file mode 100644
index 00000000000..1d804ffb996
--- /dev/null
+++ b/core/css/select2/select2.png
Binary files differ
diff --git a/core/css/select2/select2x2.png b/core/css/select2/select2x2.png
new file mode 100644
index 00000000000..4bdd5c961d4
--- /dev/null
+++ b/core/css/select2/select2x2.png
Binary files differ
diff --git a/core/css/styles.css b/core/css/styles.css
index e8c58cff249..56688e01aee 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -140,6 +140,18 @@ input[type="time"] {
-moz-box-sizing: border-box; box-sizing: border-box;
}
+.select2-choices {
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ color: #333;
+ background-image: none;
+}
+.select2-dropdown-open .select2-choices {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ border: 1px solid #3875d7;
+}
+
/* correctly align images inside of buttons */
input img, button img, .button img {
vertical-align: text-bottom;
@@ -772,6 +784,8 @@ a.bookmarklet { background-color:#ddd; border:1px solid #ccc; padding:5px;paddin
background-image:url('../img/places/home.svg');
background-repeat:no-repeat;
background-position: left center;
+ width: 26px;
+ display: inline-block;
}
#oc-dialog-filepicker-content .dirtree span:not(:last-child) { cursor: pointer; }
#oc-dialog-filepicker-content .dirtree span:last-child { font-weight: bold; }
diff --git a/core/js/js.js b/core/js/js.js
index d49001ee387..dde8ffa3211 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -256,6 +256,7 @@ var OC={
* @param {string} type the type of the file to link to (e.g. css,img,ajax.template)
* @param {string} file the filename
* @return {string} Absolute URL for a file in an app
+ * @deprecated use OC.generateUrl() instead
*/
filePath:function(app,type,file){
var isCore=OC.coreApps.indexOf(app)!==-1,
diff --git a/core/js/jstz.js b/core/js/jstz.js
new file mode 100644
index 00000000000..0f9abe8b78d
--- /dev/null
+++ b/core/js/jstz.js
@@ -0,0 +1,358 @@
+/**
+ * This script gives you the zone info key representing your device's time zone setting.
+ *
+ * @name jsTimezoneDetect
+ * @version 1.0.5
+ * @author Jon Nylander
+ * @license MIT License - http://www.opensource.org/licenses/mit-license.php
+ *
+ * For usage and examples, visit:
+ * http://pellepim.bitbucket.org/jstz/
+ *
+ * Copyright (c) Jon Nylander
+ */
+
+/*jslint undef: true */
+/*global console, exports*/
+
+(function(root) {
+ /**
+ * Namespace to hold all the code for timezone detection.
+ */
+ var jstz = (function () {
+ 'use strict';
+ var HEMISPHERE_SOUTH = 's',
+
+ /**
+ * Gets the offset in minutes from UTC for a certain date.
+ * @param {Date} date
+ * @returns {Number}
+ */
+ get_date_offset = function (date) {
+ var offset = -date.getTimezoneOffset();
+ return (offset !== null ? offset : 0);
+ },
+
+ get_date = function (year, month, date) {
+ var d = new Date();
+ if (year !== undefined) {
+ d.setFullYear(year);
+ }
+ d.setMonth(month);
+ d.setDate(date);
+ return d;
+ },
+
+ get_january_offset = function (year) {
+ return get_date_offset(get_date(year, 0 ,2));
+ },
+
+ get_june_offset = function (year) {
+ return get_date_offset(get_date(year, 5, 2));
+ },
+
+ /**
+ * Private method.
+ * Checks whether a given date is in daylight saving time.
+ * If the date supplied is after august, we assume that we're checking
+ * for southern hemisphere DST.
+ * @param {Date} date
+ * @returns {Boolean}
+ */
+ date_is_dst = function (date) {
+ var is_southern = date.getMonth() > 7,
+ base_offset = is_southern ? get_june_offset(date.getFullYear()) :
+ get_january_offset(date.getFullYear()),
+ date_offset = get_date_offset(date),
+ is_west = base_offset < 0,
+ dst_offset = base_offset - date_offset;
+
+ if (!is_west && !is_southern) {
+ return dst_offset < 0;
+ }
+
+ return dst_offset !== 0;
+ },
+
+ /**
+ * This function does some basic calculations to create information about
+ * the user's timezone. It uses REFERENCE_YEAR as a solid year for which
+ * the script has been tested rather than depend on the year set by the
+ * client device.
+ *
+ * Returns a key that can be used to do lookups in jstz.olson.timezones.
+ * eg: "720,1,2".
+ *
+ * @returns {String}
+ */
+
+ lookup_key = function () {
+ var january_offset = get_january_offset(),
+ june_offset = get_june_offset(),
+ diff = january_offset - june_offset;
+
+ if (diff < 0) {
+ return january_offset + ",1";
+ } else if (diff > 0) {
+ return june_offset + ",1," + HEMISPHERE_SOUTH;
+ }
+
+ return january_offset + ",0";
+ },
+
+ /**
+ * Uses get_timezone_info() to formulate a key to use in the olson.timezones dictionary.
+ *
+ * Returns a primitive object on the format:
+ * {'timezone': TimeZone, 'key' : 'the key used to find the TimeZone object'}
+ *
+ * @returns Object
+ */
+ determine = function () {
+ var key = lookup_key();
+ return new jstz.TimeZone(jstz.olson.timezones[key]);
+ },
+
+ /**
+ * This object contains information on when daylight savings starts for
+ * different timezones.
+ *
+ * The list is short for a reason. Often we do not have to be very specific
+ * to single out the correct timezone. But when we do, this list comes in
+ * handy.
+ *
+ * Each value is a date denoting when daylight savings starts for that timezone.
+ */
+ dst_start_for = function (tz_name) {
+
+ var ru_pre_dst_change = new Date(2010, 6, 15, 1, 0, 0, 0), // In 2010 Russia had DST, this allows us to detect Russia :)
+ dst_starts = {
+ 'America/Denver': new Date(2011, 2, 13, 3, 0, 0, 0),
+ 'America/Mazatlan': new Date(2011, 3, 3, 3, 0, 0, 0),
+ 'America/Chicago': new Date(2011, 2, 13, 3, 0, 0, 0),
+ 'America/Mexico_City': new Date(2011, 3, 3, 3, 0, 0, 0),
+ 'America/Asuncion': new Date(2012, 9, 7, 3, 0, 0, 0),
+ 'America/Santiago': new Date(2012, 9, 3, 3, 0, 0, 0),
+ 'America/Campo_Grande': new Date(2012, 9, 21, 5, 0, 0, 0),
+ 'America/Montevideo': new Date(2011, 9, 2, 3, 0, 0, 0),
+ 'America/Sao_Paulo': new Date(2011, 9, 16, 5, 0, 0, 0),
+ 'America/Los_Angeles': new Date(2011, 2, 13, 8, 0, 0, 0),
+ 'America/Santa_Isabel': new Date(2011, 3, 5, 8, 0, 0, 0),
+ 'America/Havana': new Date(2012, 2, 10, 2, 0, 0, 0),
+ 'America/New_York': new Date(2012, 2, 10, 7, 0, 0, 0),
+ 'Europe/Helsinki': new Date(2013, 2, 31, 5, 0, 0, 0),
+ 'Pacific/Auckland': new Date(2011, 8, 26, 7, 0, 0, 0),
+ 'America/Halifax': new Date(2011, 2, 13, 6, 0, 0, 0),
+ 'America/Goose_Bay': new Date(2011, 2, 13, 2, 1, 0, 0),
+ 'America/Miquelon': new Date(2011, 2, 13, 5, 0, 0, 0),
+ 'America/Godthab': new Date(2011, 2, 27, 1, 0, 0, 0),
+ 'Europe/Moscow': ru_pre_dst_change,
+ 'Asia/Amman': new Date(2013, 2, 29, 1, 0, 0, 0),
+ 'Asia/Beirut': new Date(2013, 2, 31, 2, 0, 0, 0),
+ 'Asia/Damascus': new Date(2013, 3, 6, 2, 0, 0, 0),
+ 'Asia/Jerusalem': new Date(2013, 2, 29, 5, 0, 0, 0),
+ 'Asia/Yekaterinburg': ru_pre_dst_change,
+ 'Asia/Omsk': ru_pre_dst_change,
+ 'Asia/Krasnoyarsk': ru_pre_dst_change,
+ 'Asia/Irkutsk': ru_pre_dst_change,
+ 'Asia/Yakutsk': ru_pre_dst_change,
+ 'Asia/Vladivostok': ru_pre_dst_change,
+ 'Asia/Baku': new Date(2013, 2, 31, 4, 0, 0),
+ 'Asia/Yerevan': new Date(2013, 2, 31, 3, 0, 0),
+ 'Asia/Kamchatka': ru_pre_dst_change,
+ 'Asia/Gaza': new Date(2010, 2, 27, 4, 0, 0),
+ 'Africa/Cairo': new Date(2010, 4, 1, 3, 0, 0),
+ 'Europe/Minsk': ru_pre_dst_change,
+ 'Pacific/Apia': new Date(2010, 10, 1, 1, 0, 0, 0),
+ 'Pacific/Fiji': new Date(2010, 11, 1, 0, 0, 0),
+ 'Australia/Perth': new Date(2008, 10, 1, 1, 0, 0, 0)
+ };
+
+ return dst_starts[tz_name];
+ };
+
+ return {
+ determine: determine,
+ date_is_dst: date_is_dst,
+ dst_start_for: dst_start_for
+ };
+ }());
+
+ /**
+ * Simple object to perform ambiguity check and to return name of time zone.
+ */
+ jstz.TimeZone = function (tz_name) {
+ 'use strict';
+ /**
+ * The keys in this object are timezones that we know may be ambiguous after
+ * a preliminary scan through the olson_tz object.
+ *
+ * The array of timezones to compare must be in the order that daylight savings
+ * starts for the regions.
+ */
+ var AMBIGUITIES = {
+ 'America/Denver': ['America/Denver', 'America/Mazatlan'],
+ 'America/Chicago': ['America/Chicago', 'America/Mexico_City'],
+ 'America/Santiago': ['America/Santiago', 'America/Asuncion', 'America/Campo_Grande'],
+ 'America/Montevideo': ['America/Montevideo', 'America/Sao_Paulo'],
+ 'Asia/Beirut': ['Asia/Amman', 'Asia/Jerusalem', 'Asia/Beirut', 'Europe/Helsinki','Asia/Damascus'],
+ 'Pacific/Auckland': ['Pacific/Auckland', 'Pacific/Fiji'],
+ 'America/Los_Angeles': ['America/Los_Angeles', 'America/Santa_Isabel'],
+ 'America/New_York': ['America/Havana', 'America/New_York'],
+ 'America/Halifax': ['America/Goose_Bay', 'America/Halifax'],
+ 'America/Godthab': ['America/Miquelon', 'America/Godthab'],
+ 'Asia/Dubai': ['Europe/Moscow'],
+ 'Asia/Dhaka': ['Asia/Yekaterinburg'],
+ 'Asia/Jakarta': ['Asia/Omsk'],
+ 'Asia/Shanghai': ['Asia/Krasnoyarsk', 'Australia/Perth'],
+ 'Asia/Tokyo': ['Asia/Irkutsk'],
+ 'Australia/Brisbane': ['Asia/Yakutsk'],
+ 'Pacific/Noumea': ['Asia/Vladivostok'],
+ 'Pacific/Tarawa': ['Asia/Kamchatka', 'Pacific/Fiji'],
+ 'Pacific/Tongatapu': ['Pacific/Apia'],
+ 'Asia/Baghdad': ['Europe/Minsk'],
+ 'Asia/Baku': ['Asia/Yerevan','Asia/Baku'],
+ 'Africa/Johannesburg': ['Asia/Gaza', 'Africa/Cairo']
+ },
+
+ timezone_name = tz_name,
+
+ /**
+ * Checks if a timezone has possible ambiguities. I.e timezones that are similar.
+ *
+ * For example, if the preliminary scan determines that we're in America/Denver.
+ * We double check here that we're really there and not in America/Mazatlan.
+ *
+ * This is done by checking known dates for when daylight savings start for different
+ * timezones during 2010 and 2011.
+ */
+ ambiguity_check = function () {
+ var ambiguity_list = AMBIGUITIES[timezone_name],
+ length = ambiguity_list.length,
+ i = 0,
+ tz = ambiguity_list[0];
+
+ for (; i < length; i += 1) {
+ tz = ambiguity_list[i];
+
+ if (jstz.date_is_dst(jstz.dst_start_for(tz))) {
+ timezone_name = tz;
+ return;
+ }
+ }
+ },
+
+ /**
+ * Checks if it is possible that the timezone is ambiguous.
+ */
+ is_ambiguous = function () {
+ return typeof (AMBIGUITIES[timezone_name]) !== 'undefined';
+ };
+
+ if (is_ambiguous()) {
+ ambiguity_check();
+ }
+
+ return {
+ name: function () {
+ return timezone_name;
+ }
+ };
+ };
+
+ jstz.olson = {};
+
+ /*
+ * The keys in this dictionary are comma separated as such:
+ *
+ * First the offset compared to UTC time in minutes.
+ *
+ * Then a flag which is 0 if the timezone does not take daylight savings into account and 1 if it
+ * does.
+ *
+ * Thirdly an optional 's' signifies that the timezone is in the southern hemisphere,
+ * only interesting for timezones with DST.
+ *
+ * The mapped arrays is used for constructing the jstz.TimeZone object from within
+ * jstz.determine_timezone();
+ */
+ jstz.olson.timezones = {
+ '-720,0' : 'Pacific/Majuro',
+ '-660,0' : 'Pacific/Pago_Pago',
+ '-600,1' : 'America/Adak',
+ '-600,0' : 'Pacific/Honolulu',
+ '-570,0' : 'Pacific/Marquesas',
+ '-540,0' : 'Pacific/Gambier',
+ '-540,1' : 'America/Anchorage',
+ '-480,1' : 'America/Los_Angeles',
+ '-480,0' : 'Pacific/Pitcairn',
+ '-420,0' : 'America/Phoenix',
+ '-420,1' : 'America/Denver',
+ '-360,0' : 'America/Guatemala',
+ '-360,1' : 'America/Chicago',
+ '-360,1,s' : 'Pacific/Easter',
+ '-300,0' : 'America/Bogota',
+ '-300,1' : 'America/New_York',
+ '-270,0' : 'America/Caracas',
+ '-240,1' : 'America/Halifax',
+ '-240,0' : 'America/Santo_Domingo',
+ '-240,1,s' : 'America/Santiago',
+ '-210,1' : 'America/St_Johns',
+ '-180,1' : 'America/Godthab',
+ '-180,0' : 'America/Argentina/Buenos_Aires',
+ '-180,1,s' : 'America/Montevideo',
+ '-120,0' : 'America/Noronha',
+ '-120,1' : 'America/Noronha',
+ '-60,1' : 'Atlantic/Azores',
+ '-60,0' : 'Atlantic/Cape_Verde',
+ '0,0' : 'UTC',
+ '0,1' : 'Europe/London',
+ '60,1' : 'Europe/Berlin',
+ '60,0' : 'Africa/Lagos',
+ '60,1,s' : 'Africa/Windhoek',
+ '120,1' : 'Asia/Beirut',
+ '120,0' : 'Africa/Johannesburg',
+ '180,0' : 'Asia/Baghdad',
+ '180,1' : 'Europe/Moscow',
+ '210,1' : 'Asia/Tehran',
+ '240,0' : 'Asia/Dubai',
+ '240,1' : 'Asia/Baku',
+ '270,0' : 'Asia/Kabul',
+ '300,1' : 'Asia/Yekaterinburg',
+ '300,0' : 'Asia/Karachi',
+ '330,0' : 'Asia/Kolkata',
+ '345,0' : 'Asia/Kathmandu',
+ '360,0' : 'Asia/Dhaka',
+ '360,1' : 'Asia/Omsk',
+ '390,0' : 'Asia/Rangoon',
+ '420,1' : 'Asia/Krasnoyarsk',
+ '420,0' : 'Asia/Jakarta',
+ '480,0' : 'Asia/Shanghai',
+ '480,1' : 'Asia/Irkutsk',
+ '525,0' : 'Australia/Eucla',
+ '525,1,s' : 'Australia/Eucla',
+ '540,1' : 'Asia/Yakutsk',
+ '540,0' : 'Asia/Tokyo',
+ '570,0' : 'Australia/Darwin',
+ '570,1,s' : 'Australia/Adelaide',
+ '600,0' : 'Australia/Brisbane',
+ '600,1' : 'Asia/Vladivostok',
+ '600,1,s' : 'Australia/Sydney',
+ '630,1,s' : 'Australia/Lord_Howe',
+ '660,1' : 'Asia/Kamchatka',
+ '660,0' : 'Pacific/Noumea',
+ '690,0' : 'Pacific/Norfolk',
+ '720,1,s' : 'Pacific/Auckland',
+ '720,0' : 'Pacific/Tarawa',
+ '765,1,s' : 'Pacific/Chatham',
+ '780,0' : 'Pacific/Tongatapu',
+ '780,1,s' : 'Pacific/Apia',
+ '840,0' : 'Pacific/Kiritimati'
+ };
+
+ if (typeof exports !== 'undefined') {
+ exports.jstz = jstz;
+ } else {
+ root.jstz = jstz;
+ }
+})(this);
diff --git a/core/js/select2/LICENSE b/core/js/select2/LICENSE
new file mode 100644
index 00000000000..0247cc76273
--- /dev/null
+++ b/core/js/select2/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2014 Igor Vaynberg
+
+Version: @@ver@@ Timestamp: @@timestamp@@
+
+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
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License at:
+
+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,
+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/core/js/select2/README.md b/core/js/select2/README.md
new file mode 100644
index 00000000000..406fe79dc95
--- /dev/null
+++ b/core/js/select2/README.md
@@ -0,0 +1,90 @@
+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
+
+Use cases
+---------
+
+* Enhancing native selects with search.
+* Enhancing native selects with a better multi-select interface.
+* Loading data from JavaScript: easily load items via ajax and have them searchable.
+* Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
+* Tagging: ability to add new items on the fly.
+* Working with large, remote datasets: ability to partially load a dataset based on the search term.
+* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
+* Templating: support for custom rendering of results and selections.
+
+Browser compatibility
+---------------------
+* IE 8+
+* Chrome 8+
+* 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.
+
+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))
+* [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/))
+* [Yii 2.x](http://demos.krajee.com/widgets#select2)
+* [Yii 1.x](https://github.com/tonybolzan/yii-select2)
+
+Internationalization (i18n)
+---------------------------
+
+Select2 supports multiple languages by simply including the right
+language JS file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.).
+
+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
+-----------
+
+Have a bug? Please create an issue here on GitHub!
+
+https://github.com/ivaynberg/select2/issues
+
+Mailing list
+------------
+
+Have a question? Ask on our mailing list!
+
+select2@googlegroups.com
+
+https://groups.google.com/d/forum/select2
+
+
+Copyright and license
+---------------------
+
+Copyright 2012 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
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
+
+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 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/core/js/select2/bower.json b/core/js/select2/bower.json
new file mode 100644
index 00000000000..80e8596e806
--- /dev/null
+++ b/core/js/select2/bower.json
@@ -0,0 +1,8 @@
+{
+ "name": "select2",
+ "version": "3.4.8",
+ "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
+ "dependencies": {
+ "jquery": ">= 1.7.1"
+ }
+}
diff --git a/core/js/select2/component.json b/core/js/select2/component.json
new file mode 100644
index 00000000000..ad7abf9d9fa
--- /dev/null
+++ b/core/js/select2/component.json
@@ -0,0 +1,66 @@
+{
+ "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",
+ "demo": "http://ivaynberg.github.io/select2/",
+ "keywords": [
+ "jquery"
+ ],
+ "main": "select2.js",
+ "styles": [
+ "select2.css",
+ "select2-bootstrap.css"
+ ],
+ "scripts": [
+ "select2.js",
+ "select2_locale_ar.js",
+ "select2_locale_bg.js",
+ "select2_locale_ca.js",
+ "select2_locale_cs.js",
+ "select2_locale_da.js",
+ "select2_locale_de.js",
+ "select2_locale_el.js",
+ "select2_locale_es.js",
+ "select2_locale_et.js",
+ "select2_locale_eu.js",
+ "select2_locale_fa.js",
+ "select2_locale_fi.js",
+ "select2_locale_fr.js",
+ "select2_locale_gl.js",
+ "select2_locale_he.js",
+ "select2_locale_hr.js",
+ "select2_locale_hu.js",
+ "select2_locale_id.js",
+ "select2_locale_is.js",
+ "select2_locale_it.js",
+ "select2_locale_ja.js",
+ "select2_locale_ka.js",
+ "select2_locale_ko.js",
+ "select2_locale_lt.js",
+ "select2_locale_lv.js",
+ "select2_locale_mk.js",
+ "select2_locale_ms.js",
+ "select2_locale_nl.js",
+ "select2_locale_no.js",
+ "select2_locale_pl.js",
+ "select2_locale_pt-BR.js",
+ "select2_locale_pt-PT.js",
+ "select2_locale_ro.js",
+ "select2_locale_ru.js",
+ "select2_locale_sk.js",
+ "select2_locale_sv.js",
+ "select2_locale_th.js",
+ "select2_locale_tr.js",
+ "select2_locale_uk.js",
+ "select2_locale_vi.js",
+ "select2_locale_zh-CN.js",
+ "select2_locale_zh-TW.js"
+ ],
+ "images": [
+ "select2-spinner.gif",
+ "select2.png",
+ "select2x2.png"
+ ],
+ "license": "MIT"
+}
diff --git a/core/js/select2/composer.json b/core/js/select2/composer.json
new file mode 100644
index 00000000000..c50fadba855
--- /dev/null
+++ b/core/js/select2/composer.json
@@ -0,0 +1,29 @@
+{
+ "name":
+ "ivaynberg/select2",
+ "description": "Select2 is a jQuery based replacement for select boxes.",
+ "version": "3.4.8",
+ "type": "component",
+ "homepage": "http://ivaynberg.github.io/select2/",
+ "license": "Apache-2.0",
+ "require": {
+ "robloach/component-installer": "*",
+ "components/jquery": ">=1.7.1"
+ },
+ "extra": {
+ "component": {
+ "scripts": [
+ "select2.js"
+ ],
+ "files": [
+ "select2.js",
+ "select2_locale_*.js",
+ "select2.css",
+ "select2-bootstrap.css",
+ "select2-spinner.gif",
+ "select2.png",
+ "select2x2.png"
+ ]
+ }
+ }
+}
diff --git a/core/js/select2/package.json b/core/js/select2/package.json
new file mode 100644
index 00000000000..75ad84acaf8
--- /dev/null
+++ b/core/js/select2/package.json
@@ -0,0 +1,20 @@
+{
+ "name" : "Select2",
+ "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+ "homepage": "http://ivaynberg.github.io/select2",
+ "author": "Igor Vaynberg",
+ "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"},
+ "main": "select2.js",
+ "version": "3.4.8",
+ "jspm": {
+ "main": "select2",
+ "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"],
+ "shim": {
+ "select2": {
+ "imports": ["jquery", "./select2.css!"],
+ "exports": "$"
+ }
+ },
+ "buildConfig": { "uglify": true }
+ }
+}
diff --git a/core/js/select2/release.sh b/core/js/select2/release.sh
new file mode 100755
index 00000000000..0d2e279ead4
--- /dev/null
+++ b/core/js/select2/release.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+set -e
+
+echo -n "Enter the version for this release: "
+
+read ver
+
+if [ ! $ver ]; then
+ echo "Invalid version."
+ exit
+fi
+
+name="select2"
+js="$name.js"
+mini="$name.min.js"
+css="$name.css"
+release="$name-$ver"
+tag="$ver"
+branch="build-$ver"
+curbranch=`git branch | grep "*" | sed "s/* //"`
+timestamp=$(date)
+tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
+remote="github"
+
+echo "Pulling from origin"
+
+git pull
+
+echo "Updating Version Identifiers"
+
+sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i -- bower.json select2.jquery.json component.json composer.json package.json
+
+git add bower.json
+git add select2.jquery.json
+git add component.json
+git add composer.json
+git add package.json
+
+git commit -m "modified version identifiers in descriptors for release $ver"
+git push
+
+git branch "$branch"
+git checkout "$branch"
+
+echo "Tokenizing..."
+
+find . -name "$js" | xargs -I{} sed -e "$tokens" -i -- {}
+find . -name "$css" | xargs -I{} sed -e "$tokens" -i -- {}
+
+sed -e "s/latest/$ver/g" -i -- bower.json
+
+git add "$js"
+git add "$css"
+
+echo "Minifying..."
+
+echo "/*" > "$mini"
+cat LICENSE | sed "$tokens" >> "$mini"
+echo "*/" >> "$mini"
+
+curl -s \
+ --data-urlencode "js_code@$js" \
+ http://marijnhaverbeke.nl/uglifyjs \
+ >> "$mini"
+
+git add "$mini"
+
+git commit -m "release $ver"
+
+echo "Tagging..."
+git tag -a "$tag" -m "tagged version $ver"
+git push "$remote" --tags
+
+echo "Cleaning Up..."
+
+git checkout "$curbranch"
+git branch -D "$branch"
+
+echo "Done"
diff --git a/core/js/select2/select2-bootstrap.css b/core/js/select2/select2-bootstrap.css
new file mode 100644
index 00000000000..3b83f0a2297
--- /dev/null
+++ b/core/js/select2/select2-bootstrap.css
@@ -0,0 +1,87 @@
+.form-control .select2-choice {
+ border: 0;
+ border-radius: 2px;
+}
+
+.form-control .select2-choice .select2-arrow {
+ border-radius: 0 2px 2px 0;
+}
+
+.form-control.select2-container {
+ height: auto !important;
+ padding: 0;
+}
+
+.form-control.select2-container.select2-dropdown-open {
+ border-color: #5897FB;
+ border-radius: 3px 3px 0 0;
+}
+
+.form-control .select2-container.select2-dropdown-open .select2-choices {
+ border-radius: 3px 3px 0 0;
+}
+
+.form-control.select2-container .select2-choices {
+ border: 0 !important;
+ border-radius: 3px;
+}
+
+.control-group.warning .select2-container .select2-choice,
+.control-group.warning .select2-container .select2-choices,
+.control-group.warning .select2-container-active .select2-choice,
+.control-group.warning .select2-container-active .select2-choices,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #C09853 !important;
+}
+
+.control-group.warning .select2-container .select2-choice div {
+ border-left: 1px solid #C09853 !important;
+ background: #FCF8E3 !important;
+}
+
+.control-group.error .select2-container .select2-choice,
+.control-group.error .select2-container .select2-choices,
+.control-group.error .select2-container-active .select2-choice,
+.control-group.error .select2-container-active .select2-choices,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.error .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #B94A48 !important;
+}
+
+.control-group.error .select2-container .select2-choice div {
+ border-left: 1px solid #B94A48 !important;
+ background: #F2DEDE !important;
+}
+
+.control-group.info .select2-container .select2-choice,
+.control-group.info .select2-container .select2-choices,
+.control-group.info .select2-container-active .select2-choice,
+.control-group.info .select2-container-active .select2-choices,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.info .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #3A87AD !important;
+}
+
+.control-group.info .select2-container .select2-choice div {
+ border-left: 1px solid #3A87AD !important;
+ background: #D9EDF7 !important;
+}
+
+.control-group.success .select2-container .select2-choice,
+.control-group.success .select2-container .select2-choices,
+.control-group.success .select2-container-active .select2-choice,
+.control-group.success .select2-container-active .select2-choices,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.success .select2-container-multi.select2-container-active .select2-choices {
+ border: 1px solid #468847 !important;
+}
+
+.control-group.success .select2-container .select2-choice div {
+ border-left: 1px solid #468847 !important;
+ background: #DFF0D8 !important;
+}
diff --git a/core/js/select2/select2.jquery.json b/core/js/select2/select2.jquery.json
new file mode 100644
index 00000000000..e9119279f11
--- /dev/null
+++ b/core/js/select2/select2.jquery.json
@@ -0,0 +1,36 @@
+{
+ "name": "select2",
+ "title": "Select2",
+ "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+ "keywords": [
+ "select",
+ "autocomplete",
+ "typeahead",
+ "dropdown",
+ "multiselect",
+ "tag",
+ "tagging"
+ ],
+ "version": "3.4.8",
+ "author": {
+ "name": "Igor Vaynberg",
+ "url": "https://github.com/ivaynberg"
+ },
+ "licenses": [
+ {
+ "type": "Apache",
+ "url": "http://www.apache.org/licenses/LICENSE-2.0"
+ },
+ {
+ "type": "GPL v2",
+ "url": "http://www.gnu.org/licenses/gpl-2.0.html"
+ }
+ ],
+ "bugs": "https://github.com/ivaynberg/select2/issues",
+ "homepage": "http://ivaynberg.github.com/select2",
+ "docs": "http://ivaynberg.github.com/select2/",
+ "download": "https://github.com/ivaynberg/select2/tags",
+ "dependencies": {
+ "jquery": ">=1.7.1"
+ }
+}
diff --git a/core/js/select2/select2.js b/core/js/select2/select2.js
new file mode 100644
index 00000000000..2969da5d1f7
--- /dev/null
+++ b/core/js/select2/select2.js
@@ -0,0 +1,3448 @@
+/*
+Copyright 2012 Igor Vaynberg
+
+Version: 3.4.8 Timestamp: Thu May 1 09:50:32 EDT 2014
+
+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
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License at:
+
+ 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 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.
+*/
+(function ($) {
+ if(typeof $.fn.each2 == "undefined") {
+ $.extend($.fn, {
+ /*
+ * 4-10 times faster .each replacement
+ * use it carefully, as it overrides jQuery context of element on each iteration
+ */
+ each2 : function (c) {
+ var j = $([0]), i = -1, l = this.length;
+ while (
+ ++i < l
+ && (j.context = j[0] = this[i])
+ && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
+ );
+ return this;
+ }
+ });
+ }
+})(jQuery);
+
+(function ($, undefined) {
+ "use strict";
+ /*global document, window, jQuery, console */
+
+ if (window.Select2 !== undefined) {
+ return;
+ }
+
+ var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
+ lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
+
+ KEY = {
+ 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 (k) {
+ k = k.which ? k.which : k;
+ switch (k) {
+ case KEY.LEFT:
+ case KEY.RIGHT:
+ case KEY.UP:
+ case KEY.DOWN:
+ return true;
+ }
+ return false;
+ },
+ isControl: function (e) {
+ var k = e.which;
+ switch (k) {
+ case KEY.SHIFT:
+ case KEY.CTRL:
+ case KEY.ALT:
+ return true;
+ }
+
+ if (e.metaKey) return true;
+
+ return false;
+ },
+ isFunctionKey: function (k) {
+ k = k.which ? k.which : k;
+ return k >= 112 && k <= 123;
+ }
+ },
+ MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
+
+ 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"};
+
+ $document = $(document);
+
+ nextUid=(function() { var counter=1; return function() { return counter++; }; }());
+
+
+ function reinsertElement(element) {
+ var placeholder = $(document.createTextNode(''));
+
+ element.before(placeholder);
+ placeholder.before(element);
+ placeholder.remove();
+ }
+
+ function stripDiacritics(str) {
+ // Used 'uni range + named function' from http://jsperf.com/diacritics/18
+ function match(a) {
+ return DIACRITICS[a] || a;
+ }
+
+ return str.replace(/[^\u0000-\u007E]/g, match);
+ }
+
+ function indexOf(value, array) {
+ var i = 0, l = array.length;
+ for (; i < l; i = i + 1) {
+ if (equal(value, array[i])) return i;
+ }
+ return -1;
+ }
+
+ function measureScrollbar () {
+ var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
+ $template.appendTo('body');
+
+ var dim = {
+ width: $template.width() - $template[0].clientWidth,
+ height: $template.height() - $template[0].clientHeight
+ };
+ $template.remove();
+
+ return dim;
+ }
+
+ /**
+ * Compares equality of a and b
+ * @param a
+ * @param b
+ */
+ function equal(a, b) {
+ if (a === b) return true;
+ if (a === undefined || b === undefined) return false;
+ if (a === null || b === null) return false;
+ // Check whether 'a' or 'b' is a string (primitive or object).
+ // The concatenation of an empty string (+'') converts its argument to a string's primitive.
+ if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
+ if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
+ return false;
+ }
+
+ /**
+ * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
+ * strings
+ * @param string
+ * @param separator
+ */
+ function splitVal(string, separator) {
+ 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]);
+ return val;
+ }
+
+ function getSideBorderPadding(element) {
+ return element.outerWidth(false) - element.width();
+ }
+
+ function installKeyUpChangeEvent(element) {
+ var key="keyup-change-value";
+ element.on("keydown", function () {
+ if ($.data(element, key) === undefined) {
+ $.data(element, key, element.val());
+ }
+ });
+ element.on("keyup", function () {
+ var val= $.data(element, key);
+ if (val !== undefined && element.val() !== val) {
+ $.removeData(element, key);
+ element.trigger("keyup-change");
+ }
+ });
+ }
+
+ $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.
+ *
+ * filters out mouse events that occur when mouse is stationary but
+ * the elements under the pointer are scrolled.
+ */
+ function installFilteredMouseMove(element) {
+ element.on("mousemove", function (e) {
+ var lastpos = lastMousePosition;
+ if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
+ $(e.target).trigger("mousemove-filtered", e);
+ }
+ });
+ }
+
+ /**
+ * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
+ * within the last quietMillis milliseconds.
+ *
+ * @param quietMillis number of milliseconds to wait before invoking fn
+ * @param fn function to be debounced
+ * @param ctx object to be used as this reference within fn
+ * @return debounced version of fn
+ */
+ function debounce(quietMillis, fn, ctx) {
+ ctx = ctx || undefined;
+ var timeout;
+ return function () {
+ var args = arguments;
+ window.clearTimeout(timeout);
+ timeout = window.setTimeout(function() {
+ fn.apply(ctx, args);
+ }, quietMillis);
+ };
+ }
+
+ function installDebouncedScroll(threshold, element) {
+ var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
+ element.on("scroll", function (e) {
+ if (indexOf(e.target, element.get()) >= 0) notify(e);
+ });
+ }
+
+ function focus($el) {
+ if ($el[0] === document.activeElement) return;
+
+ /* set the focus in a 0 timeout - that way the focus is set after the processing
+ of the current event has finished - which seems like the only reliable way
+ to set focus */
+ window.setTimeout(function() {
+ var el=$el[0], pos=$el.val().length, range;
+
+ $el.focus();
+
+ /* make sure el received focus so we do not error out when trying to manipulate the caret.
+ sometimes modals or others listeners may steal it after its set */
+ var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
+ if (isVisible && el === document.activeElement) {
+
+ /* after the focus is set move the caret to the end, necessary when we val()
+ just before setting focus */
+ if(el.setSelectionRange)
+ {
+ el.setSelectionRange(pos, pos);
+ }
+ else if (el.createTextRange) {
+ range = el.createTextRange();
+ range.collapse(false);
+ range.select();
+ }
+ }
+ }, 0);
+ }
+
+ function getCursorInfo(el) {
+ el = $(el)[0];
+ var offset = 0;
+ var length = 0;
+ if ('selectionStart' in el) {
+ offset = el.selectionStart;
+ length = el.selectionEnd - offset;
+ } else if ('selection' in document) {
+ el.focus();
+ var sel = document.selection.createRange();
+ length = document.selection.createRange().text.length;
+ sel.moveStart('character', -el.value.length);
+ offset = sel.text.length - length;
+ }
+ return { offset: offset, length: length };
+ }
+
+ function killEvent(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ function killEventImmediately(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+
+ function measureTextWidth(e) {
+ if (!sizer){
+ var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
+ sizer = $(document.createElement("div")).css({
+ position: "absolute",
+ left: "-10000px",
+ top: "-10000px",
+ display: "none",
+ fontSize: style.fontSize,
+ fontFamily: style.fontFamily,
+ fontStyle: style.fontStyle,
+ fontWeight: style.fontWeight,
+ letterSpacing: style.letterSpacing,
+ textTransform: style.textTransform,
+ whiteSpace: "nowrap"
+ });
+ sizer.attr("class","select2-sizer");
+ $("body").append(sizer);
+ }
+ sizer.text(e.val());
+ return sizer.width();
+ }
+
+ function syncCssClasses(dest, src, adapter) {
+ var classes, replacements = [], adapted;
+
+ classes = dest.attr("class");
+ if (classes) {
+ classes = '' + classes; // for IE which returns object
+ $(classes.split(" ")).each2(function() {
+ if (this.indexOf("select2-") === 0) {
+ replacements.push(this);
+ }
+ });
+ }
+ classes = src.attr("class");
+ if (classes) {
+ classes = '' + classes; // for IE which returns object
+ $(classes.split(" ")).each2(function() {
+ if (this.indexOf("select2-") !== 0) {
+ adapted = adapter(this);
+ if (adapted) {
+ replacements.push(adapted);
+ }
+ }
+ });
+ }
+ dest.attr("class", replacements.join(" "));
+ }
+
+
+ function markMatch(text, term, markup, escapeMarkup) {
+ var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
+ tl=term.length;
+
+ if (match<0) {
+ markup.push(escapeMarkup(text));
+ return;
+ }
+
+ markup.push(escapeMarkup(text.substring(0, match)));
+ markup.push("<span class='select2-match'>");
+ markup.push(escapeMarkup(text.substring(match, match + tl)));
+ markup.push("</span>");
+ markup.push(escapeMarkup(text.substring(match + tl, text.length)));
+ }
+
+ function defaultEscapeMarkup(markup) {
+ var replace_map = {
+ '\\': '&#92;',
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#39;',
+ "/": '&#47;'
+ };
+
+ return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
+ return replace_map[match];
+ });
+ }
+
+ /**
+ * Produces an ajax-based query function
+ *
+ * @param options object containing configuration parameters
+ * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
+ * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
+ * @param options.url url for the data
+ * @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.
+ * 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
+ * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
+ */
+ function ajax(options) {
+ var timeout, // current scheduled but not yet executed request
+ handler = null,
+ quietMillis = options.quietMillis || 100,
+ ajaxUrl = options.url,
+ self = this;
+
+ return function (query) {
+ window.clearTimeout(timeout);
+ timeout = window.setTimeout(function () {
+ var data = options.data, // ajax data function
+ url = ajaxUrl, // ajax url string or function
+ transport = options.transport || $.fn.select2.ajaxDefaults.transport,
+ // deprecated - to be removed in 4.0 - use params instead
+ deprecated = {
+ type: options.type || 'GET', // set type of request (GET or POST)
+ cache: options.cache || false,
+ jsonpCallback: options.jsonpCallback||undefined,
+ dataType: options.dataType||"json"
+ },
+ params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
+
+ data = data ? data.call(self, query.term, query.page, query.context) : null;
+ url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
+
+ if (handler && typeof handler.abort === "function") { handler.abort(); }
+
+ if (options.params) {
+ if ($.isFunction(options.params)) {
+ $.extend(params, options.params.call(self));
+ } else {
+ $.extend(params, options.params);
+ }
+ }
+
+ $.extend(params, {
+ url: url,
+ dataType: options.dataType,
+ 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);
+ query.callback(results);
+ }
+ });
+ handler = transport.call(self, params);
+ }, quietMillis);
+ };
+ }
+
+ /**
+ * Produces a query function that works with a local array
+ *
+ * @param options object containing configuration parameters. The options parameter can either be an array or an
+ * object.
+ *
+ * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
+ *
+ * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
+ * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
+ * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
+ * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
+ * the text.
+ */
+ function local(options) {
+ var data = options, // data elements
+ dataText,
+ tmp,
+ text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
+
+ if ($.isArray(data)) {
+ tmp = data;
+ data = { results: tmp };
+ }
+
+ if ($.isFunction(data) === false) {
+ tmp = data;
+ data = function() { return tmp; };
+ }
+
+ var dataItem = data();
+ if (dataItem.text) {
+ text = dataItem.text;
+ // if text is not a function we assume it to be a key name
+ if (!$.isFunction(text)) {
+ dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
+ text = function (item) { return item[dataText]; };
+ }
+ }
+
+ return function (query) {
+ var t = query.term, filtered = { results: [] }, process;
+ if (t === "") {
+ query.callback(data());
+ return;
+ }
+
+ process = function(datum, collection) {
+ var group, attr;
+ datum = datum[0];
+ if (datum.children) {
+ group = {};
+ for (attr in datum) {
+ if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
+ }
+ group.children=[];
+ $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
+ if (group.children.length || query.matcher(t, text(group), datum)) {
+ collection.push(group);
+ }
+ } else {
+ if (query.matcher(t, text(datum), datum)) {
+ collection.push(datum);
+ }
+ }
+ };
+
+ $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
+ query.callback(filtered);
+ };
+ }
+
+ // TODO javadoc
+ function tags(data) {
+ var isFunc = $.isFunction(data);
+ return function (query) {
+ var t = query.term, filtered = {results: []};
+ var result = isFunc ? data(query) : data;
+ if ($.isArray(result)) {
+ $(result).each(function () {
+ var isObject = this.text !== undefined,
+ text = isObject ? this.text : this;
+ if (t === "" || query.matcher(t, text)) {
+ filtered.results.push(isObject ? this : {id: this, text: this});
+ }
+ });
+ query.callback(filtered);
+ }
+ };
+ }
+
+ /**
+ * Checks if the formatter function should be used.
+ *
+ * Throws an error if it is not a function. Returns true if it should be used,
+ * false if no formatting should be performed.
+ *
+ * @param formatter
+ */
+ function checkFormatter(formatter, formatterName) {
+ if ($.isFunction(formatter)) return true;
+ if (!formatter) return false;
+ if (typeof(formatter) === 'string') return true;
+ throw new Error(formatterName +" must be a string, function, or falsy value");
+ }
+
+ function evaluate(val) {
+ if ($.isFunction(val)) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return val.apply(null, args);
+ }
+ return val;
+ }
+
+ function countResults(results) {
+ var count = 0;
+ $.each(results, function(i, item) {
+ if (item.children) {
+ count += countResults(item.children);
+ } else {
+ count++;
+ }
+ });
+ return count;
+ }
+
+ /**
+ * Default tokenizer. This function uses breaks the input on substring match of any string from the
+ * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
+ * two options have to be defined in order for the tokenizer to work.
+ *
+ * @param input text user has typed so far or pasted into the search field
+ * @param selection currently selected choices
+ * @param selectCallback function(choice) callback tho add the choice to selection
+ * @param opts select2's opts
+ * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
+ */
+ function defaultTokenizer(input, selection, selectCallback, opts) {
+ var original = input, // store the original so we can compare and know if we need to tell the search to update its text
+ dupe = false, // check for whether a token we extracted represents a duplicate selected choice
+ token, // token
+ index, // position at which the separator was found
+ i, l, // looping variables
+ separator; // the matched separator
+
+ if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
+
+ while (true) {
+ index = -1;
+
+ for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
+ separator = opts.tokenSeparators[i];
+ index = input.indexOf(separator);
+ if (index >= 0) break;
+ }
+
+ if (index < 0) break; // did not find any token separator in the input string, bail
+
+ token = input.substring(0, index);
+ input = input.substring(index + separator.length);
+
+ if (token.length > 0) {
+ token = opts.createSearchChoice.call(this, token, selection);
+ if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
+ dupe = false;
+ for (i = 0, l = selection.length; i < l; i++) {
+ if (equal(opts.id(token), opts.id(selection[i]))) {
+ dupe = true; break;
+ }
+ }
+
+ if (!dupe) selectCallback(token);
+ }
+ }
+ }
+
+ if (original!==input) return input;
+ }
+
+ function cleanupJQueryElements() {
+ var self = this;
+
+ Array.prototype.forEach.call(arguments, function (element) {
+ self[element].remove();
+ self[element] = null;
+ });
+ }
+
+ /**
+ * Creates a new class
+ *
+ * @param superClass
+ * @param methods
+ */
+ function clazz(SuperClass, methods) {
+ var constructor = function () {};
+ constructor.prototype = new SuperClass;
+ constructor.prototype.constructor = constructor;
+ constructor.prototype.parent = SuperClass.prototype;
+ constructor.prototype = $.extend(constructor.prototype, methods);
+ return constructor;
+ }
+
+ AbstractSelect2 = clazz(Object, {
+
+ // abstract
+ bind: function (func) {
+ var self = this;
+ return function () {
+ func.apply(self, arguments);
+ };
+ },
+
+ // abstract
+ init: function (opts) {
+ var results, search, resultsSelector = ".select2-results";
+
+ // prepare options
+ this.opts = opts = this.prepareOpts(opts);
+
+ this.id=opts.id;
+
+ // destroy if called on an existing component
+ if (opts.element.data("select2") !== undefined &&
+ opts.element.data("select2") !== null) {
+ opts.element.data("select2").destroy();
+ }
+
+ this.container = this.createContainer();
+
+ this.liveRegion = $("<span>", {
+ 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
+ .replace(/([.])/g, '_')
+ .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
+ this.container.attr("id", this.containerId);
+
+ this.container.attr("title", opts.element.attr("title"));
+
+ this.body = $("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.elementTabIndex = this.opts.element.attr("tabindex");
+
+ // swap container for the element
+ this.opts.element
+ .data("select2", this)
+ .attr("tabindex", "-1")
+ .before(this.container)
+ .on("click.select2", killEvent); // do not leak click events
+
+ this.container.data("select2", this);
+
+ this.dropdown = this.container.find(".select2-drop");
+
+ syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
+
+ this.dropdown.addClass(evaluate(opts.dropdownCssClass));
+ this.dropdown.data("select2", this);
+ this.dropdown.on("click", killEvent);
+
+ this.results = results = this.container.find(resultsSelector);
+ this.search = search = this.container.find("input.select2-input");
+
+ this.queryCount = 0;
+ this.resultsPage = 0;
+ this.context = null;
+
+ // initialize the container
+ this.initContainer();
+
+ this.container.on("click", killEvent);
+
+ installFilteredMouseMove(this.results);
+
+ this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
+ this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
+ this._touchEvent = true;
+ this.highlightUnderEvent(event);
+ }));
+ this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
+ this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
+
+ // Waiting for a click event on touch devices to select option and hide dropdown
+ // otherwise click will be triggered on an underlying element
+ this.dropdown.on('click', this.bind(function (event) {
+ if (this._touchEvent) {
+ this._touchEvent = false;
+ this.selectHighlighted();
+ }
+ }));
+
+ installDebouncedScroll(80, this.results);
+ this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
+
+ // do not propagate change event from the search field out of the component
+ $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
+ $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
+
+ // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
+ if ($.fn.mousewheel) {
+ results.mousewheel(function (e, delta, deltaX, deltaY) {
+ var top = results.scrollTop();
+ if (deltaY > 0 && top - deltaY <= 0) {
+ results.scrollTop(0);
+ killEvent(e);
+ } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
+ results.scrollTop(results.get(0).scrollHeight - results.height());
+ killEvent(e);
+ }
+ });
+ }
+
+ installKeyUpChangeEvent(search);
+ search.on("keyup-change input paste", this.bind(this.updateResults));
+ search.on("focus", function () { search.addClass("select2-focused"); });
+ search.on("blur", function () { search.removeClass("select2-focused");});
+
+ this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
+ if ($(e.target).closest(".select2-result-selectable").length > 0) {
+ this.highlightUnderEvent(e);
+ this.selectHighlighted(e);
+ }
+ }));
+
+ // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
+ // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
+ // dom it will trigger the popup close, which is not what we want
+ // 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;
+
+ if ($.isFunction(this.opts.initSelection)) {
+ // initialize selection based on the current value of the source element
+ this.initSelection();
+
+ // if the user has provided a function that can set selection based on the value of the source element
+ // we monitor the change event on the element and trigger it, allowing for two way synchronization
+ this.monitorSource();
+ }
+
+ if (opts.maximumInputLength !== null) {
+ this.search.attr("maxlength", opts.maximumInputLength);
+ }
+
+ var disabled = opts.element.prop("disabled");
+ if (disabled === undefined) disabled = false;
+ this.enable(!disabled);
+
+ var readonly = opts.element.prop("readonly");
+ if (readonly === undefined) readonly = false;
+ this.readonly(readonly);
+
+ // Calculate size of scrollbar
+ scrollBarDimensions = scrollBarDimensions || measureScrollbar();
+
+ this.autofocus = opts.element.prop("autofocus");
+ opts.element.prop("autofocus", false);
+ if (this.autofocus) this.focus();
+
+ this.search.attr("placeholder", opts.searchInputPlaceholder);
+ },
+
+ // abstract
+ destroy: function () {
+ var element=this.opts.element, select2 = element.data("select2");
+
+ this.close();
+
+ if (this.propertyObserver) {
+ this.propertyObserver.disconnect();
+ this.propertyObserver = 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});
+ } else {
+ element.removeAttr("tabindex");
+ }
+ element.show();
+ }
+
+ cleanupJQueryElements.call(this,
+ "container",
+ "liveRegion",
+ "dropdown",
+ "results",
+ "search"
+ );
+ },
+
+ // abstract
+ optionToData: function(element) {
+ if (element.is("option")) {
+ return {
+ id:element.prop("value"),
+ text:element.text(),
+ element: element.get(),
+ css: element.attr("class"),
+ disabled: element.prop("disabled"),
+ locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
+ };
+ } else if (element.is("optgroup")) {
+ return {
+ text:element.attr("label"),
+ children:[],
+ element: element.get(),
+ css: element.attr("class")
+ };
+ }
+ },
+
+ // abstract
+ prepareOpts: function (opts) {
+ var element, select, idKey, ajaxUrl, self = this;
+
+ element = opts.element;
+
+ if (element.get(0).tagName.toLowerCase() === "select") {
+ this.select = select = opts.element;
+ }
+
+ if (select) {
+ // these options are not allowed when attached to a select because they are picked up off the element itself
+ $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
+ if (this in opts) {
+ throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
+ }
+ });
+ }
+
+ opts = $.extend({}, {
+ populateResults: function(container, results, query) {
+ var populate, id=this.opts.id, liveRegion=this.liveRegion;
+
+ populate=function(results, container, depth) {
+
+ var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
+
+ results = opts.sortResults(results, container, query);
+
+ for (i = 0, l = results.length; i < l; i = i + 1) {
+
+ result=results[i];
+
+ disabled = (result.disabled === true);
+ selectable = (!disabled) && (id(result) !== undefined);
+
+ compound=result.children && result.children.length > 0;
+
+ node=$("<li></li>");
+ node.addClass("select2-results-dept-"+depth);
+ node.addClass("select2-result");
+ node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
+ if (disabled) { node.addClass("select2-disabled"); }
+ if (compound) { node.addClass("select2-result-with-children"); }
+ node.addClass(self.opts.formatResultCssClass(result));
+ node.attr("role", "presentation");
+
+ label=$(document.createElement("div"));
+ label.addClass("select2-result-label");
+ label.attr("id", "select2-result-label-" + nextUid());
+ label.attr("role", "option");
+
+ formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
+ if (formatted!==undefined) {
+ label.html(formatted);
+ node.append(label);
+ }
+
+
+ if (compound) {
+
+ innerContainer=$("<ul></ul>");
+ innerContainer.addClass("select2-result-sub");
+ populate(result.children, innerContainer, depth+1);
+ node.append(innerContainer);
+ }
+
+ node.data("select2-data", result);
+ container.append(node);
+ }
+
+ liveRegion.text(opts.formatMatches(results.length));
+ };
+
+ populate(results, container, 0);
+ }
+ }, $.fn.select2.defaults, opts);
+
+ if (typeof(opts.id) !== "function") {
+ idKey = opts.id;
+ opts.id = function (e) { return e[idKey]; };
+ }
+
+ if ($.isArray(opts.element.data("select2Tags"))) {
+ if ("tags" in opts) {
+ throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
+ }
+ opts.tags=opts.element.data("select2Tags");
+ }
+
+ if (select) {
+ opts.query = this.bind(function (query) {
+ var data = { results: [], more: false },
+ term = query.term,
+ children, placeholderOption, process;
+
+ process=function(element, collection) {
+ var group;
+ if (element.is("option")) {
+ if (query.matcher(term, element.text(), element)) {
+ collection.push(self.optionToData(element));
+ }
+ } else if (element.is("optgroup")) {
+ group=self.optionToData(element);
+ element.children().each2(function(i, elm) { process(elm, group.children); });
+ if (group.children.length>0) {
+ collection.push(group);
+ }
+ }
+ };
+
+ children=element.children();
+
+ // ignore the placeholder option if there is one
+ if (this.getPlaceholder() !== undefined && children.length > 0) {
+ placeholderOption = this.getPlaceholderOption();
+ if (placeholderOption) {
+ children=children.not(placeholderOption);
+ }
+ }
+
+ children.each2(function(i, elm) { process(elm, data.results); });
+
+ query.callback(data);
+ });
+ // this is needed because inside val() we construct choices from options and there 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) {
+ opts.ajax.url = ajaxUrl;
+ }
+ opts.query = ajax.call(opts.element, opts.ajax);
+ } else if ("data" in opts) {
+ opts.query = local(opts.data);
+ } else if ("tags" in opts) {
+ opts.query = tags(opts.tags);
+ if (opts.createSearchChoice === undefined) {
+ opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
+ }
+ if (opts.initSelection === undefined) {
+ opts.initSelection = function (element, callback) {
+ var data = [];
+ $(splitVal(element.val(), opts.separator)).each(function () {
+ var obj = { id: this, text: this },
+ tags = opts.tags;
+ if ($.isFunction(tags)) tags=tags();
+ $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
+ data.push(obj);
+ });
+
+ callback(data);
+ };
+ }
+ }
+ }
+ }
+ if (typeof(opts.query) !== "function") {
+ throw "query function not defined for Select2 " + opts.element.attr("id");
+ }
+
+ if (opts.createSearchChoicePosition === 'top') {
+ opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
+ }
+ else if (opts.createSearchChoicePosition === 'bottom') {
+ opts.createSearchChoicePosition = function(list, item) { list.push(item); };
+ }
+ else if (typeof(opts.createSearchChoicePosition) !== "function") {
+ throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
+ }
+
+ return opts;
+ },
+
+ /**
+ * Monitor the original element for changes and update select2 accordingly
+ */
+ // abstract
+ monitorSource: function () {
+ var el = this.opts.element, sync, observer;
+
+ el.on("change.select2", this.bind(function (e) {
+ if (this.opts.element.data("select2-change-triggered") !== true) {
+ this.initSelection();
+ }
+ }));
+
+ sync = this.bind(function () {
+
+ // sync enabled state
+ var disabled = el.prop("disabled");
+ if (disabled === undefined) disabled = false;
+ this.enable(!disabled);
+
+ var readonly = el.prop("readonly");
+ if (readonly === undefined) readonly = false;
+ this.readonly(readonly);
+
+ syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
+ this.container.addClass(evaluate(this.opts.containerCssClass));
+
+ syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
+ this.dropdown.addClass(evaluate(this.opts.dropdownCssClass));
+
+ });
+
+ // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
+ if (el.length && el[0].attachEvent) {
+ el.each(function() {
+ this.attachEvent("onpropertychange", 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);
+ });
+ this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
+ }
+ },
+
+ // abstract
+ triggerSelect: function(data) {
+ var evt = $.Event("select2-selecting", { val: this.id(data), object: data });
+ this.opts.element.trigger(evt);
+ return !evt.isDefaultPrevented();
+ },
+
+ /**
+ * Triggers the change event on the source element
+ */
+ // abstract
+ triggerChange: function (details) {
+
+ details = details || {};
+ details= $.extend({}, details, { type: "change", val: this.val() });
+ // prevents recursive triggering
+ this.opts.element.data("select2-change-triggered", true);
+ this.opts.element.trigger(details);
+ this.opts.element.data("select2-change-triggered", false);
+
+ // some validation frameworks ignore the change event and listen instead to keyup, click for selects
+ // so here we trigger the click event manually
+ this.opts.element.click();
+
+ // ValidationEngine ignores the change event and listens instead to blur
+ // so here we trigger the blur event manually if so desired
+ if (this.opts.blurOnChange)
+ this.opts.element.blur();
+ },
+
+ //abstract
+ isInterfaceEnabled: function()
+ {
+ return this.enabledInterface === true;
+ },
+
+ // abstract
+ enableInterface: function() {
+ var enabled = this._enabled && !this._readonly,
+ disabled = !enabled;
+
+ if (enabled === this.enabledInterface) return false;
+
+ this.container.toggleClass("select2-container-disabled", disabled);
+ this.close();
+ this.enabledInterface = enabled;
+
+ return true;
+ },
+
+ // abstract
+ enable: function(enabled) {
+ if (enabled === undefined) enabled = true;
+ if (this._enabled === enabled) return;
+ this._enabled = enabled;
+
+ this.opts.element.prop("disabled", !enabled);
+ this.enableInterface();
+ },
+
+ // abstract
+ disable: function() {
+ this.enable(false);
+ },
+
+ // abstract
+ readonly: function(enabled) {
+ if (enabled === undefined) enabled = false;
+ if (this._readonly === enabled) return;
+ this._readonly = enabled;
+
+ this.opts.element.prop("readonly", enabled);
+ this.enableInterface();
+ },
+
+ // abstract
+ opened: function () {
+ return this.container.hasClass("select2-dropdown-open");
+ },
+
+ // abstract
+ positionDropdown: function() {
+ var $dropdown = this.dropdown,
+ offset = this.container.offset(),
+ height = this.container.outerHeight(false),
+ width = this.container.outerWidth(false),
+ dropHeight = $dropdown.outerHeight(false),
+ $window = $(window),
+ windowWidth = $window.width(),
+ windowHeight = $window.height(),
+ viewPortRight = $window.scrollLeft() + windowWidth,
+ viewportBottom = $window.scrollTop() + windowHeight,
+ dropTop = offset.top + height,
+ dropLeft = offset.left,
+ enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
+ enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
+ dropWidth = $dropdown.outerWidth(false),
+ enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
+ aboveNow = $dropdown.hasClass("select2-drop-above"),
+ bodyOffset,
+ above,
+ changeDirection,
+ css,
+ resultsListNode;
+
+ // always prefer the current above/below alignment, unless there is not enough room
+ if (aboveNow) {
+ above = true;
+ if (!enoughRoomAbove && enoughRoomBelow) {
+ changeDirection = true;
+ above = false;
+ }
+ } else {
+ above = false;
+ if (!enoughRoomBelow && enoughRoomAbove) {
+ changeDirection = true;
+ above = true;
+ }
+ }
+
+ //if we are changing direction we need to get positions when dropdown is hidden;
+ if (changeDirection) {
+ $dropdown.hide();
+ offset = this.container.offset();
+ height = this.container.outerHeight(false);
+ width = this.container.outerWidth(false);
+ dropHeight = $dropdown.outerHeight(false);
+ viewPortRight = $window.scrollLeft() + windowWidth;
+ viewportBottom = $window.scrollTop() + windowHeight;
+ 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
+ this.focusSearch();
+ }
+
+ if (this.opts.dropdownAutoWidth) {
+ resultsListNode = $('.select2-results', $dropdown)[0];
+ $dropdown.addClass('select2-drop-auto-width');
+ $dropdown.css('width', '');
+ // Add scrollbar width to dropdown if vertical scrollbar is present
+ 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');
+ }
+
+ //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
+ //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
+
+ // fix positioning when body has an offset and is not position: static
+ if (this.body.css('position') !== 'static') {
+ bodyOffset = this.body.offset();
+ dropTop -= bodyOffset.top;
+ dropLeft -= bodyOffset.left;
+ }
+
+ if (!enoughRoomOnRight) {
+ dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
+ }
+
+ css = {
+ left: dropLeft,
+ width: width
+ };
+
+ if (above) {
+ css.top = offset.top - dropHeight;
+ css.bottom = 'auto';
+ this.container.addClass("select2-drop-above");
+ $dropdown.addClass("select2-drop-above");
+ }
+ else {
+ css.top = dropTop;
+ css.bottom = 'auto';
+ this.container.removeClass("select2-drop-above");
+ $dropdown.removeClass("select2-drop-above");
+ }
+ css = $.extend(css, evaluate(this.opts.dropdownCss));
+
+ $dropdown.css(css);
+ },
+
+ // abstract
+ shouldOpen: function() {
+ var event;
+
+ if (this.opened()) return false;
+
+ if (this._enabled === false || this._readonly === true) return false;
+
+ event = $.Event("select2-opening");
+ this.opts.element.trigger(event);
+ return !event.isDefaultPrevented();
+ },
+
+ // abstract
+ clearDropdownAlignmentPreference: function() {
+ // clear the classes used to figure out the preference of where the dropdown should be opened
+ this.container.removeClass("select2-drop-above");
+ this.dropdown.removeClass("select2-drop-above");
+ },
+
+ /**
+ * Opens the dropdown
+ *
+ * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
+ * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
+ */
+ // abstract
+ open: function () {
+
+ if (!this.shouldOpen()) return false;
+
+ this.opening();
+
+ return true;
+ },
+
+ /**
+ * Performs the opening of the dropdown
+ */
+ // abstract
+ opening: function() {
+ var cid = this.containerEventName,
+ scroll = "scroll." + cid,
+ resize = "resize."+cid,
+ orient = "orientationchange."+cid,
+ mask;
+
+ this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
+
+ this.clearDropdownAlignmentPreference();
+
+ if(this.dropdown[0] !== this.body.children().last()[0]) {
+ this.dropdown.detach().appendTo(this.body);
+ }
+
+ // create the dropdown mask if doesn't already exist
+ mask = $("#select2-drop-mask");
+ if (mask.length == 0) {
+ mask = $(document.createElement("div"));
+ mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
+ mask.hide();
+ mask.appendTo(this.body);
+ mask.on("mousedown touchstart click", function (e) {
+ // Prevent IE from generating a click event on the body
+ reinsertElement(mask);
+
+ var dropdown = $("#select2-drop"), self;
+ if (dropdown.length > 0) {
+ self=dropdown.data("select2");
+ if (self.opts.selectOnBlur) {
+ self.selectHighlighted({noFocus: true});
+ }
+ self.close();
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+ }
+
+ // ensure the mask is always right before the dropdown
+ if (this.dropdown.prev()[0] !== mask[0]) {
+ this.dropdown.before(mask);
+ }
+
+ // move the global id to the correct dropdown
+ $("#select2-drop").removeAttr("id");
+ this.dropdown.attr("id", "select2-drop");
+
+ // show the elements
+ mask.show();
+
+ this.positionDropdown();
+ this.dropdown.show();
+ this.positionDropdown();
+
+ this.dropdown.addClass("select2-drop-active");
+
+ // attach listeners to events that can change the position of the container and thus require
+ // the position of the dropdown to be updated as well so it does not come unglued from the container
+ var that = this;
+ this.container.parents().add(window).each(function () {
+ $(this).on(resize+" "+scroll+" "+orient, function (e) {
+ if (that.opened()) that.positionDropdown();
+ });
+ });
+
+
+ },
+
+ // abstract
+ close: function () {
+ if (!this.opened()) return;
+
+ var cid = this.containerEventName,
+ scroll = "scroll." + cid,
+ resize = "resize."+cid,
+ orient = "orientationchange."+cid;
+
+ // unbind event listeners
+ this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
+
+ this.clearDropdownAlignmentPreference();
+
+ $("#select2-drop-mask").hide();
+ this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop 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($.Event("select2-close"));
+ },
+
+ /**
+ * Opens control, sets input value, and updates results.
+ */
+ // abstract
+ externalSearch: function (term) {
+ this.open();
+ this.search.val(term);
+ this.updateResults(false);
+ },
+
+ // abstract
+ clearSearch: function () {
+
+ },
+
+ //abstract
+ getMaximumSelectionSize: function() {
+ return evaluate(this.opts.maximumSelectionSize);
+ },
+
+ // abstract
+ ensureHighlightVisible: function () {
+ var results = this.results, children, index, child, hb, rb, y, more;
+
+ index = this.highlight();
+
+ if (index < 0) return;
+
+ if (index == 0) {
+
+ // if the first element is highlighted scroll all the way to the top,
+ // that way any unselectable headers above it will also be scrolled
+ // into view
+
+ results.scrollTop(0);
+ return;
+ }
+
+ children = this.findHighlightableChoices().find('.select2-result-label');
+
+ child = $(children[index]);
+
+ hb = child.offset().top + child.outerHeight(true);
+
+ // if this is the last child lets also make sure select2-more-results is visible
+ if (index === children.length - 1) {
+ more = results.find("li.select2-more-results");
+ if (more.length > 0) {
+ hb = more.offset().top + more.outerHeight(true);
+ }
+ }
+
+ rb = results.offset().top + results.outerHeight(true);
+ if (hb > rb) {
+ results.scrollTop(results.scrollTop() + (hb - rb));
+ }
+ y = child.offset().top - results.offset().top;
+
+ // make sure the top of the element is visible
+ if (y < 0 && child.css('display') != 'none' ) {
+ results.scrollTop(results.scrollTop() + y); // y is negative
+ }
+ },
+
+ // abstract
+ findHighlightableChoices: function() {
+ return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
+ },
+
+ // abstract
+ moveHighlight: function (delta) {
+ var choices = this.findHighlightableChoices(),
+ index = this.highlight();
+
+ while (index > -1 && index < choices.length) {
+ index += delta;
+ var choice = $(choices[index]);
+ if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
+ this.highlight(index);
+ break;
+ }
+ }
+ },
+
+ // abstract
+ highlight: function (index) {
+ var choices = this.findHighlightableChoices(),
+ choice,
+ data;
+
+ if (arguments.length === 0) {
+ return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
+ }
+
+ if (index >= choices.length) index = choices.length - 1;
+ if (index < 0) index = 0;
+
+ this.removeHighlight();
+
+ choice = $(choices[index]);
+ choice.addClass("select2-highlighted");
+
+ // ensure assistive technology can determine the active choice
+ this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
+
+ this.ensureHighlightVisible();
+
+ this.liveRegion.text(choice.text());
+
+ data = choice.data("select2-data");
+ if (data) {
+ this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
+ }
+ },
+
+ removeHighlight: function() {
+ this.results.find(".select2-highlighted").removeClass("select2-highlighted");
+ },
+
+ touchMoved: function() {
+ this._touchMoved = true;
+ },
+
+ clearTouchMoved: function() {
+ this._touchMoved = false;
+ },
+
+ // abstract
+ countSelectableResults: function() {
+ return this.findHighlightableChoices().length;
+ },
+
+ // abstract
+ highlightUnderEvent: function (event) {
+ var el = $(event.target).closest(".select2-result-selectable");
+ if (el.length > 0 && !el.is(".select2-highlighted")) {
+ var choices = this.findHighlightableChoices();
+ this.highlight(choices.index(el));
+ } else if (el.length == 0) {
+ // if we are over an unselectable item remove all highlights
+ this.removeHighlight();
+ }
+ },
+
+ // abstract
+ loadMoreIfNeeded: function () {
+ var results = this.results,
+ more = results.find("li.select2-more-results"),
+ below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
+ page = this.resultsPage + 1,
+ self=this,
+ term=this.search.val(),
+ context=this.context;
+
+ if (more.length === 0) return;
+ below = more.offset().top - results.offset().top - results.height();
+
+ if (below <= this.opts.loadMorePadding) {
+ more.addClass("select2-active");
+ this.opts.query({
+ element: this.opts.element,
+ term: term,
+ page: page,
+ context: context,
+ matcher: this.opts.matcher,
+ callback: this.bind(function (data) {
+
+ // ignore a response if the select2 has been closed before it was received
+ if (!self.opened()) return;
+
+
+ self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
+ self.postprocessResults(data, false, false);
+
+ if (data.more===true) {
+ more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, page+1));
+ window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
+ } else {
+ more.remove();
+ }
+ self.positionDropdown();
+ self.resultsPage = page;
+ self.context = data.context;
+ this.opts.element.trigger({ type: "select2-loaded", items: data });
+ })});
+ }
+ },
+
+ /**
+ * Default tokenizer function which does nothing
+ */
+ tokenize: function() {
+
+ },
+
+ /**
+ * @param initial whether or not this is the call to this method right after the dropdown has been opened
+ */
+ // abstract
+ updateResults: function (initial) {
+ var search = this.search,
+ results = this.results,
+ opts = this.opts,
+ data,
+ self = this,
+ input,
+ term = search.val(),
+ lastTerm = $.data(this.container, "select2-last-term"),
+ // sequence number used to drop out-of-order responses
+ queryNumber;
+
+ // prevent duplicate queries against the same term
+ if (initial !== true && lastTerm && equal(term, lastTerm)) return;
+
+ $.data(this.container, "select2-last-term", term);
+
+ // if the search is currently hidden we do not alter the results
+ if (initial !== true && (this.showSearchInput === false || !this.opened())) {
+ return;
+ }
+
+ function postRender() {
+ search.removeClass("select2-active");
+ self.positionDropdown();
+ if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
+ self.liveRegion.text(results.text());
+ }
+ else {
+ self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length));
+ }
+ }
+
+ function render(html) {
+ results.html(html);
+ postRender();
+ }
+
+ queryNumber = ++this.queryCount;
+
+ var maxSelSize = this.getMaximumSelectionSize();
+ if (maxSelSize >=1) {
+ data = this.data();
+ if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
+ render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, maxSelSize) + "</li>");
+ return;
+ }
+ }
+
+ if (search.val().length < opts.minimumInputLength) {
+ if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
+ render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, search.val(), opts.minimumInputLength) + "</li>");
+ } else {
+ render("");
+ }
+ if (initial && this.showSearch) this.showSearch(true);
+ return;
+ }
+
+ if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
+ if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
+ render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, search.val(), opts.maximumInputLength) + "</li>");
+ } else {
+ render("");
+ }
+ return;
+ }
+
+ if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
+ render("<li class='select2-searching'>" + evaluate(opts.formatSearching) + "</li>");
+ }
+
+ search.addClass("select2-active");
+
+ this.removeHighlight();
+
+ // give the tokenizer a chance to pre-process the input
+ input = this.tokenize();
+ if (input != undefined && input != null) {
+ search.val(input);
+ }
+
+ this.resultsPage = 1;
+
+ opts.query({
+ element: opts.element,
+ term: search.val(),
+ page: this.resultsPage,
+ context: null,
+ matcher: opts.matcher,
+ callback: this.bind(function (data) {
+ var def; // default choice
+
+ // ignore old responses
+ if (queryNumber != this.queryCount) {
+ return;
+ }
+
+ // ignore a response if the select2 has been closed before it was received
+ if (!this.opened()) {
+ this.search.removeClass("select2-active");
+ return;
+ }
+
+ // save context, if any
+ this.context = (data.context===undefined) ? null : data.context;
+ // create a default choice and prepend it to the list
+ if (this.opts.createSearchChoice && search.val() !== "") {
+ def = this.opts.createSearchChoice.call(self, search.val(), data.results);
+ if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
+ if ($(data.results).filter(
+ function () {
+ return equal(self.id(this), self.id(def));
+ }).length === 0) {
+ this.opts.createSearchChoicePosition(data.results, def);
+ }
+ }
+ }
+
+ if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
+ render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, search.val()) + "</li>");
+ return;
+ }
+
+ results.empty();
+ 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("<li class='select2-more-results'>" + self.opts.escapeMarkup(evaluate(opts.formatLoadMore, this.resultsPage)) + "</li>");
+ window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
+ }
+
+ this.postprocessResults(data, initial);
+
+ postRender();
+
+ this.opts.element.trigger({ type: "select2-loaded", items: data });
+ })});
+ },
+
+ // abstract
+ cancel: function () {
+ this.close();
+ },
+
+ // abstract
+ blur: function () {
+ // if selectOnBlur == true, select the currently highlighted option
+ if (this.opts.selectOnBlur)
+ this.selectHighlighted({noFocus: true});
+
+ this.close();
+ this.container.removeClass("select2-container-active");
+ // synonymous to .is(':focus'), which is available in jquery >= 1.6
+ if (this.search[0] === document.activeElement) { this.search.blur(); }
+ this.clearSearch();
+ this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
+ },
+
+ // abstract
+ focusSearch: function () {
+ focus(this.search);
+ },
+
+ // abstract
+ selectHighlighted: function (options) {
+ if (this._touchMoved) {
+ this.clearTouchMoved();
+ return;
+ }
+ var index=this.highlight(),
+ highlighted=this.results.find(".select2-highlighted"),
+ data = highlighted.closest('.select2-result').data("select2-data");
+
+ if (data) {
+ this.highlight(index);
+ this.onSelect(data, options);
+ } else if (options && options.noFocus) {
+ this.close();
+ }
+ },
+
+ // abstract
+ getPlaceholder: function () {
+ var placeholderOption;
+ return this.opts.element.attr("placeholder") ||
+ this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
+ this.opts.element.data("placeholder") ||
+ this.opts.placeholder ||
+ ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
+ },
+
+ // abstract
+ getPlaceholderOption: function() {
+ if (this.select) {
+ var firstOption = this.select.children('option').first();
+ if (this.opts.placeholderOption !== undefined ) {
+ //Determine the placeholder option based on the specified placeholderOption setting
+ return (this.opts.placeholderOption === "first" && firstOption) ||
+ (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
+ } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
+ //No explicit placeholder option specified, use the first if it's blank
+ return firstOption;
+ }
+ }
+ },
+
+ /**
+ * Get the desired width for the container element. This is
+ * derived first from option `width` passed to select2, then
+ * the inline 'style' on the original element, and finally
+ * falls back to the jQuery calculated element width.
+ */
+ // abstract
+ initContainerWidth: function () {
+ function resolveContainerWidth() {
+ var style, attrs, matches, i, l, attr;
+
+ if (this.opts.width === "off") {
+ return null;
+ } else if (this.opts.width === "element"){
+ return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
+ } 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) {
+ attrs = style.split(';');
+ for (i = 0, l = attrs.length; i < l; i = i + 1) {
+ attr = attrs[i].replace(/\s/g, '');
+ matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
+ if (matches !== null && matches.length >= 1)
+ return matches[1];
+ }
+ }
+
+ if (this.opts.width === "resolve") {
+ // next check if css('width') can resolve a width that is percent based, this is sometimes possible
+ // when attached to input type=hidden or elements hidden via css
+ style = this.opts.element.css('width');
+ if (style.indexOf("%") > 0) return style;
+
+ // finally, fallback on the calculated width of the element
+ return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
+ }
+
+ return null;
+ } else if ($.isFunction(this.opts.width)) {
+ return this.opts.width();
+ } else {
+ return this.opts.width;
+ }
+ };
+
+ var width = resolveContainerWidth.call(this);
+ if (width !== null) {
+ this.container.css("width", width);
+ }
+ }
+ });
+
+ SingleSelect2 = clazz(AbstractSelect2, {
+
+ // single
+
+ createContainer: function () {
+ var container = $(document.createElement("div")).attr({
+ "class": "select2-container"
+ }).html([
+ "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
+ " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
+ " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
+ "</a>",
+ "<label for='' class='select2-offscreen'></label>",
+ "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
+ "<div class='select2-drop select2-display-none'>",
+ " <div class='select2-search'>",
+ " <label for='' class='select2-offscreen'></label>",
+ " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
+ " aria-autocomplete='list' />",
+ " </div>",
+ " <ul class='select2-results' role='listbox'>",
+ " </ul>",
+ "</div>"].join(""));
+ return container;
+ },
+
+ // single
+ enableInterface: function() {
+ if (this.parent.enableInterface.apply(this, arguments)) {
+ this.focusser.prop("disabled", !this.isInterfaceEnabled());
+ }
+ },
+
+ // single
+ opening: function () {
+ var el, range, len;
+
+ if (this.opts.minimumResultsForSearch >= 0) {
+ this.showSearch(true);
+ }
+
+ this.parent.opening.apply(this, arguments);
+
+ if (this.showSearchInput !== false) {
+ // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
+ // all other browsers handle this just fine
+
+ this.search.val(this.focusser.val());
+ }
+ if (this.opts.shouldFocusInput(this)) {
+ this.search.focus();
+ // move the cursor to the end after focussing, otherwise it will be at the beginning and
+ // new text will appear *before* focusser.val()
+ el = this.search.get(0);
+ if (el.createTextRange) {
+ range = el.createTextRange();
+ range.collapse(false);
+ range.select();
+ } else if (el.setSelectionRange) {
+ len = this.search.val().length;
+ el.setSelectionRange(len, len);
+ }
+ }
+
+ // 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.focusser.prop("disabled", true).val("");
+ this.updateResults(true);
+ this.opts.element.trigger($.Event("select2-open"));
+ },
+
+ // single
+ close: function () {
+ if (!this.opened()) return;
+ this.parent.close.apply(this, arguments);
+
+ this.focusser.prop("disabled", false);
+
+ if (this.opts.shouldFocusInput(this)) {
+ this.focusser.focus();
+ }
+ },
+
+ // single
+ focus: function () {
+ if (this.opened()) {
+ this.close();
+ } else {
+ this.focusser.prop("disabled", false);
+ if (this.opts.shouldFocusInput(this)) {
+ this.focusser.focus();
+ }
+ }
+ },
+
+ // single
+ isFocused: function () {
+ return this.container.hasClass("select2-container-active");
+ },
+
+ // single
+ cancel: function () {
+ this.parent.cancel.apply(this, arguments);
+ this.focusser.prop("disabled", false);
+
+ if (this.opts.shouldFocusInput(this)) {
+ this.focusser.focus();
+ }
+ },
+
+ // single
+ destroy: function() {
+ $("label[for='" + this.focusser.attr('id') + "']")
+ .attr('for', this.opts.element.attr("id"));
+ this.parent.destroy.apply(this, arguments);
+
+ cleanupJQueryElements.call(this,
+ "selection",
+ "focusser"
+ );
+ },
+
+ // single
+ initContainer: function () {
+
+ var selection,
+ container = this.container,
+ dropdown = this.dropdown,
+ idSuffix = nextUid(),
+ elementLabel;
+
+ if (this.opts.minimumResultsForSearch < 0) {
+ this.showSearch(false);
+ } else {
+ this.showSearch(true);
+ }
+
+ this.selection = selection = container.find(".select2-choice");
+
+ this.focusser = container.find(".select2-focusser");
+
+ // add aria associations
+ selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
+ this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
+ this.results.attr("id", "select2-results-"+idSuffix);
+ this.search.attr("aria-owns", "select2-results-"+idSuffix);
+
+ // rewrite labels from original element to focusser
+ this.focusser.attr("id", "s2id_autogen"+idSuffix);
+
+ elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
+
+ this.focusser.prev()
+ .text(elementLabel.text())
+ .attr('for', this.focusser.attr('id'));
+
+ // Ensure the original element retains an accessible name
+ var originalTitle = this.opts.element.attr("title");
+ this.opts.element.attr("title", (originalTitle || elementLabel.text()));
+
+ this.focusser.attr("tabindex", this.elementTabIndex);
+
+ // write label for search field using the label from the focusser element
+ this.search.attr("id", this.focusser.attr('id') + '_search');
+
+ this.search.prev()
+ .text($("label[for='" + this.focusser.attr('id') + "']").text())
+ .attr('for', this.search.attr('id'));
+
+ this.search.on("keydown", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+
+ if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
+ // prevent the page from scrolling
+ killEvent(e);
+ return;
+ }
+
+ switch (e.which) {
+ case KEY.UP:
+ case KEY.DOWN:
+ this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
+ killEvent(e);
+ return;
+ case KEY.ENTER:
+ this.selectHighlighted();
+ killEvent(e);
+ return;
+ case KEY.TAB:
+ this.selectHighlighted({noFocus: true});
+ return;
+ case KEY.ESC:
+ this.cancel(e);
+ killEvent(e);
+ return;
+ }
+ }));
+
+ this.search.on("blur", this.bind(function(e) {
+ // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
+ // 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()) {
+ this.search.focus();
+ }
+ }), 0);
+ }
+ }));
+
+ this.focusser.on("keydown", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+
+ if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
+ return;
+ }
+
+ if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
+ killEvent(e);
+ return;
+ }
+
+ if (e.which == KEY.DOWN || e.which == KEY.UP
+ || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
+
+ if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
+
+ this.open();
+ killEvent(e);
+ return;
+ }
+
+ if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
+ if (this.opts.allowClear) {
+ this.clear();
+ }
+ killEvent(e);
+ return;
+ }
+ }));
+
+
+ installKeyUpChangeEvent(this.focusser);
+ this.focusser.on("keyup-change input", this.bind(function(e) {
+ if (this.opts.minimumResultsForSearch >= 0) {
+ e.stopPropagation();
+ if (this.opened()) return;
+ this.open();
+ }
+ }));
+
+ selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+ this.clear();
+ killEventImmediately(e);
+ this.close();
+ this.selection.focus();
+ }));
+
+ selection.on("mousedown touchstart", this.bind(function (e) {
+ // Prevent IE from generating a click event on the body
+ reinsertElement(selection);
+
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
+
+ if (this.opened()) {
+ this.close();
+ } else if (this.isInterfaceEnabled()) {
+ this.open();
+ }
+
+ killEvent(e);
+ }));
+
+ dropdown.on("mousedown touchstart", this.bind(function() {
+ if (this.opts.shouldFocusInput(this)) {
+ this.search.focus();
+ }
+ }));
+
+ selection.on("focus", this.bind(function(e) {
+ killEvent(e);
+ }));
+
+ this.focusser.on("focus", this.bind(function(){
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
+ this.container.addClass("select2-container-active");
+ })).on("blur", this.bind(function() {
+ if (!this.opened()) {
+ this.container.removeClass("select2-container-active");
+ this.opts.element.trigger($.Event("select2-blur"));
+ }
+ }));
+ this.search.on("focus", this.bind(function(){
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
+ this.container.addClass("select2-container-active");
+ }));
+
+ this.initContainerWidth();
+ this.opts.element.addClass("select2-offscreen");
+ this.setPlaceholder();
+
+ },
+
+ // single
+ clear: function(triggerChange) {
+ var data=this.selection.data("select2-data");
+ if (data) { // guard against queued quick consecutive clicks
+ var evt = $.Event("select2-clearing");
+ this.opts.element.trigger(evt);
+ if (evt.isDefaultPrevented()) {
+ return;
+ }
+ var placeholderOption = this.getPlaceholderOption();
+ this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
+ this.selection.find(".select2-chosen").empty();
+ this.selection.removeData("select2-data");
+ this.setPlaceholder();
+
+ if (triggerChange !== false){
+ this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
+ this.triggerChange({removed:data});
+ }
+ }
+ },
+
+ /**
+ * Sets selection based on source element's value
+ */
+ // single
+ initSelection: function () {
+ var selected;
+ if (this.isPlaceholderOptionSelected()) {
+ this.updateSelection(null);
+ this.close();
+ this.setPlaceholder();
+ } else {
+ var self = this;
+ this.opts.initSelection.call(null, this.opts.element, function(selected){
+ if (selected !== undefined && selected !== null) {
+ self.updateSelection(selected);
+ self.close();
+ self.setPlaceholder();
+ self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
+ }
+ });
+ }
+ },
+
+ isPlaceholderOptionSelected: function() {
+ var placeholderOption;
+ if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
+ return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
+ || (this.opts.element.val() === "")
+ || (this.opts.element.val() === undefined)
+ || (this.opts.element.val() === null);
+ },
+
+ // single
+ prepareOpts: function () {
+ var opts = this.parent.prepareOpts.apply(this, arguments),
+ self=this;
+
+ if (opts.element.get(0).tagName.toLowerCase() === "select") {
+ // install the selection initializer
+ opts.initSelection = function (element, callback) {
+ var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
+ // a single select box always has a value, no need to null check 'selected'
+ callback(self.optionToData(selected));
+ };
+ } else if ("data" in opts) {
+ // install default initSelection when applied to hidden input and data is local
+ opts.initSelection = opts.initSelection || function (element, callback) {
+ var id = element.val();
+ //search in data by id, storing the actual matching item
+ var match = null;
+ opts.query({
+ matcher: function(term, text, el){
+ var is_match = equal(id, opts.id(el));
+ if (is_match) {
+ match = el;
+ }
+ return is_match;
+ },
+ callback: !$.isFunction(callback) ? $.noop : function() {
+ callback(match);
+ }
+ });
+ };
+ }
+
+ return opts;
+ },
+
+ // single
+ getPlaceholder: function() {
+ // if a placeholder is specified on a single select without a valid placeholder option ignore it
+ if (this.select) {
+ if (this.getPlaceholderOption() === undefined) {
+ return undefined;
+ }
+ }
+
+ return this.parent.getPlaceholder.apply(this, arguments);
+ },
+
+ // single
+ setPlaceholder: function () {
+ var placeholder = this.getPlaceholder();
+
+ if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
+
+ // check for a placeholder option if attached to a select
+ if (this.select && this.getPlaceholderOption() === undefined) return;
+
+ this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
+
+ this.selection.addClass("select2-default");
+
+ this.container.removeClass("select2-allowclear");
+ }
+ },
+
+ // single
+ postprocessResults: function (data, initial, noHighlightUpdate) {
+ var selected = 0, self = this, showSearchInput = true;
+
+ // find the selected element in the result list
+
+ this.findHighlightableChoices().each2(function (i, elm) {
+ if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
+ selected = i;
+ return false;
+ }
+ });
+
+ // and highlight it
+ if (noHighlightUpdate !== false) {
+ if (initial === true && selected >= 0) {
+ this.highlight(selected);
+ } else {
+ this.highlight(0);
+ }
+ }
+
+ // hide the search box if this is the first we got the results and there are enough of them for search
+
+ if (initial === true) {
+ var min = this.opts.minimumResultsForSearch;
+ if (min >= 0) {
+ this.showSearch(countResults(data.results) >= min);
+ }
+ }
+ },
+
+ // single
+ showSearch: function(showSearchInput) {
+ if (this.showSearchInput === showSearchInput) return;
+
+ this.showSearchInput = showSearchInput;
+
+ this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
+ this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
+ //add "select2-with-searchbox" to the container if search box is shown
+ $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
+ },
+
+ // single
+ onSelect: function (data, options) {
+
+ if (!this.triggerSelect(data)) { return; }
+
+ var old = this.opts.element.val(),
+ oldData = this.data();
+
+ this.opts.element.val(this.id(data));
+ this.updateSelection(data);
+
+ this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
+
+ this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
+ this.close();
+
+ if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
+ this.focusser.focus();
+ }
+
+ if (!equal(old, this.id(data))) {
+ this.triggerChange({ added: data, removed: oldData });
+ }
+ },
+
+ // single
+ updateSelection: function (data) {
+
+ var container=this.selection.find(".select2-chosen"), formatted, cssClass;
+
+ this.selection.data("select2-data", data);
+
+ container.empty();
+ if (data !== null) {
+ formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
+ }
+ if (formatted !== undefined) {
+ container.append(formatted);
+ }
+ cssClass=this.opts.formatSelectionCssClass(data, container);
+ if (cssClass !== undefined) {
+ container.addClass(cssClass);
+ }
+
+ this.selection.removeClass("select2-default");
+
+ if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
+ this.container.addClass("select2-allowclear");
+ }
+ },
+
+ // single
+ val: function () {
+ var val,
+ triggerChange = false,
+ data = null,
+ self = this,
+ oldData = this.data();
+
+ if (arguments.length === 0) {
+ return this.opts.element.val();
+ }
+
+ val = arguments[0];
+
+ if (arguments.length > 1) {
+ triggerChange = arguments[1];
+ }
+
+ if (this.select) {
+ this.select
+ .val(val)
+ .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
+ data = self.optionToData(elm);
+ return false;
+ });
+ this.updateSelection(data);
+ this.setPlaceholder();
+ if (triggerChange) {
+ this.triggerChange({added: data, removed:oldData});
+ }
+ } else {
+ // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
+ if (!val && val !== 0) {
+ this.clear(triggerChange);
+ return;
+ }
+ if (this.opts.initSelection === undefined) {
+ throw new Error("cannot call val() if initSelection() is not defined");
+ }
+ this.opts.element.val(val);
+ this.opts.initSelection(this.opts.element, function(data){
+ self.opts.element.val(!data ? "" : self.id(data));
+ self.updateSelection(data);
+ self.setPlaceholder();
+ if (triggerChange) {
+ self.triggerChange({added: data, removed:oldData});
+ }
+ });
+ }
+ },
+
+ // single
+ clearSearch: function () {
+ this.search.val("");
+ this.focusser.val("");
+ },
+
+ // single
+ data: function(value) {
+ var data,
+ triggerChange = false;
+
+ if (arguments.length === 0) {
+ data = this.selection.data("select2-data");
+ if (data == undefined) data = null;
+ return data;
+ } else {
+ if (arguments.length > 1) {
+ triggerChange = arguments[1];
+ }
+ if (!value) {
+ this.clear(triggerChange);
+ } else {
+ data = this.data();
+ this.opts.element.val(!value ? "" : this.id(value));
+ this.updateSelection(value);
+ if (triggerChange) {
+ this.triggerChange({added: value, removed:data});
+ }
+ }
+ }
+ }
+ });
+
+ MultiSelect2 = clazz(AbstractSelect2, {
+
+ // multi
+ createContainer: function () {
+ var container = $(document.createElement("div")).attr({
+ "class": "select2-container select2-container-multi"
+ }).html([
+ "<ul class='select2-choices'>",
+ " <li class='select2-search-field'>",
+ " <label for='' class='select2-offscreen'></label>",
+ " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
+ " </li>",
+ "</ul>",
+ "<div class='select2-drop select2-drop-multi select2-display-none'>",
+ " <ul class='select2-results'>",
+ " </ul>",
+ "</div>"].join(""));
+ return container;
+ },
+
+ // multi
+ prepareOpts: function () {
+ var opts = this.parent.prepareOpts.apply(this, arguments),
+ self=this;
+
+ // TODO validate placeholder is a string if specified
+
+ if (opts.element.get(0).tagName.toLowerCase() === "select") {
+ // install the selection initializer
+ opts.initSelection = function (element, callback) {
+
+ var data = [];
+
+ element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
+ data.push(self.optionToData(elm));
+ });
+ callback(data);
+ };
+ } else if ("data" in opts) {
+ // install default initSelection when applied to hidden input and data is local
+ opts.initSelection = opts.initSelection || function (element, callback) {
+ var ids = splitVal(element.val(), opts.separator);
+ //search in data by array of ids, storing matching items in a list
+ var matches = [];
+ opts.query({
+ matcher: function(term, text, el){
+ var is_match = $.grep(ids, function(id) {
+ return equal(id, opts.id(el));
+ }).length;
+ if (is_match) {
+ matches.push(el);
+ }
+ return is_match;
+ },
+ callback: !$.isFunction(callback) ? $.noop : function() {
+ // reorder matches based on the order they appear in the ids array because right now
+ // they are in the order in which they appear in data array
+ var ordered = [];
+ for (var i = 0; i < ids.length; i++) {
+ var id = ids[i];
+ for (var j = 0; j < matches.length; j++) {
+ var match = matches[j];
+ if (equal(id, opts.id(match))) {
+ ordered.push(match);
+ matches.splice(j, 1);
+ break;
+ }
+ }
+ }
+ callback(ordered);
+ }
+ });
+ };
+ }
+
+ return opts;
+ },
+
+ // multi
+ selectChoice: function (choice) {
+
+ var selected = this.container.find(".select2-search-choice-focus");
+ if (selected.length && choice && choice[0] == selected[0]) {
+
+ } else {
+ if (selected.length) {
+ this.opts.element.trigger("choice-deselected", selected);
+ }
+ selected.removeClass("select2-search-choice-focus");
+ if (choice && choice.length) {
+ this.close();
+ choice.addClass("select2-search-choice-focus");
+ this.opts.element.trigger("choice-selected", choice);
+ }
+ }
+ },
+
+ // multi
+ destroy: function() {
+ $("label[for='" + this.search.attr('id') + "']")
+ .attr('for', this.opts.element.attr("id"));
+ this.parent.destroy.apply(this, arguments);
+
+ cleanupJQueryElements.call(this,
+ "searchContainer",
+ "selection"
+ );
+ },
+
+ // multi
+ initContainer: function () {
+
+ var selector = ".select2-choices", selection;
+
+ this.searchContainer = this.container.find(".select2-search-field");
+ this.selection = selection = this.container.find(selector);
+
+ var _this = this;
+ this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) {
+ //killEvent(e);
+ _this.search[0].focus();
+ _this.selectChoice($(this));
+ });
+
+ // rewrite labels from original element to focusser
+ this.search.attr("id", "s2id_autogen"+nextUid());
+
+ this.search.prev()
+ .text($("label[for='" + this.opts.element.attr("id") + "']").text())
+ .attr('for', this.search.attr('id'));
+
+ this.search.on("input paste", this.bind(function() {
+ if (!this.isInterfaceEnabled()) return;
+ if (!this.opened()) {
+ this.open();
+ }
+ }));
+
+ this.search.attr("tabindex", this.elementTabIndex);
+
+ this.keydowns = 0;
+ this.search.on("keydown", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+
+ ++this.keydowns;
+ var selected = selection.find(".select2-search-choice-focus");
+ var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
+ var next = selected.next(".select2-search-choice:not(.select2-locked)");
+ var pos = getCursorInfo(this.search);
+
+ if (selected.length &&
+ (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
+ var selectedChoice = selected;
+ if (e.which == KEY.LEFT && prev.length) {
+ selectedChoice = prev;
+ }
+ else if (e.which == KEY.RIGHT) {
+ selectedChoice = next.length ? next : null;
+ }
+ else if (e.which === KEY.BACKSPACE) {
+ if (this.unselect(selected.first())) {
+ this.search.width(10);
+ selectedChoice = prev.length ? prev : next;
+ }
+ } else if (e.which == KEY.DELETE) {
+ if (this.unselect(selected.first())) {
+ this.search.width(10);
+ selectedChoice = next.length ? next : null;
+ }
+ } else if (e.which == KEY.ENTER) {
+ selectedChoice = null;
+ }
+
+ this.selectChoice(selectedChoice);
+ killEvent(e);
+ if (!selectedChoice || !selectedChoice.length) {
+ this.open();
+ }
+ return;
+ } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
+ || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
+
+ this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
+ killEvent(e);
+ return;
+ } else {
+ this.selectChoice(null);
+ }
+
+ if (this.opened()) {
+ switch (e.which) {
+ case KEY.UP:
+ case KEY.DOWN:
+ this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
+ killEvent(e);
+ return;
+ case KEY.ENTER:
+ this.selectHighlighted();
+ killEvent(e);
+ return;
+ case KEY.TAB:
+ this.selectHighlighted({noFocus:true});
+ this.close();
+ return;
+ case KEY.ESC:
+ this.cancel(e);
+ killEvent(e);
+ return;
+ }
+ }
+
+ if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
+ || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
+ return;
+ }
+
+ if (e.which === KEY.ENTER) {
+ if (this.opts.openOnEnter === false) {
+ return;
+ } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
+ return;
+ }
+ }
+
+ this.open();
+
+ if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
+ // prevent the page from scrolling
+ killEvent(e);
+ }
+
+ if (e.which === KEY.ENTER) {
+ // prevent form from being submitted
+ killEvent(e);
+ }
+
+ }));
+
+ this.search.on("keyup", this.bind(function (e) {
+ this.keydowns = 0;
+ this.resizeSearch();
+ })
+ );
+
+ this.search.on("blur", this.bind(function(e) {
+ this.container.removeClass("select2-container-active");
+ this.search.removeClass("select2-focused");
+ this.selectChoice(null);
+ if (!this.opened()) this.clearSearch();
+ e.stopImmediatePropagation();
+ this.opts.element.trigger($.Event("select2-blur"));
+ }));
+
+ this.container.on("click", selector, this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+ if ($(e.target).closest(".select2-search-choice").length > 0) {
+ // clicked inside a select2 search choice, do not open
+ return;
+ }
+ this.selectChoice(null);
+ this.clearPlaceholder();
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.Event("select2-focus"));
+ }
+ this.open();
+ this.focusSearch();
+ e.preventDefault();
+ }));
+
+ this.container.on("focus", selector, this.bind(function () {
+ if (!this.isInterfaceEnabled()) return;
+ if (!this.container.hasClass("select2-container-active")) {
+ this.opts.element.trigger($.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");
+
+ // set the placeholder if necessary
+ this.clearSearch();
+ },
+
+ // multi
+ enableInterface: function() {
+ if (this.parent.enableInterface.apply(this, arguments)) {
+ this.search.prop("disabled", !this.isInterfaceEnabled());
+ }
+ },
+
+ // multi
+ initSelection: function () {
+ var data;
+ if (this.opts.element.val() === "" && this.opts.element.text() === "") {
+ this.updateSelection([]);
+ this.close();
+ // set the placeholder if necessary
+ this.clearSearch();
+ }
+ if (this.select || this.opts.element.val() !== "") {
+ var self = this;
+ this.opts.initSelection.call(null, this.opts.element, function(data){
+ if (data !== undefined && data !== null) {
+ self.updateSelection(data);
+ self.close();
+ // set the placeholder if necessary
+ self.clearSearch();
+ }
+ });
+ }
+ },
+
+ // multi
+ clearSearch: function () {
+ var placeholder = this.getPlaceholder(),
+ maxWidth = this.getMaxSearchWidth();
+
+ if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
+ this.search.val(placeholder).addClass("select2-default");
+ // stretch the search box to full width of the container so as much of the placeholder is visible as possible
+ // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
+ this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
+ } else {
+ this.search.val("").width(10);
+ }
+ },
+
+ // multi
+ clearPlaceholder: function () {
+ if (this.search.hasClass("select2-default")) {
+ this.search.val("").removeClass("select2-default");
+ }
+ },
+
+ // multi
+ opening: function () {
+ this.clearPlaceholder(); // should be done before super so placeholder is not used to search
+ this.resizeSearch();
+
+ this.parent.opening.apply(this, arguments);
+
+ this.focusSearch();
+
+ // 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.updateResults(true);
+ if (this.opts.shouldFocusInput(this)) {
+ this.search.focus();
+ }
+ this.opts.element.trigger($.Event("select2-open"));
+ },
+
+ // multi
+ close: function () {
+ if (!this.opened()) return;
+ this.parent.close.apply(this, arguments);
+ },
+
+ // multi
+ focus: function () {
+ this.close();
+ this.search.focus();
+ },
+
+ // multi
+ isFocused: function () {
+ return this.search.hasClass("select2-focused");
+ },
+
+ // multi
+ updateSelection: function (data) {
+ var ids = [], filtered = [], self = this;
+
+ // filter out duplicates
+ $(data).each(function () {
+ if (indexOf(self.id(this), ids) < 0) {
+ ids.push(self.id(this));
+ filtered.push(this);
+ }
+ });
+ data = filtered;
+
+ this.selection.find(".select2-search-choice").remove();
+ $(data).each(function () {
+ self.addSelectedChoice(this);
+ });
+ self.postprocessResults();
+ },
+
+ // multi
+ tokenize: function() {
+ var input = this.search.val();
+ input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
+ if (input != null && input != undefined) {
+ this.search.val(input);
+ if (input.length > 0) {
+ this.open();
+ }
+ }
+
+ },
+
+ // multi
+ onSelect: function (data, options) {
+
+ if (!this.triggerSelect(data)) { return; }
+
+ this.addSelectedChoice(data);
+
+ this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
+
+ // keep track of the search's value before it gets cleared
+ this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
+
+ this.clearSearch();
+ this.updateResults();
+
+ if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
+
+ if (this.opts.closeOnSelect) {
+ this.close();
+ this.search.width(10);
+ } else {
+ if (this.countSelectableResults()>0) {
+ this.search.width(10);
+ this.resizeSearch();
+ if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
+ // if we reached max selection size repaint the results so choices
+ // are replaced with the max selection reached message
+ this.updateResults(true);
+ } else {
+ // initializes search's value with nextSearchTerm and update search result
+ if(this.nextSearchTerm != undefined){
+ this.search.val(this.nextSearchTerm);
+ this.updateResults();
+ this.search.select();
+ }
+ }
+ this.positionDropdown();
+ } else {
+ // if nothing left to select close
+ this.close();
+ this.search.width(10);
+ }
+ }
+
+ // since its not possible to select an element that has already been
+ // added we do not need to check if this is a new element before firing change
+ this.triggerChange({ added: data });
+
+ if (!options || !options.noFocus)
+ this.focusSearch();
+ },
+
+ // multi
+ cancel: function () {
+ this.close();
+ this.focusSearch();
+ },
+
+ addSelectedChoice: function (data) {
+ var enableChoice = !data.locked,
+ enabledItem = $(
+ "<li class='select2-search-choice'>" +
+ " <div></div>" +
+ " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
+ "</li>"),
+ disabledItem = $(
+ "<li class='select2-search-choice select2-locked'>" +
+ "<div></div>" +
+ "</li>");
+ var choice = enableChoice ? enabledItem : disabledItem,
+ id = this.id(data),
+ val = this.getVal(),
+ formatted,
+ cssClass;
+
+ formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
+ if (formatted != undefined) {
+ choice.find("div").replaceWith("<div>"+formatted+"</div>");
+ }
+ cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
+ if (cssClass != undefined) {
+ choice.addClass(cssClass);
+ }
+
+ if(enableChoice){
+ choice.find(".select2-search-choice-close")
+ .on("mousedown", killEvent)
+ .on("click dblclick", this.bind(function (e) {
+ if (!this.isInterfaceEnabled()) return;
+
+ this.unselect($(e.target));
+ this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
+ killEvent(e);
+ this.close();
+ this.focusSearch();
+ })).on("focus", this.bind(function () {
+ if (!this.isInterfaceEnabled()) return;
+ this.container.addClass("select2-container-active");
+ this.dropdown.addClass("select2-drop-active");
+ }));
+ }
+
+ choice.data("select2-data", data);
+ choice.insertBefore(this.searchContainer);
+
+ val.push(id);
+ this.setVal(val);
+ },
+
+ // multi
+ unselect: function (selected) {
+ var val = this.getVal(),
+ data,
+ index;
+ selected = selected.closest(".select2-search-choice");
+
+ if (selected.length === 0) {
+ throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
+ }
+
+ data = selected.data("select2-data");
+
+ if (!data) {
+ // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
+ // and invoked on an element already removed
+ return;
+ }
+
+ var evt = $.Event("select2-removing");
+ evt.val = this.id(data);
+ evt.choice = data;
+ this.opts.element.trigger(evt);
+
+ if (evt.isDefaultPrevented()) {
+ return false;
+ }
+
+ while((index = indexOf(this.id(data), val)) >= 0) {
+ val.splice(index, 1);
+ this.setVal(val);
+ if (this.select) this.postprocessResults();
+ }
+
+ selected.remove();
+
+ this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
+ this.triggerChange({ removed: data });
+
+ return true;
+ },
+
+ // multi
+ postprocessResults: function (data, initial, noHighlightUpdate) {
+ var val = this.getVal(),
+ choices = this.results.find(".select2-result"),
+ compound = this.results.find(".select2-result-with-children"),
+ self = this;
+
+ choices.each2(function (i, choice) {
+ var id = self.id(choice.data("select2-data"));
+ if (indexOf(id, val) >= 0) {
+ choice.addClass("select2-selected");
+ // mark all children of the selected parent as selected
+ choice.find(".select2-result-selectable").addClass("select2-selected");
+ }
+ });
+
+ compound.each2(function(i, choice) {
+ // hide an optgroup if it doesn't have any selectable children
+ if (!choice.is('.select2-result-selectable')
+ && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
+ choice.addClass("select2-selected");
+ }
+ });
+
+ if (this.highlight() == -1 && noHighlightUpdate !== false){
+ self.highlight(0);
+ }
+
+ //If all results are chosen render formatNoMatches
+ if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
+ if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
+ if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
+ this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.search.val()) + "</li>");
+ }
+ }
+ }
+
+ },
+
+ // multi
+ getMaxSearchWidth: function() {
+ return this.selection.width() - getSideBorderPadding(this.search);
+ },
+
+ // multi
+ resizeSearch: function () {
+ var minimumWidth, left, maxWidth, containerLeft, searchWidth,
+ sideBorderPadding = getSideBorderPadding(this.search);
+
+ minimumWidth = measureTextWidth(this.search) + 10;
+
+ left = this.search.offset().left;
+
+ maxWidth = this.selection.width();
+ containerLeft = this.selection.offset().left;
+
+ searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
+
+ if (searchWidth < minimumWidth) {
+ searchWidth = maxWidth - sideBorderPadding;
+ }
+
+ if (searchWidth < 40) {
+ searchWidth = maxWidth - sideBorderPadding;
+ }
+
+ if (searchWidth <= 0) {
+ searchWidth = minimumWidth;
+ }
+
+ this.search.width(Math.floor(searchWidth));
+ },
+
+ // multi
+ getVal: function () {
+ var val;
+ if (this.select) {
+ val = this.select.val();
+ return val === null ? [] : val;
+ } else {
+ val = this.opts.element.val();
+ return splitVal(val, this.opts.separator);
+ }
+ },
+
+ // multi
+ setVal: function (val) {
+ var unique;
+ if (this.select) {
+ this.select.val(val);
+ } else {
+ unique = [];
+ // filter out duplicates
+ $(val).each(function () {
+ if (indexOf(this, unique) < 0) unique.push(this);
+ });
+ this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
+ }
+ },
+
+ // multi
+ buildChangeDetails: function (old, current) {
+ var current = current.slice(0),
+ old = old.slice(0);
+
+ // remove intersection from each array
+ for (var i = 0; i < current.length; i++) {
+ for (var j = 0; j < old.length; j++) {
+ if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
+ current.splice(i, 1);
+ if(i>0){
+ i--;
+ }
+ old.splice(j, 1);
+ j--;
+ }
+ }
+ }
+
+ return {added: current, removed: old};
+ },
+
+
+ // multi
+ val: function (val, triggerChange) {
+ var oldData, self=this;
+
+ if (arguments.length === 0) {
+ return this.getVal();
+ }
+
+ oldData=this.data();
+ if (!oldData.length) oldData=[];
+
+ // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
+ if (!val && val !== 0) {
+ this.opts.element.val("");
+ this.updateSelection([]);
+ this.clearSearch();
+ if (triggerChange) {
+ this.triggerChange({added: this.data(), removed: oldData});
+ }
+ return;
+ }
+
+ // val is a list of ids
+ this.setVal(val);
+
+ if (this.select) {
+ this.opts.initSelection(this.select, this.bind(this.updateSelection));
+ if (triggerChange) {
+ this.triggerChange(this.buildChangeDetails(oldData, this.data()));
+ }
+ } else {
+ if (this.opts.initSelection === undefined) {
+ throw new Error("val() cannot be called if initSelection() is not defined");
+ }
+
+ this.opts.initSelection(this.opts.element, function(data){
+ var ids=$.map(data, self.id);
+ self.setVal(ids);
+ self.updateSelection(data);
+ self.clearSearch();
+ if (triggerChange) {
+ self.triggerChange(self.buildChangeDetails(oldData, self.data()));
+ }
+ });
+ }
+ this.clearSearch();
+ },
+
+ // multi
+ onSortStart: function() {
+ if (this.select) {
+ throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
+ }
+
+ // collapse search field into 0 width so its container can be collapsed as well
+ this.search.width(0);
+ // hide the container
+ this.searchContainer.hide();
+ },
+
+ // multi
+ onSortEnd:function() {
+
+ var val=[], self=this;
+
+ // show search and move it to the end of the list
+ this.searchContainer.show();
+ // make sure the search container is the last item in the list
+ this.searchContainer.appendTo(this.searchContainer.parent());
+ // since we collapsed the width in dragStarted, we resize it here
+ this.resizeSearch();
+
+ // update selection
+ this.selection.find(".select2-search-choice").each(function() {
+ val.push(self.opts.id($(this).data("select2-data")));
+ });
+ this.setVal(val);
+ this.triggerChange();
+ },
+
+ // multi
+ data: function(values, triggerChange) {
+ var self=this, ids, old;
+ if (arguments.length === 0) {
+ return this.selection
+ .children(".select2-search-choice")
+ .map(function() { return $(this).data("select2-data"); })
+ .get();
+ } else {
+ old = this.data();
+ if (!values) { values = []; }
+ ids = $.map(values, function(e) { return self.opts.id(e); });
+ this.setVal(ids);
+ this.updateSelection(values);
+ this.clearSearch();
+ if (triggerChange) {
+ this.triggerChange(this.buildChangeDetails(old, this.data()));
+ }
+ }
+ }
+ });
+
+ $.fn.select2 = function () {
+
+ var args = Array.prototype.slice.call(arguments, 0),
+ opts,
+ select2,
+ method, value, multiple,
+ allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
+ valueMethods = ["opened", "isFocused", "container", "dropdown"],
+ propertyMethods = ["val", "data"],
+ methodsMap = { search: "externalSearch" };
+
+ this.each(function () {
+ if (args.length === 0 || typeof(args[0]) === "object") {
+ opts = args.length === 0 ? {} : $.extend({}, args[0]);
+ opts.element = $(this);
+
+ if (opts.element.get(0).tagName.toLowerCase() === "select") {
+ multiple = opts.element.prop("multiple");
+ } else {
+ multiple = opts.multiple || false;
+ if ("tags" in opts) {opts.multiple = multiple = true;}
+ }
+
+ select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
+ select2.init(opts);
+ } else if (typeof(args[0]) === "string") {
+
+ if (indexOf(args[0], allowedMethods) < 0) {
+ throw "Unknown method: " + args[0];
+ }
+
+ value = undefined;
+ select2 = $(this).data("select2");
+ if (select2 === undefined) return;
+
+ method=args[0];
+
+ if (method === "container") {
+ value = select2.container;
+ } else if (method === "dropdown") {
+ value = select2.dropdown;
+ } else {
+ if (methodsMap[method]) method = methodsMap[method];
+
+ value = select2[method].apply(select2, args.slice(1));
+ }
+ if (indexOf(args[0], valueMethods) >= 0
+ || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
+ return false; // abort the iteration, ready to return first matched value
+ }
+ } else {
+ throw "Invalid arguments to select2 plugin: " + args;
+ }
+ });
+ return (value === undefined) ? this : value;
+ };
+
+ // plugin defaults, accessible to users
+ $.fn.select2.defaults = {
+ width: "copy",
+ loadMorePadding: 0,
+ closeOnSelect: true,
+ openOnEnter: true,
+ containerCss: {},
+ dropdownCss: {},
+ containerCssClass: "",
+ dropdownCssClass: "",
+ formatResult: function(result, container, query, escapeMarkup) {
+ var markup=[];
+ markMatch(result.text, query.term, markup, escapeMarkup);
+ return markup.join("");
+ },
+ formatSelection: function (data, container, escapeMarkup) {
+ return data ? escapeMarkup(data.text) : undefined;
+ },
+ sortResults: function (results, container, query) {
+ return results;
+ },
+ formatResultCssClass: function(data) {return data.css;},
+ formatSelectionCssClass: function(data, container) {return undefined;},
+ formatMatches: function (matches) { 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 + " 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…"; },
+ minimumResultsForSearch: 0,
+ minimumInputLength: 0,
+ maximumInputLength: null,
+ maximumSelectionSize: 0,
+ id: function (e) { return e == undefined ? null : e.id; },
+ matcher: function(term, text) {
+ return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
+ },
+ separator: ",",
+ tokenSeparators: [],
+ tokenizer: defaultTokenizer,
+ escapeMarkup: defaultEscapeMarkup,
+ blurOnChange: false,
+ selectOnBlur: false,
+ adaptContainerCssClass: function(c) { return c; },
+ adaptDropdownCssClass: function(c) { return null; },
+ nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
+ searchInputPlaceholder: '',
+ createSearchChoicePosition: 'top',
+ shouldFocusInput: function (instance) {
+ // Attempt to detect touch devices
+ var supportsTouchEvents = (('ontouchstart' in window) ||
+ (navigator.msMaxTouchPoints > 0));
+
+ // Only devices which support touch events should be special cased
+ if (!supportsTouchEvents) {
+ return true;
+ }
+
+ // Never focus the input if search is disabled
+ if (instance.opts.minimumResultsForSearch < 0) {
+ return false;
+ }
+
+ return true;
+ }
+ };
+
+ $.fn.select2.ajaxDefaults = {
+ transport: $.ajax,
+ params: {
+ type: "GET",
+ cache: false,
+ dataType: "json"
+ }
+ };
+
+ // exports
+ window.Select2 = {
+ query: {
+ ajax: ajax,
+ local: local,
+ tags: tags
+ }, util: {
+ debounce: debounce,
+ markMatch: markMatch,
+ escapeMarkup: defaultEscapeMarkup,
+ stripDiacritics: stripDiacritics
+ }, "class": {
+ "abstract": AbstractSelect2,
+ "single": SingleSelect2,
+ "multi": MultiSelect2
+ }
+ };
+
+}(jQuery));
diff --git a/core/js/select2/select2_locale_ar.js b/core/js/select2/select2_locale_ar.js
new file mode 100644
index 00000000000..acb33a2f6ad
--- /dev/null
+++ b/core/js/select2/select2_locale_ar.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Arabic translation.
+ *
+ * Author: Adel KEDJOUR <adel@kedjour.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 + " إختيارات فقط"; },
+ formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; },
+ formatSearching: function () { return "البحث…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_bg.js b/core/js/select2/select2_locale_bg.js
new file mode 100644
index 00000000000..585d28a2b0b
--- /dev/null
+++ b/core/js/select2/select2_locale_bg.js
@@ -0,0 +1,18 @@
+/**
+ * Select2 Bulgarian translation.
+ *
+ * @author Lubomir Vikev <lubomirvikev@gmail.com>
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "Търсене…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_ca.js b/core/js/select2/select2_locale_ca.js
new file mode 100644
index 00000000000..7e19d3ce966
--- /dev/null
+++ b/core/js/select2/select2_locale_ca.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Catalan translation.
+ *
+ * Author: David Planella <david.planella@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_cs.js b/core/js/select2/select2_locale_cs.js
new file mode 100644
index 00000000000..376b54a1352
--- /dev/null
+++ b/core/js/select2/select2_locale_cs.js
@@ -0,0 +1,49 @@
+/**
+ * Select2 Czech translation.
+ *
+ * Author: Michal Marek <ahoj@michal-marek.cz>
+ * Author - sklonovani: David Vallner <david@vallner.net>
+ */
+(function ($) {
+ "use strict";
+ // use text for the numbers 2 through 4
+ var smallNumbers = {
+ 2: function(masc) { return (masc ? "dva" : "dvě"); },
+ 3: function() { return "tři"; },
+ 4: function() { return "čtyři"; }
+ }
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () { return "Nenalezeny žádné položky"; },
+ formatInputTooShort: function (input, min) {
+ var n = min - input.length;
+ if (n == 1) {
+ return "Prosím zadejte ještě jeden znak";
+ } else if (n <= 4) {
+ return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky";
+ } else {
+ return "Prosím zadejte ještě dalších "+n+" znaků";
+ }
+ },
+ formatInputTooLong: function (input, max) {
+ var n = input.length - max;
+ if (n == 1) {
+ return "Prosím zadejte o jeden znak méně";
+ } else if (n <= 4) {
+ return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně";
+ } else {
+ return "Prosím zadejte o "+n+" znaků méně";
+ }
+ },
+ formatSelectionTooBig: function (limit) {
+ if (limit == 1) {
+ return "Můžete zvolit jen jednu položku";
+ } else if (limit <= 4) {
+ return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky";
+ } else {
+ return "Můžete zvolit maximálně "+limit+" položek";
+ }
+ },
+ formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; },
+ formatSearching: function () { return "Vyhledávání…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_da.js b/core/js/select2/select2_locale_da.js
new file mode 100644
index 00000000000..dbce3e1748d
--- /dev/null
+++ b/core/js/select2/select2_locale_da.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Danish translation.
+ *
+ * Author: Anders Jenbo <anders@jenbo.dk>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_de.js b/core/js/select2/select2_locale_de.js
new file mode 100644
index 00000000000..93b18e81f85
--- /dev/null
+++ b/core/js/select2/select2_locale_de.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 German translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery); \ No newline at end of file
diff --git a/core/js/select2/select2_locale_el.js b/core/js/select2/select2_locale_el.js
new file mode 100644
index 00000000000..e94b02cbc5f
--- /dev/null
+++ b/core/js/select2/select2_locale_el.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Greek translation.
+ *
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "Αναζήτηση…"; }
+ });
+})(jQuery); \ No newline at end of file
diff --git a/core/js/select2/select2_locale_en.js.template b/core/js/select2/select2_locale_en.js.template
new file mode 100644
index 00000000000..f66bcc844db
--- /dev/null
+++ b/core/js/select2/select2_locale_en.js.template
@@ -0,0 +1,18 @@
+/**
+ * Select2 <Language> translation.
+ *
+ * Author: Your Name <your@email>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatMatches: function (matches) { 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"); },
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_es.js b/core/js/select2/select2_locale_es.js
new file mode 100644
index 00000000000..f2b581791eb
--- /dev/null
+++ b/core/js/select2/select2_locale_es.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Spanish translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_et.js b/core/js/select2/select2_locale_et.js
new file mode 100644
index 00000000000..a4045d22df7
--- /dev/null
+++ b/core/js/select2/select2_locale_et.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Estonian translation.
+ *
+ * Author: Kuldar Kalvik <kuldar@kalvik.ee>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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.."; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_eu.js b/core/js/select2/select2_locale_eu.js
new file mode 100644
index 00000000000..1da1a709481
--- /dev/null
+++ b/core/js/select2/select2_locale_eu.js
@@ -0,0 +1,43 @@
+/**
+ * Select2 Basque translation.
+ *
+ * Author: Julen Ruiz Aizpuru <julenx at gmail dot com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () {
+ return "Ez da bat datorrenik aurkitu";
+ },
+ formatInputTooShort: function (input, min) {
+ var n = min - input.length;
+ if (n === 1) {
+ return "Idatzi karaktere bat gehiago";
+ } else {
+ return "Idatzi " + n + " karaktere gehiago";
+ }
+ },
+ formatInputTooLong: function (input, max) {
+ var n = input.length - max;
+ if (n === 1) {
+ return "Idatzi karaktere bat gutxiago";
+ } else {
+ return "Idatzi " + n + " karaktere gutxiago";
+ }
+ },
+ formatSelectionTooBig: function (limit) {
+ if (limit === 1 ) {
+ return "Elementu bakarra hauta dezakezu";
+ } else {
+ return limit + " elementu hauta ditzakezu soilik";
+ }
+ },
+ formatLoadMore: function (pageNumber) {
+ return "Emaitza gehiago kargatzen…";
+ },
+ formatSearching: function () {
+ return "Bilatzen…";
+ }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_fa.js b/core/js/select2/select2_locale_fa.js
new file mode 100644
index 00000000000..a9e95af4dba
--- /dev/null
+++ b/core/js/select2/select2_locale_fa.js
@@ -0,0 +1,19 @@
+/**
+ * Select2 Persian translation.
+ *
+ * Author: Ali Choopan <choopan@arsh.co>
+ * Author: Ebrahim Byagowi <ebrahim@gnu.org>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; },
+ 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 "در حال جستجو…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_fi.js b/core/js/select2/select2_locale_fi.js
new file mode 100644
index 00000000000..9bed310f717
--- /dev/null
+++ b/core/js/select2/select2_locale_fi.js
@@ -0,0 +1,28 @@
+/**
+ * Select2 Finnish translation
+ */
+(function ($) {
+ "use strict";
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () {
+ return "Ei tuloksia";
+ },
+ formatInputTooShort: function (input, min) {
+ var n = min - input.length;
+ return "Ole hyvä ja anna " + n + " merkkiä lisää";
+ },
+ formatInputTooLong: function (input, max) {
+ var n = input.length - max;
+ return "Ole hyvä ja anna " + n + " merkkiä vähemmän";
+ },
+ formatSelectionTooBig: function (limit) {
+ return "Voit valita ainoastaan " + limit + " kpl";
+ },
+ formatLoadMore: function (pageNumber) {
+ return "Ladataan lisää tuloksia…";
+ },
+ formatSearching: function () {
+ return "Etsitään…";
+ }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_fr.js b/core/js/select2/select2_locale_fr.js
new file mode 100644
index 00000000000..9afda2abdcd
--- /dev/null
+++ b/core/js/select2/select2_locale_fr.js
@@ -0,0 +1,16 @@
+/**
+ * Select2 French translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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"); },
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_gl.js b/core/js/select2/select2_locale_gl.js
new file mode 100644
index 00000000000..80326320bf0
--- /dev/null
+++ b/core/js/select2/select2_locale_gl.js
@@ -0,0 +1,43 @@
+/**
+ * Select2 Galician translation
+ *
+ * Author: Leandro Regueiro <leandro.regueiro@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () {
+ return "Non se atoparon resultados";
+ },
+ formatInputTooShort: function (input, min) {
+ var n = min - input.length;
+ if (n === 1) {
+ return "Engada un carácter";
+ } else {
+ return "Engada " + n + " caracteres";
+ }
+ },
+ formatInputTooLong: function (input, max) {
+ var n = input.length - max;
+ if (n === 1) {
+ return "Elimine un carácter";
+ } else {
+ return "Elimine " + n + " caracteres";
+ }
+ },
+ formatSelectionTooBig: function (limit) {
+ if (limit === 1 ) {
+ return "Só pode seleccionar un elemento";
+ } else {
+ return "Só pode seleccionar " + limit + " elementos";
+ }
+ },
+ formatLoadMore: function (pageNumber) {
+ return "Cargando máis resultados…";
+ },
+ formatSearching: function () {
+ return "Buscando…";
+ }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_he.js b/core/js/select2/select2_locale_he.js
new file mode 100644
index 00000000000..00385410804
--- /dev/null
+++ b/core/js/select2/select2_locale_he.js
@@ -0,0 +1,17 @@
+/**
+* Select2 Hebrew translation.
+*
+* Author: Yakir Sitbon <http://www.yakirs.net/>
+*/
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "מחפש…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_hr.js b/core/js/select2/select2_locale_hr.js
new file mode 100644
index 00000000000..c29372524b6
--- /dev/null
+++ b/core/js/select2/select2_locale_hr.js
@@ -0,0 +1,22 @@
+/**
+ * Select2 Croatian translation.
+ *
+ * @author Edi Modrić <edi.modric@gmail.com>
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+
+ function character (n) {
+ return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova");
+ }
+})(jQuery);
diff --git a/core/js/select2/select2_locale_hu.js b/core/js/select2/select2_locale_hu.js
new file mode 100644
index 00000000000..a8c30881928
--- /dev/null
+++ b/core/js/select2/select2_locale_hu.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Hungarian translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_id.js b/core/js/select2/select2_locale_id.js
new file mode 100644
index 00000000000..547454079ba
--- /dev/null
+++ b/core/js/select2/select2_locale_id.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Indonesian translation.
+ *
+ * Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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"); },
+ formatLoadMore: function (pageNumber) { return "Mengambil data…"; },
+ formatSearching: function () { return "Mencari…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_is.js b/core/js/select2/select2_locale_is.js
new file mode 100644
index 00000000000..aecc6cd7194
--- /dev/null
+++ b/core/js/select2/select2_locale_is.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Icelandic translation.
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_it.js b/core/js/select2/select2_locale_it.js
new file mode 100644
index 00000000000..d4e24de7000
--- /dev/null
+++ b/core/js/select2/select2_locale_it.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Italian translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery); \ No newline at end of file
diff --git a/core/js/select2/select2_locale_ja.js b/core/js/select2/select2_locale_ja.js
new file mode 100644
index 00000000000..81106e78a80
--- /dev/null
+++ b/core/js/select2/select2_locale_ja.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Japanese translation.
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "検索中・・・"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_ka.js b/core/js/select2/select2_locale_ka.js
new file mode 100644
index 00000000000..366cc2d9c4d
--- /dev/null
+++ b/core/js/select2/select2_locale_ka.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Georgian (Kartuli) translation.
+ *
+ * Author: Dimitri Kurashvili dimakura@gmail.com
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "ძებნა…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_ko.js b/core/js/select2/select2_locale_ko.js
new file mode 100644
index 00000000000..1a84d21eae6
--- /dev/null
+++ b/core/js/select2/select2_locale_ko.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Korean translation.
+ *
+ * @author Swen Mun <longfinfunnel@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "검색 중…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_lt.js b/core/js/select2/select2_locale_lt.js
new file mode 100644
index 00000000000..2e2f950b00d
--- /dev/null
+++ b/core/js/select2/select2_locale_lt.js
@@ -0,0 +1,24 @@
+/**
+ * Select2 Lithuanian translation.
+ *
+ * @author CRONUS Karmalakas <cronus dot karmalakas at gmail dot com>
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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); },
+ formatSelectionTooBig: function (limit) {
+ return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą");
+ },
+ formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; },
+ formatSearching: function () { return "Ieškoma…"; }
+ });
+
+ function character (n) {
+ return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į");
+ }
+})(jQuery);
diff --git a/core/js/select2/select2_locale_lv.js b/core/js/select2/select2_locale_lv.js
new file mode 100644
index 00000000000..b300ec770f4
--- /dev/null
+++ b/core/js/select2/select2_locale_lv.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Latvian translation.
+ *
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_mk.js b/core/js/select2/select2_locale_mk.js
new file mode 100644
index 00000000000..513562c51bf
--- /dev/null
+++ b/core/js/select2/select2_locale_mk.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Macedonian translation.
+ *
+ * Author: Marko Aleksic <psybaron@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "Пребарување…"; }
+ });
+})(jQuery); \ No newline at end of file
diff --git a/core/js/select2/select2_locale_ms.js b/core/js/select2/select2_locale_ms.js
new file mode 100644
index 00000000000..262042aab15
--- /dev/null
+++ b/core/js/select2/select2_locale_ms.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Malay translation.
+ *
+ * Author: Kepoweran <kepoweran@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_nl.js b/core/js/select2/select2_locale_nl.js
new file mode 100644
index 00000000000..5b5c4156ce1
--- /dev/null
+++ b/core/js/select2/select2_locale_nl.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Dutch translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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"; },
+ 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
diff --git a/core/js/select2/select2_locale_no.js b/core/js/select2/select2_locale_no.js
new file mode 100644
index 00000000000..ab61c082a02
--- /dev/null
+++ b/core/js/select2/select2_locale_no.js
@@ -0,0 +1,18 @@
+/**
+ * Select2 Norwegian translation.
+ *
+ * Author: Torgeir Veimo <torgeir.veimo@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
+
diff --git a/core/js/select2/select2_locale_pl.js b/core/js/select2/select2_locale_pl.js
new file mode 100644
index 00000000000..75054e76578
--- /dev/null
+++ b/core/js/select2/select2_locale_pl.js
@@ -0,0 +1,22 @@
+/**
+ * Select2 Polish translation.
+ *
+ * @author Jan Kondratowicz <jan@kondratowicz.pl>
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(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…"; }
+ });
+
+ function character (n, word, pluralSuffix) {
+ return " " + n + " " + word + (n == 1 ? "" : n%10 < 5 && n%10 > 1 && (n%100 < 5 || n%100 > 20) ? pluralSuffix : "ów");
+ }
+})(jQuery);
diff --git a/core/js/select2/select2_locale_pt-BR.js b/core/js/select2/select2_locale_pt-BR.js
new file mode 100644
index 00000000000..ac4969acfbb
--- /dev/null
+++ b/core/js/select2/select2_locale_pt-BR.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Brazilian Portuguese translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () { return "Nenhum resultado encontrado"; },
+ formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_pt-PT.js b/core/js/select2/select2_locale_pt-PT.js
new file mode 100644
index 00000000000..cced7cf3ec1
--- /dev/null
+++ b/core/js/select2/select2_locale_pt-PT.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Portuguese (Portugal) translation
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_ro.js b/core/js/select2/select2_locale_ro.js
new file mode 100644
index 00000000000..87eca4cf740
--- /dev/null
+++ b/core/js/select2/select2_locale_ro.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Romanian translation.
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_rs.js b/core/js/select2/select2_locale_rs.js
new file mode 100644
index 00000000000..300c01bc5e5
--- /dev/null
+++ b/core/js/select2/select2_locale_rs.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Serbian translation.
+ *
+ * @author Limon Monte <limon.monte@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_ru.js b/core/js/select2/select2_locale_ru.js
new file mode 100644
index 00000000000..0f45ce0dddf
--- /dev/null
+++ b/core/js/select2/select2_locale_ru.js
@@ -0,0 +1,21 @@
+/**
+ * Select2 Russian translation.
+ *
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatNoMatches: function () { return "Совпадений не найдено"; },
+ 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 "Поиск…"; }
+ });
+
+ function character (n) {
+ return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов");
+ }
+})(jQuery);
diff --git a/core/js/select2/select2_locale_sk.js b/core/js/select2/select2_locale_sk.js
new file mode 100644
index 00000000000..772f304aca9
--- /dev/null
+++ b/core/js/select2/select2_locale_sk.js
@@ -0,0 +1,48 @@
+/**
+ * Select2 Slovak translation.
+ *
+ * Author: David Vallner <david@vallner.net>
+ */
+(function ($) {
+ "use strict";
+ // use text for the numbers 2 through 4
+ var smallNumbers = {
+ 2: function(masc) { return (masc ? "dva" : "dve"); },
+ 3: function() { return "tri"; },
+ 4: function() { return "štyri"; }
+ }
+ $.extend($.fn.select2.defaults, {
+ 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";
+ } else if (n <= 4) {
+ return "Prosím zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky";
+ } else {
+ 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";
+ } else {
+ 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) {
+ return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky";
+ } else {
+ return "Môžete zvoliť najviac "+limit+" položiek";
+ }
+ },
+ formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; },
+ formatSearching: function () { return "Vyhľadávanie…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_sv.js b/core/js/select2/select2_locale_sv.js
new file mode 100644
index 00000000000..d611189a593
--- /dev/null
+++ b/core/js/select2/select2_locale_sv.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Swedish translation.
+ *
+ * Author: Jens Rantil <jens.rantil@telavox.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_th.js b/core/js/select2/select2_locale_th.js
new file mode 100644
index 00000000000..df59bdac36d
--- /dev/null
+++ b/core/js/select2/select2_locale_th.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Thai translation.
+ *
+ * Author: Atsawin Chaowanakritsanakul <joke@nakhon.net>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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 "กำลังค้นข้อมูล…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_tr.js b/core/js/select2/select2_locale_tr.js
new file mode 100644
index 00000000000..f834dad2b89
--- /dev/null
+++ b/core/js/select2/select2_locale_tr.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Turkish translation.
+ *
+ * Author: Salim KAYABAŞI <salim.kayabasi@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_uk.js b/core/js/select2/select2_locale_uk.js
new file mode 100644
index 00000000000..8d31a056080
--- /dev/null
+++ b/core/js/select2/select2_locale_uk.js
@@ -0,0 +1,23 @@
+/**
+ * Select2 Ukrainian translation.
+ *
+ * @author bigmihail <bigmihail@bigmir.net>
+ * @author Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; },
+ formatNoMatches: function () { return "Нічого не знайдено"; },
+ formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); },
+ formatInputTooLong: function (input, max) { return "Введіть буль ласка на " + character(input.length - max, "символ") + " менше"; },
+ formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); },
+ formatLoadMore: function (pageNumber) { return "Завантаження даних…"; },
+ formatSearching: function () { return "Пошук…"; }
+ });
+
+ function character (n, word) {
+ return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів");
+ }
+})(jQuery);
diff --git a/core/js/select2/select2_locale_vi.js b/core/js/select2/select2_locale_vi.js
new file mode 100644
index 00000000000..5dbc275361f
--- /dev/null
+++ b/core/js/select2/select2_locale_vi.js
@@ -0,0 +1,18 @@
+/**
+ * Select2 Vietnamese translation.
+ *
+ * Author: Long Nguyen <olragon@gmail.com>
+ */
+(function ($) {
+ "use strict";
+
+ $.extend($.fn.select2.defaults, {
+ 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"); },
+ formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; },
+ formatSearching: function () { return "Đang tìm…"; }
+ });
+})(jQuery);
+
diff --git a/core/js/select2/select2_locale_zh-CN.js b/core/js/select2/select2_locale_zh-CN.js
new file mode 100644
index 00000000000..6add3c52518
--- /dev/null
+++ b/core/js/select2/select2_locale_zh-CN.js
@@ -0,0 +1,14 @@
+/**
+ * Select2 Chinese translation
+ */
+(function ($) {
+ "use strict";
+ $.extend($.fn.select2.defaults, {
+ 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 "搜索中…"; }
+ });
+})(jQuery);
diff --git a/core/js/select2/select2_locale_zh-TW.js b/core/js/select2/select2_locale_zh-TW.js
new file mode 100755
index 00000000000..f072381faae
--- /dev/null
+++ b/core/js/select2/select2_locale_zh-TW.js
@@ -0,0 +1,14 @@
+/**
+ * Select2 Traditional Chinese translation
+ */
+(function ($) {
+ "use strict";
+ $.extend($.fn.select2.defaults, {
+ 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 "搜尋中…"; }
+ });
+})(jQuery);
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
new file mode 100644
index 00000000000..f351c1b451a
--- /dev/null
+++ b/core/js/setupchecks.js
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2014
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+ OC.SetupChecks = {
+ /**
+ * Check whether the WebDAV connection works.
+ *
+ * @return $.Deferred object resolved with an array of error messages
+ */
+ checkWebDAV: function() {
+ var deferred = $.Deferred();
+ var afterCall = function(xhr) {
+ var messages = [];
+ if (xhr.status !== 207 && xhr.status !== 401) {
+ messages.push(
+ t('core', 'Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken.')
+ );
+ }
+ deferred.resolve(messages);
+ };
+
+ $.ajax({
+ type: 'PROPFIND',
+ url: OC.linkToRemoteBase('webdav'),
+ data: '<?xml version="1.0"?>' +
+ '<d:propfind xmlns:d="DAV:">' +
+ '<d:prop><d:resourcetype/></d:prop>' +
+ '</d:propfind>',
+ complete: afterCall
+ });
+ return deferred.promise();
+ },
+
+ /**
+ * Runs setup checks on the server side
+ *
+ * @return $.Deferred object resolved with an array of error messages
+ */
+ checkSetup: function() {
+ var deferred = $.Deferred();
+ var afterCall = function(data, statusText, xhr) {
+ var messages = [];
+ if (xhr.status === 200 && data) {
+ if (!data.serverhasinternetconnection) {
+ messages.push(
+ t('core', 'This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features.')
+ );
+ }
+ } else {
+ messages.push(t('core', 'Error occurred while checking server setup'));
+ }
+ deferred.resolve(messages);
+ };
+
+ $.ajax({
+ type: 'GET',
+ url: OC.generateUrl('settings/ajax/checksetup')
+ }).then(afterCall, afterCall);
+ return deferred.promise();
+ }
+ };
+})();
+
diff --git a/core/js/visitortimezone.js b/core/js/visitortimezone.js
index 9146e00aade..e6e99ee7e20 100644
--- a/core/js/visitortimezone.js
+++ b/core/js/visitortimezone.js
@@ -1,6 +1,7 @@
+/* global jstz */
$(document).ready(function () {
- var visitortimezone = (-new Date().getTimezoneOffset() / 60);
- $('#timezone-offset').val(visitortimezone);
+ $('#timezone-offset').val((-new Date().getTimezoneOffset() / 60));
+ $('#timezone').val(jstz.determine().name());
// only enable the submit button once we are sure that the timezone is set
var $loginForm = $('form[name="login"]');
diff --git a/core/l10n/af_ZA.php b/core/l10n/af_ZA.php
index 6bdbfe50be2..404c7195c07 100644
--- a/core/l10n/af_ZA.php
+++ b/core/l10n/af_ZA.php
@@ -1,12 +1,20 @@
<?php
$TRANSLATIONS = array(
+"Couldn't send mail to following users: %s " => "Kon nie e-pos aan die volgende gebruikers stuur nie: %s",
"Turned on maintenance mode" => "Instandhouding aangeskakel",
"Turned off maintenance mode" => "Instandhouding uitgeskakel",
+"Updated database" => "Databasis opgedateer",
+"Checked database schema update" => "Databasis skema opdatering nagegaan",
+"Checked database schema update for apps" => "Databasis skema opdatering nagegaan vir sagteware",
+"Updated \"%s\" to %s" => "\"%s\" opgedateer na %s",
+"Disabled incompatible apps: %s" => "Onversoenbare sagteware onaktief gemaak: %s",
"No image or file provided" => "Geen prent of lêer voorsien",
-"Unknown filetype" => "Onbekende leertipe",
+"Unknown filetype" => "Onbekende lêertipe",
+"Invalid image" => "Ongeldige prent",
"No temporary profile picture available, try again" => "Geen tydelike profiel foto beskikbaar nie, probeer weer",
+"No crop data provided" => "Geen \"crop\" data verskaf",
"Sunday" => "Sondag",
-"Monday" => "Mandag",
+"Monday" => "Maandag",
"Tuesday" => "Dinsdag",
"Wednesday" => "Woensdag",
"Thursday" => "Donderdag",
@@ -25,16 +33,25 @@ $TRANSLATIONS = array(
"November" => "November",
"December" => "Desember",
"Settings" => "Instellings",
+"File" => "Lêer",
+"Folder" => "Omslag",
+"Image" => "Prent",
+"Audio" => "Audio",
"Saving..." => "Stoor...",
+"Couldn't send reset email. Please contact your administrator." => "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.",
+"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." => "Die \"link\" vir die herstel van jou wagwoord is na jou epos gestuur. As jy dit nie binne 'n redelike tyd ontvang nie, soek deur jou \"spam/junk\" omslagte.<br>As dit nie daar is nie vra jou administrateur vir hulp.",
+"I know what I'm doing" => "Ek weet wat ek doen",
"Reset password" => "Herstel wagwoord",
+"Password can not be changed. Please contact your administrator." => "Wagwoord kan nie verander word nie. Kontak asseblief jou stelsel administrateur.",
"No" => "Nee",
"Yes" => "Ja",
"Choose" => "Kies",
"Ok" => "OK",
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
-"New Files" => "Nuwe leêrs",
-"Already existing files" => "Bestaande leêrs",
-"Cancel" => "Kanseleer",
+"One file conflict" => "Een lêer konflik",
+"New Files" => "Nuwe lêers",
+"Already existing files" => "Bestaande lêers",
+"Cancel" => "Kanselleer",
"Continue" => "Gaan voort",
"Very weak password" => "Baie swak wagwoord",
"Weak password" => "Swak wagwoord",
@@ -56,7 +73,7 @@ $TRANSLATIONS = array(
"Set expiration date" => "Stel verval datum",
"Expiration date" => "Verval datum",
"group" => "groep",
-"Resharing is not allowed" => "Hernieu deel is nie toegelaat nie ",
+"Resharing is not allowed" => "Herdeling is nie toegelaat nie ",
"Shared in {item} with {user}" => "Gedeel in {item} met {user}",
"Unshare" => "Deel terug neem",
"can edit" => "kan wysig",
@@ -86,15 +103,14 @@ $TRANSLATIONS = array(
"Admin" => "Admin",
"Help" => "Hulp",
"Access forbidden" => "Toegang verbode",
-"Cloud not found" => "Wolk nie gevind",
"Security Warning" => "Sekuriteits waarskuwing",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Jou PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)",
-"Please update your PHP installation to use %s securely." => "Opdateer asseblief jou PHP instelasie om %s veilig te gebruik",
-"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." => "Jou data gids en leers is moontlik toeganklik vanaf die internet omdat die .htaccess leer nie werk nie.",
+"Please update your PHP installation to use %s securely." => "Opdateer asseblief jou PHP installasie om %s veilig te gebruik",
+"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." => "Jou data gids en lêers is moontlik toeganklik vanaf die internet omdat die .htaccess lêer nie werk nie.",
"For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." => "Vir inligting oor hoe om jou bediener behoorlik op te stel, sien asseblief die<a href=\"%s\" target=\"_blank\">dokumentasie</a>.",
"Create an <strong>admin account</strong>" => "Skep `n <strong>admin-rekening</strong>",
"Password" => "Wagwoord",
-"Data folder" => "Data vouer",
+"Data folder" => "Data omslag",
"Configure the database" => "Stel databasis op",
"Database user" => "Databasis-gebruiker",
"Database password" => "Databasis-wagwoord",
diff --git a/core/l10n/ar.php b/core/l10n/ar.php
index 3f1d2854181..0f1f613b801 100644
--- a/core/l10n/ar.php
+++ b/core/l10n/ar.php
@@ -37,6 +37,8 @@ $TRANSLATIONS = array(
"Weak password" => "كلمة السر ضعيفة",
"Good password" => "كلمة السر جيدة",
"Strong password" => "كلمة السر قوية",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "اعدادات خادمك غير صحيحة بشكل تسمح لك بمزامنة ملفاتك وذلك بسبب أن واجهة WebDAV تبدو معطلة",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "هذا الخادم لا يوجد لدية اتصال انترنت. هذا يعني ان بعض الميزات مثل mounting التخزين الخارجي , تنبيهات عن التحديثات او تنزيلات برامج الطرف الثالث3 لا تعمل. الدخول للملفات البعيدة و ارسال تنبيهات البريد الالكتروني ممكن ان لا تعمل ايضا. نحن نقترح بتفعيل اتصال الانترنت لهذا الخادم لتتمكن من الاستفادة من كل الميزات",
"Shared" => "مشارك",
"Share" => "شارك",
"Error" => "خطأ",
@@ -84,7 +86,6 @@ $TRANSLATIONS = array(
"Admin" => "المدير",
"Help" => "المساعدة",
"Access forbidden" => "التوصّل محظور",
-"Cloud not found" => "لم يتم إيجاد",
"Security Warning" => "تحذير أمان",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "يرجى تحديث نسخة PHP لاستخدام %s بطريقة آمنة",
diff --git a/core/l10n/ast.php b/core/l10n/ast.php
index 40812610133..43ea5f16b34 100644
--- a/core/l10n/ast.php
+++ b/core/l10n/ast.php
@@ -65,6 +65,8 @@ $TRANSLATIONS = array(
"So-so password" => "Contraseña pasable",
"Good password" => "Contraseña bona",
"Strong password" => "Contraseña mui bona",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "El to sirvidor web entá nun ta configuráu afayadizamente pa permitir la sincronización de ficheros porque la interfaz WebDAV paez tar rota.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Esti sirvidor nun tien conexón a Internet. Esto significa que dalgunes de les carauterístiques nun van funcionar, como'l montaxe d'almacenamiento esternu, les notificaciones sobre anovamientos, la instalación d'aplicaciones de terceros, l'accesu a los ficheros de mou remotu o l'unviu de correos-e de notificación. Suxerimos habilitar una conexón a Internet nesti sirvidor pa esfrutar de toles funciones.",
"Shared" => "Compartíu",
"Shared with {recipients}" => "Compartío con {recipients}",
"Share" => "Compartir",
@@ -139,7 +141,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Fallu al marcar favoritos",
"Error unfavoriting" => "Fallu al desmarcar favoritos",
"Access forbidden" => "Accesu denegáu",
-"Cloud not found" => "Ñube non atopada",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hola, ¿qué hai?\n\nnamái déxanos dicite que %s compartió %s contigo.\nVelu: %s\n\n",
"The share will expire on %s." => "La compartición va caducar el %s.",
"Cheers!" => "¡Salú!",
diff --git a/core/l10n/bg_BG.php b/core/l10n/bg_BG.php
index c47c6e52e9e..41a6e464365 100644
--- a/core/l10n/bg_BG.php
+++ b/core/l10n/bg_BG.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Не особено добра парола",
"Good password" => "Добра парола",
"Strong password" => "Сигурна парола",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Твоят web сървър все още не е правилно настроен да позволява синхронизация на файлове, защото WebDAV интерфейсът изглежда не работи.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Сървърът няма работеща интернет връзка. Това означава, че някои функции като прикачването на външни дискови устройства, уведомления за обновяване или инсталиране на външни приложения няма да работят. Достъпът на файлове отвън или изпращане на имейли за уведомление вероятно също няма да работят. Препоръчваме да включиш интернет връзката за този сървър ако искаш да използваш всички тези функции.",
"Shared" => "Споделено",
"Shared with {recipients}" => "Споделено с {recipients}.",
"Share" => "Споделяне",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Грешка при отбелязване за любим.",
"Error unfavoriting" => "Грешка при премахване отбелязването за любим.",
"Access forbidden" => "Достъпът е забранен",
-"Cloud not found" => "Облакът не намерен",
+"File not found" => "Файлът не е открит.",
+"The specified document has not been found on the server." => "Избраният документ не е намерн на сървъра.",
+"You can click here to return to %s." => "Можеш да натиснеш тук, за да се върнеш на %s",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Здрасти,\n\nсамо да те уведомя, че %s сподели %s с теб.\nРазгледай го: %s\n\n",
"The share will expire on %s." => "Споделянето ще изтече на %s.",
"Cheers!" => "Поздрави!",
@@ -186,6 +190,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "Темата %s бе изключена.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Моля, увери се, че си направил копия на базата данни, папките с настройки и данни, преди да продължиш.",
"Start update" => "Започни обновяването",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "За да избегнеш таймаутове при по-големи инсталации, можеш да изпълниш следните команди в инсталанционната директория:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "За да избегнеш таймаутове при по-големи инсталации, можеш да изпълниш следните команди в инсталанционната директория:",
+"This %s instance is currently being updated, which may take a while." => "В момента този %s се обновява, а това може да отнеме време.",
+"This page will refresh itself when the %s instance is available again." => "Тази страница ще се опресни автоматично, когато %s е отново на линия."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/core/l10n/bn_BD.php b/core/l10n/bn_BD.php
index d219411866d..c051d787c6c 100644
--- a/core/l10n/bn_BD.php
+++ b/core/l10n/bn_BD.php
@@ -37,11 +37,14 @@ $TRANSLATIONS = array(
"Yes" => "হ্যাঁ",
"Choose" => "বেছে নিন",
"Ok" => "তথাস্তু",
-"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} সাংঘর্ষিক ফাইল","{count} সাংঘর্ষিক ফাইল"),
+"One file conflict" => "একটি সাংঘর্ষিক ফাইল",
"New Files" => "নতুন ফাইল",
"Already existing files" => "বিদ্যমান ফাইল",
+"Which files do you want to keep?" => "কোন ফাইলগুলো রেখে দিতে চান?",
"Cancel" => "বাতিল",
"Continue" => "চালিয়ে যাও",
+"Strong password" => "শক্তিশালী কুটশব্দ",
"Shared" => "ভাগাভাগিকৃত",
"Share" => "ভাগাভাগি কর",
"Error" => "সমস্যা",
@@ -85,8 +88,13 @@ $TRANSLATIONS = array(
"Apps" => "অ্যাপ",
"Admin" => "প্রশাসন",
"Help" => "সহায়িকা",
+"Error deleting tag(s)" => "ট্যাগ(সমূহ) অপসারণে সমস্যা",
+"Error tagging" => "ট্যাগ করতে সমস্যা",
+"Error untagging" => "ট্যাগ বাতিল করতে সমস্যা",
+"Error favoriting" => "প্রিয় তালিকাভুক্তিতে সমস্যা",
"Access forbidden" => "অধিগমনের অনুমতি নেই",
-"Cloud not found" => "ক্লাউড খুঁজে পাওয়া গেল না",
+"File not found" => "ফাইল খুঁজে পাওয়া গেল না",
+"Cheers!" => "শুভেচ্ছা!",
"Security Warning" => "নিরাপত্তাজনিত সতর্কতা",
"Create an <strong>admin account</strong>" => "<strong>প্রশাসক একাউন্ট</strong> তৈরী করুন",
"Password" => "কূটশব্দ",
diff --git a/core/l10n/ca.php b/core/l10n/ca.php
index 42bb5231a57..5b397766be1 100644
--- a/core/l10n/ca.php
+++ b/core/l10n/ca.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Contrasenya passable",
"Good password" => "Contrasenya bona",
"Strong password" => "Contrasenya forta",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "El servidor web no està configurat correctament per permetre la sincronització de fitxers perquè la interfície WebDAV sembla no funcionar correctament.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Aquest servidor no té cap connexió a internet que funcioni. Això significa que algunes de les característiques com el muntatge d'emmagatzemament extern, les notificacions quant a actualitzacions o la instal·lació d'aplicacions de tercers no funcionarà. L'accés remot a fitxers i l'enviament de correus electrònics podria tampoc no funcionar. Us suggerim que habiliteu la connexió a internet per aquest servidor si voleu tenir totes les característiques.",
"Shared" => "Compartit",
"Shared with {recipients}" => "Compartit amb {recipients}",
"Share" => "Comparteix",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Error en posar a preferits",
"Error unfavoriting" => "Error en treure de preferits",
"Access forbidden" => "Accés prohibit",
-"Cloud not found" => "No s'ha trobat el núvol",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Ei,\n\nnomés fer-te saber que %s ha compartit %s amb tu.\nMira-ho a: %s\n\n",
"The share will expire on %s." => "La compartició venç el %s.",
"Cheers!" => "Salut!",
diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php
index f5ad9e730b4..31e321d9921 100644
--- a/core/l10n/cs_CZ.php
+++ b/core/l10n/cs_CZ.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Středně silné heslo",
"Good password" => "Dobré heslo",
"Strong password" => "Silné heslo",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Váš webový server není správně nastaven pro umožnění synchronizace, rozhraní WebDAV se zdá být rozbité.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Server nemá funkční připojení k internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích e-mailů také nemusí fungovat. Pokud si přejete využívat všech vlastností ownCloud, doporučujeme povolit připojení k internetu tomuto serveru.",
"Shared" => "Sdílené",
"Shared with {recipients}" => "Sdíleno s {recipients}",
"Share" => "Sdílet",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Chyba při označování jako oblíbené",
"Error unfavoriting" => "Chyba při odznačování jako oblíbené",
"Access forbidden" => "Přístup zakázán",
-"Cloud not found" => "Cloud nebyl nalezen",
+"File not found" => "Soubor nenalezen",
+"The specified document has not been found on the server." => "Vybraný dokument nebyl na serveru nalezen.",
+"You can click here to return to %s." => "Kliknout zde pro návrat na %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hej ty tam,\n\njen ti chci dát vědět, že %s sdílel %s s tebou.\nZobraz si to: %s\n\n",
"The share will expire on %s." => "Sdílení vyprší %s.",
"Cheers!" => "Ať slouží!",
@@ -186,6 +190,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "Vzhled %s byl zakázán.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Před provedením dalšího kroku se prosím ujistěte, že databáze a konfigurační a datový adresář byly zazálohovány. ",
"Start update" => "Spustit aktualizaci",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Abyste zabránili vypršení časového limitu u větších instalací, můžete namísto toho spustit následující příkaz v hlavním adresáři:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Abyste zabránili vypršení časového limitu u větších instalací, můžete namísto toho spustit následující příkaz v hlavním adresáři:",
+"This %s instance is currently being updated, which may take a while." => "Tato instalace %s je právě aktualizována a to může chvíli trvat.",
+"This page will refresh itself when the %s instance is available again." => "Tato stránka se automaticky načte poté, co bude opět dostupná instance %s."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/core/l10n/cy_GB.php b/core/l10n/cy_GB.php
index 77169ad6960..4b805f11899 100644
--- a/core/l10n/cy_GB.php
+++ b/core/l10n/cy_GB.php
@@ -29,6 +29,7 @@ $TRANSLATIONS = array(
"Ok" => "Iawn",
"_{count} file conflict_::_{count} file conflicts_" => array("","","",""),
"Cancel" => "Diddymu",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Nid yw eich gweinydd wedi'i gyflunio eto i ganiatáu cydweddu ffeiliau oherwydd bod y rhyngwyneb WebDAV wedi torri.",
"Shared" => "Rhannwyd",
"Share" => "Rhannu",
"Error" => "Gwall",
@@ -71,7 +72,6 @@ $TRANSLATIONS = array(
"Admin" => "Gweinyddu",
"Help" => "Cymorth",
"Access forbidden" => "Mynediad wedi'i wahardd",
-"Cloud not found" => "Methwyd canfod cwmwl",
"Security Warning" => "Rhybudd Diogelwch",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Mae eich fersiwn PHP yn agored i ymosodiad NULL Byte (CVE-2006-7243)",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." => "Mwy na thebyg fod modd cyrraedd eich cyfeiriadur data a ffeilau o'r rhyngrwyd oherwydd nid yw'r ffeil .htaccess yn gweithio. ",
diff --git a/core/l10n/da.php b/core/l10n/da.php
index fd862fe4d29..bf855d1f085 100644
--- a/core/l10n/da.php
+++ b/core/l10n/da.php
@@ -38,7 +38,7 @@ $TRANSLATIONS = array(
"Image" => "Billede",
"Audio" => "Lyd",
"Saving..." => "Gemmer...",
-"Couldn't send reset email. Please contact your administrator." => "Der opstod et problem under afsending af reset-emailen. Kontakt venligst systemadministratoren.",
+"Couldn't send reset email. Please contact your administrator." => "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." => "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.",
"Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" => "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?",
"I know what I'm doing" => "Jeg ved, hvad jeg har gang i",
@@ -66,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "Jævnt kodeord",
"Good password" => "Godt kodeord",
"Strong password" => "Stærkt kodeord",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Din webserver er endnu ikke sat op til at tillade fil synkronisering fordi WebDAV grænsefladen virker ødelagt.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Denne ownCloud-server har ikke en fungerende forbindelse til internettet. Det betyder, at visse funktioner som montering af eksterne drev, oplysninger om opdatering eller installation af 3.-parts applikationer ikke fungerer. Det vil sandsynligvis heller ikke fungere at tilgå filer fra eksterne drev eller informations-e-mails. Vi opfordrer til at etablere forbindelse til internettet for denne server, såfremt du ønsker samtlige funktioner.",
+"Error occurred while checking server setup" => "Der opstod fejl under tjek af serveropsætningen",
"Shared" => "Delt",
"Shared with {recipients}" => "Delt med {recipients}",
"Share" => "Del",
@@ -114,11 +117,11 @@ $TRANSLATIONS = array(
"The update was unsuccessful." => "Opdateringen mislykkedes.",
"The update was successful. Redirecting you to ownCloud now." => "Opdateringen blev udført korrekt. Du bliver nu viderestillet til ownCloud.",
"Couldn't reset password because the token is invalid" => "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt",
-"Couldn't send reset email. Please make sure your username is correct." => "Der opstod et problem under afsendelse af nulstillings-emailen. Kontroller venligst om dit brugernavnet er korrekt",
-"Couldn't send reset email because there is no email address for this username. Please contact your administrator." => "Der opstod et problem under afsendelse af nulstillings-emailen. Der ikke er nogen email adresse tilknyttet denne bruger konto. Kontakt venligst systemadministratoren",
+"Couldn't send reset email. Please make sure your username is correct." => "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt",
+"Couldn't send reset email because there is no email address for this username. Please contact your administrator." => "Der opstod et problem under afsendelse af nulstillings-e-mailen. Der ikke er nogen email adresse tilknyttet denne bruger konto. Kontakt venligst systemadministratoren",
"%s password reset" => "%s adgangskode nulstillet",
"Use the following link to reset your password: {link}" => "Anvend følgende link til at nulstille din adgangskode: {link}",
-"You will receive a link to reset your password via Email." => "Du vil modtage et link til at nulstille dit kodeord via email.",
+"You will receive a link to reset your password via Email." => "Du vil modtage et link til at nulstille dit kodeord via e-mail.",
"Username" => "Brugernavn",
"Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" => "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode. HVis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter. Vil du fortsætte?",
"Yes, I really want to reset my password now" => "Ja, Jeg ønsker virkelig at nulstille mit kodeord",
@@ -140,10 +143,23 @@ $TRANSLATIONS = array(
"Error favoriting" => "Fejl ved favoritering",
"Error unfavoriting" => "Fejl ved fjernelse af favorisering.",
"Access forbidden" => "Adgang forbudt",
-"Cloud not found" => "Sky ikke fundet",
+"File not found" => "Filen blev ikke fundet",
+"The specified document has not been found on the server." => "Det angivne dokument blev ikke fundet på serveren.",
+"You can click here to return to %s." => "Du kan klikke her for at gå tilbage til %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hej med dig\n\nDette blot for at lade dig vide, at %s har delt %s med dig.\nSe det her: %s\n\n",
"The share will expire on %s." => "Delingen vil udløbe om %s.",
"Cheers!" => "Hej!",
+"The server encountered an internal error and was unable to complete your request." => "Servern stødte på en intern fejl og var ikke i stand til at fuldføre din forespørgsel.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Kontakt venligst serveradministratoren, hvis denne fejl gentager sig flere gange - medtag venligst de tekniske detaljer nedenfor i din rapport.",
+"More details can be found in the server log." => "Flere detaljer kan fås i serverloggen.",
+"Technical details" => "Tekniske detaljer",
+"Remote Address: %s" => "Fjernadresse: %s",
+"Request ID: %s" => "Forespørgsels-ID: %s",
+"Code: %s" => "Kode: %s",
+"Message: %s" => "Besked: %s",
+"File: %s" => "Fil: %s",
+"Line: %s" => "Linje: %s",
+"Trace" => "Sporing",
"Security Warning" => "Sikkerhedsadvarsel",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Din PHP-version er sårbar overfor et NULL Byte angreb (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Opdater venligst din PHP installation for at anvende %s sikkert.",
@@ -186,6 +202,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "Temaet, %s, er blevet deaktiveret.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Venligst sikrer dig en backup af databasen, config-mappen og data-mappen inden vi fortsætter.",
"Start update" => "Begynd opdatering",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "For at undgå tidsudløb med større installationer, så kan du i stedet køre følgende kommando fra din installationsmappe:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "For at undgå tidsudløb med større installationer, så kan du i stedet køre følgende kommando fra din installationsmappe:",
+"This %s instance is currently being updated, which may take a while." => "Denne %s-instans bliver i øjeblikket opdateret, hvilket kan tage et stykke tid.",
+"This page will refresh itself when the %s instance is available again." => "Denne side vil genopfriske sig selv, når %s-instancen er tilgængelig igen."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/core/l10n/de.php b/core/l10n/de.php
index d33f9c2f6c9..ca3742c7549 100644
--- a/core/l10n/de.php
+++ b/core/l10n/de.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Durchschnittliches Passwort",
"Good password" => "Gutes Passwort",
"Strong password" => "Starkes Passwort",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Dein Web-Server ist noch nicht für Datei-Synchronisation bereit, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie z.B. das Einbinden von externen Speichern, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren. Der Fernzugriff auf Dateien und das Senden von Benachrichtigungsmails funktioniert eventuell ebenfalls nicht. Wir empfehlen die Internetverbindung für diesen Server zu aktivieren, wenn Sie alle Funktionen nutzen wollen.",
"Shared" => "Geteilt",
"Shared with {recipients}" => "Geteilt mit {recipients}",
"Share" => "Teilen",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Fehler beim Favorisieren",
"Error unfavoriting" => "Fehler beim Entfernen aus den Favoriten",
"Access forbidden" => "Zugriff verboten",
-"Cloud not found" => "Cloud nicht gefunden",
+"File not found" => "Datei nicht gefunden",
+"The specified document has not been found on the server." => "Das ausgewählte Dokument wurde auf dem Server nicht gefunden.",
+"You can click here to return to %s." => "Du kannst zur Rückkehr zu %s hier klicken.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hallo,\n\nich wollte Dich nur wissen lassen, dass %s %s mit Dir teilt.\nSchaue es Dir an: %s\n\n",
"The share will expire on %s." => "Die Freigabe wird am %s ablaufen.",
"Cheers!" => "Hallo!",
diff --git a/core/l10n/de_CH.php b/core/l10n/de_CH.php
index 84a48b98e8c..749be51dc33 100644
--- a/core/l10n/de_CH.php
+++ b/core/l10n/de_CH.php
@@ -34,6 +34,8 @@ $TRANSLATIONS = array(
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
"New Files" => "Neue Dateien",
"Cancel" => "Abbrechen",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ihr Web-Server ist noch nicht für eine Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet das einige Funktionen wie z.B. das Einbinden von externen Speichern, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren. Der Fernzugriff auf Dateien und das Senden von Benachrichtigungsmails funktioniert eventuell ebenfalls nicht. Wir empfehlen die Internetverbindung für diesen Server zu aktivieren wenn Sie alle Funktionen nutzen wollen.",
"Shared" => "Geteilt",
"Share" => "Teilen",
"Error" => "Fehler",
@@ -81,7 +83,6 @@ $TRANSLATIONS = array(
"Admin" => "Administrator",
"Help" => "Hilfe",
"Access forbidden" => "Zugriff verboten",
-"Cloud not found" => "Cloud wurde nicht gefunden",
"Security Warning" => "Sicherheitshinweis",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Ihre PHP Version ist durch die NULL Byte Attacke (CVE-2006-7243) angreifbar",
"Please update your PHP installation to use %s securely." => "Bitte aktualisieren Sie Ihre PHP-Installation um %s sicher nutzen zu können.",
diff --git a/core/l10n/de_DE.php b/core/l10n/de_DE.php
index 1abde6e0230..c63b320ae7d 100644
--- a/core/l10n/de_DE.php
+++ b/core/l10n/de_DE.php
@@ -66,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "Passables Passwort",
"Good password" => "Gutes Passwort",
"Strong password" => "Starkes Passwort",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ihr Internetserver ist noch nicht richtig konfiguriert, um Dateisynchronisation zu erlauben, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Dieser Server hat keine funktionierende Internetverbindung. Dieses bedeutet, dass einige Funktionen wie z.B. das Einbinden von externen Speichern, Aktualisierungsbenachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren. Der Fernzugriff auf Dateien und das Versenden von E-Mail-Benachrichtigungen funktionieren eventuell ebenfalls nicht. Wir empfehlen die Internetverbindung für diesen Server zu aktivieren, wenn Sie alle Funktionen benutzen wollen.",
+"Error occurred while checking server setup" => "Fehler beim Überprüfen der Servereinrichtung",
"Shared" => "Geteilt",
"Shared with {recipients}" => "Geteilt mit {recipients}",
"Share" => "Teilen",
@@ -140,10 +143,23 @@ $TRANSLATIONS = array(
"Error favoriting" => "Fehler beim Hinzufügen zu den Favoriten",
"Error unfavoriting" => "Fehler beim Entfernen aus den Favoriten",
"Access forbidden" => "Zugriff verboten",
-"Cloud not found" => "Cloud wurde nicht gefunden",
+"File not found" => "Datei nicht gefunden",
+"The specified document has not been found on the server." => "Das ausgewählte Dokument wurde auf dem Server nicht gefunden.",
+"You can click here to return to %s." => "Sie können zur Rückkehr zu %s hier klicken.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hallo,\n\n%s hat %s mit Ihnen geteilt.\nAnsehen: %s\n\n",
"The share will expire on %s." => "Die Freigabe wird am %s ablaufen.",
"Cheers!" => "Noch einen schönen Tag!",
+"The server encountered an internal error and was unable to complete your request." => "Der Server hat einen internen Fehler und konnte Ihre Anfrage nicht vervollständigen.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Bitte wenden Sie sich an den Serveradministrator, wenn dieser Fehler mehrfach auftritt, geben Sie bitte die, unten stehenden, technischen Details in Ihrem Bericht mit an.",
+"More details can be found in the server log." => "Weitere Details können im Serverprotokoll gefunden werden.",
+"Technical details" => "Technische Details",
+"Remote Address: %s" => "Entfernte Adresse: %s",
+"Request ID: %s" => "Anforderungskennung: %s",
+"Code: %s" => "Code: %s",
+"Message: %s" => "Nachricht: %s",
+"File: %s" => "Datei: %s",
+"Line: %s" => "Zeile: %s",
+"Trace" => "Spur",
"Security Warning" => "Sicherheitshinweis",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Ihre PHP Version ist durch die NULL Byte Attacke (CVE-2006-7243) angreifbar",
"Please update your PHP installation to use %s securely." => "Bitte aktualisieren Sie Ihre PHP-Installation um %s sicher nutzen zu können.",
diff --git a/core/l10n/el.php b/core/l10n/el.php
index 78692c4dd5c..9f1e71d0dbc 100644
--- a/core/l10n/el.php
+++ b/core/l10n/el.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Μέτριο συνθηματικό",
"Good password" => "Καλό συνθηματικό",
"Strong password" => "Δυνατό συνθηματικό",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ο διακομιστής σας δεν έχει ρυθμιστεί κατάλληλα ώστε να επιτρέπει τον συγχρονισμό αρχείων γιατί η διεπαφή WebDAV πιθανόν να είναι κατεστραμμένη.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Αυτός ο διακομιστής δεν έχει ενεργή σύνδεση στο διαδίκτυο. Αυτό σημαίνει ότι κάποιες υπηρεσίες όπως η σύνδεση με εξωτερικούς αποθηκευτικούς χώρους, ειδοποιήσεις περί ενημερώσεων ή η εγκατάσταση 3ων εφαρμογών δεν θα είναι διαθέσιμες. Η πρόσβαση απομακρυσμένων αρχείων και η αποστολή ειδοποιήσεων μέσω ηλεκτρονικού ταχυδρομείου μπορεί επίσης να μην είναι διαθέσιμες. Προτείνουμε να ενεργοποιήσετε την πρόσβαση στο διαδίκτυο για αυτόν το διακομιστή εάν θέλετε να χρησιμοποιήσετε όλες τις υπηρεσίες.",
"Shared" => "Κοινόχρηστα",
"Shared with {recipients}" => "Διαμοιράστηκε με {recipients}",
"Share" => "Διαμοιρασμός",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Σφάλμα προσθήκης στα αγαπημένα",
"Error unfavoriting" => "Σφάλμα αφαίρεσης από τα αγαπημένα",
"Access forbidden" => "Δεν επιτρέπεται η πρόσβαση",
-"Cloud not found" => "Δεν βρέθηκε νέφος",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Γειά χαρά,\n\nαπλά σας ενημερώνω πως ο %s μοιράστηκε το %s με εσάς.\nΔείτε το: %s\n\n",
"The share will expire on %s." => "Ο διαμοιρασμός θα λήξει σε %s.",
"Cheers!" => "Χαιρετισμούς!",
diff --git a/core/l10n/en_GB.php b/core/l10n/en_GB.php
index 826cf6adfb6..7c32d382150 100644
--- a/core/l10n/en_GB.php
+++ b/core/l10n/en_GB.php
@@ -66,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "So-so password",
"Good password" => "Good password",
"Strong password" => "Strong password",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Your web server is not yet properly setup to allow files synchronisation because the WebDAV interface seems to be broken.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don't work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features.",
+"Error occurred while checking server setup" => "Error occurred whilst checking server setup",
"Shared" => "Shared",
"Shared with {recipients}" => "Shared with {recipients}",
"Share" => "Share",
@@ -140,10 +143,23 @@ $TRANSLATIONS = array(
"Error favoriting" => "Error favouriting",
"Error unfavoriting" => "Error unfavouriting",
"Access forbidden" => "Access denied",
-"Cloud not found" => "Cloud not found",
+"File not found" => "File not found",
+"The specified document has not been found on the server." => "The specified document has not been found on the server.",
+"You can click here to return to %s." => "You can click here to return to %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n",
"The share will expire on %s." => "The share will expire on %s.",
"Cheers!" => "Cheers!",
+"The server encountered an internal error and was unable to complete your request." => "The server encountered an internal error and was unable to complete your request.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.",
+"More details can be found in the server log." => "More details can be found in the server log.",
+"Technical details" => "Technical details",
+"Remote Address: %s" => "Remote Address: %s",
+"Request ID: %s" => "Request ID: %s",
+"Code: %s" => "Code: %s",
+"Message: %s" => "Message: %s",
+"File: %s" => "File: %s",
+"Line: %s" => "Line: %s",
+"Trace" => "Trace",
"Security Warning" => "Security Warning",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Please update your PHP installation to use %s securely.",
@@ -186,6 +202,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "The theme %s has been disabled.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Please make sure that the database, the config folder and the data folder have been backed up before proceeding.",
"Start update" => "Start update",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:",
+"This %s instance is currently being updated, which may take a while." => "This %s instance is currently being updated, which may take a while.",
+"This page will refresh itself when the %s instance is available again." => "This page will refresh itself when the %s instance is available again."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/core/l10n/eo.php b/core/l10n/eo.php
index 59bc44327be..be5327e8e63 100644
--- a/core/l10n/eo.php
+++ b/core/l10n/eo.php
@@ -45,6 +45,7 @@ $TRANSLATIONS = array(
"So-so password" => "Mezaĉa pasvorto",
"Good password" => "Bona pasvorto",
"Strong password" => "Forta pasvorto",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Via TTT-servilo ankoraŭ ne ĝuste agordiĝis por permesi sinkronigi dosierojn ĉar la WebDAV-interfaco ŝajnas rompita.",
"Shared" => "Dividita",
"Share" => "Kunhavigi",
"Error" => "Eraro",
@@ -101,7 +102,6 @@ $TRANSLATIONS = array(
"Error tagging" => "Eraris etikedado",
"Error untagging" => "Eraris maletikedado",
"Access forbidden" => "Aliro estas malpermesata",
-"Cloud not found" => "La nubo ne estas trovita",
"Security Warning" => "Sekureca averto",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Via PHP versio estas sendefenda je la NULL bajto atako (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Bonvolu ĝisdatigi vian PHP-instalon por uzi %s sekure.",
diff --git a/core/l10n/es.php b/core/l10n/es.php
index ca551d4be8e..b95230e98d4 100644
--- a/core/l10n/es.php
+++ b/core/l10n/es.php
@@ -66,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "Contraseña pasable",
"Good password" => "Contraseña buena",
"Strong password" => "Contraseña muy buena",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Su servidor web aún no está configurado adecuadamente para permitir la sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Este servidor no tiene conexión a Internet. Esto significa que algunas de las características no funcionarán, como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones, la instalación de aplicaciones de terceros, el acceso a los archivos de forma remota o el envío de correos electrónicos de notificación. Sugerimos habilitar una conexión a Internet en este servidor para disfrutar de todas las funciones.",
+"Error occurred while checking server setup" => "Ha ocurrido un error la revisar la configuración del servidor",
"Shared" => "Compartido",
"Shared with {recipients}" => "Compartido con {recipients}",
"Share" => "Compartir",
@@ -140,10 +143,23 @@ $TRANSLATIONS = array(
"Error favoriting" => "Error al marcar como favorito",
"Error unfavoriting" => "Error al quitar como favorito",
"Access forbidden" => "Acceso denegado",
-"Cloud not found" => "No se encuentra la nube",
+"File not found" => "Archivo no encontrado",
+"The specified document has not been found on the server." => "El documento indicado no se ha encontrado en el servidor.",
+"You can click here to return to %s." => "Puede hacer clic aquí para volver a %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hola:\n\nTan solo queremos informarte que %s compartió %s contigo.\nMíralo aquí: %s\n\n",
"The share will expire on %s." => "El objeto dejará de ser compartido el %s.",
"Cheers!" => "¡Saludos!",
+"The server encountered an internal error and was unable to complete your request." => "El servidor ha encontrado un error y no puede completar la solicitud.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Por favor contacte con el administrador del servidor si este error reaparece multiples veces. Por favor incluya los detalles tecnicos que se muestran acontinuación.",
+"More details can be found in the server log." => "Mas detalles pueden verse en el log del servidor.",
+"Technical details" => "Detalles tecnicos",
+"Remote Address: %s" => "Dirección remota: %s",
+"Request ID: %s" => "ID solicitado: %s",
+"Code: %s" => "Codigo: %s",
+"Message: %s" => "Mensaje: %s",
+"File: %s" => "Archivo: %s",
+"Line: %s" => "Linea: %s",
+"Trace" => "Trazas",
"Security Warning" => "Advertencia de seguridad",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Su versión de PHP es vulnerable al ataque de Byte NULL (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Por favor, actualice su instalación PHP para usar %s con seguridad.",
@@ -186,6 +202,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "El tema %s ha sido desactivado.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Antes de proceder, asegúrese de que se haya hecho un respaldo de la base de datos, la carpeta de configuración y la carpeta de datos.",
"Start update" => "Iniciar actualización",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Para evitar tiempos de espera en grandes instalaciones, en su lugar puede ejecutar el siguiente comando desde el directorio de instalación:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Para evitar tiempos de espera en grandes instalaciones, en su lugar puede ejecutar el siguiente comando desde el directorio de instalación:",
+"This %s instance is currently being updated, which may take a while." => "Está instancia %s está siendo actualizada, lo que puede llevar un tiempo.",
+"This page will refresh itself when the %s instance is available again." => "La página se refrescará por sí misma cuando la instancia %s vuelva a estar disponible."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/core/l10n/es_AR.php b/core/l10n/es_AR.php
index 2d9ac5460ac..89d7b721ce0 100644
--- a/core/l10n/es_AR.php
+++ b/core/l10n/es_AR.php
@@ -55,6 +55,8 @@ $TRANSLATIONS = array(
"So-so password" => "Contraseña de nivel medio. ",
"Good password" => "Buena contraseña. ",
"Strong password" => "Contraseña fuerte.",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Tu servidor web no está configurado todavía para permitir sincronización de archivos porque la interfaz WebDAV parece no funcionar.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "El servidor no posee una conexión a Internet activa. Esto significa que algunas características como el montaje de un almacenamiento externo, las notificaciones acerca de actualizaciones o la instalación de aplicaciones de terceros no funcionarán. El acceso a archivos de forma remota y el envío de correos con notificaciones es posible que tampoco funcionen. Sugerimos habilitar la conexión a Internet para este servidor si deseas tener todas estas características.",
"Shared" => "Compartido",
"Share" => "Compartir",
"Error" => "Error",
@@ -118,7 +120,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Error al favorecer",
"Error unfavoriting" => "Error al desfavorecer",
"Access forbidden" => "Acceso prohibido",
-"Cloud not found" => "No se encontró ownCloud",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "¡Hola!\n\nsólo te quería decir que %s acaba de compartir %s contigo.\nVerlo: %s\n\n",
"The share will expire on %s." => "El compartir expirará en %s.",
"Cheers!" => "¡Saludos!",
diff --git a/core/l10n/es_MX.php b/core/l10n/es_MX.php
index 74f7f376113..1575822ee50 100644
--- a/core/l10n/es_MX.php
+++ b/core/l10n/es_MX.php
@@ -48,6 +48,8 @@ $TRANSLATIONS = array(
"(all selected)" => "(todos seleccionados)",
"({count} selected)" => "({count} seleccionados)",
"Error loading file exists template" => "Error cargando plantilla de archivo existente",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Su servidor web aún no está configurado adecuadamente para permitir la sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Este servidor no tiene conexión a Internet. Esto significa que algunas de las características no funcionarán, como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones, la instalación de aplicaciones de terceros, el acceso a los archivos de forma remota o el envío de correos electrónicos de notificación. Sugerimos habilitar una conexión a Internet en este servidor para disfrutar de todas las funciones.",
"Shared" => "Compartido",
"Share" => "Compartir",
"Error" => "Error",
@@ -111,7 +113,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Error al marcar como favorito",
"Error unfavoriting" => "Error al quitar como favorito",
"Access forbidden" => "Acceso denegado",
-"Cloud not found" => "No se encuentra la nube",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hola:\n\nTan solo queremos informarte que %s compartió %s contigo.\nMíralo aquí: %s\n\n",
"The share will expire on %s." => "El objeto dejará de ser compartido el %s.",
"Cheers!" => "¡Saludos!",
diff --git a/core/l10n/et_EE.php b/core/l10n/et_EE.php
index 24781f95e63..4b9ac3f93b6 100644
--- a/core/l10n/et_EE.php
+++ b/core/l10n/et_EE.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Enam-vähem sobiv parool",
"Good password" => "Hea parool",
"Strong password" => "Väga hea parool",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Veebiserveri ei ole veel korralikult seadistatud võimaldamaks failide sünkroniseerimist, kuna WebDAV liides näib olevat mittetoimiv.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Serveril puudub toimiv internetiühendus. See tähendab, et mõned funktsionaalsused, nagu näiteks väliste andmehoidlate ühendamine, teavitused uuendustest või kolmandate osapoolte rakenduste paigaldamine ei tööta. Eemalt failidele ligipääs ning teadete saatmine emailiga ei pruugi samuti toimida. Kui soovid täielikku funktsionaalsust, siis soovitame serverile tagada ligipääs internetti.",
"Shared" => "Jagatud",
"Shared with {recipients}" => "Jagatud {recipients}",
"Share" => "Jaga",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Viga lemmikuks lisamisel",
"Error unfavoriting" => "Viga lemmikutest eemaldamisel",
"Access forbidden" => "Ligipääs on keelatud",
-"Cloud not found" => "Pilve ei leitud",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Tere,\n\n%s jagas sulle välja %s.\nVaata siit: %s\n\n",
"The share will expire on %s." => "Jagamine aegub %s.",
"Cheers!" => "Terekest!",
diff --git a/core/l10n/eu.php b/core/l10n/eu.php
index 263fdf8016c..4ff2b6f2aae 100644
--- a/core/l10n/eu.php
+++ b/core/l10n/eu.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Halamoduzko pasahitza",
"Good password" => "Pasahitz ona",
"Strong password" => "Pasahitz sendoa",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Zure web zerbitzaria ez dago oraindik ongi konfiguratuta fitxategien sinkronizazioa egiteko, WebDAV interfazea ongi ez dagoela dirudi.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Zerbitzari honen interneteko konexioa ez dabil. Honek esan nahi du kanpoko biltegiratze zerbitzuak, eguneraketen informazioa edo bestelako aplikazioen instalazioa bezalako programek ez dutela funtzionatuko. Urrunetik fitxategiak eskuratzea eta e-postak bidaltzea ere ezinezkoa izan daiteke. onwCloud-en aukera guztiak erabili ahal izateko zerbitzari honetan interneteko konexioa gaitzea aholkatzen dizugu.",
"Shared" => "Elkarbanatuta",
"Shared with {recipients}" => "{recipients}-rekin partekatua.",
"Share" => "Elkarbanatu",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Errorea gogokoetara gehitzerakoan",
"Error unfavoriting" => "Errorea gogokoetatik kentzerakoan",
"Access forbidden" => "Sarrera debekatuta",
-"Cloud not found" => "Ez da hodeia aurkitu",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Kaixo\n\n%s-ek %s zurekin partekatu duela jakin dezazun.\nIkusi ezazu: %s\n\n",
"The share will expire on %s." => "Elkarbanaketa %s-n iraungiko da.",
"Cheers!" => "Ongi izan!",
diff --git a/core/l10n/fa.php b/core/l10n/fa.php
index e78b69f3569..6506102e360 100644
--- a/core/l10n/fa.php
+++ b/core/l10n/fa.php
@@ -60,6 +60,8 @@ $TRANSLATIONS = array(
"So-so password" => "رمز عبور متوسط",
"Good password" => "رمز عبور خوب",
"Strong password" => "رمز عبور قوی",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "احتمالاً وب سرور شما طوری تنظیم نشده است که اجازه ی همگام سازی فایلها را بدهد زیرا به نظر میرسد رابط WebDAV از کار افتاده است.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "این سرور ارتباط اینترنتی ندارد. این بدین معناست که بعضی از امکانات نظیر مرتبط سازی یک منبع ذخیره‌ی خارجی، اطلاعات رسانی در مورد بروزرسانی‌ها یا نصب برنامه های جانبی کار نمی‌کنند. دسترسی به فایل ها از راه دور و ارسال اطلاع رسانی توسط ایمیل ممکن است همچنان کار نکند. ما پیشنهاد می‌کنیم که ارتباط اینترنتی مربوط به این سرور را فعال کنید تا تمامی امکانات را در اختیار داشته باشید.",
"Shared" => "اشتراک گذاشته شده",
"Shared with {recipients}" => "به اشتراک گذاشته شده با {recipients}",
"Share" => "اشتراک‌گذاری",
@@ -121,7 +123,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "خطا هنگام افزودن به موارد محبوب",
"Error unfavoriting" => "خطا هنگام حذف از موارد محبوب",
"Access forbidden" => "اجازه دسترسی به مناطق ممنوعه را ندارید",
-"Cloud not found" => "پیدا نشد",
"Cheers!" => "سلامتی!",
"Security Warning" => "اخطار امنیتی",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "نسخه ی PHP شما در برابر حملات NULL Byte آسیب پذیر است.(CVE-2006-7243)",
diff --git a/core/l10n/fi_FI.php b/core/l10n/fi_FI.php
index 9f63759b3c8..40cff052bfd 100644
--- a/core/l10n/fi_FI.php
+++ b/core/l10n/fi_FI.php
@@ -65,6 +65,9 @@ $TRANSLATIONS = array(
"So-so password" => "Kohtalainen salasana",
"Good password" => "Hyvä salasana",
"Strong password" => "Vahva salasana",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Web-palvelimen asetukset eivät ole kelvolliset tiedostojen synkronointia varten, koska WebDAV-liitäntä vaikuttaa olevan rikki.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Tällä palvelimella ei ole toimivaa internetyhteyttä. Sen seurauksena jotkin ominaisuudet, kuten erillisten tallennustilojen liittäminen, ilmoitukset päivityksistä tai kolmansien osapuolten sovellusten asentaminen eivät toimi. Tiedostojen käyttäminen etäältä ja ilmoitusten lähettäminen sähköpostitse eivät myöskään välttämättä toimi. Jos haluat käyttää kaikkia palvelimen ominaisuuksia, kytke palvelin internetiin.",
+"Error occurred while checking server setup" => "Virhe palvelimen määrityksiä tarkistaessa",
"Shared" => "Jaettu",
"Shared with {recipients}" => "Jaettu henkilöiden {recipients} kanssa",
"Share" => "Jaa",
@@ -139,10 +142,22 @@ $TRANSLATIONS = array(
"Error favoriting" => "Suosituksen kirjoitusvirhe",
"Error unfavoriting" => "Suosituksen poisto virhe",
"Access forbidden" => "Pääsy estetty",
-"Cloud not found" => "Pilveä ei löydy",
+"File not found" => "Tiedostoa ei löytynyt",
+"The specified document has not been found on the server." => "Määritettyä asiakirjaa ei löytynyt palvelimelta.",
+"You can click here to return to %s." => "Napsauta tästä palataksesi %siin.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hei sinä!\n\n%s jakoi kohteen %s kanssasi.\nTutustu siihen: %s\n\n",
"The share will expire on %s." => "Jakaminen päättyy %s.",
"Cheers!" => "Kippis!",
+"The server encountered an internal error and was unable to complete your request." => "Palvelin kohtasi sisäisen virheen, eikä pystynyt viimeistelmään pyyntöäsi.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Ota yhteys palvelimen ylläpitäjään, jos tämä virhe ilmenee useita kertoja. Lisää yhteydenottoosi alla olevat tekniset tiedot.",
+"More details can be found in the server log." => "Lisätietoja on palvelimen lokitiedostossa.",
+"Technical details" => "Tekniset tiedot",
+"Remote Address: %s" => "Etäosoite: %s",
+"Request ID: %s" => "Pyynnön tunniste: %s",
+"Code: %s" => "Koodi: %s",
+"Message: %s" => "Viesti: %s",
+"File: %s" => "Tiedosto: %s",
+"Line: %s" => "Rivi: %s",
"Security Warning" => "Turvallisuusvaroitus",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "PHP-asennuksesi on haavoittuvainen NULL Byte -hyökkäykselle (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Päivitä PHP-asennus varmistaaksesi, että %s on turvallinen käyttää.",
diff --git a/core/l10n/fil.php b/core/l10n/fil.php
new file mode 100644
index 00000000000..e012fb1656e
--- /dev/null
+++ b/core/l10n/fil.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"_{count} file conflict_::_{count} file conflicts_" => array("","")
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/core/l10n/fr.php b/core/l10n/fr.php
index b96db20309c..347118c3585 100644
--- a/core/l10n/fr.php
+++ b/core/l10n/fr.php
@@ -5,6 +5,8 @@ $TRANSLATIONS = array(
"Turned off maintenance mode" => "Basculé en mode production (non maintenance)",
"Updated database" => "Base de données mise à jour",
"Checked database schema update" => "Mise à jour du schéma de la base de données vérifiée",
+"Checked database schema update for apps" => "La mise à jour du schéma de la base de données pour les applications a été vérifiée",
+"Updated \"%s\" to %s" => "Mise à jour de \"%s\" à %s",
"Disabled incompatible apps: %s" => "Applications incompatibles désactivées: %s",
"No image or file provided" => "Aucune image ou fichier fourni",
"Unknown filetype" => "Type de fichier inconnu",
@@ -64,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "Mot de passe de sécurité tout juste acceptable",
"Good password" => "Mot de passe de sécurité suffisante",
"Strong password" => "Mot de passe de forte sécurité",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Votre serveur web, n'est pas correctement configuré pour permettre la synchronisation des fichiers, car l'interface WebDav ne fonctionne pas comme il faut.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par mails ne seront pas fonctionnels également. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
+"Error occurred while checking server setup" => "Une erreur s'est produite lors de la vérification de la configuration du serveur",
"Shared" => "Partagé",
"Shared with {recipients}" => "Partagé avec {recipients}",
"Share" => "Partager",
@@ -138,10 +143,22 @@ $TRANSLATIONS = array(
"Error favoriting" => "Erreur lors de la mise en favori",
"Error unfavoriting" => "Erreur lors de la suppression des favoris",
"Access forbidden" => "Accès interdit",
-"Cloud not found" => "Introuvable",
+"File not found" => "Fichier non trouvé",
+"The specified document has not been found on the server." => "Le document spécifié n'a pu être trouvé sur le serveur.",
+"You can click here to return to %s." => "Vous pouvez cliquer ici pour retourner à %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Bonjour,\n\nNous vous informons que %s a partagé %s avec vous.\nConsultez-le : %s\n",
"The share will expire on %s." => "Le partage expirera le %s.",
"Cheers!" => "À bientôt !",
+"The server encountered an internal error and was unable to complete your request." => "Le serveur a rencontré une erreur interne et est incapable d'effectuer votre demande.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Veuillez contacter l'administrateur du serveur si cette erreur réapparaît plusieurs fois, veuillez joindre les détails techniques à votre rapport.",
+"More details can be found in the server log." => "Plus de détails peuvent être trouvés dans le journal du serveur.",
+"Technical details" => "Détails techniques",
+"Remote Address: %s" => "Adresse distante : %s",
+"Request ID: %s" => "ID de la demande : %s",
+"Code: %s" => "Code : %s",
+"Message: %s" => "Message : %s",
+"File: %s" => "Fichier : %s",
+"Line: %s" => "Ligne : %s",
"Security Warning" => "Avertissement de sécurité",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Votre version de PHP est vulnérable à l'attaque par caractère NULL (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Veuillez mettre à jour votre installation PHP pour utiliser %s de façon sécurisée.",
diff --git a/core/l10n/gl.php b/core/l10n/gl.php
index 81e8a5c305a..9f9b3a8e34c 100644
--- a/core/l10n/gl.php
+++ b/core/l10n/gl.php
@@ -64,6 +64,8 @@ $TRANSLATIONS = array(
"So-so password" => "Contrasinal non moi aló",
"Good password" => "Bo contrasinal",
"Strong password" => "Contrasinal forte",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "O seu servidor web aínda non está configurado axeidamente para permitir a sincronización de ficheiros xa que semella que a interface WebDAV non está a funcionar.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Este servidor non ten conexión a Internet. Isto significa que algunhas das funcionalidades como a montaxe de almacenamento externo, as notificacións sobre actualizacións ou instalación de aplicacións de terceiros non funcionan. O acceso aos ficheiros de forma remota e o envío de mensaxes de notificación poderían non funcionar. Suxerímoslle que active a conexión a Internet deste servidor se quere dispor de todas as funcionalidades.",
"Shared" => "Compartido",
"Shared with {recipients}" => "Compartido con {recipients}",
"Share" => "Compartir",
@@ -138,7 +140,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Produciuse un erro ao marcar como favorito",
"Error unfavoriting" => "Produciuse un erro ao desmarcar como favorito",
"Access forbidden" => "Acceso denegado",
-"Cloud not found" => "Nube non atopada",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Ola,\n\nsó facerlle saber que %s compartiu %s con vostede.\nVéxao en: %s\n\n",
"The share will expire on %s." => "Esta compartición caduca o %s.",
"Cheers!" => "Saúdos!",
diff --git a/core/l10n/he.php b/core/l10n/he.php
index 0cc44614349..39ce0956dd7 100644
--- a/core/l10n/he.php
+++ b/core/l10n/he.php
@@ -30,6 +30,7 @@ $TRANSLATIONS = array(
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
"New Files" => "קבצים חדשים",
"Cancel" => "ביטול",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "שרת האינטרנט שלך אינו מוגדר לצורכי סנכרון קבצים עדיין כיוון שמנשק ה־WebDAV כנראה אינו תקין.",
"Shared" => "שותף",
"Share" => "שתף",
"Error" => "שגיאה",
@@ -75,7 +76,6 @@ $TRANSLATIONS = array(
"Admin" => "מנהל",
"Help" => "עזרה",
"Access forbidden" => "הגישה נחסמה",
-"Cloud not found" => "ענן לא נמצא",
"Security Warning" => "אזהרת אבטחה",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "גרסת ה־PHP פגיעה בפני התקפת בית NULL/ריק (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "נא לעדכן את התקנת ה-PHP שלך כדי להשתמש ב-%s בצורה מאובטחת.",
diff --git a/core/l10n/hi.php b/core/l10n/hi.php
index 0311dd34ab5..ef81f978aa3 100644
--- a/core/l10n/hi.php
+++ b/core/l10n/hi.php
@@ -37,7 +37,6 @@ $TRANSLATIONS = array(
"Users" => "उपयोगकर्ता",
"Apps" => "Apps",
"Help" => "सहयोग",
-"Cloud not found" => "क्लौड नहीं मिला ",
"Security Warning" => "सुरक्षा चेतावनी ",
"Create an <strong>admin account</strong>" => "व्यवस्थापक खाता बनाएँ",
"Password" => "पासवर्ड",
diff --git a/core/l10n/hr.php b/core/l10n/hr.php
index 2d5a6c6f719..ae71027dd74 100644
--- a/core/l10n/hr.php
+++ b/core/l10n/hr.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Lozinka tako-tako",
"Good password" => "Lozinka dobra",
"Strong password" => "Lozinka snažna",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Vaš web poslužitelj još nije propisno postavljen da bi omogućio sinkronizaciju datoteka jer izgleda da jesučelje WebDAV neispravno.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Ovaj poslužitelj nema nikakvu radnu vezu s internetom. To znači da ne rade neke od njegovihfunkcija kao što su spajanje na vanjsku memoriju, notifikacije o ažuriranju ili instalacijiaplikacija treće strane. Također, možda je onemogućen daljinski pristup datotekama i slanjenotifikacijske e-pošte. Savjetujemo vam da, ako želite da sve njegove funkcije rade,omogućite vezuovog poslužitelja s internetom.",
"Shared" => "Resurs podijeljen",
"Shared with {recipients}" => "Resurs podijeljen s {recipients}",
"Share" => "Podijelite",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Pogrešno dodavanje u favorite",
"Error unfavoriting" => "Pogrešno uklanjanje iz favorita",
"Access forbidden" => "Pristup zabranjen",
-"Cloud not found" => "Oblak nije pronađen",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hej, \n\nsamo vam javljamo da je %s podijelio %s s vama.\nPogledajte ga: %s\n\n",
"The share will expire on %s." => "Podijeljeni resurs će isteći na %s.",
"Cheers!" => "Cheers!",
diff --git a/core/l10n/hu_HU.php b/core/l10n/hu_HU.php
index aa08b71fa02..f9d5f012e9a 100644
--- a/core/l10n/hu_HU.php
+++ b/core/l10n/hu_HU.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Nem túl jó jelszó",
"Good password" => "Jó jelszó",
"Strong password" => "Erős jelszó",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Az Ön webkiszolgálója nincs megfelelően beállítva az állományok szinkronizálásához, mert a WebDAV-elérés úgy tűnik, nem működik.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "A kiszolgálónak nem működik az internetkapcsolata. Ez azt jelenti, hogy bizonyos funkciók nem fognak működni, mint pl. külső tárolók becsatolása, automatikus frissítési értesítések vagy más fejlesztők /3rd party/ által írt alkalmazások telepítése. Az állományok távolról történő elérése valamint e-mail értesítések küldése szintén lehet, hogy nem fog működni. Javasoljuk, hogy engedélyezze a kiszolgáló internetelérését, ha az összes funkciót szeretné használni.",
"Shared" => "Megosztott",
"Shared with {recipients}" => "Megosztva ővelük: {recipients}",
"Share" => "Megosztás",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Hiba a kedvencekhez adáskor",
"Error unfavoriting" => "Hiba a kedvencekből törléskor",
"Access forbidden" => "A hozzáférés nem engedélyezett",
-"Cloud not found" => "A felhő nem található",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Üdv!\\n\n\\n\nÉrtesítjük, hogy %s megosztotta Önnel a következőt: %s.\\n\nItt lehet megnézni: %s\\n\n\\n",
"The share will expire on %s." => "A megosztás lejár ekkor %s",
"Cheers!" => "Üdv.",
diff --git a/core/l10n/ia.php b/core/l10n/ia.php
index 2e84854f586..be244b04828 100644
--- a/core/l10n/ia.php
+++ b/core/l10n/ia.php
@@ -107,7 +107,6 @@ $TRANSLATIONS = array(
"Error loading tags" => "Error quando on cargava etiquettas",
"Tag already exists" => "Etiquetta ja existe",
"Access forbidden" => "Accesso prohibite",
-"Cloud not found" => "Nube non trovate",
"The share will expire on %s." => "Le compartir expirara le %s.",
"Cheers!" => "Acclamationes!",
"Security Warning" => "Aviso de securitate",
diff --git a/core/l10n/id.php b/core/l10n/id.php
index 5d4bb5cdc0e..d10a08ec70d 100644
--- a/core/l10n/id.php
+++ b/core/l10n/id.php
@@ -56,6 +56,7 @@ $TRANSLATIONS = array(
"So-so password" => "Sandi lumayan",
"Good password" => "Sandi baik",
"Strong password" => "Sandi kuat",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Web server Anda belum dikonfigurasikan dengan baik untuk mengizinkan sinkronisasi berkas karena tampaknya antarmuka WebDAV rusak.",
"Shared" => "Dibagikan",
"Share" => "Bagikan",
"Error" => "Galat",
@@ -120,7 +121,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Galat saat memberikan sebagai favorit",
"Error unfavoriting" => "Galat saat menghapus sebagai favorit",
"Access forbidden" => "Akses ditolak",
-"Cloud not found" => "Cloud tidak ditemukan",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hai,\n\nhanya supaya anda tahu bahwa %s membagikan %s dengan anda.\nLihat: %s\n\n",
"The share will expire on %s." => "Pembagian akan berakhir pada %s.",
"Cheers!" => "Horee!",
diff --git a/core/l10n/is.php b/core/l10n/is.php
index b1095a49bfb..cec7226680d 100644
--- a/core/l10n/is.php
+++ b/core/l10n/is.php
@@ -70,7 +70,6 @@ $TRANSLATIONS = array(
"Admin" => "Stjórnun",
"Help" => "Hjálp",
"Access forbidden" => "Aðgangur bannaður",
-"Cloud not found" => "Ský finnst ekki",
"Security Warning" => "Öryggis aðvörun",
"Create an <strong>admin account</strong>" => "Útbúa <strong>vefstjóra aðgang</strong>",
"Password" => "Lykilorð",
diff --git a/core/l10n/it.php b/core/l10n/it.php
index 474ac18850d..69692ebc79f 100644
--- a/core/l10n/it.php
+++ b/core/l10n/it.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Password così-così",
"Good password" => "Password buona",
"Strong password" => "Password forte",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file poiché l'interfaccia WebDAV sembra essere danneggiata.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Questo server ownCloud non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.",
"Shared" => "Condivisi",
"Shared with {recipients}" => "Condiviso con {recipients}",
"Share" => "Condividi",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Errore di creazione dei preferiti",
"Error unfavoriting" => "Errore di rimozione dai preferiti",
"Access forbidden" => "Accesso negato",
-"Cloud not found" => "Nuvola non trovata",
+"File not found" => "File non trovato",
+"The specified document has not been found on the server." => "Il documento specificato non è stato trovato sul server.",
+"You can click here to return to %s." => "Puoi fare clic qui per tornare a %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Ciao,\n\nvolevo informarti che %s ha condiviso %s con te.\nVedi: %s\n\n",
"The share will expire on %s." => "La condivisione scadrà il %s.",
"Cheers!" => "Saluti!",
diff --git a/core/l10n/ja.php b/core/l10n/ja.php
index 939e6e0c8a3..2891835fe42 100644
--- a/core/l10n/ja.php
+++ b/core/l10n/ja.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "まずまずのパスワード",
"Good password" => "良好なパスワード",
"Strong password" => "強いパスワード",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "WebDAVインターフェースに問題があると思われるため、WEBサーバーはまだファイルの同期を許可するよう適切に設定されていません。",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "このサーバーはインターネットに接続していません。この場合、外部ストレージのマウント、更新の通知やサードパーティアプリといったいくつかの機能が使えません。また、リモート接続でのファイルアクセス、通知メールの送信と言った機能も利用できないかもしれません。全ての機能を利用したいのであれば、このサーバーからインターネットに接続できるようにすることをお勧めします。",
"Shared" => "共有中",
"Shared with {recipients}" => "{recipients} と共有",
"Share" => "共有",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "お気に入りに追加エラー",
"Error unfavoriting" => "お気に入りから削除エラー",
"Access forbidden" => "アクセスが禁止されています",
-"Cloud not found" => "見つかりません",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "こんにちは、\n\n%s があなたと %s を共有したことをお知らせします。\nそれを表示: %s\n",
"The share will expire on %s." => "共有は %s で有効期限が切れます。",
"Cheers!" => "それでは!",
diff --git a/core/l10n/ka_GE.php b/core/l10n/ka_GE.php
index 31201abb898..2ba7d4d7cca 100644
--- a/core/l10n/ka_GE.php
+++ b/core/l10n/ka_GE.php
@@ -31,6 +31,7 @@ $TRANSLATIONS = array(
"_{count} file conflict_::_{count} file conflicts_" => array(""),
"New Files" => "ახალი ფაილები",
"Cancel" => "უარყოფა",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "თქვენი web სერვერი არ არის კონფიგურირებული ფაილ სინქრონიზაციისთვის, რადგან WebDAV ინტერფეისი შეიძლება იყოს გატეხილი.",
"Shared" => "გაზიარებული",
"Share" => "გაზიარება",
"Error" => "შეცდომა",
@@ -73,7 +74,6 @@ $TRANSLATIONS = array(
"Admin" => "ადმინისტრატორი",
"Help" => "დახმარება",
"Access forbidden" => "წვდომა აკრძალულია",
-"Cloud not found" => "ღრუბელი არ არსებობს",
"Security Warning" => "უსაფრთხოების გაფრთხილება",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "თქვენი PHP ვერსია შეიცავს საფრთხეს NULL Byte შეტევებისთვის (CVE-2006-7243)",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." => "თქვენი data დირექტორია და ფაილები დაშვებადია ინტერნეტში რადგან .htaccess ფაილი არ მუშაობს.",
diff --git a/core/l10n/km.php b/core/l10n/km.php
index c2da871a113..1e7c3b93df9 100644
--- a/core/l10n/km.php
+++ b/core/l10n/km.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"So-so password" => "ពាក្យ​សម្ងាត់​ធម្មតា",
"Good password" => "ពាក្យ​សម្ងាត់​ល្អ",
"Strong password" => "ពាក្យ​សម្ងាត់​ខ្លាំង",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "ម៉ាស៊ីន​មេ​វេប​របស់​អ្នក​មិន​បានរៀបចំត្រឹមត្រូវ ដើម្បី​អនុញ្ញាតិ​អោយ​មាន​ឯកសារ​ធ្វើ​សមកាលកម្មបាន​ទេ ព្រោះថា WebDAV ហាក់​បី​ដូច​ជាខូចហើយ។",
"Shared" => "បាន​ចែក​រំលែក",
"Share" => "ចែក​រំលែក",
"Error" => "កំហុស",
@@ -80,7 +81,6 @@ $TRANSLATIONS = array(
"Admin" => "អ្នក​គ្រប់​គ្រង",
"Help" => "ជំនួយ",
"Access forbidden" => "បាន​ហាមឃាត់​ការ​ចូល",
-"Cloud not found" => "រក​មិន​ឃើញ Cloud",
"Security Warning" => "បម្រាម​សុវត្ថិភាព",
"Create an <strong>admin account</strong>" => "បង្កើត​<strong>គណនី​អភិបាល</strong>",
"Password" => "ពាក្យសម្ងាត់",
diff --git a/core/l10n/ko.php b/core/l10n/ko.php
index ceff4c53f06..71eff300d06 100644
--- a/core/l10n/ko.php
+++ b/core/l10n/ko.php
@@ -58,6 +58,8 @@ $TRANSLATIONS = array(
"So-so password" => "그저 그런 암호",
"Good password" => "좋은 암호",
"Strong password" => "강력한 암호",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "WebDAV 인터페이스가 제대로 작동하지 않습니다. 웹 서버에서 파일 동기화를 사용할 수 있도록 설정이 제대로 되지 않은 것 같습니다.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "서버에서 인터넷에 연결할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 3자 앱 설치 등 일부 기능을 사용할 수 없습니다. 외부에서 파일에 접근하거나 알림 이메일을 보내지 못할 수도 있습니다. 모든 기능을 사용하려면 인터넷에 연결하는 것을 추천합니다.",
"Shared" => "공유됨",
"Share" => "공유",
"Error" => "오류",
@@ -122,7 +124,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "즐겨찾기 추가 오류",
"Error unfavoriting" => "즐겨찾기 삭제 오류",
"Access forbidden" => "접근 금지됨",
-"Cloud not found" => "클라우드를 찾을 수 없습니다",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "안녕하세요,\n\n%s 님이 %s을(를) 공유하였음을 알려 드립니다.\n보기 링크: %s\n\n",
"The share will expire on %s." => "이 공유는 %s 까지 유지됩니다.",
"Cheers!" => "감사합니다!",
diff --git a/core/l10n/ku_IQ.php b/core/l10n/ku_IQ.php
index 775fdab1f95..d188db0dab6 100644
--- a/core/l10n/ku_IQ.php
+++ b/core/l10n/ku_IQ.php
@@ -18,7 +18,6 @@ $TRANSLATIONS = array(
"Apps" => "به‌رنامه‌كان",
"Admin" => "به‌ڕێوه‌به‌ری سه‌ره‌كی",
"Help" => "یارمەتی",
-"Cloud not found" => "هیچ نه‌دۆزرایه‌وه‌",
"Password" => "وشەی تێپەربو",
"Data folder" => "زانیاری فۆڵده‌ر",
"Database user" => "به‌كارهێنه‌ری داتابه‌یس",
diff --git a/core/l10n/lb.php b/core/l10n/lb.php
index 24f8850f12a..e448a2b500d 100644
--- a/core/l10n/lb.php
+++ b/core/l10n/lb.php
@@ -94,7 +94,6 @@ $TRANSLATIONS = array(
"Error tagging" => "Fehler beim Taggen",
"Error untagging" => "Fehler beim Tag läschen",
"Access forbidden" => "Zougrëff net erlaabt",
-"Cloud not found" => "Cloud net fonnt",
"Cheers!" => "Prost!",
"Security Warning" => "Sécherheets-Warnung",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Deng PHP-Versioun ass verwonnbar duerch d'NULL-Byte-Attack (CVE-2006-7243)",
diff --git a/core/l10n/lt_LT.php b/core/l10n/lt_LT.php
index 328ffd808eb..d3b98951506 100644
--- a/core/l10n/lt_LT.php
+++ b/core/l10n/lt_LT.php
@@ -48,6 +48,8 @@ $TRANSLATIONS = array(
"(all selected)" => "(visi pažymėti)",
"({count} selected)" => "({count} pažymėtų)",
"Error loading file exists template" => "Klaida įkeliant esančių failų ruošinį",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Jūsų serveris nėra tvarkingai nustatytas leisti failų sinchronizaciją, nes WebDAV sąsaja panašu, kad yra sugadinta.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Šis serveris neturi veikiančio ryšio. Tai reiškia, kas kai kurios funkcijos kaip išorinės saugyklos prijungimas, perspėjimai apie atnaujinimus ar trečių šalių programų įdiegimas neveikia. Failų pasiekimas iš kitur ir pranešimų siuntimas el. paštu gali taip pat neveikti. Rekomenduojame įjungti interneto ryšį šiame serveryje, jei norite naudoti visas funkcijas.",
"Shared" => "Dalinamasi",
"Share" => "Dalintis",
"Error" => "Klaida",
@@ -111,7 +113,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Klaida įtraukiant į mėgstamus.",
"Error unfavoriting" => "Klaida pašalinant iš mėgstamų.",
"Access forbidden" => "Priėjimas draudžiamas",
-"Cloud not found" => "Negalima rasti",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Labas,\n\nInformuojame, kad %s pasidalino su Jumis %s.\nPažiūrėti tai: %s\n",
"The share will expire on %s." => "Bendrinimo laikas baigsis %s.",
"Cheers!" => "Sveikinimai!",
diff --git a/core/l10n/lv.php b/core/l10n/lv.php
index 166ecf80370..4ed068bf751 100644
--- a/core/l10n/lv.php
+++ b/core/l10n/lv.php
@@ -30,6 +30,8 @@ $TRANSLATIONS = array(
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"New Files" => "Jaunās datnes",
"Cancel" => "Atcelt",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Jūsu serveris vēl nav pareizi iestatīts, lai ļautu sinhronizēt datnes, jo izskatās, ka WebDAV saskarne ir salauzta.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Šim serverim nav savienojums ar internetu. Tas nozīmē ka nebūs tādas iespējas kā ārējo datu nesēju montēšana, paziņojumi par atjauninājumiem vai citu izstrādātāju programmu uzstādīšana. Attālināta failu piekļuve vai paziņojumu epastu sūtīšana iespējams arī nedarbosies. Ir rekomendēts iespējot interneta savienojumu lai gūtu iespēju izmantotu visus risinājumus.",
"Shared" => "Kopīgs",
"Share" => "Dalīties",
"Error" => "Kļūda",
@@ -76,7 +78,6 @@ $TRANSLATIONS = array(
"Admin" => "Administratori",
"Help" => "Palīdzība",
"Access forbidden" => "Pieeja ir liegta",
-"Cloud not found" => "Mākonis netika atrasts",
"Security Warning" => "Brīdinājums par drošību",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Jūsu PHP ir ievainojamība pret NULL Byte uzbrukumiem (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Lūdzu atjauniniet PHP instalāciju lai varētu droši izmantot %s.",
diff --git a/core/l10n/mk.php b/core/l10n/mk.php
index c8d6dc9fa42..ed41f264605 100644
--- a/core/l10n/mk.php
+++ b/core/l10n/mk.php
@@ -102,7 +102,6 @@ $TRANSLATIONS = array(
"Error untagging" => "Грешка при отстранување на таговите",
"Error favoriting" => "Грешка при ",
"Access forbidden" => "Забранет пристап",
-"Cloud not found" => "Облакот не е најден",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Здраво,\n\nСамо да ве известам дека %s shared %s with you.\nView it: %s\n\n",
"Cheers!" => "Поздрав!",
"Security Warning" => "Безбедносно предупредување",
diff --git a/core/l10n/ms_MY.php b/core/l10n/ms_MY.php
index 8eb766614a8..414b190fe6c 100644
--- a/core/l10n/ms_MY.php
+++ b/core/l10n/ms_MY.php
@@ -46,7 +46,6 @@ $TRANSLATIONS = array(
"Admin" => "Admin",
"Help" => "Bantuan",
"Access forbidden" => "Larangan akses",
-"Cloud not found" => "Awan tidak dijumpai",
"Security Warning" => "Amaran keselamatan",
"Create an <strong>admin account</strong>" => "buat <strong>akaun admin</strong>",
"Password" => "Kata laluan",
diff --git a/core/l10n/mt_MT.php b/core/l10n/mt_MT.php
new file mode 100644
index 00000000000..98de84e3313
--- /dev/null
+++ b/core/l10n/mt_MT.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"_{count} file conflict_::_{count} file conflicts_" => array("","","","")
+);
+$PLURAL_FORMS = "nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);";
diff --git a/core/l10n/my_MM.php b/core/l10n/my_MM.php
index d6a6632ecfc..eec76317284 100644
--- a/core/l10n/my_MM.php
+++ b/core/l10n/my_MM.php
@@ -33,7 +33,6 @@ $TRANSLATIONS = array(
"Apps" => "Apps",
"Admin" => "အက်ဒမင်",
"Help" => "အကူအညီ",
-"Cloud not found" => "မတွေ့ရှိမိပါ",
"Security Warning" => "လုံခြုံရေးသတိပေးချက်",
"Create an <strong>admin account</strong>" => "<strong>အက်ဒမင်အကောင့်</strong>တစ်ခုဖန်တီးမည်",
"Password" => "စကားဝှက်",
diff --git a/core/l10n/nb_NO.php b/core/l10n/nb_NO.php
index 5cb06574a08..106fbd65094 100644
--- a/core/l10n/nb_NO.php
+++ b/core/l10n/nb_NO.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "So-so-passord",
"Good password" => "Bra passord",
"Strong password" => "Sterkt passord",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Din nettservev er ikke konfigurert korrekt for filsynkronisering. WebDAV ser ut til å ikke funkere.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Denne serveren har ikke en fungerende Internett-tilkobling. Dette betyr at noen av funksjonene, f.eks. å koble opp ekstern lagring, påminnelser om oppdatering eller installering av 3-parts apper ikke fungerer. Fjerntilgang til filer og utsending av påminnelser i e-post virker kanskje ikke heller. Vi anbefaler at Internett-forbindelsen for denne serveren aktiveres hvis du vil ha full funksjonalitet.",
"Shared" => "Delt",
"Shared with {recipients}" => "Delt med {recipients}",
"Share" => "Del",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Feil ved favorittmerking",
"Error unfavoriting" => "Feil ved fjerning av favorittmerking",
"Access forbidden" => "Tilgang nektet",
-"Cloud not found" => "Sky ikke funnet",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hei,\n\nDette er en beskjed om at %s delte %s med deg.\nVis den: %s\n\n",
"The share will expire on %s." => "Delingen vil opphøre %s.",
"Cheers!" => "Ha det!",
diff --git a/core/l10n/nl.php b/core/l10n/nl.php
index 1a808046838..aac1542aed0 100644
--- a/core/l10n/nl.php
+++ b/core/l10n/nl.php
@@ -66,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "Matig wachtwoord",
"Good password" => "Goed wachtwoord",
"Strong password" => "Sterk wachtwoord",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Uw webserver is nog niet goed ingesteld voor bestandssynchronisatie omdat de WebDAV interface verbroken lijkt.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie emails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.",
+"Error occurred while checking server setup" => "Een fout trad op bij checken serverconfiguratie",
"Shared" => "Gedeeld",
"Shared with {recipients}" => "Gedeeld met {recipients}",
"Share" => "Delen",
@@ -140,10 +143,23 @@ $TRANSLATIONS = array(
"Error favoriting" => "Fout bij favoriet maken",
"Error unfavoriting" => "Fout bij verwijderen favorietstatus",
"Access forbidden" => "Toegang verboden",
-"Cloud not found" => "Cloud niet gevonden",
+"File not found" => "Bestand niet gevonden",
+"The specified document has not been found on the server." => "Het opgegeven document is niet gevonden op deze server.",
+"You can click here to return to %s." => "Klik hier om terug te keren naar %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hallo,\n\n%s deelt %s met u.\nBekijk het hier: %s\n\n",
"The share will expire on %s." => "De share vervalt op %s.",
"Cheers!" => "Proficiat!",
+"The server encountered an internal error and was unable to complete your request." => "De server ontdekte een interne fout en kon uw aanvraag niet verder uitvoeren.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Neem contact op mer de serverbeheerder als deze fout meerdere keren optreedt en neem de onderstaande technische details op in uw melding.",
+"More details can be found in the server log." => "Meer details in de serverlogging,",
+"Technical details" => "Technische details",
+"Remote Address: %s" => "Extern adres: %s",
+"Request ID: %s" => "Aanvraag ID: %s",
+"Code: %s" => "Code: %s",
+"Message: %s" => "Boodschap: %s",
+"File: %s" => "Bestand: %s",
+"Line: %s" => "Regel: %s",
+"Trace" => "Trace",
"Security Warning" => "Beveiligingswaarschuwing",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Uw PHP-versie is kwetsbaar voor de NULL byte aanval (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Werk uw PHP installatie bij om %s veilig te kunnen gebruiken.",
diff --git a/core/l10n/nn_NO.php b/core/l10n/nn_NO.php
index d51e750f3ed..dcbad11138d 100644
--- a/core/l10n/nn_NO.php
+++ b/core/l10n/nn_NO.php
@@ -50,6 +50,8 @@ $TRANSLATIONS = array(
"Error loading file exists template" => "Klarte ikkje å lasta fil-finst-mal",
"Very weak password" => "Veldig svakt passord",
"Weak password" => "Svakt passord",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Tenaren din er ikkje enno rett innstilt til å tilby filsynkronisering sidan WebDAV-grensesnittet ser ut til å vera øydelagt.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Denne tenaren har ikkje ei fungerande nettilkopling. Dette vil seia at visse funksjonar, som montering av ekstern lagring, meldingar om oppdateringar eller installering av tredjepartsprogram, ikkje vil fungera. Det kan òg henda at du ikkje får tilgang til filene dine utanfrå, eller ikkje får sendt varslingsepostar. Me rår deg til å skru på nettilkoplinga for denne tenaren viss du ønskjer desse funksjonane.",
"Shared" => "Delt",
"Share" => "Del",
"Error" => "Feil",
@@ -99,7 +101,6 @@ $TRANSLATIONS = array(
"Admin" => "Admin",
"Help" => "Hjelp",
"Access forbidden" => "Tilgang forbudt",
-"Cloud not found" => "Fann ikkje skyen",
"Security Warning" => "Tryggleiksåtvaring",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "PHP-utgåva di er sårbar for NULL-byteåtaket (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Ver venleg og oppdater PHP-installasjonen din til å brukar %s trygt.",
diff --git a/core/l10n/oc.php b/core/l10n/oc.php
index 42ea079ec96..d785441ee28 100644
--- a/core/l10n/oc.php
+++ b/core/l10n/oc.php
@@ -60,7 +60,6 @@ $TRANSLATIONS = array(
"Admin" => "Admin",
"Help" => "Ajuda",
"Access forbidden" => "Acces enebit",
-"Cloud not found" => "Nívol pas trobada",
"Security Warning" => "Avertiment de securitat",
"Create an <strong>admin account</strong>" => "Crea un <strong>compte admin</strong>",
"Password" => "Senhal",
diff --git a/core/l10n/pl.php b/core/l10n/pl.php
index 8d0d812cf21..7d991cdef82 100644
--- a/core/l10n/pl.php
+++ b/core/l10n/pl.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Mało skomplikowane hasło",
"Good password" => "Dobre hasło",
"Strong password" => "Mocne hasło",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Serwer internetowy nie jest jeszcze poprawnie skonfigurowany, aby umożliwić synchronizację plików, ponieważ interfejs WebDAV wydaje się być uszkodzony.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Ten serwer OwnCloud nie ma połączenia z Internetem. Oznacza to, że niektóre z funkcji, takich jak montowanie zewnętrznych zasobów, powiadomienia o aktualizacji lub 3-cie aplikacje mogą nie działać. Dostęp do plików z zewnątrz i wysyłanie powiadomienia e-mail nie może również działać. Sugerujemy, aby włączyć połączenia internetowego dla tego serwera, jeśli chcesz mieć wszystkie opcje.",
"Shared" => "Udostępniono",
"Shared with {recipients}" => "Współdzielony z {recipients}",
"Share" => "Udostępnij",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Błąd podczas dodawania do ulubionch",
"Error unfavoriting" => "Błąd przy usuwaniu z ulubionych",
"Access forbidden" => "Dostęp zabroniony",
-"Cloud not found" => "Nie odnaleziono chmury",
+"File not found" => "Nie odnaleziono pliku",
+"The specified document has not been found on the server." => "Wskazany dokument nie został znaleziony na serwerze.",
+"You can click here to return to %s." => "Możesz kliknąć tutaj aby powrócić do %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Witaj,\n\ntylko informuję, że %s współdzieli z Tobą %s.\nZobacz tutaj: %s\n\n",
"The share will expire on %s." => "Ten zasób wygaśnie %s",
"Cheers!" => "Pozdrawiam!",
@@ -186,6 +190,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "Motyw %s został wyłączony.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Proszę się upewnić, że baza danych, folder konfiguracji oraz folder danych zostały zarchiwizowane przed przejściem dalej.",
"Start update" => "Rozpocznij aktualizację",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Aby uniknąć timeout-ów przy większych instalacjach, możesz zamiast tego uruchomić następującą komendę w katalogu Twojej instalacji:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Aby uniknąć timeout-ów przy większych instalacjach, możesz zamiast tego uruchomić następującą komendę w katalogu Twojej instalacji:",
+"This %s instance is currently being updated, which may take a while." => "Ta instancja %s jest właśnie aktualizowana, co może chwilę potrwać.",
+"This page will refresh itself when the %s instance is available again." => "Strona odświeży się gdy instancja %s będzie ponownie dostępna."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php
index 1c69248a194..8a25ec579a8 100644
--- a/core/l10n/pt_BR.php
+++ b/core/l10n/pt_BR.php
@@ -66,6 +66,9 @@ $TRANSLATIONS = array(
"So-so password" => "Senha mais ou menos",
"Good password" => "Boa senha",
"Strong password" => "Senha forte",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Seu servidor web não está configurado corretamente para permitir sincronização de arquivos porque a interface WebDAV parece não estar funcionando.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Este servidor não tem conexão com a internet. Isso significa que algumas das características como a montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de 3ºs terceiros não funcionam. Acessar arquivos remotamente e envio de e-mails de notificação também não podem funcionar. Sugerimos permitir conexão com a internet para esse servidor, se você deseja ter todas as funcionalidades.",
+"Error occurred while checking server setup" => "Erro ao verificar a configuração do servidor",
"Shared" => "Compartilhados",
"Shared with {recipients}" => "Compartilhado com {recipients}",
"Share" => "Compartilhar",
@@ -140,10 +143,23 @@ $TRANSLATIONS = array(
"Error favoriting" => "Erro colocando nos favoritos",
"Error unfavoriting" => "Erro retirando do favoritos",
"Access forbidden" => "Acesso proibido",
-"Cloud not found" => "Cloud não encontrado",
+"File not found" => "Arquivo não encontrado",
+"The specified document has not been found on the server." => "O documento especificado não foi encontrado no servidor.",
+"You can click here to return to %s." => "Você pode clicar aqui para retornar para %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Olá,\n\ngostaria que você soubesse que %s compartilhou %s com você.\nVeja isto: %s\n\n",
"The share will expire on %s." => "O compartilhamento irá expirar em %s.",
"Cheers!" => "Saúde!",
+"The server encountered an internal error and was unable to complete your request." => "O servidor encontrou um erro interno e não conseguiu concluir o seu pedido.",
+"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." => "Entre em contato com o administrador do servidor se este erro reaparece várias vezes, por favor, inclua os detalhes técnicos abaixo em seu relatório.",
+"More details can be found in the server log." => "Mais detalhes podem ser encontrados no log do servidor.",
+"Technical details" => "Detalhes técnicos",
+"Remote Address: %s" => "Endereço Remoto: %s",
+"Request ID: %s" => "ID do Pedido: %s",
+"Code: %s" => "Código: %s",
+"Message: %s" => "Mensagem: %s",
+"File: %s" => "Arquivo: %s",
+"Line: %s" => "Linha: %s",
+"Trace" => "Rastreamento",
"Security Warning" => "Aviso de Segurança",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Sua versão do PHP está vulnerável ao ataque NULL Byte (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Por favor, atualize sua instalação PHP para usar %s segurança.",
diff --git a/core/l10n/pt_PT.php b/core/l10n/pt_PT.php
index ade2f7a520f..d6a940f6cfd 100644
--- a/core/l10n/pt_PT.php
+++ b/core/l10n/pt_PT.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Password aceitável",
"Good password" => "Password Forte",
"Strong password" => "Password muito forte",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "O seu servidor web não está configurado correctamente para autorizar sincronização de ficheiros, pois o interface WebDAV parece estar com problemas.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Este servidor ownCloud não tem uma ligação de internet a funcionar. Isto significa que algumas funcionalidades como o acesso a locais externos (dropbox, gdrive, etc), notificações sobre actualizções, ou a instalação de aplicações não irá funcionar. Sugerimos que active uma ligação à internet se pretender obter todas as funcionalidades do ownCloud.",
"Shared" => "Partilhado",
"Shared with {recipients}" => "Partilhado com {recipients}",
"Share" => "Partilhar",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Erro a definir como favorito",
"Error unfavoriting" => "Erro a remover como favorito",
"Access forbidden" => "Acesso interdito",
-"Cloud not found" => "Cloud nao encontrada",
+"File not found" => "Ficheiro não encontrado",
+"The specified document has not been found on the server." => "O documento especificado não foi encontrado no servidor.",
+"You can click here to return to %s." => "Pode clicar aqui para retornar para %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Olá,\n\napenas para informar que %s partilhou »%s« consigo.\nConsulte aqui: %s\n",
"The share will expire on %s." => "Esta partilha vai expirar em %s.",
"Cheers!" => "Parabéns!",
@@ -186,6 +190,8 @@ $TRANSLATIONS = array(
"The theme %s has been disabled." => "O tema %s foi desativado.",
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." => "Por favor garanta a cópia de segurança da base de dados e das pastas 'config' e 'data' antes de prosseguir.",
"Start update" => "Iniciar atualização",
-"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Para evitar tempos de espera com instalações maiores, você pode em vez disso, executar o seguinte comando a partir do diretório de instalação:"
+"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" => "Para evitar tempos de espera com instalações maiores, você pode em vez disso, executar o seguinte comando a partir do diretório de instalação:",
+"This %s instance is currently being updated, which may take a while." => "Esta instância %s está actualmente a ser actualizada, poderá demorar algum tempo.",
+"This page will refresh itself when the %s instance is available again." => "Esta página irá ser recarregada novamente quando a instância %s ficar novamente disponível."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/core/l10n/ro.php b/core/l10n/ro.php
index fe717125d06..591cd7e2850 100644
--- a/core/l10n/ro.php
+++ b/core/l10n/ro.php
@@ -53,6 +53,7 @@ $TRANSLATIONS = array(
"Weak password" => "Parolă slabă",
"Good password" => "Parolă bună",
"Strong password" => "Parolă puternică",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Serverul de web nu este încă setat corespunzător pentru a permite sincronizarea fișierelor deoarece interfața WebDAV pare a fi întreruptă.",
"Shared" => "Partajat",
"Shared with {recipients}" => "Partajat cu {recipients}",
"Share" => "Partajează",
@@ -108,7 +109,6 @@ $TRANSLATIONS = array(
"Admin" => "Administrator",
"Help" => "Ajutor",
"Access forbidden" => "Acces restricționat",
-"Cloud not found" => "Nu s-a găsit",
"The share will expire on %s." => "Partajarea va expira în data de %s.",
"Security Warning" => "Avertisment de securitate",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Versiunea dvs. PHP este vulnerabilă la un atac cu un octet NULL (CVE-2006-7243)",
diff --git a/core/l10n/ru.php b/core/l10n/ru.php
index 017a0147298..203aef008d0 100644
--- a/core/l10n/ru.php
+++ b/core/l10n/ru.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Так себе пароль",
"Good password" => "Хороший пароль",
"Strong password" => "Устойчивый к взлому пароль",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Веб-сервер до сих пор не настроен для возможности синхронизации файлов. Похоже что проблема в неисправности интерфейса WebDAV.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Этот сервер не имеет подключения к сети интернет. Это значит, что некоторые возможности, такие как подключение внешних дисков, уведомления об обновлениях или установка сторонних приложений – не работают. Удалённый доступ к файлам и отправка уведомлений по электронной почте вероятнее всего тоже не будут работать. Предлагаем включить соединение с интернетом для этого сервера, если Вы хотите иметь все возможности.",
"Shared" => "Общие",
"Shared with {recipients}" => "Доступ открыт {recipients}",
"Share" => "Открыть доступ",
@@ -140,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Ошибка размещения в любимых",
"Error unfavoriting" => "Ошибка удаления из любимых",
"Access forbidden" => "Доступ запрещён",
-"Cloud not found" => "Облако не найдено",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Здравствуйте,\n\n%s предоставил Вам доступ к %s.\nПосмотреть: %s\n\n",
"The share will expire on %s." => "Доступ будет закрыт %s",
"Cheers!" => "Удачи!",
diff --git a/core/l10n/si_LK.php b/core/l10n/si_LK.php
index e0763d7a924..57de60748e9 100644
--- a/core/l10n/si_LK.php
+++ b/core/l10n/si_LK.php
@@ -57,7 +57,6 @@ $TRANSLATIONS = array(
"Admin" => "පරිපාලක",
"Help" => "උදව්",
"Access forbidden" => "ඇතුල් වීම තහනම්",
-"Cloud not found" => "සොයා ගත නොහැක",
"Security Warning" => "ආරක්ෂක නිවේදනයක්",
"Password" => "මුර පදය",
"Data folder" => "දත්ත ෆෝල්ඩරය",
diff --git a/core/l10n/sk_SK.php b/core/l10n/sk_SK.php
index 85538f5a71d..cae7bfd3a5a 100644
--- a/core/l10n/sk_SK.php
+++ b/core/l10n/sk_SK.php
@@ -5,6 +5,8 @@ $TRANSLATIONS = array(
"Turned off maintenance mode" => "Mód údržby e vypnutý",
"Updated database" => "Databáza je aktualizovaná",
"Checked database schema update" => "Skontrolovať aktualizáciu schémy databázy",
+"Checked database schema update for apps" => "Aktualizácia schémy databázy aplikácií bola overená",
+"Updated \"%s\" to %s" => "Aktualizované \"%s\" na %s",
"Disabled incompatible apps: %s" => "Zakázané nekompatibilné aplikácie: %s",
"No image or file provided" => "Obrázok alebo súbor nebol zadaný",
"Unknown filetype" => "Neznámy typ súboru",
@@ -64,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Priemerné heslo",
"Good password" => "Dobré heslo",
"Strong password" => "Silné heslo",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Váš webový server nie je správne nastavený na synchronizáciu, pretože rozhranie WebDAV je poškodené.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Server nemá funkčné pripojenie k internetu. Niektoré moduly ako napr. externé úložisko, oznámenie o dostupných aktualizáciách alebo inštalácia aplikácií tretích strán nebudú fungovať. Prístup k súborom z iných miest a odosielanie oznamovacích emailov tiež nemusí fungovať. Ak chcete využívať všetky vlastnosti ownCloudu, odporúčame povoliť pripojenie k internetu tomuto serveru.",
"Shared" => "Zdieľané",
"Shared with {recipients}" => "Zdieľa s {recipients}",
"Share" => "Zdieľať",
@@ -138,7 +142,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Chyba pri pridaní do obľúbených",
"Error unfavoriting" => "Chyba pri odobratí z obľúbených",
"Access forbidden" => "Prístup odmietnutý",
-"Cloud not found" => "Nenájdené",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Dobrý deň,\n\nPoužívateľ %s zdieľa s vami súbor, alebo priečinok s názvom %s.\nPre zobrazenie kliknite na túto linku: %s\n",
"The share will expire on %s." => "Zdieľanie vyprší %s.",
"Cheers!" => "Pekný deň!",
@@ -176,6 +179,7 @@ $TRANSLATIONS = array(
"Thank you for your patience." => "Ďakujeme za Vašu trpezlivosť.",
"You are accessing the server from an untrusted domain." => "Pristupujete na server v nedôveryhodnej doméne.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." => "Kontaktujte administrátora. Ak ste administrátorom tejto inštancie, nakonfigurujte správne nastavenie \"trusted_domain\" v config/config.php. Vzorová konfigurácia je uvedená v config/config.sample.php.",
+"Add \"%s\" as trusted domain" => "Pridať \"%s\" ako dôveryhodnú doménu",
"%s will be updated to version %s." => "%s bude zaktualizovaný na verziu %s.",
"The following apps will be disabled:" => "Tieto aplikácie budú zakázané:",
"The theme %s has been disabled." => "Téma %s bola zakázaná.",
diff --git a/core/l10n/sl.php b/core/l10n/sl.php
index 4bbf11c56b5..cc350690f4c 100644
--- a/core/l10n/sl.php
+++ b/core/l10n/sl.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Slabo geslo",
"Good password" => "Dobro geslo",
"Strong password" => "Odlično geslo",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Spletni stražnik še ni ustrezno nastavljen in ne omogoča usklajevanja, saj je nastavitev WebDAV okvarjena.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Na voljo ni delujoče internetne povezave. To pomeni, da nekaterih možnosti, kot so priklapljanje zunanje shrambe, obveščanja o posodobitvah in nameščanje programov tretje roke ni podprto. Dostop do datotek z oddaljenih mest in pošiljanje obvestil preko elektronske pošte je verjetno še vedno mogoče. Za omogočanje vseh zmožnosti mora biti vzpostavljena tudi ustrezna internetna povezava.",
"Shared" => "V souporabi",
"Shared with {recipients}" => "V souporabi z {recipients}",
"Share" => "Souporaba",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Napaka označevanja priljubljenosti",
"Error unfavoriting" => "Napaka odstranjevanja oznake priljubljenosti",
"Access forbidden" => "Dostop je prepovedan",
-"Cloud not found" => "Oblaka ni mogoče najti",
+"File not found" => "Datoteke ni mogoče najti",
+"The specified document has not been found on the server." => "Določenega dokumenta na strežniku ni mogoče najti.",
+"You can click here to return to %s." => "S klikom na povezavo boste vrnjeni na %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Pozdravljeni,\n\noseba %s vam je omogočila souporabo %s.\nVir si lahko ogledate: %s\n\n",
"The share will expire on %s." => "Povezava souporabe bo potekla %s.",
"Cheers!" => "Na zdravje!",
diff --git a/core/l10n/sq.php b/core/l10n/sq.php
index 654d991d6d5..7ae33ee303d 100644
--- a/core/l10n/sq.php
+++ b/core/l10n/sq.php
@@ -32,6 +32,7 @@ $TRANSLATIONS = array(
"Ok" => "Në rregull",
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
"Cancel" => "Anulo",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Web Serveri juaj nuk është konfigurar sic duhet në mënyre që të lejojë sinkronizimin e skedare pasi ndërfaqja WevDAV duket të jetë e demtuar.",
"Shared" => "Ndarë",
"Share" => "Nda",
"Error" => "Veprim i gabuar",
@@ -78,7 +79,6 @@ $TRANSLATIONS = array(
"Admin" => "Admin",
"Help" => "Ndihmë",
"Access forbidden" => "Ndalohet hyrja",
-"Cloud not found" => "Cloud-i nuk u gjet",
"Security Warning" => "Paralajmërim sigurie",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Versioni juaj i PHP-së është i cënueshëm nga sulmi NULL Byte (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Ju lutem azhurnoni instalimin tuaj të PHP-së që të përdorni %s -in në mënyrë të sigurt.",
diff --git a/core/l10n/sr.php b/core/l10n/sr.php
index fb315967707..2d994100867 100644
--- a/core/l10n/sr.php
+++ b/core/l10n/sr.php
@@ -29,6 +29,7 @@ $TRANSLATIONS = array(
"Ok" => "У реду",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"Cancel" => "Откажи",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ваш веб сервер тренутно не подржава синхронизацију датотека јер се чини да је WebDAV сучеље неисправно.",
"Share" => "Дели",
"Error" => "Грешка",
"Error while sharing" => "Грешка у дељењу",
@@ -68,7 +69,6 @@ $TRANSLATIONS = array(
"Admin" => "Администратор",
"Help" => "Помоћ",
"Access forbidden" => "Забрањен приступ",
-"Cloud not found" => "Облак није нађен",
"Security Warning" => "Сигурносно упозорење",
"Create an <strong>admin account</strong>" => "Направи <strong>административни налог</strong>",
"Password" => "Лозинка",
diff --git a/core/l10n/sr@latin.php b/core/l10n/sr@latin.php
index 6bcaaa3320d..28009eccb0d 100644
--- a/core/l10n/sr@latin.php
+++ b/core/l10n/sr@latin.php
@@ -79,7 +79,6 @@ $TRANSLATIONS = array(
"Admin" => "Adninistracija",
"Help" => "Pomoć",
"Access forbidden" => "Pristup zabranjen",
-"Cloud not found" => "Oblak nije nađen",
"Security Warning" => "Bezbednosno upozorenje",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Vaša PHP verzija je ranjiva na ",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." => "Vaši podaci i direktorijumi su verovatno dostupni sa interneta jer .htaccess fajl ne funkcioniše.",
diff --git a/core/l10n/sv.php b/core/l10n/sv.php
index e2e233cf893..489ce234e45 100644
--- a/core/l10n/sv.php
+++ b/core/l10n/sv.php
@@ -63,6 +63,8 @@ $TRANSLATIONS = array(
"So-so password" => "Okej lösenord",
"Good password" => "Bra lösenord",
"Strong password" => "Starkt lösenord",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Din webbserver är inte korrekt konfigurerad för att tillåta filsynkronisering eftersom WebDAV inte verkar fungera.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Servern har ingen fungerande internetanslutning. Detta innebär att en del av de funktioner som montering av extern lagring, notifieringar om uppdateringar eller installation av 3: e part appar inte fungerar. Åtkomst till filer och skicka e-postmeddelanden fungerar troligen inte heller. Vi rekommenderar starkt att aktivera en internetuppkoppling för denna server om du vill ha alla funktioner.",
"Shared" => "Delad",
"Shared with {recipients}" => "Delad med {recipients}",
"Share" => "Dela",
@@ -137,7 +139,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Fel favorisering",
"Error unfavoriting" => "Fel av favorisering ",
"Access forbidden" => "Åtkomst förbjuden",
-"Cloud not found" => "Hittade inget moln",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hej där!,\n\nVi vill bara meddela att %s delade %s med dig.\nTitta på den här: %s\n\n",
"The share will expire on %s." => "Utdelningen kommer att upphöra %s.",
"Cheers!" => "Ha de fint!",
diff --git a/core/l10n/ta_LK.php b/core/l10n/ta_LK.php
index ac613efaac2..30262c1fbf8 100644
--- a/core/l10n/ta_LK.php
+++ b/core/l10n/ta_LK.php
@@ -65,7 +65,6 @@ $TRANSLATIONS = array(
"Admin" => "நிர்வாகம்",
"Help" => "உதவி",
"Access forbidden" => "அணுக தடை",
-"Cloud not found" => "Cloud காணப்படவில்லை",
"Security Warning" => "பாதுகாப்பு எச்சரிக்கை",
"Create an <strong>admin account</strong>" => "<strong> நிர்வாக கணக்கொன்றை </strong> உருவாக்குக",
"Password" => "கடவுச்சொல்",
diff --git a/core/l10n/th_TH.php b/core/l10n/th_TH.php
index f4cee72b4f4..c27fbe4c335 100644
--- a/core/l10n/th_TH.php
+++ b/core/l10n/th_TH.php
@@ -74,7 +74,6 @@ $TRANSLATIONS = array(
"Admin" => "ผู้ดูแล",
"Help" => "ช่วยเหลือ",
"Access forbidden" => "การเข้าถึงถูกหวงห้าม",
-"Cloud not found" => "ไม่พบ Cloud",
"Security Warning" => "คำเตือนเกี่ยวกับความปลอดภัย",
"Create an <strong>admin account</strong>" => "สร้าง <strong>บัญชีผู้ดูแลระบบ</strong>",
"Password" => "รหัสผ่าน",
diff --git a/core/l10n/tr.php b/core/l10n/tr.php
index feffc916428..4b2fb78029c 100644
--- a/core/l10n/tr.php
+++ b/core/l10n/tr.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "Normal parola",
"Good password" => "İyi parola",
"Strong password" => "Güçlü parola",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Web sunucunuz dosya eşitlemesine izin vermek üzere düzgün bir şekilde yapılandırılmamış. WebDAV arayüzü sorunlu görünüyor.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "Bu sunucunun çalışan bir internet bağlantısı yok. Bu, harici depolama alanı bağlama, güncelleştirme bildirimleri veya 3. parti uygulama kurma gibi bazı özellikler çalışmayacağı anlamına gelmektedir. Uzaktan dosyalara erişim ve e-posta ile bildirim gönderme de çalışmayacaktır. Eğer bu özelliklerin tamamını kullanmak istiyorsanız, sunucu için internet bağlantısını etkinleştirmenizi öneriyoruz.",
"Shared" => "Paylaşılan",
"Shared with {recipients}" => "{recipients} ile paylaşılmış",
"Share" => "Paylaş",
@@ -140,7 +142,9 @@ $TRANSLATIONS = array(
"Error favoriting" => "Beğenilirken hata",
"Error unfavoriting" => "Beğeniden kaldırılırken hata",
"Access forbidden" => "Erişim yasak",
-"Cloud not found" => "Bulut bulunamadı",
+"File not found" => "Dosya bulunamadı",
+"The specified document has not been found on the server." => "Belirtilen dosya sunucuda bulunamadı.",
+"You can click here to return to %s." => "%s ana sayfasına dönmek için buraya tıklayabilirsiniz.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Merhaba,\n\nSadece %s sizinle %s paylaşımını yaptığını bildiriyoruz.\nBuradan bakabilirsiniz: %s\n\n",
"The share will expire on %s." => "Bu paylaşım %s tarihinde sona erecek.",
"Cheers!" => "Hoşça kalın!",
diff --git a/core/l10n/ug.php b/core/l10n/ug.php
index fb52f5483a2..418563352bd 100644
--- a/core/l10n/ug.php
+++ b/core/l10n/ug.php
@@ -27,6 +27,7 @@ $TRANSLATIONS = array(
"Ok" => "جەزملە",
"_{count} file conflict_::_{count} file conflicts_" => array(""),
"Cancel" => "ۋاز كەچ",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "سىزنىڭ تور مۇلازىمېتىرىڭىز ھۆججەت قەدەمداشلاشقا يول قويىدىغان قىلىپ توغرا تەڭشەلمەپتۇ، چۈنكى WebDAV نىڭ ئېغىزى بۇزۇلغاندەك تۇرىدۇ.",
"Share" => "ھەمبەھىر",
"Error" => "خاتالىق",
"Send" => "يوللا",
diff --git a/core/l10n/uk.php b/core/l10n/uk.php
index bf4c8697784..ce15a2b2e9a 100644
--- a/core/l10n/uk.php
+++ b/core/l10n/uk.php
@@ -53,6 +53,7 @@ $TRANSLATIONS = array(
"Weak password" => "Слабкий пароль",
"Good password" => "Добрий пароль",
"Strong password" => "Надійний пароль",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Ваш Web-сервер ще не налаштований належним чином для того, щоб дозволити синхронізацію файлів, через те що інтерфейс WebDAV, здається, зламаний.",
"Shared" => "Опубліковано",
"Share" => "Поділитися",
"Error" => "Помилка",
@@ -117,7 +118,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "Помилка позначення улюблених",
"Error unfavoriting" => "Помилка зняття позначки улюблених",
"Access forbidden" => "Доступ заборонено",
-"Cloud not found" => "Cloud не знайдено",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Агов,\n\nпросто щоб ви знали, що %s поділився %s з вами.\nПодивіться: %s\n\n",
"The share will expire on %s." => "Доступ до спільних даних вичерпається %s.",
"Cheers!" => "Будьмо!",
diff --git a/core/l10n/ur_PK.php b/core/l10n/ur_PK.php
index 3ba7bdeb4ef..fa7fcbcf6db 100644
--- a/core/l10n/ur_PK.php
+++ b/core/l10n/ur_PK.php
@@ -99,7 +99,6 @@ $TRANSLATIONS = array(
"Admin" => "ایڈمن",
"Help" => "مدد",
"Access forbidden" => "رسائ منقطع ہے",
-"Cloud not found" => "کلوڈ موجود نہہں",
"Cheers!" => "واہ!",
"Security Warning" => "حفاظتی انتباہ",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "آپ کا پی ایچ پی ورین نل بائٹ کے حملے کے خطرے سے دوچار ہے (CVE-2006-7243)",
diff --git a/core/l10n/vi.php b/core/l10n/vi.php
index 305f35ceaf9..255cff617d5 100644
--- a/core/l10n/vi.php
+++ b/core/l10n/vi.php
@@ -109,7 +109,6 @@ $TRANSLATIONS = array(
"Error tagging" => "Lỗi gắn thẻ",
"Error untagging" => "Lỗi không gắn thẻ",
"Access forbidden" => "Truy cập bị cấm",
-"Cloud not found" => "Không tìm thấy Clound",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Xin chào,\n\nbáo cho bạn biết rằng %s đã chia sẽ %s với bạn.\nXem nó: %s\n\n",
"The share will expire on %s." => "Chia sẻ này sẽ hết hiệu lực vào %s.",
"Cheers!" => "Chúc mừng!",
diff --git a/core/l10n/zh_CN.php b/core/l10n/zh_CN.php
index 668c5b97544..24390dec4a1 100644
--- a/core/l10n/zh_CN.php
+++ b/core/l10n/zh_CN.php
@@ -64,6 +64,8 @@ $TRANSLATIONS = array(
"So-so password" => "一般强度的密码",
"Good password" => "较强的密码",
"Strong password" => "强密码",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "您的Web服务器尚未正确设置以允许文件同步, 因为WebDAV的接口似乎已损坏.",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "此服务器上没有可用的因特网连接. 这意味着某些特性将无法工作,例如挂载外部存储器, 提醒更新或安装第三方应用等. 从远程访问文件和发送提醒电子邮件也可能无法工作. 如果你想要ownCloud的所有特性, 我们建议启用此服务器的因特网连接.",
"Shared" => "已共享",
"Shared with {recipients}" => "由{recipients}分享",
"Share" => "分享",
@@ -138,7 +140,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "收藏时出错",
"Error unfavoriting" => "删除收藏时出错",
"Access forbidden" => "访问禁止",
-"Cloud not found" => "未找到云",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "嗨、你好,\n\n只想让你知道 %s 分享了 %s 给你。\n现在查看: %s\n",
"The share will expire on %s." => "此分享将在 %s 过期。",
"Cheers!" => "干杯!",
diff --git a/core/l10n/zh_HK.php b/core/l10n/zh_HK.php
index 59b7632ee46..45a52a3ca0f 100644
--- a/core/l10n/zh_HK.php
+++ b/core/l10n/zh_HK.php
@@ -66,7 +66,6 @@ $TRANSLATIONS = array(
"Apps" => "軟件",
"Admin" => "管理",
"Help" => "幫助",
-"Cloud not found" => "未找到Cloud",
"Create an <strong>admin account</strong>" => "建立管理員帳戶",
"Password" => "密碼",
"Configure the database" => "設定資料庫",
diff --git a/core/l10n/zh_TW.php b/core/l10n/zh_TW.php
index 18a44e985d5..851663c5bd6 100644
--- a/core/l10n/zh_TW.php
+++ b/core/l10n/zh_TW.php
@@ -66,6 +66,8 @@ $TRANSLATIONS = array(
"So-so password" => "普通的密碼",
"Good password" => "好的密碼",
"Strong password" => "很強的密碼",
+"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "您的網頁伺服器尚未被正確設定來進行檔案同步,因為您的 WebDAV 界面似乎無法使用。",
+"This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." => "這臺 ownCloud 伺服器沒有連接到網際網路,因此有些功能像是掛載外部儲存空間、更新 ownCloud 或應用程式的通知沒有辦法運作。透過網際網路存取檔案還有電子郵件通知可能也無法運作。如果想要 ownCloud 完整的功能,建議您將這臺伺服器連接至網際網路。",
"Shared" => "已分享",
"Shared with {recipients}" => "與 {recipients} 分享",
"Share" => "分享",
@@ -139,7 +141,6 @@ $TRANSLATIONS = array(
"Error favoriting" => "加入最愛時出錯",
"Error unfavoriting" => "從最愛移除出錯",
"Access forbidden" => "存取被拒",
-"Cloud not found" => "找不到網頁",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "嗨,\n\n%s 和你分享了 %s ,到這裡看它:%s\n",
"The share will expire on %s." => "這個分享將會於 %s 過期",
"Cheers!" => "太棒了!",
diff --git a/core/register_command.php b/core/register_command.php
index b02988bbdd8..aaf10d946b2 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -12,7 +12,7 @@ $repair = new \OC\Repair(\OC\Repair::getRepairSteps());
$application->add(new OC\Core\Command\Status);
$application->add(new OC\Core\Command\Db\GenerateChangeScript());
$application->add(new OC\Core\Command\Db\ConvertType(OC_Config::getObject(), new \OC\DB\ConnectionFactory()));
-$application->add(new OC\Core\Command\Upgrade());
+$application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Maintenance\SingleUser());
$application->add(new OC\Core\Command\Maintenance\Mode(OC_Config::getObject()));
$application->add(new OC\Core\Command\App\Disable());
diff --git a/core/routes.php b/core/routes.php
index fac67f23175..a9d5387bc14 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -20,9 +20,6 @@ $application->registerRoutes($this, array('routes' => array(
// Post installation check
/** @var $this OCP\Route\IRouter */
-$this->create('post_setup_check', '/post-setup-check')
- ->action('OC_Setup', 'postSetupCheck');
-
// Core ajax actions
// Search
$this->create('search_ajax_search', '/search/ajax/search.php')
diff --git a/core/setup/controller.php b/core/setup/controller.php
index 9dcc9acfc64..15679e33976 100644
--- a/core/setup/controller.php
+++ b/core/setup/controller.php
@@ -22,12 +22,10 @@ class Controller {
if(count($e) > 0) {
$options = array_merge($opts, $post, $errors);
$this->display($options);
- }
- else {
+ } else {
$this->finishSetup();
}
- }
- else {
+ } else {
$options = array_merge($opts, $post);
$this->display($options);
}
@@ -53,8 +51,7 @@ class Controller {
}
public function finishSetup() {
- header( 'Location: '.\OC_Helper::linkToRoute( 'post_setup_check' ));
- exit();
+ \OC_Util::redirectToDefaultPage();
}
public function loadAutoConfig($post) {
diff --git a/core/templates/error.php b/core/templates/error.php
index e8b7a49264f..030fbf07fcb 100644
--- a/core/templates/error.php
+++ b/core/templates/error.php
@@ -2,7 +2,9 @@
<?php foreach($_["errors"] as $error):?>
<li class='error'>
<?php p($error['error']) ?><br/>
- <p class='hint'><?php if(isset($error['hint']))print_unescaped($error['hint']) ?></p>
+ <?php if(isset($error['hint']) && $error['hint']): ?>
+ <p class='hint'><?php print_unescaped($error['hint']) ?></p>
+ <?php endif;?>
</li>
<?php endforeach ?>
</ul>
diff --git a/core/templates/exception.php b/core/templates/exception.php
new file mode 100644
index 00000000000..cf0e4c74825
--- /dev/null
+++ b/core/templates/exception.php
@@ -0,0 +1,29 @@
+<?php
+ /** @var array $_ */
+ /** @var OC_L10N $l */
+?>
+<span class="error error-wide">
+ <h2><strong><?php p('Internal Server Error') ?></strong></h2>
+ <p><?php p($l->t('The server encountered an internal error and was unable to complete your request.')) ?></p>
+ <p><?php p($l->t('Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.')) ?></p>
+ <p><?php p($l->t('More details can be found in the server log.')) ?></p>
+ <br />
+
+ <h2><strong><?php p($l->t('Technical details')) ?></strong></h2>
+ <ul>
+ <li><?php p($l->t('Remote Address: %s', $_['remoteAddr'])) ?></li>
+ <li><?php p($l->t('Request ID: %s', $_['requestID'])) ?></li>
+ <?php if($_['debugMode']): ?>
+ <li><?php p($l->t('Code: %s', $_['errorCode'])) ?></li>
+ <li><?php p($l->t('Message: %s', $_['errorMsg'])) ?></li>
+ <li><?php p($l->t('File: %s', $_['file'])) ?></li>
+ <li><?php p($l->t('Line: %s', $_['line'])) ?></li>
+ <?php endif; ?>
+ </ul>
+
+ <?php if($_['debugMode']): ?>
+ <br />
+ <h2><strong><?php p($l->t('Trace')) ?></strong></h2>
+ <pre><?php p($_['trace']) ?></pre>
+ <?php endif; ?>
+</span>
diff --git a/core/templates/login.php b/core/templates/login.php
index 819010c5485..ad9db14bac1 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -1,4 +1,5 @@
<?php /** @var $l OC_L10N */ ?>
+<?php script('core', 'jstz') ?>
<!--[if IE 8]><style>input[type="checkbox"]{padding:0;}</style><![endif]-->
<form method="post" name="login">
@@ -47,6 +48,7 @@
<label for="remember_login"><?php p($l->t('remember')); ?></label>
<?php endif; ?>
<input type="hidden" name="timezone-offset" id="timezone-offset"/>
+ <input type="hidden" name="timezone" id="timezone"/>
<input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" />
<input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>" disabled="disabled"/>
</fieldset>