Add full language UI translations and modal wrapping

This commit is contained in:
2026-02-08 19:00:25 +01:00
parent 27515639aa
commit 62ad664ec0
3 changed files with 695 additions and 21 deletions

View File

@@ -1,10 +1,12 @@
import { ref, computed } from 'vue';
const supportedLocales = ['pl', 'en', 'zh', 'hi', 'es', 'fr', 'ar', 'bn', 'ru', 'pt', 'ur'];
const detectLocale = () => {
if (typeof navigator === 'undefined') return 'en';
const browserLocale = (navigator.languages && navigator.languages[0]) || navigator.language || 'en';
const short = browserLocale.toLowerCase().split('-')[0];
return short === 'pl' ? 'pl' : 'en';
return supportedLocales.includes(short) ? short : 'en';
};
const messages = {
@@ -49,6 +51,18 @@ const messages = {
'pwa.installTitle': 'Zainstaluj aplikację i graj offline',
'pwa.installMobile': 'Dodaj do ekranu głównego',
'pwa.installDesktop': 'Zainstaluj na komputerze',
'language.label': 'Wybór języka',
'language.pl': 'Polski',
'language.en': 'Angielski',
'language.zh': 'Mandaryński',
'language.hi': 'Hindi',
'language.es': 'Hiszpański',
'language.fr': 'Francuski',
'language.ar': 'Arabski',
'language.bn': 'Bengalski',
'language.ru': 'Rosyjski',
'language.pt': 'Portugalski',
'language.ur': 'Urdu',
'theme.label': 'Motyw',
'theme.system': 'System',
'theme.light': 'Jasny',
@@ -95,10 +109,544 @@ const messages = {
'pwa.installTitle': 'Install the app and play offline',
'pwa.installMobile': 'Add to home screen',
'pwa.installDesktop': 'Install on desktop',
'language.label': 'Language selection',
'language.pl': 'Polish',
'language.en': 'English',
'language.zh': 'Mandarin',
'language.hi': 'Hindi',
'language.es': 'Spanish',
'language.fr': 'French',
'language.ar': 'Arabic',
'language.bn': 'Bengali',
'language.ru': 'Russian',
'language.pt': 'Portuguese',
'language.ur': 'Urdu',
'theme.label': 'Theme',
'theme.system': 'System',
'theme.light': 'Light',
'theme.dark': 'Dark'
},
zh: {
'app.title': 'Nonograms',
'level.easy': '简单 5X5',
'level.medium': '中等 10X10',
'level.hard': '困难 15X15',
'level.custom': '自定义',
'level.guide': '指南 ❓',
'actions.reset': '重置',
'actions.random': '新随机',
'actions.undo': '撤销',
'status.time': '时间',
'status.moves': '步数',
'status.progress': '进度',
'fixed.time': '时间:',
'fixed.progress': '进度:',
'fixed.hide': '隐藏',
'fixed.show': '显示',
'guide.play': '开始',
'guide.pause': '暂停',
'guide.step': '步骤',
'guide.speed': '速度',
'guide.waiting': '等待...',
'guide.solved': '已解!',
'custom.title': '自定义游戏',
'custom.prompt': '输入网格大小 (5 - 80):',
'custom.cancel': '取消',
'custom.start': '开始',
'custom.sizeError': '尺寸必须在 5 到 80 之间!',
'win.title': '恭喜!',
'win.message': '你解开了谜题!',
'win.time': '时间:',
'win.playAgain': '再玩一次',
'win.shareTitle': '分享你的结果',
'win.shareText': '我在 {time} 内解开了 {size}x{size} 的数织!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': '下载截图',
'pwa.installTitle': '安装应用并离线游玩',
'pwa.installMobile': '添加到主屏幕',
'pwa.installDesktop': '安装到桌面',
'language.label': '语言选择',
'language.pl': '波兰语',
'language.en': '英语',
'language.zh': '中文',
'language.hi': '印地语',
'language.es': '西班牙语',
'language.fr': '法语',
'language.ar': '阿拉伯语',
'language.bn': '孟加拉语',
'language.ru': '俄语',
'language.pt': '葡萄牙语',
'language.ur': '乌尔都语',
'theme.label': '主题',
'theme.system': '系统',
'theme.light': '浅色',
'theme.dark': '深色'
},
hi: {
'app.title': 'Nonograms',
'level.easy': 'आसान 5X5',
'level.medium': 'मध्यम 10X10',
'level.hard': 'कठिन 15X15',
'level.custom': 'कस्टम',
'level.guide': 'गाइड ❓',
'actions.reset': 'रीसेट',
'actions.random': 'नई रैंडम',
'actions.undo': 'वापस',
'status.time': 'समय',
'status.moves': 'चालें',
'status.progress': 'प्रगति',
'fixed.time': 'समय:',
'fixed.progress': 'प्रगति:',
'fixed.hide': 'छिपाएं',
'fixed.show': 'दिखाएं',
'guide.play': 'शुरू',
'guide.pause': 'रोकें',
'guide.step': 'कदम',
'guide.speed': 'गति',
'guide.waiting': 'प्रतीक्षा...',
'guide.solved': 'हल हो गया!',
'custom.title': 'कस्टम गेम',
'custom.prompt': 'ग्रिड आकार दर्ज करें (5 - 80):',
'custom.cancel': 'रद्द करें',
'custom.start': 'शुरू',
'custom.sizeError': 'आकार 5 और 80 के बीच होना चाहिए!',
'win.title': 'बधाई!',
'win.message': 'आपने पहेली हल कर ली!',
'win.time': 'समय:',
'win.playAgain': 'फिर से खेलें',
'win.shareTitle': 'अपना परिणाम साझा करें',
'win.shareText': 'मैंने {time} में {size}x{size} नॉनोग्राम हल किया!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'स्क्रीनशॉट डाउनलोड करें',
'pwa.installTitle': 'ऐप इंस्टॉल करें और ऑफलाइन खेलें',
'pwa.installMobile': 'होम स्क्रीन पर जोड़ें',
'pwa.installDesktop': 'डेस्कटॉप पर इंस्टॉल करें',
'language.label': 'भाषा चयन',
'language.pl': 'पोलिश',
'language.en': 'अंग्रेज़ी',
'language.zh': 'चीनी',
'language.hi': 'हिंदी',
'language.es': 'स्पेनिश',
'language.fr': 'फ़्रेंच',
'language.ar': 'अरबी',
'language.bn': 'बंगाली',
'language.ru': 'रूसी',
'language.pt': 'पुर्तगाली',
'language.ur': 'उर्दू',
'theme.label': 'थीम',
'theme.system': 'सिस्टम',
'theme.light': 'हल्का',
'theme.dark': 'गहरा'
},
es: {
'app.title': 'Nonograms',
'level.easy': 'FÁCIL 5X5',
'level.medium': 'MEDIO 10X10',
'level.hard': 'DIFÍCIL 15X15',
'level.custom': 'PERSONALIZADO',
'level.guide': 'GUÍA ❓',
'actions.reset': 'REINICIAR',
'actions.random': 'NUEVO ALEATORIO',
'actions.undo': 'DESHACER',
'status.time': 'TIEMPO',
'status.moves': 'MOVIMIENTOS',
'status.progress': 'PROGRESO',
'fixed.time': 'Tiempo:',
'fixed.progress': 'Progreso:',
'fixed.hide': 'Ocultar',
'fixed.show': 'Mostrar',
'guide.play': 'INICIAR',
'guide.pause': 'PAUSA',
'guide.step': 'PASO',
'guide.speed': 'VELOCIDAD',
'guide.waiting': 'Esperando...',
'guide.solved': '¡Resuelto!',
'custom.title': 'JUEGO PERSONALIZADO',
'custom.prompt': 'Introduce el tamaño de la cuadrícula (5 - 80):',
'custom.cancel': 'Cancelar',
'custom.start': 'Empezar',
'custom.sizeError': '¡El tamaño debe estar entre 5 y 80!',
'win.title': '¡FELICIDADES!',
'win.message': '¡Has resuelto el rompecabezas!',
'win.time': 'Tiempo:',
'win.playAgain': 'Jugar de nuevo',
'win.shareTitle': 'Comparte tu resultado',
'win.shareText': '¡Resolví un nonograma de {size}x{size} en {time}!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'Descargar captura',
'pwa.installTitle': 'Instala la app y juega sin conexión',
'pwa.installMobile': 'Agregar a la pantalla de inicio',
'pwa.installDesktop': 'Instalar en el escritorio',
'language.label': 'Selección de idioma',
'language.pl': 'Polaco',
'language.en': 'Inglés',
'language.zh': 'Chino',
'language.hi': 'Hindi',
'language.es': 'Español',
'language.fr': 'Francés',
'language.ar': 'Árabe',
'language.bn': 'Bengalí',
'language.ru': 'Ruso',
'language.pt': 'Portugués',
'language.ur': 'Urdu',
'theme.label': 'Tema',
'theme.system': 'Sistema',
'theme.light': 'Claro',
'theme.dark': 'Oscuro'
},
fr: {
'app.title': 'Nonograms',
'level.easy': 'FACILE 5X5',
'level.medium': 'MOYEN 10X10',
'level.hard': 'DIFFICILE 15X15',
'level.custom': 'PERSONNALISÉ',
'level.guide': 'GUIDE ❓',
'actions.reset': 'RÉINITIALISER',
'actions.random': 'NOUVEAU ALÉATOIRE',
'actions.undo': 'ANNULER',
'status.time': 'TEMPS',
'status.moves': 'COUPS',
'status.progress': 'PROGRÈS',
'fixed.time': 'Temps:',
'fixed.progress': 'Progrès:',
'fixed.hide': 'Masquer',
'fixed.show': 'Afficher',
'guide.play': 'LANCER',
'guide.pause': 'PAUSE',
'guide.step': 'ÉTAPE',
'guide.speed': 'VITESSE',
'guide.waiting': 'En attente...',
'guide.solved': 'Résolu !',
'custom.title': 'JEU PERSONNALISÉ',
'custom.prompt': 'Entrez la taille de la grille (5 - 80) :',
'custom.cancel': 'Annuler',
'custom.start': 'Démarrer',
'custom.sizeError': 'La taille doit être entre 5 et 80 !',
'win.title': 'FÉLICITATIONS !',
'win.message': 'Vous avez résolu le puzzle !',
'win.time': 'Temps:',
'win.playAgain': 'Rejouer',
'win.shareTitle': 'Partagez votre résultat',
'win.shareText': 'Jai résolu un nonogramme {size}x{size} en {time} !',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'Télécharger la capture',
'pwa.installTitle': 'Installez lapp et jouez hors ligne',
'pwa.installMobile': 'Ajouter à lécran daccueil',
'pwa.installDesktop': 'Installer sur le bureau',
'language.label': 'Choix de la langue',
'language.pl': 'Polonais',
'language.en': 'Anglais',
'language.zh': 'Chinois',
'language.hi': 'Hindi',
'language.es': 'Espagnol',
'language.fr': 'Français',
'language.ar': 'Arabe',
'language.bn': 'Bengali',
'language.ru': 'Russe',
'language.pt': 'Portugais',
'language.ur': 'Ourdou',
'theme.label': 'Thème',
'theme.system': 'Système',
'theme.light': 'Clair',
'theme.dark': 'Sombre'
},
ar: {
'app.title': 'Nonograms',
'level.easy': 'سهل 5X5',
'level.medium': 'متوسط 10X10',
'level.hard': 'صعب 15X15',
'level.custom': 'مخصص',
'level.guide': 'دليل ❓',
'actions.reset': 'إعادة ضبط',
'actions.random': 'عشوائي جديد',
'actions.undo': 'تراجع',
'status.time': 'الوقت',
'status.moves': 'الحركات',
'status.progress': 'التقدم',
'fixed.time': 'الوقت:',
'fixed.progress': 'التقدم:',
'fixed.hide': 'إخفاء',
'fixed.show': 'إظهار',
'guide.play': 'ابدأ',
'guide.pause': 'إيقاف مؤقت',
'guide.step': 'خطوة',
'guide.speed': 'السرعة',
'guide.waiting': 'جارٍ الانتظار...',
'guide.solved': 'تم الحل!',
'custom.title': 'لعبة مخصصة',
'custom.prompt': 'أدخل حجم الشبكة (5 - 80):',
'custom.cancel': 'إلغاء',
'custom.start': 'ابدأ',
'custom.sizeError': 'يجب أن يكون الحجم بين 5 و80!',
'win.title': 'تهانينا!',
'win.message': 'لقد حللت اللغز!',
'win.time': 'الوقت:',
'win.playAgain': 'العب مرة أخرى',
'win.shareTitle': 'شارك نتيجتك',
'win.shareText': 'حللت نونوغرام {size}x{size} في {time}!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'تحميل لقطة الشاشة',
'pwa.installTitle': 'ثبّت التطبيق والعب دون اتصال',
'pwa.installMobile': 'أضف إلى الشاشة الرئيسية',
'pwa.installDesktop': 'التثبيت على سطح المكتب',
'language.label': 'اختيار اللغة',
'language.pl': 'البولندية',
'language.en': 'الإنجليزية',
'language.zh': 'الصينية',
'language.hi': 'الهندية',
'language.es': 'الإسبانية',
'language.fr': 'الفرنسية',
'language.ar': 'العربية',
'language.bn': 'البنغالية',
'language.ru': 'الروسية',
'language.pt': 'البرتغالية',
'language.ur': 'الأردية',
'theme.label': 'السمة',
'theme.system': 'النظام',
'theme.light': 'فاتح',
'theme.dark': 'داكن'
},
bn: {
'app.title': 'Nonograms',
'level.easy': 'সহজ 5X5',
'level.medium': 'মাঝারি 10X10',
'level.hard': 'কঠিন 15X15',
'level.custom': 'কাস্টম',
'level.guide': 'গাইড ❓',
'actions.reset': 'রিসেট',
'actions.random': 'নতুন র‍্যান্ডম',
'actions.undo': 'পূর্বাবস্থায়',
'status.time': 'সময়',
'status.moves': 'চাল',
'status.progress': 'অগ্রগতি',
'fixed.time': 'সময়:',
'fixed.progress': 'অগ্রগতি:',
'fixed.hide': 'লুকান',
'fixed.show': 'দেখান',
'guide.play': 'শুরু',
'guide.pause': 'বিরতি',
'guide.step': 'ধাপ',
'guide.speed': 'গতি',
'guide.waiting': 'অপেক্ষা...',
'guide.solved': 'সমাধান হয়েছে!',
'custom.title': 'কাস্টম গেম',
'custom.prompt': 'গ্রিডের আকার দিন (5 - 80):',
'custom.cancel': 'বাতিল',
'custom.start': 'শুরু',
'custom.sizeError': 'আকার 5 থেকে 80 এর মধ্যে হতে হবে!',
'win.title': 'অভিনন্দন!',
'win.message': 'আপনি ধাঁধা সমাধান করেছেন!',
'win.time': 'সময়:',
'win.playAgain': 'আবার খেলুন',
'win.shareTitle': 'আপনার ফলাফল শেয়ার করুন',
'win.shareText': 'আমি {time} সময়ে {size}x{size} ননোগ্রাম সমাধান করেছি!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'স্ক্রিনশট ডাউনলোড করুন',
'pwa.installTitle': 'অ্যাপটি ইনস্টল করে অফলাইনে খেলুন',
'pwa.installMobile': 'হোম স্ক্রিনে যোগ করুন',
'pwa.installDesktop': 'ডেস্কটপে ইনস্টল করুন',
'language.label': 'ভাষা নির্বাচন',
'language.pl': 'পোলিশ',
'language.en': 'ইংরেজি',
'language.zh': 'চীনা',
'language.hi': 'হিন্দি',
'language.es': 'স্প্যানিশ',
'language.fr': 'ফরাসি',
'language.ar': 'আরবি',
'language.bn': 'বাংলা',
'language.ru': 'রুশ',
'language.pt': 'পর্তুগিজ',
'language.ur': 'উর্দু',
'theme.label': 'থিম',
'theme.system': 'সিস্টেম',
'theme.light': 'হালকা',
'theme.dark': 'গাঢ়'
},
ru: {
'app.title': 'Nonograms',
'level.easy': 'ЛЕГКО 5X5',
'level.medium': 'СРЕДНЕ 10X10',
'level.hard': 'ТЯЖЕЛО 15X15',
'level.custom': 'СВОЯ',
'level.guide': 'ПОДСКАЗКА ❓',
'actions.reset': 'СБРОС',
'actions.random': 'НОВАЯ СЛУЧАЙНАЯ',
'actions.undo': 'ОТМЕНА',
'status.time': 'ВРЕМЯ',
'status.moves': 'ХОДЫ',
'status.progress': 'ПРОГРЕСС',
'fixed.time': 'Время:',
'fixed.progress': 'Прогресс:',
'fixed.hide': 'Скрыть',
'fixed.show': 'Показать',
'guide.play': 'СТАРТ',
'guide.pause': 'ПАУЗА',
'guide.step': 'ШАГ',
'guide.speed': 'СКОРОСТЬ',
'guide.waiting': 'Ожидание...',
'guide.solved': 'Решено!',
'custom.title': 'СВОЯ ИГРА',
'custom.prompt': 'Введите размер сетки (5 - 80):',
'custom.cancel': 'Отмена',
'custom.start': 'Старт',
'custom.sizeError': 'Размер должен быть от 5 до 80!',
'win.title': 'ПОЗДРАВЛЯЕМ!',
'win.message': 'Вы решили головоломку!',
'win.time': 'Время:',
'win.playAgain': 'Сыграть снова',
'win.shareTitle': 'Поделитесь результатом',
'win.shareText': 'Я решил(а) нонограмму {size}x{size} за {time}!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'Скачать снимок',
'pwa.installTitle': 'Установите приложение и играйте офлайн',
'pwa.installMobile': 'Добавить на главный экран',
'pwa.installDesktop': 'Установить на компьютер',
'language.label': 'Выбор языка',
'language.pl': 'Польский',
'language.en': 'Английский',
'language.zh': 'Китайский',
'language.hi': 'Хинди',
'language.es': 'Испанский',
'language.fr': 'Французский',
'language.ar': 'Арабский',
'language.bn': 'Бенгальский',
'language.ru': 'Русский',
'language.pt': 'Португальский',
'language.ur': 'Урду',
'theme.label': 'Тема',
'theme.system': 'Система',
'theme.light': 'Светлая',
'theme.dark': 'Тёмная'
},
pt: {
'app.title': 'Nonograms',
'level.easy': 'FÁCIL 5X5',
'level.medium': 'MÉDIO 10X10',
'level.hard': 'DIFÍCIL 15X15',
'level.custom': 'PERSONALIZADO',
'level.guide': 'GUIA ❓',
'actions.reset': 'REINICIAR',
'actions.random': 'NOVO ALEATÓRIO',
'actions.undo': 'DESFAZER',
'status.time': 'TEMPO',
'status.moves': 'MOVIMENTOS',
'status.progress': 'PROGRESSO',
'fixed.time': 'Tempo:',
'fixed.progress': 'Progresso:',
'fixed.hide': 'Ocultar',
'fixed.show': 'Mostrar',
'guide.play': 'INICIAR',
'guide.pause': 'PAUSAR',
'guide.step': 'PASSO',
'guide.speed': 'VELOCIDADE',
'guide.waiting': 'Aguardando...',
'guide.solved': 'Resolvido!',
'custom.title': 'JOGO PERSONALIZADO',
'custom.prompt': 'Digite o tamanho da grade (5 - 80):',
'custom.cancel': 'Cancelar',
'custom.start': 'Iniciar',
'custom.sizeError': 'O tamanho deve estar entre 5 e 80!',
'win.title': 'PARABÉNS!',
'win.message': 'Você resolveu o puzzle!',
'win.time': 'Tempo:',
'win.playAgain': 'Jogar novamente',
'win.shareTitle': 'Compartilhe seu resultado',
'win.shareText': 'Resolvi um nonograma {size}x{size} em {time}!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'Baixar captura',
'pwa.installTitle': 'Instale o app e jogue offline',
'pwa.installMobile': 'Adicionar à tela inicial',
'pwa.installDesktop': 'Instalar no desktop',
'language.label': 'Seleção de idioma',
'language.pl': 'Polonês',
'language.en': 'Inglês',
'language.zh': 'Chinês',
'language.hi': 'Hindi',
'language.es': 'Espanhol',
'language.fr': 'Francês',
'language.ar': 'Árabe',
'language.bn': 'Bengali',
'language.ru': 'Russo',
'language.pt': 'Português',
'language.ur': 'Urdu',
'theme.label': 'Tema',
'theme.system': 'Sistema',
'theme.light': 'Claro',
'theme.dark': 'Escuro'
},
ur: {
'app.title': 'Nonograms',
'level.easy': 'آسان 5X5',
'level.medium': 'درمیانہ 10X10',
'level.hard': 'مشکل 15X15',
'level.custom': 'حسب ضرورت',
'level.guide': 'رہنمائی ❓',
'actions.reset': 'ری سیٹ',
'actions.random': 'نیا رینڈم',
'actions.undo': 'واپس',
'status.time': 'وقت',
'status.moves': 'چالیں',
'status.progress': 'پیش رفت',
'fixed.time': 'وقت:',
'fixed.progress': 'پیش رفت:',
'fixed.hide': 'چھپائیں',
'fixed.show': 'دکھائیں',
'guide.play': 'شروع',
'guide.pause': 'توقف',
'guide.step': 'قدم',
'guide.speed': 'رفتار',
'guide.waiting': 'انتظار...',
'guide.solved': 'حل ہوگیا!',
'custom.title': 'حسب ضرورت کھیل',
'custom.prompt': 'گرڈ کا سائز درج کریں (5 - 80):',
'custom.cancel': 'منسوخ',
'custom.start': 'شروع',
'custom.sizeError': 'سائز 5 اور 80 کے درمیان ہونا چاہیے!',
'win.title': 'مبارک ہو!',
'win.message': 'آپ نے پہیلی حل کر لی!',
'win.time': 'وقت:',
'win.playAgain': 'دوبارہ کھیلیں',
'win.shareTitle': 'اپنا نتیجہ شیئر کریں',
'win.shareText': 'میں نے {time} میں {size}x{size} نونوگرام حل کیا!',
'win.shareX': 'X',
'win.shareFacebook': 'Facebook',
'win.shareWhatsapp': 'WhatsApp',
'win.shareDownload': 'اسکرین شاٹ ڈاؤن لوڈ کریں',
'pwa.installTitle': 'ایپ انسٹال کریں اور آف لائن کھیلیں',
'pwa.installMobile': 'ہوم اسکرین پر شامل کریں',
'pwa.installDesktop': 'ڈیسک ٹاپ پر انسٹال کریں',
'language.label': 'زبان کا انتخاب',
'language.pl': 'پولش',
'language.en': 'انگریزی',
'language.zh': 'چینی',
'language.hi': 'ہندی',
'language.es': 'ہسپانوی',
'language.fr': 'فرانسیسی',
'language.ar': 'عربی',
'language.bn': 'بنگالی',
'language.ru': 'روسی',
'language.pt': 'پرتگالی',
'language.ur': 'اردو',
'theme.label': 'تھیم',
'theme.system': 'سسٹم',
'theme.light': 'ہلکا',
'theme.dark': 'گہرا'
}
};
@@ -118,7 +666,7 @@ const t = (key, params) => {
};
const setLocale = (value) => {
locale.value = messages[value] ? value : 'en';
locale.value = supportedLocales.includes(value) ? value : 'en';
if (typeof document !== 'undefined') {
document.documentElement.lang = locale.value;
document.title = t('app.title');