select2-rails 4.0.8 → 4.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/lib/select2-rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/select2-full.js +229 -99
  4. data/vendor/assets/javascripts/select2.js +229 -99
  5. data/vendor/assets/javascripts/select2_locale_af.js +1 -1
  6. data/vendor/assets/javascripts/select2_locale_ar.js +1 -1
  7. data/vendor/assets/javascripts/select2_locale_az.js +1 -1
  8. data/vendor/assets/javascripts/select2_locale_bg.js +1 -1
  9. data/vendor/assets/javascripts/select2_locale_bn.js +1 -1
  10. data/vendor/assets/javascripts/select2_locale_bs.js +1 -1
  11. data/vendor/assets/javascripts/select2_locale_ca.js +1 -1
  12. data/vendor/assets/javascripts/select2_locale_cs.js +1 -1
  13. data/vendor/assets/javascripts/select2_locale_da.js +1 -1
  14. data/vendor/assets/javascripts/select2_locale_de.js +1 -1
  15. data/vendor/assets/javascripts/select2_locale_dsb.js +1 -1
  16. data/vendor/assets/javascripts/select2_locale_el.js +1 -1
  17. data/vendor/assets/javascripts/select2_locale_en.js +1 -1
  18. data/vendor/assets/javascripts/select2_locale_es.js +1 -1
  19. data/vendor/assets/javascripts/select2_locale_et.js +1 -1
  20. data/vendor/assets/javascripts/select2_locale_eu.js +1 -1
  21. data/vendor/assets/javascripts/select2_locale_fa.js +1 -1
  22. data/vendor/assets/javascripts/select2_locale_fi.js +1 -1
  23. data/vendor/assets/javascripts/select2_locale_fr.js +1 -1
  24. data/vendor/assets/javascripts/select2_locale_gl.js +1 -1
  25. data/vendor/assets/javascripts/select2_locale_he.js +1 -1
  26. data/vendor/assets/javascripts/select2_locale_hi.js +1 -1
  27. data/vendor/assets/javascripts/select2_locale_hr.js +1 -1
  28. data/vendor/assets/javascripts/select2_locale_hsb.js +1 -1
  29. data/vendor/assets/javascripts/select2_locale_hu.js +1 -1
  30. data/vendor/assets/javascripts/select2_locale_hy.js +1 -1
  31. data/vendor/assets/javascripts/select2_locale_id.js +1 -1
  32. data/vendor/assets/javascripts/select2_locale_is.js +1 -1
  33. data/vendor/assets/javascripts/select2_locale_it.js +1 -1
  34. data/vendor/assets/javascripts/select2_locale_ja.js +1 -1
  35. data/vendor/assets/javascripts/select2_locale_ka.js +1 -1
  36. data/vendor/assets/javascripts/select2_locale_km.js +1 -1
  37. data/vendor/assets/javascripts/select2_locale_ko.js +1 -1
  38. data/vendor/assets/javascripts/select2_locale_lt.js +1 -1
  39. data/vendor/assets/javascripts/select2_locale_lv.js +1 -1
  40. data/vendor/assets/javascripts/select2_locale_mk.js +1 -1
  41. data/vendor/assets/javascripts/select2_locale_ms.js +1 -1
  42. data/vendor/assets/javascripts/select2_locale_nb.js +1 -1
  43. data/vendor/assets/javascripts/select2_locale_ne.js +1 -1
  44. data/vendor/assets/javascripts/select2_locale_nl.js +1 -1
  45. data/vendor/assets/javascripts/select2_locale_pl.js +1 -1
  46. data/vendor/assets/javascripts/select2_locale_ps.js +1 -1
  47. data/vendor/assets/javascripts/select2_locale_pt-BR.js +1 -1
  48. data/vendor/assets/javascripts/select2_locale_pt.js +1 -1
  49. data/vendor/assets/javascripts/select2_locale_ro.js +1 -1
  50. data/vendor/assets/javascripts/select2_locale_ru.js +1 -1
  51. data/vendor/assets/javascripts/select2_locale_sk.js +1 -1
  52. data/vendor/assets/javascripts/select2_locale_sl.js +1 -1
  53. data/vendor/assets/javascripts/select2_locale_sq.js +1 -1
  54. data/vendor/assets/javascripts/select2_locale_sr-Cyrl.js +1 -1
  55. data/vendor/assets/javascripts/select2_locale_sr.js +1 -1
  56. data/vendor/assets/javascripts/select2_locale_sv.js +1 -1
  57. data/vendor/assets/javascripts/select2_locale_th.js +1 -1
  58. data/vendor/assets/javascripts/select2_locale_tk.js +1 -1
  59. data/vendor/assets/javascripts/select2_locale_tr.js +1 -1
  60. data/vendor/assets/javascripts/select2_locale_uk.js +1 -1
  61. data/vendor/assets/javascripts/select2_locale_vi.js +1 -1
  62. data/vendor/assets/javascripts/select2_locale_zh-CN.js +1 -1
  63. data/vendor/assets/javascripts/select2_locale_zh-TW.js +1 -1
  64. data/vendor/assets/stylesheets/select2.css +2 -1
  65. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e62325c4b81af2fab18f200949ff8e4df173d9d95e34fa4c988bfb5e1afef5e
4
- data.tar.gz: cb301034bc178d7a151fa2c5c8d63b9d1cec33581c8df44c6ce2825fb87c5101
3
+ metadata.gz: fa7afeef77581e6ce4d482852a85ec8988be1be558e2cdd5c9ba306149f92c08
4
+ data.tar.gz: 7dd5d6eb35f2880fc9b84230ab307605293fa19c1926a38af369f122ba10f68c
5
5
  SHA512:
6
- metadata.gz: 6c4d09f316619c53667e77ec1c7ae37b2fda4b3d9d9b112befb70982db33783ae52636bb53ad0d5805991e9aa4c310e37a3c09ffeb037f15ad9616ed24ccccfc
7
- data.tar.gz: 957a70bf102744fc67255486c8a6c0a6de8be278932d542f95b149b79fed2774ed46ebca23265acaeb614ac6405b04929573d3592dbcb5dfc76cac2c3888d9fe
6
+ metadata.gz: ae1e831be34afb7918fbe7b5a2c4d4c377792a696d1886dc05d2b2efa00bb8887b715de8fe98319253b030a818cd61449c96ffb6ddda59b890b5275e85c6d875
7
+ data.tar.gz: 8f4a81baa622cf4c234f6504eff265390ebabb39c52bf83f874346502f3dd389bcad2206196e2c2eb535c5373a59bf07fa9b680353fcf3520f60932911109d81
@@ -1,5 +1,5 @@
1
1
  module Select2
2
2
  module Rails
3
- VERSION = '4.0.8'
3
+ VERSION = '4.0.9'
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Select2 4.0.8
2
+ * Select2 4.0.9
3
3
  * https://select2.github.io
4
4
  *
5
5
  * Released under the MIT license
@@ -832,6 +832,8 @@ S2.define('select2/utils',[
832
832
  if (Utils.__cache[id] != null) {
833
833
  delete Utils.__cache[id];
834
834
  }
835
+
836
+ element.removeAttribute('data-select2-id');
835
837
  };
836
838
 
837
839
  return Utils;
@@ -853,7 +855,7 @@ S2.define('select2/results',[
853
855
 
854
856
  Results.prototype.render = function () {
855
857
  var $results = $(
856
- '<ul class="select2-results__options" role="tree"></ul>'
858
+ '<ul class="select2-results__options" role="listbox"></ul>'
857
859
  );
858
860
 
859
861
  if (this.options.get('multiple')) {
@@ -876,7 +878,7 @@ S2.define('select2/results',[
876
878
  this.hideLoading();
877
879
 
878
880
  var $message = $(
879
- '<li role="treeitem" aria-live="assertive"' +
881
+ '<li role="alert" aria-live="assertive"' +
880
882
  ' class="select2-results__option"></li>'
881
883
  );
882
884
 
@@ -1010,7 +1012,7 @@ S2.define('select2/results',[
1010
1012
  option.className = 'select2-results__option';
1011
1013
 
1012
1014
  var attrs = {
1013
- 'role': 'treeitem',
1015
+ 'role': 'option',
1014
1016
  'aria-selected': 'false'
1015
1017
  };
1016
1018
 
@@ -1430,6 +1432,7 @@ S2.define('select2/selection/base',[
1430
1432
 
1431
1433
  $selection.attr('title', this.$element.attr('title'));
1432
1434
  $selection.attr('tabindex', this._tabindex);
1435
+ $selection.attr('aria-disabled', 'false');
1433
1436
 
1434
1437
  this.$selection = $selection;
1435
1438
 
@@ -1439,7 +1442,6 @@ S2.define('select2/selection/base',[
1439
1442
  BaseSelection.prototype.bind = function (container, $container) {
1440
1443
  var self = this;
1441
1444
 
1442
- var id = container.id + '-container';
1443
1445
  var resultsId = container.id + '-results';
1444
1446
 
1445
1447
  this.container = container;
@@ -1489,10 +1491,12 @@ S2.define('select2/selection/base',[
1489
1491
 
1490
1492
  container.on('enable', function () {
1491
1493
  self.$selection.attr('tabindex', self._tabindex);
1494
+ self.$selection.attr('aria-disabled', 'false');
1492
1495
  });
1493
1496
 
1494
1497
  container.on('disable', function () {
1495
1498
  self.$selection.attr('tabindex', '-1');
1499
+ self.$selection.attr('aria-disabled', 'true');
1496
1500
  });
1497
1501
  };
1498
1502
 
@@ -1515,7 +1519,6 @@ S2.define('select2/selection/base',[
1515
1519
  };
1516
1520
 
1517
1521
  BaseSelection.prototype._attachCloseHandler = function (container) {
1518
- var self = this;
1519
1522
 
1520
1523
  $(document.body).on('mousedown.select2.' + container.id, function (e) {
1521
1524
  var $target = $(e.target);
@@ -1525,8 +1528,6 @@ S2.define('select2/selection/base',[
1525
1528
  var $all = $('.select2.select2-container--open');
1526
1529
 
1527
1530
  $all.each(function () {
1528
- var $this = $(this);
1529
-
1530
1531
  if (this == $select[0]) {
1531
1532
  return;
1532
1533
  }
@@ -1653,7 +1654,14 @@ S2.define('select2/selection/single',[
1653
1654
  var formatted = this.display(selection, $rendered);
1654
1655
 
1655
1656
  $rendered.empty().append(formatted);
1656
- $rendered.attr('title', selection.title || selection.text);
1657
+
1658
+ var title = selection.title || selection.text;
1659
+
1660
+ if (title) {
1661
+ $rendered.attr('title', title);
1662
+ } else {
1663
+ $rendered.removeAttr('title');
1664
+ }
1657
1665
  };
1658
1666
 
1659
1667
  return SingleSelection;
@@ -1756,7 +1764,12 @@ S2.define('select2/selection/multiple',[
1756
1764
  var formatted = this.display(selection, $selection);
1757
1765
 
1758
1766
  $selection.append(formatted);
1759
- $selection.attr('title', selection.title || selection.text);
1767
+
1768
+ var title = selection.title || selection.text;
1769
+
1770
+ if (title) {
1771
+ $selection.attr('title', title);
1772
+ }
1760
1773
 
1761
1774
  Utils.StoreData($selection[0], 'data', selection);
1762
1775
 
@@ -1949,7 +1962,7 @@ S2.define('select2/selection/search',[
1949
1962
  '<li class="select2-search select2-search--inline">' +
1950
1963
  '<input class="select2-search__field" type="search" tabindex="-1"' +
1951
1964
  ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
1952
- ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
1965
+ ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
1953
1966
  '</li>'
1954
1967
  );
1955
1968
 
@@ -1966,14 +1979,18 @@ S2.define('select2/selection/search',[
1966
1979
  Search.prototype.bind = function (decorated, container, $container) {
1967
1980
  var self = this;
1968
1981
 
1982
+ var resultsId = container.id + '-results';
1983
+
1969
1984
  decorated.call(this, container, $container);
1970
1985
 
1971
1986
  container.on('open', function () {
1987
+ self.$search.attr('aria-controls', resultsId);
1972
1988
  self.$search.trigger('focus');
1973
1989
  });
1974
1990
 
1975
1991
  container.on('close', function () {
1976
1992
  self.$search.val('');
1993
+ self.$search.removeAttr('aria-controls');
1977
1994
  self.$search.removeAttr('aria-activedescendant');
1978
1995
  self.$search.trigger('focus');
1979
1996
  });
@@ -1993,7 +2010,11 @@ S2.define('select2/selection/search',[
1993
2010
  });
1994
2011
 
1995
2012
  container.on('results:focus', function (params) {
1996
- self.$search.attr('aria-activedescendant', params.id);
2013
+ if (params.data._resultId) {
2014
+ self.$search.attr('aria-activedescendant', params.data._resultId);
2015
+ } else {
2016
+ self.$search.removeAttr('aria-activedescendant');
2017
+ }
1997
2018
  });
1998
2019
 
1999
2020
  this.$selection.on('focusin', '.select2-search--inline', function (evt) {
@@ -2027,6 +2048,12 @@ S2.define('select2/selection/search',[
2027
2048
  }
2028
2049
  });
2029
2050
 
2051
+ this.$selection.on('click', '.select2-search--inline', function (evt) {
2052
+ if (self.$search.val()) {
2053
+ evt.stopPropagation();
2054
+ }
2055
+ });
2056
+
2030
2057
  // Try to detect the IE version should the `documentMode` property that
2031
2058
  // is stored on the document. This is only implemented in IE and is
2032
2059
  // slightly cleaner than doing a user agent check.
@@ -2145,7 +2172,7 @@ S2.define('select2/selection/search',[
2145
2172
  var width = '';
2146
2173
 
2147
2174
  if (this.$search.attr('placeholder') !== '') {
2148
- width = this.$selection.find('.select2-selection__rendered').innerWidth();
2175
+ width = this.$selection.find('.select2-selection__rendered').width();
2149
2176
  } else {
2150
2177
  var minimumWidth = this.$search.val().length + 1;
2151
2178
 
@@ -3428,15 +3455,19 @@ S2.define('select2/data/array',[
3428
3455
  'jquery'
3429
3456
  ], function (SelectAdapter, Utils, $) {
3430
3457
  function ArrayAdapter ($element, options) {
3431
- var data = options.get('data') || [];
3458
+ this._dataToConvert = options.get('data') || [];
3432
3459
 
3433
3460
  ArrayAdapter.__super__.constructor.call(this, $element, options);
3434
-
3435
- this.addOptions(this.convertToOptions(data));
3436
3461
  }
3437
3462
 
3438
3463
  Utils.Extend(ArrayAdapter, SelectAdapter);
3439
3464
 
3465
+ ArrayAdapter.prototype.bind = function (container, $container) {
3466
+ ArrayAdapter.__super__.bind.call(this, container, $container);
3467
+
3468
+ this.addOptions(this.convertToOptions(this._dataToConvert));
3469
+ };
3470
+
3440
3471
  ArrayAdapter.prototype.select = function (data) {
3441
3472
  var $option = this.$element.find('option').filter(function (i, elm) {
3442
3473
  return elm.value == data.id.toString();
@@ -3726,8 +3757,6 @@ S2.define('select2/data/tags',[
3726
3757
  };
3727
3758
 
3728
3759
  Tags.prototype._removeOldTags = function (_) {
3729
- var tag = this._lastTag;
3730
-
3731
3760
  var $options = this.$element.find('option[data-select2-tag]');
3732
3761
 
3733
3762
  $options.each(function () {
@@ -3931,10 +3960,30 @@ S2.define('select2/data/maximumSelectionLength',[
3931
3960
  decorated.call(this, $e, options);
3932
3961
  }
3933
3962
 
3963
+ MaximumSelectionLength.prototype.bind =
3964
+ function (decorated, container, $container) {
3965
+ var self = this;
3966
+
3967
+ decorated.call(this, container, $container);
3968
+
3969
+ container.on('select', function () {
3970
+ self._checkIfMaximumSelected();
3971
+ });
3972
+ };
3973
+
3934
3974
  MaximumSelectionLength.prototype.query =
3935
3975
  function (decorated, params, callback) {
3936
3976
  var self = this;
3937
3977
 
3978
+ this._checkIfMaximumSelected(function () {
3979
+ decorated.call(self, params, callback);
3980
+ });
3981
+ };
3982
+
3983
+ MaximumSelectionLength.prototype._checkIfMaximumSelected =
3984
+ function (_, successCallback) {
3985
+ var self = this;
3986
+
3938
3987
  this.current(function (currentData) {
3939
3988
  var count = currentData != null ? currentData.length : 0;
3940
3989
  if (self.maximumSelectionLength > 0 &&
@@ -3947,7 +3996,10 @@ S2.define('select2/data/maximumSelectionLength',[
3947
3996
  });
3948
3997
  return;
3949
3998
  }
3950
- decorated.call(self, params, callback);
3999
+
4000
+ if (successCallback) {
4001
+ successCallback();
4002
+ }
3951
4003
  });
3952
4004
  };
3953
4005
 
@@ -4010,7 +4062,7 @@ S2.define('select2/dropdown/search',[
4010
4062
  '<span class="select2-search select2-search--dropdown">' +
4011
4063
  '<input class="select2-search__field" type="search" tabindex="-1"' +
4012
4064
  ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
4013
- ' spellcheck="false" role="textbox" />' +
4065
+ ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
4014
4066
  '</span>'
4015
4067
  );
4016
4068
 
@@ -4025,6 +4077,8 @@ S2.define('select2/dropdown/search',[
4025
4077
  Search.prototype.bind = function (decorated, container, $container) {
4026
4078
  var self = this;
4027
4079
 
4080
+ var resultsId = container.id + '-results';
4081
+
4028
4082
  decorated.call(this, container, $container);
4029
4083
 
4030
4084
  this.$search.on('keydown', function (evt) {
@@ -4047,6 +4101,7 @@ S2.define('select2/dropdown/search',[
4047
4101
 
4048
4102
  container.on('open', function () {
4049
4103
  self.$search.attr('tabindex', 0);
4104
+ self.$search.attr('aria-controls', resultsId);
4050
4105
 
4051
4106
  self.$search.trigger('focus');
4052
4107
 
@@ -4057,6 +4112,8 @@ S2.define('select2/dropdown/search',[
4057
4112
 
4058
4113
  container.on('close', function () {
4059
4114
  self.$search.attr('tabindex', -1);
4115
+ self.$search.removeAttr('aria-controls');
4116
+ self.$search.removeAttr('aria-activedescendant');
4060
4117
 
4061
4118
  self.$search.val('');
4062
4119
  self.$search.trigger('blur');
@@ -4079,6 +4136,14 @@ S2.define('select2/dropdown/search',[
4079
4136
  }
4080
4137
  }
4081
4138
  });
4139
+
4140
+ container.on('results:focus', function (params) {
4141
+ if (params.data._resultId) {
4142
+ self.$search.attr('aria-activedescendant', params.data._resultId);
4143
+ } else {
4144
+ self.$search.removeAttr('aria-activedescendant');
4145
+ }
4146
+ });
4082
4147
  };
4083
4148
 
4084
4149
  Search.prototype.handleSearch = function (evt) {
@@ -4223,7 +4288,7 @@ S2.define('select2/dropdown/infiniteScroll',[
4223
4288
  var $option = $(
4224
4289
  '<li ' +
4225
4290
  'class="select2-results__option select2-results__option--load-more"' +
4226
- 'role="treeitem" aria-disabled="true"></li>'
4291
+ 'role="option" aria-disabled="true"></li>'
4227
4292
  );
4228
4293
 
4229
4294
  var message = this.options.get('translations').get('loadingMore');
@@ -4249,27 +4314,11 @@ S2.define('select2/dropdown/attachBody',[
4249
4314
  AttachBody.prototype.bind = function (decorated, container, $container) {
4250
4315
  var self = this;
4251
4316
 
4252
- var setupResultsEvents = false;
4253
-
4254
4317
  decorated.call(this, container, $container);
4255
4318
 
4256
4319
  container.on('open', function () {
4257
4320
  self._showDropdown();
4258
4321
  self._attachPositioningHandler(container);
4259
-
4260
- if (!setupResultsEvents) {
4261
- setupResultsEvents = true;
4262
-
4263
- container.on('results:all', function () {
4264
- self._positionDropdown();
4265
- self._resizeDropdown();
4266
- });
4267
-
4268
- container.on('results:append', function () {
4269
- self._positionDropdown();
4270
- self._resizeDropdown();
4271
- });
4272
- }
4273
4322
  });
4274
4323
 
4275
4324
  container.on('close', function () {
@@ -4277,6 +4326,31 @@ S2.define('select2/dropdown/attachBody',[
4277
4326
  self._detachPositioningHandler(container);
4278
4327
  });
4279
4328
 
4329
+ container.on('results:all', function () {
4330
+ self._positionDropdown();
4331
+ self._resizeDropdown();
4332
+ });
4333
+
4334
+ container.on('results:append', function () {
4335
+ self._positionDropdown();
4336
+ self._resizeDropdown();
4337
+ });
4338
+
4339
+ container.on('results:message', function () {
4340
+ self._positionDropdown();
4341
+ self._resizeDropdown();
4342
+ });
4343
+
4344
+ container.on('select', function () {
4345
+ self._positionDropdown();
4346
+ self._resizeDropdown();
4347
+ });
4348
+
4349
+ container.on('unselect', function () {
4350
+ self._positionDropdown();
4351
+ self._resizeDropdown();
4352
+ });
4353
+
4280
4354
  this.$dropdownContainer.on('mousedown', function (evt) {
4281
4355
  evt.stopPropagation();
4282
4356
  });
@@ -4868,66 +4942,29 @@ S2.define('select2/defaults',[
4868
4942
  );
4869
4943
  }
4870
4944
 
4871
- if (typeof options.language === 'string') {
4872
- // Check if the language is specified with a region
4873
- if (options.language.indexOf('-') > 0) {
4874
- // Extract the region information if it is included
4875
- var languageParts = options.language.split('-');
4876
- var baseLanguage = languageParts[0];
4877
-
4878
- options.language = [options.language, baseLanguage];
4879
- } else {
4880
- options.language = [options.language];
4881
- }
4882
- }
4883
-
4884
- if ($.isArray(options.language)) {
4885
- var languages = new Translation();
4886
- options.language.push('en');
4945
+ // If the defaults were not previously applied from an element, it is
4946
+ // possible for the language option to have not been resolved
4947
+ options.language = this._resolveLanguage(options.language);
4887
4948
 
4888
- var languageNames = options.language;
4949
+ // Always fall back to English since it will always be complete
4950
+ options.language.push('en');
4889
4951
 
4890
- for (var l = 0; l < languageNames.length; l++) {
4891
- var name = languageNames[l];
4892
- var language = {};
4893
-
4894
- try {
4895
- // Try to load it with the original name
4896
- language = Translation.loadPath(name);
4897
- } catch (e) {
4898
- try {
4899
- // If we couldn't load it, check if it wasn't the full path
4900
- name = this.defaults.amdLanguageBase + name;
4901
- language = Translation.loadPath(name);
4902
- } catch (ex) {
4903
- // The translation could not be loaded at all. Sometimes this is
4904
- // because of a configuration problem, other times this can be
4905
- // because of how Select2 helps load all possible translation files.
4906
- if (options.debug && window.console && console.warn) {
4907
- console.warn(
4908
- 'Select2: The language file for "' + name + '" could not be ' +
4909
- 'automatically loaded. A fallback will be used instead.'
4910
- );
4911
- }
4952
+ var uniqueLanguages = [];
4912
4953
 
4913
- continue;
4914
- }
4915
- }
4954
+ for (var l = 0; l < options.language.length; l++) {
4955
+ var language = options.language[l];
4916
4956
 
4917
- languages.extend(language);
4957
+ if (uniqueLanguages.indexOf(language) === -1) {
4958
+ uniqueLanguages.push(language);
4918
4959
  }
4960
+ }
4919
4961
 
4920
- options.translations = languages;
4921
- } else {
4922
- var baseTranslation = Translation.loadPath(
4923
- this.defaults.amdLanguageBase + 'en'
4924
- );
4925
- var customTranslation = new Translation(options.language);
4926
-
4927
- customTranslation.extend(baseTranslation);
4962
+ options.language = uniqueLanguages;
4928
4963
 
4929
- options.translations = customTranslation;
4930
- }
4964
+ options.translations = this._processTranslations(
4965
+ options.language,
4966
+ options.debug
4967
+ );
4931
4968
 
4932
4969
  return options;
4933
4970
  };
@@ -4994,7 +5031,7 @@ S2.define('select2/defaults',[
4994
5031
  debug: false,
4995
5032
  dropdownAutoWidth: false,
4996
5033
  escapeMarkup: Utils.escapeMarkup,
4997
- language: EnglishTranslation,
5034
+ language: {},
4998
5035
  matcher: matcher,
4999
5036
  minimumInputLength: 0,
5000
5037
  maximumInputLength: 0,
@@ -5016,6 +5053,103 @@ S2.define('select2/defaults',[
5016
5053
  };
5017
5054
  };
5018
5055
 
5056
+ Defaults.prototype.applyFromElement = function (options, $element) {
5057
+ var optionLanguage = options.language;
5058
+ var defaultLanguage = this.defaults.language;
5059
+ var elementLanguage = $element.prop('lang');
5060
+ var parentLanguage = $element.closest('[lang]').prop('lang');
5061
+
5062
+ var languages = Array.prototype.concat.call(
5063
+ this._resolveLanguage(elementLanguage),
5064
+ this._resolveLanguage(optionLanguage),
5065
+ this._resolveLanguage(defaultLanguage),
5066
+ this._resolveLanguage(parentLanguage)
5067
+ );
5068
+
5069
+ options.language = languages;
5070
+
5071
+ return options;
5072
+ };
5073
+
5074
+ Defaults.prototype._resolveLanguage = function (language) {
5075
+ if (!language) {
5076
+ return [];
5077
+ }
5078
+
5079
+ if ($.isEmptyObject(language)) {
5080
+ return [];
5081
+ }
5082
+
5083
+ if ($.isPlainObject(language)) {
5084
+ return [language];
5085
+ }
5086
+
5087
+ var languages;
5088
+
5089
+ if (!$.isArray(language)) {
5090
+ languages = [language];
5091
+ } else {
5092
+ languages = language;
5093
+ }
5094
+
5095
+ var resolvedLanguages = [];
5096
+
5097
+ for (var l = 0; l < languages.length; l++) {
5098
+ resolvedLanguages.push(languages[l]);
5099
+
5100
+ if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
5101
+ // Extract the region information if it is included
5102
+ var languageParts = languages[l].split('-');
5103
+ var baseLanguage = languageParts[0];
5104
+
5105
+ resolvedLanguages.push(baseLanguage);
5106
+ }
5107
+ }
5108
+
5109
+ return resolvedLanguages;
5110
+ };
5111
+
5112
+ Defaults.prototype._processTranslations = function (languages, debug) {
5113
+ var translations = new Translation();
5114
+
5115
+ for (var l = 0; l < languages.length; l++) {
5116
+ var languageData = new Translation();
5117
+
5118
+ var language = languages[l];
5119
+
5120
+ if (typeof language === 'string') {
5121
+ try {
5122
+ // Try to load it with the original name
5123
+ languageData = Translation.loadPath(language);
5124
+ } catch (e) {
5125
+ try {
5126
+ // If we couldn't load it, check if it wasn't the full path
5127
+ language = this.defaults.amdLanguageBase + language;
5128
+ languageData = Translation.loadPath(language);
5129
+ } catch (ex) {
5130
+ // The translation could not be loaded at all. Sometimes this is
5131
+ // because of a configuration problem, other times this can be
5132
+ // because of how Select2 helps load all possible translation files
5133
+ if (debug && window.console && console.warn) {
5134
+ console.warn(
5135
+ 'Select2: The language file for "' + language + '" could ' +
5136
+ 'not be automatically loaded. A fallback will be used instead.'
5137
+ );
5138
+ }
5139
+ }
5140
+ }
5141
+ } else if ($.isPlainObject(language)) {
5142
+ languageData = new Translation(language);
5143
+ } else {
5144
+ languageData = language;
5145
+ }
5146
+
5147
+ translations.extend(languageData);
5148
+ }
5149
+
5150
+ return translations;
5151
+ };
5152
+
5019
5153
  Defaults.prototype.set = function (key, value) {
5020
5154
  var camelKey = $.camelCase(key);
5021
5155
 
@@ -5045,6 +5179,10 @@ S2.define('select2/options',[
5045
5179
  this.fromElement($element);
5046
5180
  }
5047
5181
 
5182
+ if ($element != null) {
5183
+ this.options = Defaults.applyFromElement(this.options, $element);
5184
+ }
5185
+
5048
5186
  this.options = Defaults.apply(this.options);
5049
5187
 
5050
5188
  if ($element && $element.is('input')) {
@@ -5068,14 +5206,6 @@ S2.define('select2/options',[
5068
5206
  this.options.disabled = $e.prop('disabled');
5069
5207
  }
5070
5208
 
5071
- if (this.options.language == null) {
5072
- if ($e.prop('lang')) {
5073
- this.options.language = $e.prop('lang').toLowerCase();
5074
- } else if ($e.closest('[lang]').prop('lang')) {
5075
- this.options.language = $e.closest('[lang]').prop('lang');
5076
- }
5077
- }
5078
-
5079
5209
  if (this.options.dir == null) {
5080
5210
  if ($e.prop('dir')) {
5081
5211
  this.options.dir = $e.prop('dir');