wineater-bot 3.4.4 → 3.5.0
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.
- package/dist/wineater-chatbot.mjs +212 -167
- package/dist/wineater-chatbot.umd.js +68 -36
- package/package.json +1 -1
- package/src/js/i18n.js +25 -8
- package/src/js/widget-styles.js +34 -5
- package/src/js/widget.js +38 -8
package/package.json
CHANGED
package/src/js/i18n.js
CHANGED
|
@@ -194,7 +194,7 @@ class Translator {
|
|
|
194
194
|
|
|
195
195
|
/* -- Новые ключи bar -- */
|
|
196
196
|
barTitle: "Bar Dishes",
|
|
197
|
-
barSubtitle: "Select dishes below and click
|
|
197
|
+
barSubtitle: "Select dishes below and click 'Send'",
|
|
198
198
|
barSendButton: "Send",
|
|
199
199
|
barResetButton: "Reset",
|
|
200
200
|
barName: "Bar Name",
|
|
@@ -259,7 +259,7 @@ class Translator {
|
|
|
259
259
|
|
|
260
260
|
/* -- Novi ključevi za bar -- */
|
|
261
261
|
"barTitle": "Jela iz bara",
|
|
262
|
-
"barSubtitle": "Izaberite jela ispod i kliknite
|
|
262
|
+
"barSubtitle": "Izaberite jela ispod i kliknite 'Pošalji'",
|
|
263
263
|
"barSendButton": "Pošalji",
|
|
264
264
|
"barResetButton": "Resetuj",
|
|
265
265
|
"barName": "Naziv bara",
|
|
@@ -330,7 +330,7 @@ class Translator {
|
|
|
330
330
|
|
|
331
331
|
/* -- Новые ключи bar -- */
|
|
332
332
|
barTitle: "Bar-Auswahl",
|
|
333
|
-
barSubtitle: "Wählen Sie Ihre Gerichte und klicken Sie auf
|
|
333
|
+
barSubtitle: "Wählen Sie Ihre Gerichte und klicken Sie auf 'Senden'",
|
|
334
334
|
barSendButton: "Senden",
|
|
335
335
|
barResetButton: "Zurücksetzen",
|
|
336
336
|
barName: "Name der Bar",
|
|
@@ -426,7 +426,7 @@ class Translator {
|
|
|
426
426
|
winePairingIntro: "К этому вину подходят следующие блюда:",
|
|
427
427
|
askForDinner: "Что бы вы хотели на ужин?",
|
|
428
428
|
clearChatButton: "Очистить чат",
|
|
429
|
-
widgetTitle: "
|
|
429
|
+
widgetTitle: "НАЙДИТЬ ИДЕАЛЬНОЕ ВИНО",
|
|
430
430
|
widgetSubtitle: "Поделитесь вашими предпочтениями — блюдом, настроением, бюджетом или случаем — и наш AI-сомелье подберёт идеальное вино за секунды",
|
|
431
431
|
searchPlaceholder: "Введите ключевое слово или описание",
|
|
432
432
|
wineDetails: {
|
|
@@ -452,7 +452,7 @@ class Translator {
|
|
|
452
452
|
|
|
453
453
|
/* -- Новые ключи для бара -- */
|
|
454
454
|
barTitle: "Закуски к вину",
|
|
455
|
-
barSubtitle: "Выберите блюда ниже и нажмите
|
|
455
|
+
barSubtitle: "Выберите блюда ниже и нажмите 'Отправить'",
|
|
456
456
|
barSendButton: "Отправить",
|
|
457
457
|
barResetButton: "Сбросить",
|
|
458
458
|
barName: "Название бара",
|
|
@@ -476,10 +476,23 @@ class Translator {
|
|
|
476
476
|
async fetchConfig(storeName) {
|
|
477
477
|
try {
|
|
478
478
|
const config = await this.api.getStoreConfig(storeName);
|
|
479
|
-
|
|
480
|
-
|
|
479
|
+
|
|
480
|
+
// ✅ Если язык уже сохранён в localStorage — использовать его
|
|
481
|
+
const storedLang = localStorage.getItem('selectedLanguage');
|
|
482
|
+
if (storedLang && this.translations[storedLang]) {
|
|
483
|
+
this.language = storedLang;
|
|
484
|
+
} else if (config.lang && this.translations[config.lang]) {
|
|
485
|
+
// иначе использовать с бэкенда
|
|
486
|
+
this.language = config.lang;
|
|
487
|
+
localStorage.setItem('selectedLanguage', config.lang);
|
|
488
|
+
} else {
|
|
489
|
+
this.language = 'en';
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
this.currency = config.currency || 'USD';
|
|
493
|
+
|
|
481
494
|
} catch (e) {
|
|
482
|
-
this.language = 'en';
|
|
495
|
+
this.language = localStorage.getItem('selectedLanguage') || 'en';
|
|
483
496
|
this.currency = 'USD';
|
|
484
497
|
}
|
|
485
498
|
}
|
|
@@ -513,6 +526,10 @@ class Translator {
|
|
|
513
526
|
|
|
514
527
|
return value;
|
|
515
528
|
}
|
|
529
|
+
|
|
530
|
+
getSupportedLanguages() {
|
|
531
|
+
return Object.keys(this.translations);
|
|
532
|
+
}
|
|
516
533
|
}
|
|
517
534
|
|
|
518
535
|
export default new Translator();
|
package/src/js/widget-styles.js
CHANGED
|
@@ -620,14 +620,44 @@ visibility: visible;
|
|
|
620
620
|
|
|
621
621
|
/* ===================== 13) Блок Powered by ===================== */
|
|
622
622
|
#powered-by-widget {
|
|
623
|
-
|
|
623
|
+
position: relative;
|
|
624
|
+
border-top: 2px solid #f6f7fd;
|
|
624
625
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
625
626
|
font-weight: 200;
|
|
626
|
-
display: flex;
|
|
627
|
-
align-items: center;
|
|
628
|
-
justify-content: center;
|
|
629
627
|
padding: 12px 24px;
|
|
628
|
+
min-height: 40px;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
#powered-by-widget .powered-by-center {
|
|
632
|
+
position: absolute;
|
|
633
|
+
left: 50%;
|
|
634
|
+
transform: translateX(-50%);
|
|
635
|
+
text-align: center;
|
|
630
636
|
}
|
|
637
|
+
|
|
638
|
+
#powered-by-widget .powered-by-lang {
|
|
639
|
+
position: absolute;
|
|
640
|
+
right: 0px;
|
|
641
|
+
top: 50%;
|
|
642
|
+
transform: translateY(-50%);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
.language-dropdown {
|
|
646
|
+
padding: 4px;
|
|
647
|
+
border-radius: 6px;
|
|
648
|
+
border: 2px solid var(--wineater-color);
|
|
649
|
+
background-color: white;
|
|
650
|
+
color: var(--wineater-color);
|
|
651
|
+
font-weight: 500;
|
|
652
|
+
font-family: 'Bricolage Grotesque', sans-serif;
|
|
653
|
+
font-size: 12px;
|
|
654
|
+
cursor: pointer;
|
|
655
|
+
transition: all 0.2sease;
|
|
656
|
+
}
|
|
657
|
+
.language-dropdown:hover {
|
|
658
|
+
box-shadow: 0 4px 8px rgba(123, 43, 235, 0.2);
|
|
659
|
+
}
|
|
660
|
+
|
|
631
661
|
#powered-by-widget a {
|
|
632
662
|
text-decoration: none;
|
|
633
663
|
display: flex;
|
|
@@ -808,7 +838,6 @@ margin: 5px 0;
|
|
|
808
838
|
border: none;
|
|
809
839
|
}
|
|
810
840
|
|
|
811
|
-
|
|
812
841
|
/* Пример более узких экранов (i.e. <480px) можно добавить при необходимости */
|
|
813
842
|
`;
|
|
814
843
|
const fontLink = document.createElement('link');
|
package/src/js/widget.js
CHANGED
|
@@ -26,7 +26,7 @@ export class WineWidget {
|
|
|
26
26
|
this.initializeSearchAnimation();
|
|
27
27
|
this.sendEvent('widgetInitialized', { widgetType: this.widgetType });
|
|
28
28
|
this.loadInstantRecommendations();
|
|
29
|
-
|
|
29
|
+
this.createLanguageSwitcher();
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
sendEvent(eventType, data) {
|
|
@@ -84,12 +84,15 @@ export class WineWidget {
|
|
|
84
84
|
<div id="wine-placeholder"></div>
|
|
85
85
|
</div>
|
|
86
86
|
<div id="powered-by-widget">
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
<div class="powered-by-center">
|
|
88
|
+
<a href="https://wineater.com" target="_blank">
|
|
89
|
+
<span>${translator.translate('poweredBy')}</span>
|
|
90
|
+
<img src="${this.countryCode === 'ru' ? 'https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media/divino_logo.svg?x=5' : 'https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media/logo_medium_gray.svg'}" alt="Wineater Logo">
|
|
91
|
+
<span>${translator.translate('AI sommelier')}</span>
|
|
92
|
+
</a>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="powered-by-lang"></div>
|
|
95
|
+
</div>
|
|
93
96
|
</div>
|
|
94
97
|
</div>
|
|
95
98
|
`;
|
|
@@ -444,4 +447,31 @@ export class WineWidget {
|
|
|
444
447
|
typeEffect();
|
|
445
448
|
});
|
|
446
449
|
}
|
|
447
|
-
|
|
450
|
+
|
|
451
|
+
createLanguageSwitcher() {
|
|
452
|
+
const langContainer = document.querySelector('#powered-by-widget .powered-by-lang');
|
|
453
|
+
const languages = translator.getSupportedLanguages();
|
|
454
|
+
const currentLanguage = translator.language;
|
|
455
|
+
|
|
456
|
+
const dropdown = document.createElement('select');
|
|
457
|
+
dropdown.id = 'language-dropdown';
|
|
458
|
+
dropdown.className = 'language-dropdown';
|
|
459
|
+
|
|
460
|
+
languages.forEach(lang => {
|
|
461
|
+
const option = document.createElement('option');
|
|
462
|
+
option.value = lang;
|
|
463
|
+
option.textContent = lang.toUpperCase();
|
|
464
|
+
option.selected = lang === currentLanguage;
|
|
465
|
+
dropdown.appendChild(option);
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
dropdown.onchange = (event) => {
|
|
469
|
+
const selectedLang = event.target.value;
|
|
470
|
+
translator.language = selectedLang;
|
|
471
|
+
localStorage.setItem('selectedLanguage', selectedLang);
|
|
472
|
+
location.reload(); // Reload to apply language change
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
langContainer.appendChild(dropdown);
|
|
476
|
+
}
|
|
477
|
+
}
|