besper-frontend-site-dev-main
Version:
Professional B-esper Frontend Site - Site-wide integration toolkit for full website bot deployment
485 lines (462 loc) • 16.6 kB
JavaScript
// Internationalization for chat widget - European languages and major languages
export const translations = {
// Input placeholder text
typeYourMessage: {
en: 'Type your message here...',
de: 'Geben Sie hier Ihre Nachricht ein...',
fr: 'Tapez votre message ici...',
es: 'Escribe tu mensaje aquí...',
it: 'Digita il tuo messaggio qui...',
pt: 'Digite sua mensagem aqui...',
nl: 'Typ hier uw bericht...',
pl: 'Wpisz tutaj swoją wiadomość...',
sv: 'Skriv ditt meddelande här...',
da: 'Skriv din besked her...',
fi: 'Kirjoita viestisi tähän...',
no: 'Skriv meldingen din her...',
cs: 'Zde napište svou zprávu...',
hu: 'Írja ide üzenetét...',
ro: 'Introduceți mesajul aici...',
sk: 'Sem napíšte svoju správu...',
hr: 'Ovdje unesite poruku...',
bg: 'Въведете съобщението си тук...',
sl: 'Tukaj vnesite svoje sporočilo...',
et: 'Sisestage oma sõnum siia...',
lv: 'Ievadiet savu ziņu šeit...',
lt: 'Čia įveskite savo žinutę...',
el: 'Πληκτρολογήστε το μήνυμά σας εδώ...',
ru: 'Введите ваше сообщение здесь...',
uk: 'Введіть ваше повідомлення тут...',
// Major Asian and world languages
ja: 'ここにメッセージを入力してください...',
zh: '在此输入您的消息...',
ko: '여기에 메시지를 입력하세요...',
ar: 'اكتب رسالتك هنا...',
hi: 'अपना संदेश यहाँ टाइप करें...',
id: 'Ketik pesan Anda di sini...',
tr: 'Mesajınızı buraya yazın...',
th: 'พิมพ์ข้อความของคุณที่นี่...',
vi: 'Nhập tin nhắn của bạn tại đây...',
he: 'הקלד את ההודעה שלך כאן...',
fa: 'پیام خود را اینجا تایپ کنید...',
ms: 'Taip mesej anda di sini...',
tl: 'I-type ang inyong mensahe dito...',
},
// Tooltip texts
tooltips: {
downloadConversation: {
en: 'Download Conversation',
de: 'Unterhaltung herunterladen',
fr: 'Télécharger la conversation',
es: 'Descargar conversación',
it: 'Scarica conversazione',
pt: 'Baixar conversa',
nl: 'Gesprek downloaden',
pl: 'Pobierz rozmowę',
sv: 'Ladda ner konversation',
da: 'Download samtale',
fi: 'Lataa keskustelu',
no: 'Last ned samtale',
cs: 'Stáhnout konverzaci',
hu: 'Beszélgetés letöltése',
ro: 'Descarcă conversația',
sk: 'Stiahnuť konverzáciu',
hr: 'Preuzmi razgovor',
bg: 'Изтегли разговор',
sl: 'Prenesi pogovor',
et: 'Laadi alla vestlus',
lv: 'Lejupielādēt sarunu',
lt: 'Atsisiųsti pokalbį',
el: 'Λήψη συνομιλίας',
ru: 'Скачать беседу',
uk: 'Завантажити розмову',
// Major Asian and world languages
ja: '会話をダウンロード',
zh: '下载对话',
ko: '대화 다운로드',
ar: 'تحميل المحادثة',
hi: 'बातचीत डाउनलोड करें',
id: 'Unduh Percakapan',
tr: 'Konuşmayı İndir',
th: 'ดาวน์โหลดการสนทนา',
vi: 'Tải cuộc trò chuyện',
he: 'הורד שיחה',
fa: 'دانلود مکالمه',
ms: 'Muat turun Perbualan',
tl: 'I-download ang Pag-uusap',
},
restartConversation: {
en: 'Restart Conversation',
de: 'Unterhaltung neu starten',
fr: 'Redémarrer la conversation',
es: 'Reiniciar conversación',
it: 'Riavvia conversazione',
pt: 'Reiniciar conversa',
nl: 'Gesprek herstarten',
pl: 'Uruchom ponownie rozmowę',
sv: 'Starta om konversation',
da: 'Genstart samtale',
fi: 'Aloita keskustelu uudelleen',
no: 'Start samtale på nytt',
cs: 'Restartovat konverzaci',
hu: 'Beszélgetés újraindítása',
ro: 'Repornește conversația',
sk: 'Reštartovať konverzáciu',
hr: 'Ponovno pokreni razgovor',
bg: 'Рестартирай разговор',
sl: 'Ponovno zaženi pogovor',
et: 'Taaskäivita vestlus',
lv: 'Atsākt sarunu',
lt: 'Paleisti pokalbį iš naujo',
el: 'Επανεκκίνηση συνομιλίας',
ru: 'Перезапустить беседу',
uk: 'Перезапустити розмову',
// Major Asian and world languages
ja: '会話を再開',
zh: '重新开始对话',
ko: '대화 재시작',
ar: 'إعادة تشغيل المحادثة',
hi: 'बातचीत पुनः आरंभ करें',
id: 'Mulai Ulang Percakapan',
tr: 'Konuşmayı Yeniden Başlat',
th: 'เริ่มการสนทนาใหม่',
vi: 'Khởi động lại cuộc trò chuyện',
he: 'הפעל מחדש שיחה',
fa: 'راه اندازی مجدد مکالمه',
ms: 'Mulakan semula Perbualan',
tl: 'Simulan muli ang Pag-uusap',
},
deleteConversation: {
en: 'Delete Conversation',
de: 'Unterhaltung löschen',
fr: 'Supprimer la conversation',
es: 'Eliminar conversación',
it: 'Elimina conversazione',
pt: 'Excluir conversa',
nl: 'Gesprek verwijderen',
pl: 'Usuń rozmowę',
sv: 'Radera konversation',
da: 'Slet samtale',
fi: 'Poista keskustelu',
no: 'Slett samtale',
cs: 'Smazat konverzaci',
hu: 'Beszélgetés törlése',
ro: 'Șterge conversația',
sk: 'Vymazať konverzáciu',
hr: 'Obriši razgovor',
bg: 'Изтрий разговор',
sl: 'Izbriši pogovor',
et: 'Kustuta vestlus',
lv: 'Dzēst sarunu',
lt: 'Ištrinti pokalbį',
el: 'Διαγραφή συνομιλίας',
ru: 'Удалить беседу',
uk: 'Видалити розмову',
// Major Asian and world languages
ja: '会話を削除',
zh: '删除对话',
ko: '대화 삭제',
ar: 'حذف المحادثة',
hi: 'बातचीत हटाएं',
id: 'Hapus Percakapan',
tr: 'Konuşmayı Sil',
th: 'ลบการสนทนา',
vi: 'Xóa cuộc trò chuyện',
he: 'מחק שיחה',
fa: 'حذف مکالمه',
ms: 'Padam Perbualan',
tl: 'Tanggalin ang Pag-uusap',
},
expandView: {
en: 'Optimize view for better readability',
de: 'Ansicht für bessere Lesbarkeit optimieren',
fr: 'Optimiser la vue pour une meilleure lisibilité',
es: 'Optimizar vista para mejor legibilidad',
it: 'Ottimizza vista per migliore leggibilità',
pt: 'Otimizar visualização para melhor legibilidade',
nl: 'Optimaliseer weergave voor betere leesbaarheid',
pl: 'Zoptymalizuj widok dla lepszej czytelności',
sv: 'Optimera vy för bättre läsbarhet',
da: 'Optimer visning for bedre læsbarhed',
fi: 'Optimoi näkymä parempaa luettavuutta varten',
no: 'Optimaliser visning for bedre lesbarhet',
cs: 'Optimalizovat zobrazení pro lepší čitelnost',
hu: 'Nézet optimalizálása a jobb olvashatóságért',
ro: 'Optimizează vizualizarea pentru o mai bună lizibilitate',
sk: 'Optimalizovať zobrazenie pre lepšiu čitateľnosť',
hr: 'Optimiziraj prikaz za bolju čitljivost',
bg: 'Оптимизирай изгледа за по-добра четимост',
sl: 'Optimiziraj pogled za boljšo berljivost',
et: 'Optimeeri vaade parema loetavuse jaoks',
lv: 'Optimizēt skatu labākai lasāmībai',
lt: 'Optimizuoti vaizdą geresniam skaitomumui',
el: 'Βελτιστοποίηση προβολής για καλύτερη αναγνωσιμότητα',
ru: 'Оптимизировать вид для лучшей читаемости',
uk: 'Оптимізувати вигляд для кращої читабельності',
// Major Asian and world languages
ja: '読みやすさのためにビューを最適化',
zh: '优化视图以提高可读性',
ko: '가독성을 위한 보기 최적화',
ar: 'تحسين العرض لقابلية قراءة أفضل',
hi: 'बेहतर पठनीयता के लिए दृश्य को अनुकूलित करें',
id: 'Optimalkan tampilan untuk keterbacaan yang lebih baik',
tr: 'Daha iyi okunabilirlik için görünümü optimize edin',
th: 'ปรับแต่งมุมมองเพื่อการอ่านที่ดีขึ้น',
vi: 'Tối ưu hóa chế độ xem để dễ đọc hơn',
he: 'אופטימיזציה של התצוגה לקריאה טובה יותר',
fa: 'بهینه سازی نمایش برای خوانایی بهتر',
ms: 'Optimalkan paparan untuk kebolehbacaan yang lebih baik',
tl: 'I-optimize ang view para sa mas magandang pagkakabasa',
},
minimizeChat: {
en: 'Minimize',
de: 'Minimieren',
fr: 'Réduire',
es: 'Minimizar',
it: 'Riduci',
pt: 'Minimizar',
nl: 'Minimaliseren',
pl: 'Minimalizuj',
sv: 'Minimera',
da: 'Minimer',
fi: 'Pienennä',
no: 'Minimer',
cs: 'Minimalizovat',
hu: 'Minimalizálás',
ro: 'Minimizează',
sk: 'Minimalizovať',
hr: 'Minimiziraj',
bg: 'Минимизирай',
sl: 'Minimiziraj',
et: 'Minimeeri',
lv: 'Minimizēt',
lt: 'Sumažinti',
el: 'Ελαχιστοποίηση',
ru: 'Свернуть',
uk: 'Згорнути',
// Major Asian and world languages
ja: '最小化',
zh: '最小化',
ko: '최소화',
ar: 'تصغير',
hi: 'न्यूनतम करें',
id: 'Kecilkan',
tr: 'Küçült',
th: 'ย่อขนาด',
vi: 'Thu nhỏ',
he: 'מזער',
fa: 'کمینه کردن',
ms: 'Kecilkan',
tl: 'Paliitin',
},
dataPolicy: {
en: 'Data Policy',
de: 'Datenschutzrichtlinie',
fr: 'Politique de données',
es: 'Política de datos',
it: 'Politica sui dati',
pt: 'Política de dados',
nl: 'Gegevensbeleid',
pl: 'Polityka danych',
sv: 'Datapolicy',
da: 'Datapolitik',
fi: 'Tietopolitiikka',
no: 'Datapolicy',
cs: 'Zásady dat',
hu: 'Adatkezelési irányelvek',
ro: 'Politica datelor',
sk: 'Zásady údajov',
hr: 'Politika podataka',
bg: 'Политика за данни',
sl: 'Politika podatkov',
et: 'Andmepoliitika',
lv: 'Datu politika',
lt: 'Duomenų politika',
el: 'Πολιτική δεδομένων',
ru: 'Политика данных',
uk: 'Політика даних',
// Major Asian and world languages
ja: 'データポリシー',
zh: '数据政策',
ko: '데이터 정책',
ar: 'سياسة البيانات',
hi: 'डेटा नीति',
id: 'Kebijakan Data',
tr: 'Veri Politikası',
th: 'นโยบายข้อมูล',
vi: 'Chính sách dữ liệu',
he: 'מדיניות נתונים',
fa: 'سیاست داده',
ms: 'Dasar Data',
tl: 'Patakaran sa Data',
},
},
// Status messages
statusMessages: {
connecting: {
en: 'Connecting...',
de: 'Verbindet...',
fr: 'Connexion...',
es: 'Conectando...',
it: 'Connessione...',
pt: 'Conectando...',
nl: 'Verbinden...',
pl: 'Łączenie...',
sv: 'Ansluter...',
da: 'Forbinder...',
fi: 'Yhdistetään...',
no: 'Kobler til...',
cs: 'Připojování...',
hu: 'Csatlakozás...',
ro: 'Se conectează...',
sk: 'Pripájanie...',
hr: 'Povezivanje...',
bg: 'Свързване...',
sl: 'Povezovanje...',
et: 'Ühendamine...',
lv: 'Savienojas...',
lt: 'Jungiamasi...',
el: 'Σύνδεση...',
ru: 'Подключение...',
uk: 'Підключення...',
// Major Asian and world languages
ja: '接続中...',
zh: '正在连接...',
ko: '연결 중...',
ar: 'جاري الاتصال...',
hi: 'कनेक्ट हो रहा है...',
id: 'Menghubungkan...',
tr: 'Bağlanıyor...',
th: 'กำลังเชื่อมต่อ...',
vi: 'Đang kết nối...',
he: 'מתחבר...',
fa: 'در حال اتصال...',
ms: 'Menyambung...',
tl: 'Kumukonekta...',
},
typing: {
en: 'Typing...',
de: 'Schreibt...',
fr: 'Saisie...',
es: 'Escribiendo...',
it: 'Scrivendo...',
pt: 'Digitando...',
nl: 'Typen...',
pl: 'Pisze...',
sv: 'Skriver...',
da: 'Skriver...',
fi: 'Kirjoittaa...',
no: 'Skriver...',
cs: 'Píše...',
hu: 'Gépel...',
ro: 'Scrie...',
sk: 'Píše...',
hr: 'Piše...',
bg: 'Пише...',
sl: 'Piše...',
et: 'Kirjutab...',
lv: 'Raksta...',
lt: 'Rašo...',
el: 'Πληκτρολογεί...',
ru: 'Печатает...',
uk: 'Друкує...',
// Major Asian and world languages
ja: '入力中...',
zh: '正在输入...',
ko: '입력 중...',
ar: 'يكتب...',
hi: 'टाइप कर रहा है...',
id: 'Mengetik...',
tr: 'Yazıyor...',
th: 'กำลังพิมพ์...',
vi: 'Đang gõ...',
he: 'מקליד...',
fa: 'در حال تایپ...',
ms: 'Menaip...',
tl: 'Nagta-type...',
},
},
};
/**
* Get browser language with enhanced fallback for mobile and PC compatibility
*/
export function getBrowserLanguage() {
let lang = 'en'; // Default fallback
try {
// Try multiple browser language detection methods for better mobile compatibility
if (typeof navigator !== 'undefined') {
// Primary: navigator.language (most reliable)
lang = navigator.language;
// Fallback 1: navigator.languages array (modern browsers)
if (!lang && navigator.languages && navigator.languages.length > 0) {
lang = navigator.languages[0];
}
// Fallback 2: navigator.userLanguage (IE/older browsers)
if (!lang && navigator.userLanguage) {
lang = navigator.userLanguage;
}
// Fallback 3: navigator.browserLanguage (IE/older browsers)
if (!lang && navigator.browserLanguage) {
lang = navigator.browserLanguage;
}
// Fallback 4: navigator.systemLanguage (IE/older browsers)
if (!lang && navigator.systemLanguage) {
lang = navigator.systemLanguage;
}
}
// Ensure we have a valid string
if (!lang || typeof lang !== 'string') {
lang = 'en';
}
// Extract main language code (e.g., 'en-US' becomes 'en')
lang = lang.split('-')[0].toLowerCase();
// Validate the language code (basic check for 2-3 character codes)
if (!/^[a-z]{2,3}$/.test(lang)) {
lang = 'en';
}
} catch (error) {
// If any error occurs, fallback to English
console.warn('Language detection failed:', error);
lang = 'en';
}
return lang;
}
/**
* Get localized text with fallback to English
*/
export function getLocalizedText(category, key, language = null) {
const lang = language || getBrowserLanguage();
if (translations[category] && translations[category][key]) {
return (
translations[category][key][lang] ||
translations[category][key]['en'] ||
key
);
}
return key;
}
/**
* Get all translations for a category in current language
*/
export function getLocalizedCategory(category, language = null) {
const lang = language || getBrowserLanguage();
if (!translations[category]) return {};
const result = {};
for (const key in translations[category]) {
result[key] =
translations[category][key][lang] ||
translations[category][key]['en'] ||
key;
}
return result;
}
/**
* Get direct translation for a top-level key
*/
export function getTranslation(key, language = null) {
const lang = language || getBrowserLanguage();
if (translations[key]) {
return translations[key][lang] || translations[key]['en'] || key;
}
return key;
}