j1-template 2021.2.4 → 2021.2.8

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/modules/connectors/ad/google-adsense.html +7 -0
  3. data/_includes/themes/j1/modules/connectors/translators/google-translator.html +2 -1
  4. data/_layouts/default.html +0 -1
  5. data/assets/data/iso-639-language-codes-flags.json +224 -0
  6. data/assets/data/{translator_languages.json → iso-639-language-codes.json} +111 -142
  7. data/assets/data/translator.html +24 -20
  8. data/assets/themes/j1/adapter/js/translator.1.js +525 -0
  9. data/assets/themes/j1/adapter/js/translator.js +104 -181
  10. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +27 -12
  11. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  12. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +27 -12
  13. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +1 -1
  14. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +59 -22
  15. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +1 -1
  16. data/assets/themes/j1/modules/lightGallery/js/modules/lg-thumbnail.js +16 -8
  17. data/assets/themes/j1/modules/translator/js/translator.js +208 -236
  18. data/assets/themes/j1/modules/translator/js/translator.min.js +2 -2
  19. data/lib/j1/version.rb +1 -1
  20. data/lib/starter_web/Gemfile +1 -1
  21. data/lib/starter_web/_config.yml +1 -1
  22. data/lib/starter_web/_data/j1_config.yml +2 -22
  23. data/lib/starter_web/_data/modules/defaults/translator.yml +77 -64
  24. data/lib/starter_web/_data/modules/translator.yml +1 -0
  25. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  26. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  27. data/lib/starter_web/package.json +1 -1
  28. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +3 -3
  29. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  30. data/lib/starter_web/utilsrv/package.json +1 -1
  31. metadata +5 -7
  32. data/assets/data/msdropdown.json +0 -155
  33. data/assets/themes/j1/modules/lightGallery/js/modules/lg-video.js +0 -342
  34. data/assets/themes/j1/modules/lightGallery/js/modules/lg-video.min.js +0 -5
  35. data/lib/starter_web/assets/images/pages/features/percentage_global_mobile_tr.jpg +0 -0
@@ -157,29 +157,37 @@
157
157
  if (isVideo.youtube || isVideo.vimeo || isVideo.dailymotion) {
158
158
  if (isVideo.youtube) {
159
159
  if (_this.core.s.loadYoutubeThumbnail) {
160
- thumbImg = '//img.youtube.com/vi/' + isVideo.youtube[1] + '/' + _this.core.s.youtubeThumbSize + '.jpg';
160
+ // jadams, 2021-10-27: disabled, loading always configured thumbImg
161
+ // thumbImg = '//img.youtube.com/vi/' + isVideo.youtube[1] + '/' + _this.core.s.youtubeThumbSize + '.jpg';
162
+ thumbImg = thumb;
161
163
  } else {
162
- thumbImg = thumb;
164
+ thumbImg = thumb;
163
165
  }
164
166
  } else if (isVideo.vimeo) {
165
167
  if (_this.core.s.loadVimeoThumbnail) {
166
- thumbImg = '//i.vimeocdn.com/video/error_' + vimeoErrorThumbSize + '.jpg';
167
- vimeoId = isVideo.vimeo[1];
168
+ // jadams, 2021-10-27: disabled, loading thumbImg this ways fails
169
+ // thumbImg = '//i.vimeocdn.com/video/error_' + vimeoErrorThumbSize + '.jpg';
170
+ // vimeoId = isVideo.vimeo[1];
171
+ thumbImg = thumb;
168
172
  } else {
169
- thumbImg = thumb;
173
+ thumbImg = thumb;
170
174
  }
171
175
  } else if (isVideo.dailymotion) {
172
176
  if (_this.core.s.loadDailymotionThumbnail) {
173
- thumbImg = '//www.dailymotion.com/thumbnail/video/' + isVideo.dailymotion[1];
177
+ // jadams, 2021-10-27: disabled, loading always configured thumbImg
178
+ // thumbImg = '//www.dailymotion.com/thumbnail/video/' + isVideo.dailymotion[1];
179
+ thumbImg = thumb;
174
180
  } else {
175
- thumbImg = thumb;
181
+ thumbImg = thumb;
176
182
  }
177
183
  }
178
184
  } else {
179
185
  thumbImg = thumb;
180
186
  }
181
187
 
182
- thumbList += '<div data-vimeo-id="' + vimeoId + '" class="lg-thumb-item" style="width:' + _this.core.s.thumbWidth + 'px; height: ' + _this.core.s.thumbHeight + '; margin-right: ' + _this.core.s.thumbMargin + 'px"><img src="' + thumbImg + '" /></div>';
188
+ // jadams, 2021-10-27: removed unclear data-vimeo-id
189
+ // thumbList += '<div ="' + vimeoId + '" class="lg-thumb-item" style="width:' + _this.core.s.thumbWidth + 'px; height: ' + _this.core.s.thumbHeight + '; margin-right: ' + _this.core.s.thumbMargin + 'px"><img src="' + thumbImg + '" /></div>';
190
+ thumbList += '<div class="lg-thumb-item" style="width:' + _this.core.s.thumbWidth + 'px; height: ' + _this.core.s.thumbHeight + '; margin-right: ' + _this.core.s.thumbMargin + 'px"><img src="' + thumbImg + '" /></div>';
183
191
  vimeoId = '';
184
192
  }
185
193
 
@@ -26,153 +26,50 @@
26
26
  // -----------------------------------------------------------------------------
27
27
 
28
28
  function Translator(props) {
29
- var logger = log4javascript.getLogger('j1.core.translator');
30
- var dialogContainerID = 'translator-modal';
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // global vars
32
+ // ---------------------------------------------------------------------------
31
33
  var self = this;
34
+ var logger = log4javascript.getLogger('j1.core.translator');
35
+ var pageURL = new liteURL(window.location.href);
36
+ var cookieSecure = (pageURL.protocol.includes('https')) ? true : false;
32
37
  var detailedSettingsShown = false;
33
- var url = new liteURL(window.location.href);
34
- var cookieSecure = (url.protocol.includes('https')) ? true : false;
35
- var logText;
36
- var current_page;
37
- var whitelisted;
38
- var ddTranslationSourceLanguage;
39
38
  var navigator_language;
40
39
  var translation_language;
41
40
 
42
41
  // ---------------------------------------------------------------------------
43
- // var and propertiy settings
42
+ // default property settings
44
43
  // ---------------------------------------------------------------------------
45
-
46
44
  this.props = {
47
- contentURL: '/assets/data/translator', // this URL must contain the dialog content (modals) in the needed languages
48
- cookieName: 'j1.user.state', // the name of the User State Cookie (primary data)
49
- cookieConsentName: 'j1.user.consent', // the name of the Cookie Consent Cookie (secondary data)
50
- cookieStorageDays: 365, // the duration the cookie is stored on the client
51
- cookieSameSite: 'Strict', // restrict consent cookie to first-party, do NOT send cookie to other domains
52
- cookieSecure: false,
53
- translationEnabled: false,
54
- translatorName: 'google',
55
- translationLanguage: 'auto',
56
- translateAllPages: true, // enable tranlation on all pages
57
- hideSuggestionBox: true, // disable suggestions on translated text
58
- hidePoweredBy: true, // disable label "Powered by Google"
59
- hideTopFrame: true, // disable the (google) translator frame
60
- dialogLanguage: 'content', // language used for the consent dialog (modal)
61
- dialogLanguages: ['en','de'], // supported languages for the consent dialog (modal), defaults to first in array//
62
- dialogContainerID: 'translator-modal', // container, the dialog modal is (dynamically) loaded
63
- xhrDataElement: '', // container for the language-specific consent modal taken from /assets/data/cookieconsent.html
64
- postSelectionCallback: undefined, // callback function, called after the user has made his selection
65
- };
66
-
67
- // supported languages by Google Translate
68
- this.googleTranslatorLanguages = {
69
- 'af': { 'name': 'Afrikaans' },
70
- 'sq': { 'name': 'Albanian' },
71
- 'ar': { 'name': 'Arabic' },
72
- 'hy': { 'name': 'Armenian' },
73
- 'az': { 'name': 'Azerbaijani' },
74
- 'eu': { 'name': 'Basque' },
75
- 'be': { 'name': 'Belarusian' },
76
- 'bn': { 'name': 'Bengali' },
77
- 'bg': { 'name': 'Bulgarian' },
78
- 'ca': { 'name': 'Catalan' },
79
- 'zh-CN': { 'name': 'Chinese (Simplified)' },
80
- 'zh-TW': { 'name': 'Chinese (Traditional)' },
81
- 'hr': { 'name': 'Croatian' },
82
- 'cs': { 'name': 'Czech' },
83
- 'da': { 'name': 'Danish' },
84
- 'nl': { 'name': 'Dutch' },
85
- 'eo': { 'name': 'Esperanto' },
86
- 'et': { 'name': 'Estonian' },
87
- 'tl': { 'name': 'Filipino' },
88
- 'fi': { 'name': 'Finnish' },
89
- 'fr': { 'name': 'French' },
90
- 'gl': { 'name': 'Galician' },
91
- 'ka': { 'name': 'Georgian' },
92
- 'de': { 'name': 'German' },
93
- 'el': { 'name': 'Greek' },
94
- 'gu': { 'name': 'Gujarati' },
95
- 'ht': { 'name': 'Haitian Creole' },
96
- 'iw': { 'name': 'Hebrew' },
97
- 'hi': { 'name': 'Hindi' },
98
- 'hu': { 'name': 'Hungarian' },
99
- 'is': { 'name': 'Icelandic' },
100
- 'id': { 'name': 'Indonesian' },
101
- 'ga': { 'name': 'Irish' },
102
- 'it': { 'name': 'Italian' },
103
- 'ja': { 'name': 'Japanese' },
104
- 'kn': { 'name': 'Kannada' },
105
- 'ko': { 'name': 'Korean' },
106
- 'la': { 'name': 'Latin' },
107
- 'lv': { 'name': 'Latvian' },
108
- 'lt': { 'name': 'Lithuanian' },
109
- 'mk': { 'name': 'Macedonian' },
110
- 'ms': { 'name': 'Malay' },
111
- 'mt': { 'name': 'Maltese' },
112
- 'no': { 'name': 'Norwegian' },
113
- 'fa': { 'name': 'Persian' },
114
- 'pl': { 'name': 'Polish' },
115
- 'pt': { 'name': 'Portuguese' },
116
- 'ro': { 'name': 'Romanian' },
117
- 'ru': { 'name': 'Russian' },
118
- 'sr': { 'name': 'Serbian' },
119
- 'sk': { 'name': 'Slovak' },
120
- 'sl': { 'name': 'Slovenian' },
121
- 'es': { 'name': 'Spanish' },
122
- 'sw': { 'name': 'Swahili' },
123
- 'sv': { 'name': 'Swedish' },
124
- 'ta': { 'name': 'Tamil' },
125
- 'te': { 'name': 'Telugu' },
126
- 'th': { 'name': 'Thai' },
127
- 'tr': { 'name': 'Turkish' },
128
- 'uk': { 'name': 'Ukrainian' },
129
- 'ur': { 'name': 'Urdu' },
130
- 'vi': { 'name': 'Vietnamese' },
131
- 'cy': { 'name': 'Welsh' },
132
- 'yi': { 'name': 'Yiddish' }
133
- };
134
-
135
- // supported languages by Deepl Translate
136
- this.deeplTranslatorLanguages = {
137
- 'bg': { 'name': 'Bulgarian' },
138
- 'cs': { 'name': 'Czech' },
139
- 'da': { 'name': 'Danish' },
140
- 'de': { 'name': 'German' },
141
- 'el': { 'name': 'Greek' },
142
- 'es': { 'name': 'Spanish' },
143
- 'en': { 'name': 'English' },
144
- 'en-us': { 'name': 'English (American)' },
145
- 'en-uk': { 'name': 'English (British)' },
146
- 'et': { 'name': 'Estonian' },
147
- 'ft': { 'name': 'Finnish' },
148
- 'fr': { 'name': 'French' },
149
- 'hu': { 'name': 'Hungarian' },
150
- 'it': { 'name': 'Italian' },
151
- 'ja': { 'name': 'Japanese' },
152
- 'lv': { 'name': 'Latvian' },
153
- 'lt': { 'name': 'Lithuanian' },
154
- 'nl': { 'name': 'Dutch' },
155
- 'af': { 'name': 'Polish' },
156
- 'pt': { 'name': 'Portuguese' },
157
- 'pt-pt': { 'name': 'Portuguese (Portugal)' },
158
- 'pt-br': { 'name': 'Portuguese (Brazilian)' },
159
- 'ro': { 'name': 'Romanian' },
160
- 'ru': { 'name': 'Russian' },
161
- 'sk': { 'name': 'Slovak' },
162
- 'sl': { 'name': 'Slovenian' },
163
- 'sv': { 'name': 'Swedish' },
164
- 'zh': { 'name': 'Chinese' },
45
+ contentURL: '/assets/data/translator', // this URL must contain the dialog content (modals) in the needed languages
46
+ cookieName: 'j1.user.state', // the name of the User State Cookie (primary data)
47
+ cookieConsentName: 'j1.user.consent', // the name of the Cookie Consent Cookie (secondary data)
48
+ cookieStorageDays: 365, // the duration the cookie is stored on the client
49
+ cookieSameSite: 'Strict', // restrict consent cookie to first-party, do NOT send cookie to other domains
50
+ cookieSecure: cookieSecure, // secure flag on cookies
51
+ translationEnabled: false, // enable|disable translation on first page view
52
+ disableLanguageSelector: false, // disable language dropdown for translation in dialog (modal)
53
+ translatorName: 'google', // name of the default translator
54
+ translationLanguages: 'all', // supported languages for translation
55
+ translationLanguage: 'auto', // language used for translation
56
+ translateAllPages: true, // enable tranlation on all pages
57
+ hideSuggestionBox: true, // disable suggestions on translated text
58
+ hidePoweredBy: true, // disable label "Powered by Google"
59
+ hideTopFrame: true, // disable the (google) translator frame
60
+ dialogLanguage: 'content', // language used for the consent dialog (modal)
61
+ dialogLanguages: ['en','de'], // supported languages for the consent dialog (modal), defaults to first in array//
62
+ dialogContainerID: 'translator-modal', // container, the dialog modal is (dynamically) loaded
63
+ xhrDataElement: '', // container for the language-specific consent modal taken from /assets/data/cookieconsent.html
64
+ postSelectionCallback: '', // callback function, called after the user has made his selection
165
65
  };
166
66
 
67
+ // merge properties from default|module
167
68
  for (var property in props) {
168
69
  this.props[property] = props[property];
169
70
  }
170
71
 
171
- // merge property settings
172
- for (var property in props) {
173
- this.props[property] = props[property];
174
- }
175
-
72
+ // extract the language portion (e.g. "en" for English)
176
73
  if (this.props.dialogLanguage.indexOf("-") !== -1) {
177
74
  this.props.dialogLanguage = this.props.dialogLanguage.split("-")[0];
178
75
  }
@@ -182,12 +79,9 @@ function Translator(props) {
182
79
  this.props.dialogLanguage = this.props.dialogLanguages[0];
183
80
  }
184
81
 
185
- // set modal by dialogLanguage that is loadad
82
+ // set the xhrDataElement of the modal loadad based on dialogLanguage
186
83
  this.props.xhrDataElement = this.props.xhrDataElement + '-' + this.props.dialogLanguage;
187
84
 
188
- // set modal by dialogLanguage that is loadad
189
- this.props.cookieSecure = cookieSecure;
190
-
191
85
  logger.info('\n' + 'initializing core module: started');
192
86
  logger.info('\n' + 'state: started');
193
87
 
@@ -196,6 +90,7 @@ function Translator(props) {
196
90
  // ---------------------------------------------------------------------------
197
91
 
198
92
  // ---------------------------------------------------------------------------
93
+ // Cookie()
199
94
  // manage cookies
200
95
  // ---------------------------------------------------------------------------
201
96
  var Cookie = {
@@ -232,7 +127,7 @@ function Translator(props) {
232
127
  };
233
128
 
234
129
  // ---------------------------------------------------------------------------
235
- // manage events
130
+ // global event handler
236
131
  // ---------------------------------------------------------------------------
237
132
  var Events = {
238
133
  documentReady: function (onDocumentReady) {
@@ -245,45 +140,127 @@ function Translator(props) {
245
140
  };
246
141
 
247
142
  // ---------------------------------------------------------------------------
248
- // createMsDropdownFromJSON
143
+ // extend()
144
+ // deep merge of two objects
145
+ // ---------------------------------------------------------------------------
146
+ function extend () {
147
+ var extended = {};
148
+ var deep = false;
149
+ var i = 0;
150
+ var length = arguments.length;
151
+
152
+ // Check if a deep merge
153
+ if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) {
154
+ deep = arguments[0];
155
+ i++;
156
+ }
157
+
158
+ // Merge the object into the extended object
159
+ var merge = function (obj) {
160
+ for ( var prop in obj ) {
161
+ if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {
162
+ // If deep merge and property is an object, merge properties
163
+ if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) {
164
+ extended[prop] = extend( true, extended[prop], obj[prop] );
165
+ } else {
166
+ extended[prop] = obj[prop];
167
+ }
168
+ }
169
+ }
170
+ };
171
+
172
+ // Loop through each object and conduct a merge
173
+ for ( ; i < length; i++ ) {
174
+ var obj = arguments[i];
175
+ merge(obj);
176
+ }
177
+ return extended;
178
+ }
179
+
180
+ // ---------------------------------------------------------------------------
181
+ // executeFunctionByName()
182
+ // execute a function by NAME (functionName) in a browser context
183
+ // (e.g. window) the function is published
184
+ // ---------------------------------------------------------------------------
185
+ function executeFunctionByName (functionName, context /*, args */) {
186
+ var args = Array.prototype.slice.call(arguments, 2);
187
+ var namespaces = functionName.split('.');
188
+ var func = namespaces.pop();
189
+ for(var i = 0; i < namespaces.length; i++) {
190
+ context = context[namespaces[i]];
191
+ }
192
+ return context[func].apply(context, args);
193
+ }
194
+
195
+ // ---------------------------------------------------------------------------
196
+ // createMsDropdownFromJSON()
249
197
  // Create a msDropdown select DYNAMICALLY from JSON data located in a file
250
198
  // specified by "url". The JSON file contaians mutiple msDropdown elements
251
199
  // selected by "elm". The base (empty) <div> container the msDropdown will
252
200
  // be created is specified by theID given by "selector".
253
201
  // ---------------------------------------------------------------------------
254
202
  function createMsDropdownFromJSON (options /* url, elm, selector */) {
255
- var _this = this;
256
- var selectorID = '#' + options.selector;
203
+ var selectorID;
204
+
205
+ // -----------------------------------------------------------------------
206
+ // Merge values from defaults|options
207
+ // -----------------------------------------------------------------------
208
+ var settings = extend ({
209
+ size: 0,
210
+ width: 250,
211
+ multiple: false,
212
+ selectedIndex: 1,
213
+ enableAutoFilter: false,
214
+ visibleRows: null,
215
+ }, options);
216
+
217
+ selectorID = '#' + settings.selector;
257
218
 
258
219
  $.ajax({
259
- url: options.url,
220
+ url: settings.url,
260
221
  dataType: 'json',
261
222
  success: function (data) {
223
+ var dropdownLanguages = [];
224
+
225
+ // collect translation languages
226
+ if (self.props.translationLanguages.includes('all')) {
227
+ dropdownLanguages = data[settings.elm];
228
+ } else {
229
+ for (var i = 0; i < data[settings.elm].length; i++) {
230
+ if(self.props.translationLanguages.includes(data[settings.elm][i].value)) {
231
+ dropdownLanguages.push(data[settings.elm][i]);
232
+ }
233
+ }
234
+ }
235
+
236
+ // correct rows of the dropdown if required
237
+ if (settings.visibleRows > dropdownLanguages.length) {
238
+ settings.visibleRows = dropdownLanguages.length;
239
+ }
240
+
241
+ // create the dropdown
262
242
  MsDropdown.make(selectorID, {
263
243
  byJson: {
264
- data: data[options.elm],
265
- name: options.selector,
266
- // size: 0,
267
- // selectedIndex: 0,
268
- // width: 450,
269
- // multiple: false
244
+ data: dropdownLanguages,
245
+ name: settings.name,
246
+ size: settings.size,
247
+ width: settings.width,
248
+ multiple: settings.multiple,
270
249
  },
271
- enableAutoFilter:false
250
+ enableAutoFilter: settings.enableAutoFilter,
251
+ visibleRows: settings.visibleRows,
272
252
  });
273
-
274
- // msDropdown = document.getElementById(options.selector).msDropdown;
275
- // msDropdown.selectedIndex = 1;
276
- // $(selectorID).show();
277
- // msDropdown.on('close', function() {
278
- // console.log(msDropdown.value)
279
- // });
280
253
  },
281
254
  error: function (jqXHR, textStatus, errorThrown) {
282
- logger.error('\n' + 'failed to retrieve JSON data from: ' + url);
255
+ logger.error('\n' + 'failed to retrieve JSON data from: ' + settings.url);
283
256
  }
284
257
  });
285
258
  }
286
259
 
260
+ // ---------------------------------------------------------------------------
261
+ // showDialog
262
+ // Show|Create the translation dialog (modal)
263
+ // ---------------------------------------------------------------------------
287
264
  function showDialog() {
288
265
  Events.documentReady(function () {
289
266
 
@@ -295,101 +272,85 @@ function Translator(props) {
295
272
  self.modal.setAttribute('class', 'modal fade');
296
273
  self.modal.setAttribute('tabindex', '-1');
297
274
  self.modal.setAttribute('role', 'dialog');
298
- self.modal.setAttribute('aria-labelledby', dialogContainerID);
275
+ self.modal.setAttribute('aria-labelledby', self.props.dialogContainerID);
299
276
  document.body.append(self.modal);
300
277
  self.$modal = $(self.modal);
301
278
 
302
- if (self.props.postSelectionCallback) {
303
- self.$modal.on('hidden.bs.modal', function () {
304
- self.props.postSelectionCallback();
305
- });
306
- }
279
+ // ---------------------------------------------------------------------
280
+ // register events for the dialog (modal)
281
+ // ---------------------------------------------------------------------
307
282
 
308
283
  // ---------------------------------------------------------------------
309
- // register additional events for the dialog (modal)
284
+ // on 'show'
310
285
  // ---------------------------------------------------------------------
286
+ self.$modal.on('show.bs.modal', function () {
287
+ var msDropdownJSON;
288
+ var index;
289
+
290
+ logger.info('\n' + 'show.bs.modal: entered');
291
+
292
+ // create msDropdown from JSON data
293
+ $.when (
294
+ createMsDropdownFromJSON({
295
+ url: '/assets/data/iso-639-language-codes-flags.json',
296
+ elm: 'iso-639-languages',
297
+ selector: 'dropdownJSON',
298
+ width: 400,
299
+ visibleRows: 8,
300
+ })
301
+ )
302
+ .then(function(data) {
303
+ logger.info('\n' + 'creating msDropdown from JSON data: finished');
304
+ });
305
+ }); // END modal on 'show'
311
306
 
312
307
  // ---------------------------------------------------------------------
313
308
  // on 'shown'
309
+ // ---------------------------------------------------------------------
314
310
  self.$modal.on('shown.bs.modal', function () {
315
- if (self.props.translationLanguage === 'auto') {
316
- navigator_language = navigator.language || navigator.userLanguage;
317
- translation_language = navigator_language.split('-')[0];
318
- }
311
+ var msDropdownJSON = document.getElementById('dropdownJSON').msDropdown;
319
312
 
320
- // $.when (
321
- // createMsDropdownFromJSON({
322
- // url: '/assets/data/ms_select.json',
323
- // elm: 'googleLanguages',
324
- // selector: 'dropdowsJSON',
325
- // })
326
- // )
327
- // .then(function(data) {
328
- // $('#dropdowsJSON').show();
329
- // var msDropdown = document.getElementById('dropdowsJSON').msDropdown;
330
- // msDropdown.selectedIndex = 1;
331
- //
332
- // msDropdown.on('close', function() {
333
- // console.log(msDropdown.value)
334
- // });
335
- // });
336
-
337
- var msDropdownSourceLanguage = document.getElementById("translate-source-language").msDropdown;
338
-
339
- // msDropdownSourceLanguage.on('close', function() {
340
- // var selectedLanguage = msDropdownSourceLanguage.value.toLowerCase();
341
- //
342
- // if (translation_language !== selectedLanguage) {
343
- // settings = JSON.parse(Cookie.get(self.props.cookieName));
344
- // settings.translationLanguage = selectedLanguage;
345
- // Cookie.set(self.props.cookieName, JSON.stringify(settings), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
346
- //
347
- // logger.info('\n' + 'selected language: ' + selectedLanguage);
348
- // return false;
349
- // }
350
- // });
351
-
352
- // workaround: limit the height of the resulting list (UL)
353
- // of the 'dd' select
354
- // $('.ms-options').css('max-height', '10.5937rem');
355
-
356
- // jadams, 2021-10-18: added stop scrolling on the body,
357
- // if modal is OPEN
358
- $('body').addClass('stop-scrolling');
359
-
360
- // jadams, 2021-10-18: disable source language selection
361
- if (self.props.translationLanguage === 'auto') {
362
- msDropdownSourceLanguage.disabled = true;
363
- // msDropdownSourceLanguage.disabled = false;
364
- }
313
+ if (!msDropdownJSON.length) {
314
+ // critical error
315
+ logger.error('\n' + 'no msDropdown found in translation dialog');
316
+ self.$modal.hide();
317
+ } else {
318
+ // set translation language for auto detection
319
+ if (self.props.translationLanguage === 'auto') {
320
+ navigator_language = navigator.language || navigator.userLanguage;
321
+ translation_language = navigator_language.split('-')[0];
322
+ }
365
323
 
366
- // jadams, 2021-10-18: doesn't work for sizes > 1 !!!
367
- // get access to msDropdown elements (API)
368
- // set the size to limit the list
369
- // msDropdownSourceLanguage.size = 1;
324
+ // set translation language for the dropdown
325
+ msDropdownJSON.selectedIndex = $('#dropdownJSON option[value=' + translation_language + ']').index();;
370
326
 
371
- });
327
+ // disable translation language selection
328
+ if (self.props.disableLanguageSelector) {
329
+ msDropdownJSON.disabled = true;
330
+ }
372
331
 
373
- // ---------------------------------------------------------------------
374
- // on 'hidden'
375
- self.$modal.on('hidden.bs.modal', function () {
376
- var msDropdownSourceLanguage = document.getElementById("translate-source-language").msDropdown;
377
- var selectedLanguage = msDropdownSourceLanguage.value.toLowerCase();
378
- var settings;
332
+ $('#dropdownJSON').show();
379
333
 
380
- if (translation_language !== selectedLanguage) {
381
- settings = JSON.parse(Cookie.get(self.props.cookieName));
382
- settings.translationLanguage = selectedLanguage;
383
- Cookie.set(self.props.cookieName, JSON.stringify(settings), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
334
+ // jadams, 2021-10-18: added stop scrolling on the body,
335
+ // if modal is OPEN
336
+ $('body').addClass('stop-scrolling');
384
337
 
385
- logger.info('\n' + 'selected language: ' + selectedLanguage);
386
- return false;
387
338
  }
339
+
340
+ }); // END modal on 'shown'
341
+
342
+ // ---------------------------------------------------------------------
343
+ // on 'hidden'
344
+ // ---------------------------------------------------------------------
345
+ self.$modal.on('hidden.bs.modal', function () {
388
346
  $('body').removeClass('stop-scrolling');
389
- });
347
+ // run the postSelectionCallback for (final) translation
348
+ executeFunctionByName (self.props.postSelectionCallback, window);
349
+ }); // END modal on 'hidden'
390
350
 
391
- // load dialog (modal content)
392
- //
351
+ // ---------------------------------------------------------------------
352
+ // load the dialog (modal content)
353
+ // ---------------------------------------------------------------------
393
354
  var templateUrl = self.props.contentURL + '/' + 'index.html';
394
355
  $.get(templateUrl)
395
356
  .done(function (data) {
@@ -411,6 +372,9 @@ function Translator(props) {
411
372
  updateButtons();
412
373
  updateOptionsFromCookie();
413
374
 
375
+ // -------------------------------------------------------------------
376
+ // register button events for the dialog (modal)
377
+ // -------------------------------------------------------------------
414
378
  $('#google-options').on('hide.bs.collapse', function () {
415
379
  detailedSettingsShown = false;
416
380
  updateButtons();
@@ -448,6 +412,7 @@ function Translator(props) {
448
412
  }
449
413
 
450
414
  // ---------------------------------------------------------------------------
415
+ // updateOptionsFromCookie()
451
416
  // update all checkboxes in dialog (modal) from current cookie settings
452
417
  // ---------------------------------------------------------------------------
453
418
  function updateOptionsFromCookie() {
@@ -461,6 +426,7 @@ function Translator(props) {
461
426
  }
462
427
 
463
428
  // ---------------------------------------------------------------------------
429
+ // updateButtons()
464
430
  // toggle dialog (modal) buttons
465
431
  // ---------------------------------------------------------------------------
466
432
  function updateButtons() {
@@ -478,7 +444,8 @@ function Translator(props) {
478
444
  }
479
445
 
480
446
  // ---------------------------------------------------------------------------
481
- // collect current settings from checkboxes in dialog (modal)
447
+ // gatherOptions()
448
+ // collect current settings from all checkboxes in dialog (modal)
482
449
  // ---------------------------------------------------------------------------
483
450
  function gatherOptions(setAllExceptNecessary) {
484
451
  var $options = self.$modal.find('#google-options .translator-option');
@@ -499,7 +466,8 @@ function Translator(props) {
499
466
  }
500
467
 
501
468
  // ---------------------------------------------------------------------------
502
- // process current settings from checkboxes for `agreeAll`
469
+ // agreeAll()
470
+ // process current settings from checkboxes for button `agreeAll`
503
471
  // ---------------------------------------------------------------------------
504
472
  function agreeAll() {
505
473
  var settings;
@@ -529,7 +497,8 @@ function Translator(props) {
529
497
  }
530
498
 
531
499
  // ---------------------------------------------------------------------------
532
- // process current settings from checkboxes for `doNotAgree`
500
+ // doNotAgree()
501
+ // process current settings from checkboxes for button `doNotAgree`
533
502
  // ---------------------------------------------------------------------------
534
503
  function doNotAgree() {
535
504
  var settings = gatherOptions();
@@ -546,6 +515,7 @@ function Translator(props) {
546
515
  }
547
516
 
548
517
  // ---------------------------------------------------------------------------
518
+ // saveSettings()
549
519
  // write current settings from checkboxes to cookie
550
520
  // ---------------------------------------------------------------------------
551
521
  function saveSettings() {
@@ -581,6 +551,7 @@ function Translator(props) {
581
551
  // ===========================================================================
582
552
 
583
553
  // ---------------------------------------------------------------------------
554
+ // showDialog()
584
555
  // show the translator dialog (modal)
585
556
  // ---------------------------------------------------------------------------
586
557
  this.showDialog = function () {
@@ -588,6 +559,7 @@ function Translator(props) {
588
559
  }; // END showDialog
589
560
 
590
561
  // ---------------------------------------------------------------------------
562
+ // getSettings()
591
563
  // collect settings from cookie
592
564
  // ---------------------------------------------------------------------------
593
565
  this.getSettings = function (optionName) {