j1-template 2021.2.6 → 2021.2.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '028fe3d1a65d64d6219d163c9e489f63d482d48353f9e81a94d2779d3beffb58'
4
- data.tar.gz: 35904d19f59636e14caaab87a0ca634fe4a1f4ac4b472434fe9f89bacf64d295
3
+ metadata.gz: 91ee0616f0905e55586302ee465112ca879423feebacb51e93e04f92f4978189
4
+ data.tar.gz: c64b4a5cfab5cef176f43568c76c5ec0c2550fb7cc8a37df5e8ac97f5cbb957f
5
5
  SHA512:
6
- metadata.gz: 1f091e1530a0efef1f34d3ee2bfae8d8d50f9fa8380ac1b4e7a2bfdb31b996cfeee6d87f8f51805b0f41f23ea3e3c20d2e22de4b1b7d1e2753f945fa9989187d
7
- data.tar.gz: 5421e440efcdb3633a4233b449f32dbf21a23031a08b75a4ba8135eaa0bbe68e57a3cf510bcaf888140895ed371665f4183d03021c5a93365c1224204ac64d8c
6
+ metadata.gz: 40b74cefa0cf230f69156a18b42e6df4932187c6b3b05083efdf11f6d84126e0bcc1279c375692a3360f539b183ab7de2b32a89eb584aadf8e039813bde69aba
7
+ data.tar.gz: 14207a1cd40024aaae0fe3c83a1aa0a72b36e2ba348315e3e2c06b0a8625b38be8405bbce5719c85bb1f00d8f6819e604803575f76a4dbbadb5c5010eca8b09a
@@ -28,10 +28,11 @@
28
28
  <!-- [INFO ] [j1.modules.connectors.translation ] [ place callback for the Google Translator API ] -->
29
29
  <script>
30
30
  function googleTranslateElementInit() {
31
- new google.translate.TranslateElement({
31
+ var gtAPI = new google.translate.TranslateElement({
32
32
  pageLanguage: 'en',
33
33
  layout: google.translate.TranslateElement.FloatPosition.TOP_LEFT
34
34
  },
35
35
  'google_translate_element');
36
+ j1.adapter.translator.postTranslateElementInit(gtAPI);
36
37
  }
37
38
  </script>
@@ -151,7 +151,7 @@ exclude_from_search: true
151
151
 
152
152
  <div class="modal-footer">
153
153
  <button id="translator-buttonDoNotAgree" type="button" class="btn btn-link text-decoration-none" style="min-width: 20rem">
154
- No, skip translation
154
+ No, disable translation
155
155
  </button>
156
156
  <button id="translator-buttonAgree" type="button" class="btn btn-primary btn-raised" style="min-width: 20rem">
157
157
  Yes, please translate
@@ -266,7 +266,7 @@ exclude_from_search: true
266
266
 
267
267
  <div class="modal-footer">
268
268
  <button id="translator-buttonDoNotAgree" type="button" class="btn btn-link text-decoration-none" style="min-width: 20rem">
269
- Nein, keine Übersetzung
269
+ Nein, Übersetzung abschalten
270
270
  </button>
271
271
  <button id="translator-buttonAgree" type="button" class="btn btn-primary btn-raised" style="min-width: 20rem">
272
272
  Ja, bitte übersetzen
@@ -174,7 +174,7 @@ j1.adapter['cookieConsent'] = (function (j1, window) {
174
174
  logger.info('\n' + 'state: ' + _this.getState());
175
175
  logger.info('\n' + 'module is being initialized');
176
176
 
177
- j1.cookieConsent = new BootstrapCookieConsent({
177
+ j1.cookieConsent = new CookieConsent ({
178
178
  contentURL: moduleOptions.contentURL, // dialog content (modals) for all supported languages
179
179
  cookieName: moduleOptions.cookieName, // name of the consent cookie
180
180
  cookieSameSite: moduleOptions.cookieSameSite, // restrict consent cookie
@@ -183,7 +183,7 @@ j1.adapter['cookieConsent'] = (function (j1, window) {
183
183
  reloadPageOnChange: moduleOptions.reloadPageOnChange, // reload if setzings has changed
184
184
  dialogContainerID: moduleOptions.dialogContainerID, // container, the dialog modal is (dynamically) loaded
185
185
  xhrDataElement: moduleOptions.xhrDataElement, // container for all language-specific dialogs (modals)
186
- postSelectionCallback: function () {j1.adapter.cookieConsent.cbCookie()}
186
+ postSelectionCallback: moduleOptions.postSelectionCallback, // callback function, called after the user has made his selection
187
187
  });
188
188
 
189
189
  _this.setState('finished');
@@ -303,7 +303,8 @@ j1.adapter['cookieConsent'] = (function (j1, window) {
303
303
  name: cookie_names.user_translate,
304
304
  data: user_translate,
305
305
  samesite: 'Strict',
306
- secure: secure
306
+ secure: secure,
307
+ expires: 365
307
308
  });
308
309
 
309
310
  }
@@ -0,0 +1,525 @@
1
+ ---
2
+ regenerate: true
3
+ ---
4
+
5
+ {% capture cache %}
6
+
7
+ {% comment %}
8
+ # -----------------------------------------------------------------------------
9
+ # ~/assets/themes/j1/adapter/js/translator.js
10
+ # Liquid template to create the Template Adapter for J1 Translator
11
+ #
12
+ # Product/Info:
13
+ # http://jekyll.one
14
+ #
15
+ # Copyright (C) 2021 Juergen Adams
16
+ #
17
+ # J1 Template is licensed under the MIT License.
18
+ # For details, see https://jekyll.one
19
+ # -----------------------------------------------------------------------------
20
+ # Test data:
21
+ # {{ liquid_var | debug }}
22
+ # -----------------------------------------------------------------------------
23
+ {% endcomment %}
24
+
25
+ {% comment %} Liquid var initialization
26
+ -------------------------------------------------------------------------------- {% endcomment %}
27
+
28
+ {% comment %} Set config files
29
+ -------------------------------------------------------------------------------- {% endcomment %}
30
+ {% assign environment = site.environment %}
31
+ {% assign blocks = site.data.blocks %}
32
+ {% assign modules = site.data.modules %}
33
+ {% assign template_config = site.data.j1_config %}
34
+
35
+ {% comment %} Set config data
36
+ -------------------------------------------------------------------------------- {% endcomment %}
37
+ {% assign translator_defaults = modules.defaults.translator.defaults %}
38
+ {% assign translator_settings = modules.translator.settings %}
39
+ {% assign tracking_enabled = template_config.analytics.enabled %}
40
+
41
+
42
+ {% comment %} Set config options
43
+ -------------------------------------------------------------------------------- {% endcomment %}
44
+ {% assign translator_options = translator_defaults | merge: translator_settings %}
45
+
46
+ {% assign production = false %}
47
+ {% if environment == 'prod' or environment == 'production' %}
48
+ {% assign production = true %}
49
+ {% endif %}
50
+
51
+ /*
52
+ # -----------------------------------------------------------------------------
53
+ # ~/assets/themes/j1/adapter/js/translator.js
54
+ # JS Adapter for J1 Translate
55
+ #
56
+ # Product/Info:
57
+ # http://jekyll.one
58
+ #
59
+ # Copyright (C) 2021 Juergen Adams
60
+ #
61
+ # J1 Template is licensed under MIT License.
62
+ # See: https://github.com/jekyll-one/J1 Template/blob/master/LICENSE
63
+ # -----------------------------------------------------------------------------
64
+ # Adapter generated: {{site.time}}
65
+ # -----------------------------------------------------------------------------
66
+ */
67
+
68
+ // -----------------------------------------------------------------------------
69
+ // ESLint shimming
70
+ // -----------------------------------------------------------------------------
71
+ /* eslint indent: "off" */
72
+ /* eslint quotes: "off" */
73
+ // -----------------------------------------------------------------------------
74
+ // https://github.com/EdwardBalaj/Simple-DeepL-API-Integration
75
+ // https://github.com/marghoobsuleman/ms-Dropdown
76
+ // https://www.marghoobsuleman.com/image-dropdown/help
77
+ // https://www.marghoobsuleman.com/image-dropdown/advanced-help
78
+ 'use strict';
79
+
80
+ {% comment %} Main
81
+ -------------------------------------------------------------------------------- {% endcomment %}
82
+ j1.adapter['translator'] = (function (j1, window) {
83
+
84
+ var environment = '{{environment}}';
85
+ var tracking_enabled = ('{{tracking_enabled}}' === 'true') ? true: false; // Analytics/GA enabled?
86
+ var moduleOptions = {};
87
+ var user_translate = {};
88
+ var _this;
89
+ var $modal;
90
+ var domain;
91
+ var cookie_names;
92
+ var user_consent;
93
+ var logger;
94
+ var url;
95
+ var baseUrl;
96
+ var hostname;
97
+ var domain;
98
+ var cookie_sub_domains;
99
+ var secure;
100
+ var logText;
101
+ var cookie_written;
102
+ var modal_language;
103
+ var navigator_language;
104
+ var translation_language;
105
+ var ddSourceLanguage;
106
+ var head;
107
+ var script;
108
+ var languageList;
109
+
110
+ // ---------------------------------------------------------------------------
111
+ // helper functions
112
+ // ---------------------------------------------------------------------------
113
+
114
+ // ---------------------------------------------------------------------------
115
+ // setCookie()
116
+ // writes a flat cookie (not using an encoded JSON string)
117
+ // ---------------------------------------------------------------------------
118
+ function setCookie(options /*cName, cValue, expDays*/) {
119
+ var defaults = {};
120
+ var settings;
121
+ var document_cookie;
122
+ var stringifiedAttributes = '';
123
+
124
+ defaults = {
125
+ name: '',
126
+ path: '/',
127
+ expires: 0,
128
+ domain: 'localhost',
129
+ samesite: 'Strict',
130
+ http_only: false,
131
+ secure: false
132
+ };
133
+ settings = $.extend(defaults, options);
134
+
135
+ stringifiedAttributes += '; ' + 'path=' + settings.path;
136
+
137
+ if (settings.expires > 0) {
138
+ date.setTime(date.getTime() + (settings.expires * 24 * 60 * 60 * 1000));
139
+ stringifiedAttributes += '; ' + 'expires=' + date.toUTCString();
140
+ }
141
+
142
+ stringifiedAttributes += '; ' + 'SameSite=' + settings.samesite;
143
+
144
+ if (settings.secure) {
145
+ stringifiedAttributes += '; ' + 'secure=' + settings.secure;
146
+ }
147
+
148
+ // document_cookie = settings.name + '=' + settings.data + '; path=' + settings.path + '; ' + 'domain=' + settings.domain + '; ' + 'SameSite=' + settings.samesite + ';';
149
+ document_cookie = settings.name + '=' + settings.data + stringifiedAttributes;
150
+
151
+ document.cookie = document_cookie;
152
+ };
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // Main object
156
+ // ---------------------------------------------------------------------------
157
+ return {
158
+
159
+ // -------------------------------------------------------------------------
160
+ // Initializer
161
+ // -------------------------------------------------------------------------
162
+ init: function (options) {
163
+
164
+ // -----------------------------------------------------------------------
165
+ // globals
166
+ // -----------------------------------------------------------------------
167
+ _this = j1.adapter.translator;
168
+ logger = log4javascript.getLogger('j1.adapter.translator');
169
+ url = new liteURL(window.location.href);
170
+ baseUrl = url.origin;
171
+ hostname = url.hostname;
172
+ domain = hostname.substring(hostname.lastIndexOf('.', hostname.lastIndexOf('.') - 1) + 1);
173
+ secure = (url.protocol.includes('https')) ? true : false;
174
+ modal_language = "{{site.language}}";
175
+ navigator_language = navigator.language || navigator.userLanguage; // userLanguage for MS IE compatibility
176
+ translation_language = navigator_language.split('-')[0];
177
+ cookie_names = j1.getCookieNames();
178
+ head = document.getElementsByTagName('head')[0];
179
+ script = document.createElement('script');
180
+ script.id = 'google-translate';
181
+ script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
182
+
183
+ user_translate = {
184
+ 'translatorName': 'google',
185
+ 'translationEnabled': false,
186
+ 'analysis': true,
187
+ 'personalization': true,
188
+ 'translateAllPages': true,
189
+ 'useLanguageFromBrowser': true,
190
+ 'translationLanguage': translation_language,
191
+ };
192
+
193
+ // set domain used by cookies
194
+ if(domain !== 'localhost') {
195
+ cookie_sub_domains = '.' + hostname;
196
+ } else {
197
+ cookie_sub_domains = hostname;
198
+ }
199
+
200
+ if (j1.existsCookie(cookie_names.user_translate)) {
201
+ user_translate = j1.readCookie(cookie_names.user_translate);
202
+ } else {
203
+ logger.debug('\n' + 'write to cookie : ' + cookie_names.user_translate);
204
+ cookie_written = j1.writeCookie({
205
+ name: cookie_names.user_translate,
206
+ data: user_translate,
207
+ samesite: 'Strict',
208
+ expires: 365
209
+ });
210
+ }
211
+
212
+ // set domain used by cookies
213
+ if(domain !== 'localhost') {
214
+ cookie_sub_domains = '.' + hostname;
215
+ } else {
216
+ cookie_sub_domains = hostname;
217
+ }
218
+
219
+ // initialize state flag
220
+ _this.state = 'pending';
221
+ // _this.settings.languageList = '/assets/data/ms_select.json';
222
+
223
+ // -----------------------------------------------------------------------
224
+ // Default module settings
225
+ // -----------------------------------------------------------------------
226
+ var settings = $.extend({
227
+ module_name: 'j1.adapter.translator',
228
+ generated: '{{site.time}}'
229
+ }, options);
230
+
231
+ {% comment %} Load module config from yml data
232
+ -------------------------------------------------------------------------- {% endcomment %}
233
+ // Load module DEFAULTS|CONFIG
234
+ /* eslint-disable */
235
+ moduleOptions = $.extend({}, {{translator_options | replace: '=>', ':' | replace: 'nil', '""'}});
236
+ /* eslint-enable */
237
+
238
+ if (typeof settings !== 'undefined') {
239
+ moduleOptions = j1.mergeData(moduleOptions, settings);
240
+ }
241
+
242
+ // -----------------------------------------------------------------------
243
+ // initializer
244
+ // -----------------------------------------------------------------------
245
+ var dependencies_met_page_ready = setInterval (function (options) {
246
+ user_consent = j1.readCookie(cookie_names.user_consent);
247
+
248
+ if ( j1.getState() === 'finished' ) {
249
+ _this.setState('started');
250
+ logger.info('\n' + 'state: ' + _this.getState());
251
+ logger.info('\n' + 'module is being initialized');
252
+
253
+ if ($('google_translate_element')) {
254
+ $('google_translate_element').hide();
255
+ }
256
+
257
+ // show|hide translate button if enabled
258
+ if (moduleOptions.hideTranslatorIcon) {
259
+ if (!user_consent.analysis || !user_consent.personalization) {
260
+ // disable google translate button if visible
261
+ if ($('#quickLinksTranslateButton').css('display') === 'block') {
262
+ $('#quickLinksTranslateButton').css('display', 'none');
263
+ }
264
+ }
265
+ if (user_consent.analysis && user_consent.personalization) {
266
+ // enable google translate button if not visible
267
+ if ($('#quickLinksTranslateButton').css('display') === 'none') {
268
+ $('#quickLinksTranslateButton').css('display', 'block');
269
+ }
270
+ }
271
+ }
272
+
273
+ // update user_translate cookie
274
+ user_translate.analysis = user_consent.analysis;
275
+ user_translate.personalization = user_consent.personalization;
276
+ cookie_written = j1.writeCookie({
277
+ name: cookie_names.user_translate,
278
+ data: user_translate,
279
+ samesite: 'Strict',
280
+ secure: secure
281
+ });
282
+
283
+ j1.translator = new Translator({
284
+ contentURL: moduleOptions.contentURL, // dialog content (modals) for all supported languages
285
+ cookieName: moduleOptions.cookieName, // the name of the User State Cookie (primary data)
286
+ cookieConsentName: moduleOptions.cookieConsentName, // the name of the Cookie Consent Cookie (secondary data)
287
+ disableLanguageSelector: moduleOptions.disableLanguageSelector, // disable language dropdown for translation in dialog (modal)
288
+ dialogContainerID: moduleOptions.dialogContainerID, // dest container, the dialog modal is loaded (dynamically)
289
+ dialogLanguage: moduleOptions.dialogLanguage, // language for the dialog (modal)
290
+ translationLanguage: moduleOptions.translationLanguage, // default language for translation
291
+ translationLanguages: moduleOptions.google.translationLanguages,// supported languages for translation
292
+ translationEnabled: moduleOptions.translationEnabled, // run translation enabled|disabled
293
+ translatorName: moduleOptions.translatorName, // translator used for translation
294
+ xhrDataElement: moduleOptions.xhrDataElement, // container for all language-specific dialogs (modals)
295
+ postSelectionCallback: moduleOptions.google.postSelectionCallback
296
+ });
297
+
298
+ if (user_consent.analysis && user_consent.personalization && user_translate.translationEnabled) {
299
+ if (moduleOptions.translatorName === 'google') {
300
+ head.appendChild(script);
301
+ if ($('google_translate_element')) {
302
+ $('google_translate_element').hide();
303
+ }
304
+ }
305
+ } else {
306
+ if (moduleOptions.translatorName === 'google') {
307
+ j1.removeCookie({name: 'googtrans', domain: domain});
308
+ }
309
+ }
310
+
311
+ _this.setState('finished');
312
+ logger.info('\n' + 'state: ' + _this.getState());
313
+ logger.debug('\n' + 'module initialized successfully');
314
+ clearInterval(dependencies_met_page_ready);
315
+ }
316
+ });
317
+ }, // END init
318
+
319
+ // -------------------------------------------------------------------------
320
+ // messageHandler: MessageHandler for J1 google_translate module
321
+ // Manage messages send from other J1 modules
322
+ // -------------------------------------------------------------------------
323
+ messageHandler: function (sender, message) {
324
+ var json_message = JSON.stringify(message, undefined, 2);
325
+
326
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
327
+ logger.debug(logText);
328
+
329
+ // -----------------------------------------------------------------------
330
+ // Process commands|actions
331
+ // -----------------------------------------------------------------------
332
+ if (message.type === 'command' && message.action === 'module_initialized') {
333
+ //
334
+ // Place handling of command|action here
335
+ //
336
+ logger.info('\n' + message.text);
337
+ }
338
+
339
+ //
340
+ // Place handling of other command|action here
341
+ //
342
+
343
+ return true;
344
+ }, // END messageHandler
345
+
346
+ // -------------------------------------------------------------------------
347
+ // setState()
348
+ // Sets the current (processing) state of the module
349
+ // -------------------------------------------------------------------------
350
+ setState: function (stat) {
351
+ _this.state = stat;
352
+ }, // END setState
353
+
354
+ // -------------------------------------------------------------------------
355
+ // getState()
356
+ // Returns the current (processing) state of the module
357
+ // -------------------------------------------------------------------------
358
+ getState: function () {
359
+ return _this.state;
360
+ }, // END getState
361
+
362
+ // -------------------------------------------------------------------------
363
+ // postTranslateElementInit()
364
+ // ???
365
+ // -------------------------------------------------------------------------
366
+ postTranslateElementInit: function () {
367
+ // var transCode = '/en/de';
368
+ //
369
+ // // set the transCode cookie (googtrans)
370
+ // setCookie({
371
+ // name: 'googtrans',
372
+ // data: transCode
373
+ // });
374
+ // j1.removeCookie({name: 'googtrans', domain: domain});
375
+ return;
376
+ }, // END postTranslateElementInit
377
+
378
+ // -------------------------------------------------------------------------
379
+ // cbGoogle()
380
+ // Called by the translator CORE module after the user
381
+ // has made the lanuage selection for translation (callback)
382
+ // -------------------------------------------------------------------------
383
+ cbGoogle: function () {
384
+ var cookie_names = j1.getCookieNames();
385
+ var user_state = j1.readCookie(cookie_names.user_state);
386
+ var user_consent = j1.readCookie(cookie_names.user_consent);
387
+ var user_translate = j1.readCookie(cookie_names.user_translate);
388
+ var msDropdownLang = document.getElementById('dropdownJSON').msDropdown;
389
+ var msDropdown = document.getElementById('dropdownJSON').msDropdown;
390
+ var head;
391
+ var script;
392
+ var srcLang;
393
+ var destLang;
394
+ var transCode;
395
+ var cookie_written;
396
+ var htmlScriptElement;
397
+ var selectedTranslationLanguage;
398
+
399
+ logger.info('\n' + 'entered post selection callback from google_translate');
400
+ logger.debug('\n' + 'current values from cookie consent: ' + JSON.stringify(user_consent));
401
+ logger.debug('\n' + 'current values from user state: ' + JSON.stringify(user_state));
402
+
403
+ selectedTranslationLanguage = msDropdownLang.value;
404
+ logger.info('\n' + 'selected translation language: ' + selectedTranslationLanguage);
405
+
406
+ // update cookie consent settings
407
+ user_consent.analysis = user_translate.analysis;
408
+ user_consent.personalization = user_translate.personalization;
409
+
410
+ cookie_written = j1.writeCookie({
411
+ name: cookie_names.user_consent,
412
+ data: user_consent,
413
+ samesite: 'Strict',
414
+ secure: secure,
415
+ expires: 0
416
+ });
417
+
418
+ // translation allowed
419
+ if (user_consent.analysis && user_consent.personalization) {
420
+ head = document.getElementsByTagName('head')[0];
421
+ script = document.createElement('script');
422
+ script.id = 'google-translate';
423
+ script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
424
+ htmlScriptElement = document.getElementById(script.id);
425
+
426
+ if (user_translate.translationEnabled && moduleOptions.translatorName === 'google') {
427
+ // head.appendChild(script);
428
+
429
+ if ($('google_translate_element')) {
430
+ $('google_translate_element').hide();
431
+ }
432
+
433
+ // set transCode settings
434
+ srcLang = "{{site.language}}";
435
+ destLang = translation_language;
436
+ transCode = '/' + srcLang + '/' + selectedTranslationLanguage;
437
+
438
+ // set the transCode cookie (googtrans)
439
+ setCookie({
440
+ name: 'googtrans',
441
+ data: transCode
442
+ });
443
+
444
+ // enable google transalate button if not visible
445
+ if ($('#quickLinksTranslateButton').css('display') === 'none') {
446
+ $('#quickLinksTranslateButton').css('display', 'block');
447
+ }
448
+ } else { // translation NOT allowed
449
+
450
+ // update cookie user translate settings
451
+ user_translate.translationEnabled = false;
452
+ cookie_written = j1.writeCookie({
453
+ name: cookie_names.user_translate,
454
+ data: user_translate,
455
+ samesite: 'Strict',
456
+ secure: secure
457
+ });
458
+
459
+ // stop translation for all pages
460
+ if (htmlScriptElement) { htmlScriptElement.remove(); }
461
+ j1.removeCookie({name: 'googtrans', domain: domain});
462
+ }
463
+ }
464
+
465
+ // translation NOT allowed
466
+ if (!user_translate.analysis || !user_translate.personalization) {
467
+ head = document.getElementsByTagName('head')[0];
468
+ script = document.createElement('script');
469
+ script.id = 'google-translate';
470
+
471
+ // update cookie consent settings
472
+ user_consent.analysis = user_translate.analysis;
473
+ user_consent.personalization = user_translate.personalization;
474
+ cookie_written = j1.writeCookie({
475
+ name: cookie_names.user_consent,
476
+ data: user_consent,
477
+ samesite: 'Strict',
478
+ secure: secure,
479
+ expires: 0
480
+ });
481
+
482
+ // update cookie user translate settings
483
+ user_translate.translationEnabled = false;
484
+ cookie_written = j1.writeCookie({
485
+ name: cookie_names.user_translate,
486
+ data: user_consent,
487
+ samesite: 'Strict',
488
+ secure: secure,
489
+ expires: 0
490
+ });
491
+
492
+ // stop translation for all pages
493
+ if (htmlScriptElement) { htmlScriptElement.remove(); }
494
+ j1.removeCookie({name: 'googtrans', domain: domain});
495
+ }
496
+
497
+ if (moduleOptions.reloadPageOnChange) {
498
+ // reload current page (skip cache)
499
+ location.reload(true);
500
+ }
501
+
502
+ // disable google translate button if visible
503
+ if ($('#quickLinksTranslateButton').css('display') === 'block') {
504
+ $('#quickLinksTranslateButton').css('display', 'none');
505
+ }
506
+
507
+ }, // END cbGoogle
508
+
509
+ // -------------------------------------------------------------------------
510
+ // cbDeepl()
511
+ // Called by the translator CORE module after the user
512
+ // has made the lanuage selection for translation (callback)
513
+ // -------------------------------------------------------------------------
514
+ cbDeepl: function () {
515
+
516
+ // code for post procession on Deepl translations
517
+
518
+ } // END cbDeepl
519
+
520
+ }; // END return
521
+ })(j1, window);
522
+
523
+ {% endcapture %}
524
+ {{ cache | strip_empty_lines }}
525
+ {% assign cache = nil %}
@@ -117,16 +117,37 @@ j1.adapter['translator'] = (function (j1, window) {
117
117
  function setCookie(options /*cName, cValue, expDays*/) {
118
118
  var defaults = {};
119
119
  var settings;
120
+ var document_cookie;
121
+ var stringifiedAttributes = '';
120
122
 
121
123
  defaults = {
122
124
  name: '',
123
125
  path: '/',
124
126
  expires: 0,
125
- domain: 'localhost'
127
+ domain: 'localhost',
128
+ samesite: 'Strict',
129
+ http_only: false,
130
+ secure: false
126
131
  };
127
132
  settings = $.extend(defaults, options);
128
133
 
129
- document.cookie = settings.name + "=" + settings.data + "; path=/";
134
+ stringifiedAttributes += '; ' + 'path=' + settings.path;
135
+
136
+ if (settings.expires > 0) {
137
+ date.setTime(date.getTime() + (settings.expires * 24 * 60 * 60 * 1000));
138
+ stringifiedAttributes += '; ' + 'expires=' + date.toUTCString();
139
+ }
140
+
141
+ stringifiedAttributes += '; ' + 'SameSite=' + settings.samesite;
142
+
143
+ if (settings.secure) {
144
+ stringifiedAttributes += '; ' + 'secure=' + settings.secure;
145
+ }
146
+
147
+ // document_cookie = settings.name + '=' + settings.data + '; path=' + settings.path + '; ' + 'domain=' + settings.domain + '; ' + 'SameSite=' + settings.samesite + ';';
148
+ document_cookie = settings.name + '=' + settings.data + stringifiedAttributes;
149
+
150
+ document.cookie = document_cookie;
130
151
  };
131
152
 
132
153
  // ---------------------------------------------------------------------------
@@ -148,6 +169,7 @@ j1.adapter['translator'] = (function (j1, window) {
148
169
  baseUrl = url.origin;
149
170
  hostname = url.hostname;
150
171
  domain = hostname.substring(hostname.lastIndexOf('.', hostname.lastIndexOf('.') - 1) + 1);
172
+ cookie_domain = (domain.includes('.')) ? '.' + domain : domain;
151
173
  secure = (url.protocol.includes('https')) ? true : false;
152
174
  modal_language = "{{site.language}}";
153
175
  navigator_language = navigator.language || navigator.userLanguage; // userLanguage for MS IE compatibility
@@ -168,6 +190,7 @@ j1.adapter['translator'] = (function (j1, window) {
168
190
  'translationLanguage': translation_language,
169
191
  };
170
192
 
193
+ // load|initialize user translate cookie
171
194
  if (j1.existsCookie(cookie_names.user_translate)) {
172
195
  user_translate = j1.readCookie(cookie_names.user_translate);
173
196
  } else {
@@ -176,17 +199,11 @@ j1.adapter['translator'] = (function (j1, window) {
176
199
  name: cookie_names.user_translate,
177
200
  data: user_translate,
178
201
  samesite: 'Strict',
202
+ secure: secure,
179
203
  expires: 365
180
204
  });
181
205
  }
182
206
 
183
- // set domain used by cookies
184
- if(domain !== 'localhost') {
185
- cookie_domain = '.' + hostname;
186
- } else {
187
- cookie_domain = hostname;
188
- }
189
-
190
207
  // initialize state flag
191
208
  _this.state = 'pending';
192
209
  // _this.settings.languageList = '/assets/data/ms_select.json';
@@ -221,6 +238,7 @@ j1.adapter['translator'] = (function (j1, window) {
221
238
  logger.info('\n' + 'state: ' + _this.getState());
222
239
  logger.info('\n' + 'module is being initialized');
223
240
 
241
+ // hide the google translate element if exists
224
242
  if ($('google_translate_element')) {
225
243
  $('google_translate_element').hide();
226
244
  }
@@ -248,7 +266,8 @@ j1.adapter['translator'] = (function (j1, window) {
248
266
  name: cookie_names.user_translate,
249
267
  data: user_translate,
250
268
  samesite: 'Strict',
251
- secure: secure
269
+ secure: secure,
270
+ expires: 365
252
271
  });
253
272
 
254
273
  j1.translator = new Translator({
@@ -266,15 +285,21 @@ j1.adapter['translator'] = (function (j1, window) {
266
285
  postSelectionCallback: moduleOptions.google.postSelectionCallback
267
286
  });
268
287
 
288
+ // enable|disable translation (after callback)
269
289
  if (user_consent.analysis && user_consent.personalization && user_translate.translationEnabled) {
270
290
  if (moduleOptions.translatorName === 'google') {
271
291
  head.appendChild(script);
272
- $('google_translate_element').hide();
292
+ if ($('google_translate_element')) {
293
+ $('google_translate_element').hide();
294
+ }
273
295
  }
274
296
  } else {
275
297
  if (moduleOptions.translatorName === 'google') {
276
- j1.removeCookie({name: 'googtrans'});
277
- }
298
+ // remove all googtrans cookies that POTENTIALLY exists
299
+ Cookies.remove('googtrans', { domain: cookie_domain });
300
+ Cookies.remove('googtrans', { domain: hostname });
301
+ Cookies.remove('googtrans');
302
+ }
278
303
  }
279
304
 
280
305
  _this.setState('finished');
@@ -328,32 +353,35 @@ j1.adapter['translator'] = (function (j1, window) {
328
353
  return _this.state;
329
354
  }, // END getState
330
355
 
356
+ // -------------------------------------------------------------------------
357
+ // postTranslateElementInit()
358
+ // ???
359
+ // -------------------------------------------------------------------------
360
+ postTranslateElementInit: function (response) {
361
+ // code for post processing
362
+ logger.info('\n' + 'postTranslateElementInit entered');
363
+ logger.info('\n' + response.T.Dh);
364
+ return;
365
+ }, // END postTranslateElementInit
366
+
331
367
  // -------------------------------------------------------------------------
332
368
  // cbGoogle()
333
- // Called by the translator CORE module after the user
334
- // has made the lanuage selection for translation (callback)
369
+ // Called by the translator CORE module after the user made the
370
+ // selection for a translation|language
335
371
  // -------------------------------------------------------------------------
336
372
  cbGoogle: function () {
373
+ var logger = log4javascript.getLogger('j1.adapter.translator.cbGoogle');
337
374
  var cookie_names = j1.getCookieNames();
338
375
  var user_state = j1.readCookie(cookie_names.user_state);
339
376
  var user_consent = j1.readCookie(cookie_names.user_consent);
340
377
  var user_translate = j1.readCookie(cookie_names.user_translate);
341
- var msDropdownLang = document.getElementById('dropdownJSON').msDropdown;
342
378
  var msDropdown = document.getElementById('dropdownJSON').msDropdown;
343
- var head;
344
- var script;
379
+ var selectedTranslationLanguage;
345
380
  var srcLang;
346
381
  var destLang;
347
382
  var transCode;
348
- var cookie_written;
349
- var htmlScriptElement;
350
- var selectedTranslationLanguage;
351
-
352
- logger.info('\n' + 'entered post selection callback from google_translate');
353
- logger.debug('\n' + 'current values from cookie consent: ' + JSON.stringify(user_consent));
354
- logger.debug('\n' + 'current values from user state: ' + JSON.stringify(user_state));
355
383
 
356
- selectedTranslationLanguage = msDropdownLang.value;
384
+ selectedTranslationLanguage = msDropdown.value;
357
385
  logger.info('\n' + 'selected translation language: ' + selectedTranslationLanguage);
358
386
 
359
387
  // update cookie consent settings
@@ -365,109 +393,34 @@ j1.adapter['translator'] = (function (j1, window) {
365
393
  data: user_consent,
366
394
  samesite: 'Strict',
367
395
  secure: secure,
368
- expires: 0
396
+ expires: 365
369
397
  });
370
398
 
371
- // translation allowed
372
- if (user_consent.analysis && user_consent.personalization) {
373
- head = document.getElementsByTagName('head')[0];
374
- script = document.createElement('script');
375
- script.id = 'google-translate';
376
- script.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
377
- htmlScriptElement = document.getElementById(script.id);
378
-
379
- if (user_translate.translationEnabled && moduleOptions.translatorName === 'google') {
380
- head.appendChild(script);
381
-
382
- if ($('google_translate_element')) {
383
- $('google_translate_element').hide();
384
- }
385
-
386
- // set transCode settings
387
- srcLang = "{{site.language}}";
388
- destLang = translation_language;
389
- transCode = '/' + srcLang + '/' + selectedTranslationLanguage;
399
+ // set transCode settings
400
+ srcLang = "{{site.language}}";
401
+ destLang = translation_language;
402
+ transCode = '/' + srcLang + '/' + selectedTranslationLanguage;
390
403
 
391
- // set the transCode cookie (googtrans)
392
- setCookie({
393
- name: 'googtrans',
394
- data: transCode
395
- });
404
+ // remove all googtrans cookies that POTENTIALLY exists
405
+ Cookies.remove('googtrans', { domain: cookie_domain });
406
+ Cookies.remove('googtrans', { domain: hostname });
407
+ Cookies.remove('googtrans');
396
408
 
397
- // enable google transalate button if not visible
398
- if ($('#quickLinksTranslateButton').css('display') === 'none') {
399
- $('#quickLinksTranslateButton').css('display', 'block');
400
- }
401
- } else { // translation NOT allowed
402
-
403
- // update cookie user translate settings
404
- user_translate.translationEnabled = false;
405
- cookie_written = j1.writeCookie({
406
- name: cookie_names.user_translate,
407
- data: user_translate,
408
- samesite: 'Strict',
409
- secure: secure
410
- });
411
-
412
- // stop translation for all pages
413
- if (htmlScriptElement) { htmlScriptElement.remove(); }
414
- j1.removeCookie({name: 'googtrans'});
415
- }
416
- }
417
-
418
- // translation NOT allowed
419
- if (!user_translate.analysis || !user_translate.personalization) {
420
- head = document.getElementsByTagName('head')[0];
421
- script = document.createElement('script');
422
- script.id = 'google-translate';
423
-
424
- // update cookie consent settings
425
- user_consent.analysis = user_translate.analysis;
426
- user_consent.personalization = user_translate.personalization;
427
- cookie_written = j1.writeCookie({
428
- name: cookie_names.user_consent,
429
- data: user_consent,
430
- samesite: 'Strict',
431
- secure: secure,
432
- expires: 0
433
- });
434
-
435
- // update cookie user translate settings
436
- user_translate.translationEnabled = false;
437
- cookie_written = j1.writeCookie({
438
- name: cookie_names.user_translate,
439
- data: user_consent,
440
- samesite: 'Strict',
441
- secure: secure,
442
- expires: 0
443
- });
444
-
445
- // stop translation for all pages
446
- if (htmlScriptElement) { htmlScriptElement.remove(); }
447
- j1.removeCookie({name: 'googtrans'});
448
- }
449
-
450
- if (moduleOptions.reloadPageOnChange) {
451
- // reload current page (skip cache)
452
- location.reload(true);
453
- }
454
-
455
- // disable google translate button if visible
456
- if ($('#quickLinksTranslateButton').css('display') === 'block') {
457
- $('#quickLinksTranslateButton').css('display', 'none');
458
- }
409
+ // write the googtrans cookie w/o DOMAIN!
410
+ Cookies.set('googtrans', transCode);
459
411
 
412
+ // reload current page (skip cache)
413
+ location.reload(true);
460
414
  }, // END cbGoogle
461
415
 
462
416
  // -------------------------------------------------------------------------
463
417
  // cbDeepl()
464
- // Called by the translator CORE module after the user
465
- // has made the lanuage selection for translation (callback)
418
+ // Called by the translator CORE module after the user made the
419
+ // selection for a translation language
466
420
  // -------------------------------------------------------------------------
467
421
  cbDeepl: function () {
468
-
469
- // code for post procession on Deepl translations
470
-
422
+ var logger = log4javascript.getLogger('j1.adapter.translator.cbDeepl');
423
+ // code for post processing
471
424
  } // END cbDeepl
472
425
 
473
426
  }; // END return
@@ -37,7 +37,7 @@
37
37
  /* eslint JSUnfilteredForInLoop: "off" */
38
38
  // -----------------------------------------------------------------------------
39
39
 
40
- function BootstrapCookieConsent(props) {
40
+ function CookieConsent(props) {
41
41
  var logger = log4javascript.getLogger('j1.core.bsCookieConsent');
42
42
  var self = this;
43
43
  var detailedSettingsShown = false;
@@ -58,11 +58,12 @@ function BootstrapCookieConsent(props) {
58
58
  contentURL: '/assets/data/cookieconsent', // URL contain the consent dialogs (modals) for ALL supported languages
59
59
  cookieName: 'j1.user.translate', // name of the cookie, in which the configuration is stored
60
60
  cookieStorageDays: 365, // duration the configuration cookie is stored on the client
61
- postSelectionCallback: undefined, // callback function, called after the user has made his selection
61
+ postSelectionCallback: '', // callback function, called after the user has made his selection
62
62
  whitelisted: [], // pages NO consent modal dialog is issued
63
63
  xhrDataElement: 'consent-data', // src container for all language-specific consent dialogs (taken from contentURL)
64
64
  dialogContainerID: 'consent-modal', // dest container, the dialog modal is loaded (dynamically)
65
65
  cookieSameSite: 'Strict', // restrict the consent cookie to first-party (do NOT send cookie to other domains)
66
+ cookieSecure: true
66
67
  };
67
68
 
68
69
  // merge property settings
@@ -128,6 +129,59 @@ function BootstrapCookieConsent(props) {
128
129
  }
129
130
  };
130
131
 
132
+ // ---------------------------------------------------------------------------
133
+ // extend()
134
+ // deep merge of two objects
135
+ // ---------------------------------------------------------------------------
136
+ function extend () {
137
+ var extended = {};
138
+ var deep = false;
139
+ var i = 0;
140
+ var length = arguments.length;
141
+
142
+ // Check if a deep merge
143
+ if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) {
144
+ deep = arguments[0];
145
+ i++;
146
+ }
147
+
148
+ // Merge the object into the extended object
149
+ var merge = function (obj) {
150
+ for ( var prop in obj ) {
151
+ if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {
152
+ // If deep merge and property is an object, merge properties
153
+ if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) {
154
+ extended[prop] = extend( true, extended[prop], obj[prop] );
155
+ } else {
156
+ extended[prop] = obj[prop];
157
+ }
158
+ }
159
+ }
160
+ };
161
+
162
+ // Loop through each object and conduct a merge
163
+ for ( ; i < length; i++ ) {
164
+ var obj = arguments[i];
165
+ merge(obj);
166
+ }
167
+ return extended;
168
+ }
169
+
170
+ // ---------------------------------------------------------------------------
171
+ // executeFunctionByName()
172
+ // execute a function by NAME (functionName) in a browser context
173
+ // (e.g. window) the function is published
174
+ // ---------------------------------------------------------------------------
175
+ function executeFunctionByName (functionName, context /*, args */) {
176
+ var args = Array.prototype.slice.call(arguments, 2);
177
+ var namespaces = functionName.split('.');
178
+ var func = namespaces.pop();
179
+ for(var i = 0; i < namespaces.length; i++) {
180
+ context = context[namespaces[i]];
181
+ }
182
+ return context[func].apply(context, args);
183
+ }
184
+
131
185
  function showDialog(options) {
132
186
  Events.documentReady(function () {
133
187
 
@@ -143,11 +197,17 @@ function BootstrapCookieConsent(props) {
143
197
  document.body.append(self.modal);
144
198
  self.$modal = $(self.modal);
145
199
 
146
- if (self.props.postSelectionCallback) {
147
- self.$modal.on("hidden.bs.modal", function () {
148
- self.props.postSelectionCallback();
149
- });
150
- }
200
+ // ---------------------------------------------------------------------
201
+ // register events for the dialog (modal)
202
+ // ---------------------------------------------------------------------
203
+
204
+ // ---------------------------------------------------------------------
205
+ // on 'hidden'
206
+ // ---------------------------------------------------------------------
207
+ self.$modal.on('hidden.bs.modal', function () {
208
+ // process settings after the user has made his selections
209
+ executeFunctionByName (self.props.postSelectionCallback, window);
210
+ }); // END modal on 'hidden'
151
211
 
152
212
  // load modal content
153
213
  //
@@ -253,12 +313,12 @@ function BootstrapCookieConsent(props) {
253
313
  }
254
314
 
255
315
  function agreeAll() {
256
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays, self.props.cookieSameSite, self.props.cookieSecure);
316
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays, self.props.cookieSameSite, cookieSecure);
257
317
  self.$modal.modal('hide');
258
318
  }
259
319
 
260
320
  function doNotAgree() {
261
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays, self.props.cookieSameSite, self.props.cookieSecure);
321
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays, self.props.cookieSameSite, cookieSecure);
262
322
 
263
323
  // jadams, 2021-07-15: all cookies NOT longer supported by j1.expireCookie
264
324
  // TODO: Create loop over all cookies found in page
@@ -271,7 +331,7 @@ function BootstrapCookieConsent(props) {
271
331
  }
272
332
 
273
333
  function saveSettings() {
274
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays, self.props.cookieSameSite, self.props.cookieSecure);
334
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays, self.props.cookieSameSite, cookieSecure);
275
335
  self.$modal.modal('hide');
276
336
  }
277
337
 
@@ -467,16 +467,17 @@ function Translator(props) {
467
467
 
468
468
  // ---------------------------------------------------------------------------
469
469
  // agreeAll()
470
- // process current settings from checkboxes for button `agreeAll`
470
+ // process current settings from checkboxes for button 'agreeAll'
471
+ // On 'agreeAll', enable ALL settings required for translation
471
472
  // ---------------------------------------------------------------------------
472
473
  function agreeAll() {
473
- var settings;
474
- var consentSettings = {};
474
+ var translationSettings = gatherOptions(true);
475
+ var consentSettings = {};
475
476
 
476
- settings = gatherOptions();
477
+ // enable and write all settings required for translation (consent cookie)
477
478
  consentSettings = JSON.parse(Cookie.get(self.props.cookieConsentName));
478
- consentSettings.analysis = settings.analysis;
479
- consentSettings.personalization = settings.personalization;
479
+ consentSettings.analysis = translationSettings.analysis;
480
+ consentSettings.personalization = translationSettings.personalization;
480
481
 
481
482
  Cookie.set(
482
483
  self.props.cookieConsentName,
@@ -485,9 +486,11 @@ function Translator(props) {
485
486
  self.props.sameSite,
486
487
  self.props.secure
487
488
  );
489
+
490
+ // enable and write all settings required for translation (translation cookie)
488
491
  Cookie.set(
489
492
  self.props.cookieName,
490
- JSON.stringify(gatherOptions(true)),
493
+ JSON.stringify(translationSettings),
491
494
  self.props.cookieStorageDays,
492
495
  self.props.sameSite,
493
496
  self.props.secure
@@ -12,4 +12,4 @@
12
12
  # See: https://github.com/jekyll-one/J1 Template/blob/master/LICENSE
13
13
  # -----------------------------------------------------------------------------
14
14
  */
15
- function Translator(d){var p=this;var u=log4javascript.getLogger("j1.core.translator");var l=new liteURL(window.location.href);var c=(l.protocol.includes("https"))?true:false;var q=false;var g;var s;this.props={contentURL:"/assets/data/translator",cookieName:"j1.user.state",cookieConsentName:"j1.user.consent",cookieStorageDays:365,cookieSameSite:"Strict",cookieSecure:c,translationEnabled:false,disableLanguageSelector:false,translatorName:"google",translationLanguages:"all",translationLanguage:"auto",translateAllPages:true,hideSuggestionBox:true,hidePoweredBy:true,hideTopFrame:true,dialogLanguage:"content",dialogLanguages:["en","de"],dialogContainerID:"translator-modal",xhrDataElement:"",postSelectionCallback:"",};for(var e in d){this.props[e]=d[e]}if(this.props.dialogLanguage.indexOf("-")!==-1){this.props.dialogLanguage=this.props.dialogLanguage.split("-")[0]}if(!this.props.dialogLanguages.includes(this.props.dialogLanguage)){this.props.dialogLanguage=this.props.dialogLanguages[0]}this.props.xhrDataElement=this.props.xhrDataElement+"-"+this.props.dialogLanguage;u.info("\ninitializing core module: started");u.info("\nstate: started");var f={set:function(x,z,C,y,A){var B=window.btoa(z);var v="";if(C){var w=new Date();w.setTime(w.getTime()+(C*24*60*60*1000));v="; expires="+w.toUTCString()}if(A){document.cookie=x+"="+(B||"")+v+"; Path=/; SameSite="+y+"; secure="+A+";"}else{document.cookie=x+"="+(B||"")+v+"; Path=/; SameSite="+y+";"}},get:function(w){var z=w+"=";var v=document.cookie.split(";");for(var x=0;x<v.length;x++){var B=v[x];while(B.charAt(0)===" "){B=B.substring(1,B.length)}if(B.indexOf(z)===0){var A=B.substring(z.length,B.length);var y=window.atob(A);return y}}return undefined}};var n={documentReady:function(v){if(document.readyState!=="loading"){v()}else{document.addEventListener("DOMContentLoaded",v)}}};function t(){var v={};var w=false;var x=0;var y=arguments.length;if(Object.prototype.toString.call(arguments[0])==="[object Boolean]"){w=arguments[0];x++}var A=function(B){for(var C in B){if(Object.prototype.hasOwnProperty.call(B,C)){if(w&&Object.prototype.toString.call(B[C])==="[object Object]"){v[C]=t(true,v[C],B[C])}else{v[C]=B[C]}}}};for(;x<y;x++){var z=arguments[x];A(z)}return v}function h(A,x){var v=Array.prototype.slice.call(arguments,2);var z=A.split(".");var y=z.pop();for(var w=0;w<z.length;w++){x=x[z[w]]}return x[y].apply(x,v)}function j(w){var v;var x=t({size:0,width:250,multiple:false,selectedIndex:1,enableAutoFilter:false,visibleRows:null,},w);v="#"+x.selector;$.ajax({url:x.url,dataType:"json",success:function(A){var z=[];if(p.props.translationLanguages.includes("all")){z=A[x.elm]}else{for(var y=0;y<A[x.elm].length;y++){if(p.props.translationLanguages.includes(A[x.elm][y].value)){z.push(A[x.elm][y])}}}if(x.visibleRows>z.length){x.visibleRows=z.length}MsDropdown.make(v,{byJson:{data:z,name:x.name,size:x.size,width:x.width,multiple:x.multiple,},enableAutoFilter:x.enableAutoFilter,visibleRows:x.visibleRows,})},error:function(y,A,z){u.error("\nfailed to retrieve JSON data from: "+x.url)}})}function m(){n.documentReady(function(){p.modal=document.getElementById(p.props.dialogContainerID);if(!p.modal){u.info("\nload consent modal");p.modal=document.createElement("div");p.modal.id=p.props.dialogContainerID;p.modal.setAttribute("class","modal fade");p.modal.setAttribute("tabindex","-1");p.modal.setAttribute("role","dialog");p.modal.setAttribute("aria-labelledby",p.props.dialogContainerID);document.body.append(p.modal);p.$modal=$(p.modal);p.$modal.on("show.bs.modal",function(){var w;var x;u.info("\nshow.bs.modal: entered");$.when(j({url:"/assets/data/iso-639-language-codes-flags.json",elm:"iso-639-languages",selector:"dropdownJSON",width:400,visibleRows:8,})).then(function(y){u.info("\ncreating msDropdown from JSON data: finished")})});p.$modal.on("shown.bs.modal",function(){var w=document.getElementById("dropdownJSON").msDropdown;if(!w.length){u.error("\nno msDropdown found in translation dialog");p.$modal.hide()}else{if(p.props.translationLanguage==="auto"){g=navigator.language||navigator.userLanguage;s=g.split("-")[0]}w.selectedIndex=$("#dropdownJSON option[value="+s+"]").index();if(p.props.disableLanguageSelector){w.disabled=true}$("#dropdownJSON").show();$("body").addClass("stop-scrolling")}});p.$modal.on("hidden.bs.modal",function(){$("body").removeClass("stop-scrolling");h(p.props.postSelectionCallback,window)});var v=p.props.contentURL+"/index.html";$.get(v).done(function(w){u.info("\nloading consent modal: successfully");p.modal.innerHTML=w;p.modal.innerHTML=$("#"+p.props.xhrDataElement).eq(0).html();$(p.modal).modal({backdrop:"static",keyboard:false});p.$buttonDoNotAgree=$("#translator-buttonDoNotAgree");p.$buttonAgree=$("#translator-buttonAgree");p.$buttonSave=$("#translator-buttonSave");p.$buttonAgreeAll=$("#translator-buttonAgreeAll");u.info("\nload/initialze options from cookie");k();i();$("#google-options").on("hide.bs.collapse",function(){q=false;k()}).on("show.bs.collapse",function(){q=true;k()});u.info("\ninitialze button event handler");p.$buttonDoNotAgree.click(function(){b()});p.$buttonAgree.click(function(){o()});p.$buttonSave.click(function(){$("#google-options").collapse("hide");r();i()});p.$buttonAgreeAll.click(function(){$("#google-options").collapse("hide");o()})}).fail(function(){u.error("\nloading translator dialog (modal): failed");u.warn("\nprobably no|wrong `contentURL` set")})}else{p.$modal.modal("show")}}.bind(this))}function i(){var x=p.getSettings();if(x){for(var w in x){var v=p.$modal.find("#google-options .translator-option[data-name="+w+'] input[type="checkbox"]');v.prop("checked",x[w])}}}function k(){if(q){p.$buttonDoNotAgree.hide();p.$buttonAgree.hide();p.$buttonSave.show();p.$buttonAgreeAll.show()}else{p.$buttonDoNotAgree.show();p.$buttonAgree.show();p.$buttonSave.hide();p.$buttonAgreeAll.hide()}}function a(w){var v=p.$modal.find("#google-options .translator-option");var y={};for(var z=0;z<v.length;z++){var B=v[z];var x=B.getAttribute("data-name");if(x==="necessary"){y[x]=true}else{if(w===undefined){var A=$(B).find('input[type="checkbox"]');y[x]=A.prop("checked")}else{y[x]=!!w}}}return y}function o(){var w;var v={};w=a();v=JSON.parse(f.get(p.props.cookieConsentName));v.analysis=w.analysis;v.personalization=w.personalization;f.set(p.props.cookieConsentName,JSON.stringify(v),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);f.set(p.props.cookieName,JSON.stringify(a(true)),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);p.$modal.modal("hide")}function b(){var v=a();v.translationEnabled=false;f.set(p.props.cookieName,JSON.stringify(v),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);p.$modal.modal("hide")}function r(){var w;var v={};w=a();v=JSON.parse(f.get(p.props.cookieConsentName));v.analysis=w.analysis;v.personalization=w.personalization;f.set(p.props.cookieConsentName,JSON.stringify(v),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);f.set(p.props.cookieName,JSON.stringify(a()),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);p.$modal.modal("hide")}this.showDialog=function(){m()};this.getSettings=function(w){var v=f.get(p.props.cookieName);if(v){var x=JSON.parse(f.get(p.props.cookieName));if(w===undefined){return x}else{if(x){return x[w]}else{return false}}}else{return undefined}};u.info("\ninitializing core module finished");u.info("\nstate: finished")};
15
+ function Translator(d){var p=this;var u=log4javascript.getLogger("j1.core.translator");var l=new liteURL(window.location.href);var c=(l.protocol.includes("https"))?true:false;var q=false;var g;var s;this.props={contentURL:"/assets/data/translator",cookieName:"j1.user.state",cookieConsentName:"j1.user.consent",cookieStorageDays:365,cookieSameSite:"Strict",cookieSecure:c,translationEnabled:false,disableLanguageSelector:false,translatorName:"google",translationLanguages:"all",translationLanguage:"auto",translateAllPages:true,hideSuggestionBox:true,hidePoweredBy:true,hideTopFrame:true,dialogLanguage:"content",dialogLanguages:["en","de"],dialogContainerID:"translator-modal",xhrDataElement:"",postSelectionCallback:"",};for(var e in d){this.props[e]=d[e]}if(this.props.dialogLanguage.indexOf("-")!==-1){this.props.dialogLanguage=this.props.dialogLanguage.split("-")[0]}if(!this.props.dialogLanguages.includes(this.props.dialogLanguage)){this.props.dialogLanguage=this.props.dialogLanguages[0]}this.props.xhrDataElement=this.props.xhrDataElement+"-"+this.props.dialogLanguage;u.info("\ninitializing core module: started");u.info("\nstate: started");var f={set:function(x,z,C,y,A){var B=window.btoa(z);var v="";if(C){var w=new Date();w.setTime(w.getTime()+(C*24*60*60*1000));v="; expires="+w.toUTCString()}if(A){document.cookie=x+"="+(B||"")+v+"; Path=/; SameSite="+y+"; secure="+A+";"}else{document.cookie=x+"="+(B||"")+v+"; Path=/; SameSite="+y+";"}},get:function(w){var z=w+"=";var v=document.cookie.split(";");for(var x=0;x<v.length;x++){var B=v[x];while(B.charAt(0)===" "){B=B.substring(1,B.length)}if(B.indexOf(z)===0){var A=B.substring(z.length,B.length);var y=window.atob(A);return y}}return undefined}};var n={documentReady:function(v){if(document.readyState!=="loading"){v()}else{document.addEventListener("DOMContentLoaded",v)}}};function t(){var v={};var w=false;var x=0;var y=arguments.length;if(Object.prototype.toString.call(arguments[0])==="[object Boolean]"){w=arguments[0];x++}var A=function(B){for(var C in B){if(Object.prototype.hasOwnProperty.call(B,C)){if(w&&Object.prototype.toString.call(B[C])==="[object Object]"){v[C]=t(true,v[C],B[C])}else{v[C]=B[C]}}}};for(;x<y;x++){var z=arguments[x];A(z)}return v}function h(A,x){var v=Array.prototype.slice.call(arguments,2);var z=A.split(".");var y=z.pop();for(var w=0;w<z.length;w++){x=x[z[w]]}return x[y].apply(x,v)}function j(w){var v;var x=t({size:0,width:250,multiple:false,selectedIndex:1,enableAutoFilter:false,visibleRows:null,},w);v="#"+x.selector;$.ajax({url:x.url,dataType:"json",success:function(A){var z=[];if(p.props.translationLanguages.includes("all")){z=A[x.elm]}else{for(var y=0;y<A[x.elm].length;y++){if(p.props.translationLanguages.includes(A[x.elm][y].value)){z.push(A[x.elm][y])}}}if(x.visibleRows>z.length){x.visibleRows=z.length}MsDropdown.make(v,{byJson:{data:z,name:x.name,size:x.size,width:x.width,multiple:x.multiple,},enableAutoFilter:x.enableAutoFilter,visibleRows:x.visibleRows,})},error:function(y,A,z){u.error("\nfailed to retrieve JSON data from: "+x.url)}})}function m(){n.documentReady(function(){p.modal=document.getElementById(p.props.dialogContainerID);if(!p.modal){u.info("\nload consent modal");p.modal=document.createElement("div");p.modal.id=p.props.dialogContainerID;p.modal.setAttribute("class","modal fade");p.modal.setAttribute("tabindex","-1");p.modal.setAttribute("role","dialog");p.modal.setAttribute("aria-labelledby",p.props.dialogContainerID);document.body.append(p.modal);p.$modal=$(p.modal);p.$modal.on("show.bs.modal",function(){var w;var x;u.info("\nshow.bs.modal: entered");$.when(j({url:"/assets/data/iso-639-language-codes-flags.json",elm:"iso-639-languages",selector:"dropdownJSON",width:400,visibleRows:8,})).then(function(y){u.info("\ncreating msDropdown from JSON data: finished")})});p.$modal.on("shown.bs.modal",function(){var w=document.getElementById("dropdownJSON").msDropdown;if(!w.length){u.error("\nno msDropdown found in translation dialog");p.$modal.hide()}else{if(p.props.translationLanguage==="auto"){g=navigator.language||navigator.userLanguage;s=g.split("-")[0]}w.selectedIndex=$("#dropdownJSON option[value="+s+"]").index();if(p.props.disableLanguageSelector){w.disabled=true}$("#dropdownJSON").show();$("body").addClass("stop-scrolling")}});p.$modal.on("hidden.bs.modal",function(){$("body").removeClass("stop-scrolling");h(p.props.postSelectionCallback,window)});var v=p.props.contentURL+"/index.html";$.get(v).done(function(w){u.info("\nloading consent modal: successfully");p.modal.innerHTML=w;p.modal.innerHTML=$("#"+p.props.xhrDataElement).eq(0).html();$(p.modal).modal({backdrop:"static",keyboard:false});p.$buttonDoNotAgree=$("#translator-buttonDoNotAgree");p.$buttonAgree=$("#translator-buttonAgree");p.$buttonSave=$("#translator-buttonSave");p.$buttonAgreeAll=$("#translator-buttonAgreeAll");u.info("\nload/initialze options from cookie");k();i();$("#google-options").on("hide.bs.collapse",function(){q=false;k()}).on("show.bs.collapse",function(){q=true;k()});u.info("\ninitialze button event handler");p.$buttonDoNotAgree.click(function(){b()});p.$buttonAgree.click(function(){o()});p.$buttonSave.click(function(){$("#google-options").collapse("hide");r();i()});p.$buttonAgreeAll.click(function(){$("#google-options").collapse("hide");o()})}).fail(function(){u.error("\nloading translator dialog (modal): failed");u.warn("\nprobably no|wrong `contentURL` set")})}else{p.$modal.modal("show")}}.bind(this))}function i(){var x=p.getSettings();if(x){for(var w in x){var v=p.$modal.find("#google-options .translator-option[data-name="+w+'] input[type="checkbox"]');v.prop("checked",x[w])}}}function k(){if(q){p.$buttonDoNotAgree.hide();p.$buttonAgree.hide();p.$buttonSave.show();p.$buttonAgreeAll.show()}else{p.$buttonDoNotAgree.show();p.$buttonAgree.show();p.$buttonSave.hide();p.$buttonAgreeAll.hide()}}function a(w){var v=p.$modal.find("#google-options .translator-option");var y={};for(var z=0;z<v.length;z++){var B=v[z];var x=B.getAttribute("data-name");if(x==="necessary"){y[x]=true}else{if(w===undefined){var A=$(B).find('input[type="checkbox"]');y[x]=A.prop("checked")}else{y[x]=!!w}}}return y}function o(){var w=a(true);var v={};v=JSON.parse(f.get(p.props.cookieConsentName));v.analysis=w.analysis;v.personalization=w.personalization;f.set(p.props.cookieConsentName,JSON.stringify(v),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);f.set(p.props.cookieName,JSON.stringify(w),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);p.$modal.modal("hide")}function b(){var v=a();v.translationEnabled=false;f.set(p.props.cookieName,JSON.stringify(v),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);p.$modal.modal("hide")}function r(){var w;var v={};w=a();v=JSON.parse(f.get(p.props.cookieConsentName));v.analysis=w.analysis;v.personalization=w.personalization;f.set(p.props.cookieConsentName,JSON.stringify(v),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);f.set(p.props.cookieName,JSON.stringify(a()),p.props.cookieStorageDays,p.props.sameSite,p.props.secure);p.$modal.modal("hide")}this.showDialog=function(){m()};this.getSettings=function(w){var v=f.get(p.props.cookieName);if(v){var x=JSON.parse(f.get(p.props.cookieName));if(w===undefined){return x}else{if(x){return x[w]}else{return false}}}else{return undefined}};u.info("\ninitializing core module finished");u.info("\nstate: finished")};
data/lib/j1/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module J1
2
- VERSION = '2021.2.6'
2
+ VERSION = '2021.2.10'
3
3
  end
@@ -53,7 +53,7 @@ gem 'jekyll', '~> 4.2'
53
53
 
54
54
  # Theme Rubies, default: J1 Template (NOT used for the development system)
55
55
  #
56
- gem 'j1-template', '~> 2021.2.6'
56
+ gem 'j1-template', '~> 2021.2.10'
57
57
 
58
58
  # ------------------------------------------------------------------------------
59
59
  # PRODUCTION: Gem needed for the Jekyll and J1 prod environment
@@ -53,7 +53,7 @@ environment: development
53
53
  # ------------------------------------------------------------------------------
54
54
  # Sets the build version of J1 Template Gem
55
55
  #
56
- version: 2021.2.6
56
+ version: 2021.2.10
57
57
 
58
58
  # version
59
59
  # ------------------------------------------------------------------------------
@@ -27,7 +27,6 @@ settings:
27
27
 
28
28
  enabled: true
29
29
  show_cookie_icon: true
30
- reloadPageOnChange: true
31
30
 
32
31
  # ------------------------------------------------------------------------------
33
32
  # END config
@@ -25,6 +25,8 @@ about_config:
25
25
  defaults:
26
26
 
27
27
  enabled: false
28
+
29
+ reloadPageOnChange: true
28
30
  autoShowDialog: true # show consent dialog if NO consent cookie found
29
31
  dialogLanguage: content # auto|content|one of dialogLanguages
30
32
  dialogLanguages: [en, de] # supported dialog (modal) languages, defaults to FIRST language defined by languages
@@ -36,7 +38,7 @@ defaults:
36
38
  whitelisted: [ '/pages/public/legal/en/privacy' ] # pages NO consent issued, currently NOT supported
37
39
  xhrDataElement: consent-data # container for all language-specific consent modals (taken from contentURL)
38
40
  dialogContainerID: consent-dialog # container, the dialog modal is (dynamically) loaded
39
- postSelectionCallback: j1.adapter.cookieConsent.cbCookie # currently hardcoded
41
+ postSelectionCallback: j1.adapter.cookieConsent.cbCookie # called after the user has made his selection
40
42
 
41
43
  modal_settings:
42
44
 
@@ -46,7 +46,7 @@ defaults:
46
46
  #
47
47
  google:
48
48
 
49
- postSelectionCallback: "j1.adapter.translator.cbGoogle" # callback to run the translation
49
+ postSelectionCallback: j1.adapter.translator.cbGoogle # callback to run the translation
50
50
  hideSuggestionBox: true # disable suggestions on translated text
51
51
  hidePoweredBy: true # disable label "Powered by Google"
52
52
  hideTopFrame: true # disable the (google) translator frame
@@ -433,7 +433,7 @@ end::tables[]
433
433
  // -----------------------------------------------------------------------------
434
434
  tag::products[]
435
435
  :j1--license: MIT License
436
- :j1--version: 2021.2.6
436
+ :j1--version: 2021.2.10
437
437
  :j1--site-name: Jekyll One
438
438
  end::products[]
439
439
 
@@ -364,6 +364,6 @@ end
364
364
 
365
365
  module Jekyll
366
366
  module J1LunrSearch
367
- VERSION = '2021.2.6'
367
+ VERSION = '2021.2.10'
368
368
  end
369
369
  end
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "j1_starter",
4
- "version": "2021.2.6",
4
+ "version": "2021.2.10",
5
5
  "description": "J1 Template Starter Web",
6
6
  "homepage": "https://your.site",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "utls",
4
- "version": "2021.2.6",
4
+ "version": "2021.2.10",
5
5
  "description": "J1 Template Utility Server",
6
6
  "homepage": "https://jekyll.one",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "utls",
4
- "version": "2021.2.6",
4
+ "version": "2021.2.10",
5
5
  "description": "J1 Template Utility Server",
6
6
  "homepage": "https://jekyll.one",
7
7
  "author": {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: j1-template
3
3
  version: !ruby/object:Gem::Version
4
- version: 2021.2.6
4
+ version: 2021.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - juergen_jekyll_one
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-30 00:00:00.000000000 Z
11
+ date: 2021-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -400,6 +400,7 @@ files:
400
400
  - assets/themes/j1/adapter/js/rtextResizer.js
401
401
  - assets/themes/j1/adapter/js/themer.js
402
402
  - assets/themes/j1/adapter/js/toccer.js
403
+ - assets/themes/j1/adapter/js/translator.1.js
403
404
  - assets/themes/j1/adapter/js/translator.js
404
405
  - assets/themes/j1/core/country-flags/1x1/ad.svg
405
406
  - assets/themes/j1/core/country-flags/1x1/ae.svg