select2-rails 4.0.8 → 4.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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');