j1-template 2021.2.5 → 2021.2.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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/modules/connectors/translators/google-translator.html +2 -1
  3. data/_layouts/default.html +0 -1
  4. data/assets/data/iso-639-language-codes-flags.json +224 -0
  5. data/assets/data/{translator_languages.json → iso-639-language-codes.json} +111 -142
  6. data/assets/data/translator.html +23 -19
  7. data/assets/themes/j1/adapter/js/translator.1.js +525 -0
  8. data/assets/themes/j1/adapter/js/translator.js +107 -168
  9. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +27 -12
  10. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +1 -1
  11. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.css +27 -12
  12. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +1 -1
  13. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.css +59 -22
  14. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +1 -1
  15. data/assets/themes/j1/modules/translator/js/translator.js +217 -242
  16. data/assets/themes/j1/modules/translator/js/translator.min.js +2 -2
  17. data/lib/j1/version.rb +1 -1
  18. data/lib/starter_web/Gemfile +1 -1
  19. data/lib/starter_web/_config.yml +1 -1
  20. data/lib/starter_web/_data/j1_config.yml +2 -22
  21. data/lib/starter_web/_data/modules/defaults/translator.yml +77 -64
  22. data/lib/starter_web/_data/modules/translator.yml +1 -0
  23. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  24. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  25. data/lib/starter_web/package.json +1 -1
  26. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +3 -3
  27. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  28. data/lib/starter_web/utilsrv/package.json +1 -1
  29. metadata +5 -4
  30. data/assets/data/msdropdown.json +0 -155
@@ -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' }
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
133
65
  };
134
66
 
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' },
165
- };
166
-
167
- for (var property in props) {
168
- this.props[property] = props[property];
169
- }
170
-
171
- // merge property settings
67
+ // merge properties from default|module
172
68
  for (var property in props) {
173
69
  this.props[property] = props[property];
174
70
  }
175
71
 
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,16 +466,18 @@ 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'
471
+ // On 'agreeAll', enable ALL settings required for translation
503
472
  // ---------------------------------------------------------------------------
504
473
  function agreeAll() {
505
- var settings;
506
- var consentSettings = {};
474
+ var translationSettings = gatherOptions(true);
475
+ var consentSettings = {};
507
476
 
508
- settings = gatherOptions();
477
+ // enable and write all settings required for translation (consent cookie)
509
478
  consentSettings = JSON.parse(Cookie.get(self.props.cookieConsentName));
510
- consentSettings.analysis = settings.analysis;
511
- consentSettings.personalization = settings.personalization;
479
+ consentSettings.analysis = translationSettings.analysis;
480
+ consentSettings.personalization = translationSettings.personalization;
512
481
 
513
482
  Cookie.set(
514
483
  self.props.cookieConsentName,
@@ -517,9 +486,11 @@ function Translator(props) {
517
486
  self.props.sameSite,
518
487
  self.props.secure
519
488
  );
489
+
490
+ // enable and write all settings required for translation (translation cookie)
520
491
  Cookie.set(
521
492
  self.props.cookieName,
522
- JSON.stringify(gatherOptions(true)),
493
+ JSON.stringify(translationSettings),
523
494
  self.props.cookieStorageDays,
524
495
  self.props.sameSite,
525
496
  self.props.secure
@@ -529,7 +500,8 @@ function Translator(props) {
529
500
  }
530
501
 
531
502
  // ---------------------------------------------------------------------------
532
- // process current settings from checkboxes for `doNotAgree`
503
+ // doNotAgree()
504
+ // process current settings from checkboxes for button `doNotAgree`
533
505
  // ---------------------------------------------------------------------------
534
506
  function doNotAgree() {
535
507
  var settings = gatherOptions();
@@ -546,6 +518,7 @@ function Translator(props) {
546
518
  }
547
519
 
548
520
  // ---------------------------------------------------------------------------
521
+ // saveSettings()
549
522
  // write current settings from checkboxes to cookie
550
523
  // ---------------------------------------------------------------------------
551
524
  function saveSettings() {
@@ -581,6 +554,7 @@ function Translator(props) {
581
554
  // ===========================================================================
582
555
 
583
556
  // ---------------------------------------------------------------------------
557
+ // showDialog()
584
558
  // show the translator dialog (modal)
585
559
  // ---------------------------------------------------------------------------
586
560
  this.showDialog = function () {
@@ -588,6 +562,7 @@ function Translator(props) {
588
562
  }; // END showDialog
589
563
 
590
564
  // ---------------------------------------------------------------------------
565
+ // getSettings()
591
566
  // collect settings from cookie
592
567
  // ---------------------------------------------------------------------------
593
568
  this.getSettings = function (optionName) {