375 lines
25 KiB
JavaScript
375 lines
25 KiB
JavaScript
const translations = {
|
||
ru: {
|
||
// Navigation & General
|
||
'nav.about': 'О нас',
|
||
'nav.rooms': 'Номера',
|
||
'nav.gallery': 'Галерея',
|
||
'nav.activities': 'Развлечения',
|
||
'nav.reviews': 'Отзывы',
|
||
'nav.host': 'Хозяин',
|
||
'nav.contact': 'Контакты',
|
||
'nav.travel_tips': 'Уголок туриста',
|
||
'nav.admin': 'Управление',
|
||
|
||
// Reviews Section
|
||
'reviews.title': 'Отзывы наших гостей',
|
||
'reviews.subtitle': 'Более {count} счастливых гостей рекомендуют Hotel 777',
|
||
'reviews.leave_review': 'Оставить отзыв',
|
||
'reviews.write_review': 'Написать отзыв',
|
||
'reviews.avg_rating': 'Средняя оценка',
|
||
'reviews.stars': 'звёзд',
|
||
'reviews.star': 'звезда',
|
||
'reviews.write_first': 'Будьте первым, кто оставит отзыв!',
|
||
|
||
// Select Groups
|
||
'select.popular': 'Популярные',
|
||
'select.alphabetical': 'По алфавиту',
|
||
|
||
// Review Form
|
||
'form.select_country': 'Выберите страну',
|
||
'form.select_city': 'Город (необязательно)',
|
||
'form.another_city': 'Другой город',
|
||
'form.city_placeholder': 'Введите название города',
|
||
'form.rating': 'Оценка',
|
||
'form.your_name': 'Ваше имя (ФИО)',
|
||
'form.name_placeholder': 'Иванов Иван Иванович',
|
||
'form.review_text': 'Текст отзыва',
|
||
'form.review_placeholder': 'Расскажите о вашем опыте отдыха в Hotel 777...',
|
||
'form.hotel_code': 'Код гостиницы',
|
||
'form.code_placeholder': 'Получите на ресепшене',
|
||
'form.code_hint': 'Код сообщается гостям на ресепшене отеля',
|
||
'form.submit': 'Отправить отзыв',
|
||
'form.cancel': 'Отмена',
|
||
|
||
// Validation Messages
|
||
'validation.required': 'Это поле обязательно',
|
||
'validation.country_required': 'Выберите страну',
|
||
'validation.city_required': 'Выберите или введите город',
|
||
'validation.name_required': 'Введите ваше имя',
|
||
'validation.name_min': 'Имя должно содержать минимум 2 символа',
|
||
'validation.review_required': 'Напишите текст отзыва',
|
||
'validation.review_min': 'Отзыв должен содержать минимум 20 символов',
|
||
'validation.code_required': 'Введите код гостиницы',
|
||
'validation.code_invalid': 'Неверный код гостиницы',
|
||
'validation.rating_required': 'Поставьте оценку',
|
||
'validation.rating_range': 'Оценка должна быть от 0 до 5',
|
||
'validation.too_frequent': 'Вы уже оставляли отзыв недавно. Попробуйте позже.',
|
||
'validation.success': 'Спасибо! Ваш отзыв отправлен на модерацию и будет опубликован после проверки.',
|
||
|
||
// Admin
|
||
'admin.reviews': 'Отзывы',
|
||
'admin.reviews_all': 'Все отзывы',
|
||
'admin.reviews_pending': 'На модерации',
|
||
'admin.reviews_approved': 'Одобренные',
|
||
'admin.reviews_rejected': 'Скрытые',
|
||
'admin.approve': 'Одобрить',
|
||
'admin.reject': 'Скрыть',
|
||
'admin.delete': 'Удалить',
|
||
'admin.approve_confirm': 'Одобрить этот отзыв?',
|
||
'admin.reject_confirm': 'Скрыть этот отзыв?',
|
||
'admin.delete_confirm': 'Удалить этот отзыв?',
|
||
'admin.stats.total': 'Всего отзывов',
|
||
'admin.stats.pending': 'Ожидают модерации',
|
||
'admin.stats.approved': 'Опубликовано',
|
||
'admin.settings': 'Настройки',
|
||
'admin.settings.review_code': 'Кодовое слово для отзывов',
|
||
'admin.settings.current_code': 'Текущий код',
|
||
'admin.settings.new_code': 'Новый код',
|
||
'admin.settings.save': 'Сохранить',
|
||
'admin.settings.saved': 'Кодовое слово обновлено',
|
||
|
||
// Reviews List
|
||
'review.from': 'из',
|
||
'review.date_format': 'MMMM YYYY',
|
||
'review.no_reviews': 'Отзывов пока нет',
|
||
|
||
// Footer
|
||
'footer.rights': 'Все права защищены',
|
||
'footer.hotel777': 'Hotel 777',
|
||
|
||
// Buttons
|
||
'btn.close': 'Закрыть',
|
||
'btn.loading': 'Отправка...',
|
||
'btn.show_code': 'Показать',
|
||
'btn.hide_code': 'Скрыть',
|
||
|
||
// Language
|
||
'lang.switch': 'English',
|
||
'lang.current': 'Русский',
|
||
|
||
// Travel Tips
|
||
'travel_tips.badge': 'Уголок туриста',
|
||
'travel_tips.title': 'Что нужно знать туристу',
|
||
'travel_tips.subtitle': 'Полезная информация для комфортного и безопасного отдыха в Абхазии: связь, традиции, важные советы',
|
||
|
||
'travel_tips.important.title': 'Важные моменты',
|
||
'travel_tips.important.1.title': 'Пересечение границы',
|
||
'travel_tips.important.1.desc': 'Для граждан РФ — внутренний паспорт. Детям до 14 лет — свидетельство о рождении. Граница по реке Псоу, работают два КПП. Очереди в пик сезона — планируйте время.',
|
||
'travel_tips.important.2.title': 'Валюта и оплата',
|
||
'travel_tips.important.2.desc': 'В Абхазии действует российский рубль. Банкоматы есть только в крупных городах (Гагра, Сухум, Гудаута). Везде принимают наличные, карты — только в крупных магазинах и отелях.',
|
||
'travel_tips.important.3.title': 'Медицина и страховка',
|
||
'travel_tips.important.3.desc': 'Полис ОМС РФ в Абхазии не действует. Рекомендуем оформить туристическую страховку. В Гудауте есть аптеки и больница. Возьмите необходимые лекарства с собой.',
|
||
'travel_tips.important.4.title': 'Транспорт',
|
||
'travel_tips.important.4.desc': 'Основной транспорт — маршрутки и такси. Между городами курсируют автобусы. Дороги горные, соблюдайте осторожность. До гостиницы от границы ~30 минут на такси.',
|
||
|
||
'travel_tips.customs.title': 'Национальные особенности',
|
||
'travel_tips.customs.1.title': 'Абхазское гостеприимство',
|
||
'travel_tips.customs.1.desc': 'Гостеприимство для абхазов — священный долг. Гостю предложат лучшее, что есть в доме. Отказ от угощения может быть воспринят как неуважение — попробуйте хотя бы немного.',
|
||
'travel_tips.customs.2.title': 'Застольные традиции',
|
||
'travel_tips.customs.2.desc': 'Тамада — главный человек за столом. Тосты произносятся по очереди, первый — за Всевышнего. Пить до дна не обязательно, но пригубить нужно. Не перебивайте говорящего тост.',
|
||
'travel_tips.customs.3.title': 'Уважение к старшим',
|
||
'travel_tips.customs.3.desc': 'В Абхазии глубоко чтят старших по возрасту. При встрече первым здоровается младший. В присутствии старших не принято громко говорить, курить или сидеть в вольной позе.',
|
||
'travel_tips.customs.4.title': 'Местная кухня',
|
||
'travel_tips.customs.4.desc': 'Обязательно попробуйте: абысту (мамалыга), аджику, хачапури, копчёный сыр, ачапу (фасоль с орехами), шашлык, свежую форель. Национальные напитки — чача и местное вино.',
|
||
|
||
'travel_tips.mobile.title': 'Мобильная связь и интернет',
|
||
'travel_tips.mobile.subtitle': 'Какие операторы работают в Абхазии, условия роуминга и как получить местную SIM-карту',
|
||
|
||
'travel_tips.operators.russian.title': 'Российские операторы в Абхазии',
|
||
'travel_tips.operators.labels.plan': 'Тариф',
|
||
'travel_tips.operators.labels.calls_in': 'Входящие',
|
||
'travel_tips.operators.labels.calls_out': 'Исходящие в РФ',
|
||
'travel_tips.operators.labels.internet': 'Интернет',
|
||
'travel_tips.operators.labels.bonus': 'Бонусы',
|
||
'travel_tips.operators.labels.activation': 'Как подключить',
|
||
'travel_tips.operators.mts.name': 'МТС',
|
||
'travel_tips.operators.mts.plan': '«Забугорище»',
|
||
'travel_tips.operators.mts.calls_in': 'Бесплатно (первые 10 мин каждого вызова)',
|
||
'travel_tips.operators.mts.calls_out': '9,50 ₽/мин',
|
||
'travel_tips.operators.mts.internet': '700 МБ/мес бесплатно. Далее — 3,50 ₽/МБ',
|
||
'travel_tips.operators.mts.bonus': 'Яндекс Карты, 2ГИС и банковские приложения — безлимитно и без расхода пакета',
|
||
'travel_tips.operators.mts.activation': 'USSD *111*333# или в приложении «Мой МТС»',
|
||
'travel_tips.operators.mts.badge': 'Лучшее предложение',
|
||
'travel_tips.operators.megafon.name': 'МегаФон',
|
||
'travel_tips.operators.megafon.plan': 'Роуминг в Абхазии',
|
||
'travel_tips.operators.megafon.calls_in': '9 ₽/мин',
|
||
'travel_tips.operators.megafon.calls_out': '9 ₽/мин',
|
||
'travel_tips.operators.megafon.internet': '~9 ₽/МБ без опции. Рекомендуется опция «Отпуск онлайн» — пакеты минут и ГБ со скидкой',
|
||
'travel_tips.operators.megafon.bonus': 'Опция «Отпуск онлайн»: пакеты от 300 ₽ (минуты + ГБ)',
|
||
'travel_tips.operators.megafon.activation': 'В приложении МегаФон → Роуминг',
|
||
'travel_tips.operators.beeline.name': 'Билайн',
|
||
'travel_tips.operators.beeline.plan': 'Роуминг по миру',
|
||
'travel_tips.operators.beeline.calls_in': '9 ₽/мин',
|
||
'travel_tips.operators.beeline.calls_out': '9 ₽/мин',
|
||
'travel_tips.operators.beeline.internet': 'Пакеты ГБ в приложении. Без пакета — ~10 ₽/МБ',
|
||
'travel_tips.operators.beeline.bonus': 'Приложение Билайн работает без расхода трафика. Пакеты от 300 ₽',
|
||
'travel_tips.operators.beeline.activation': 'В приложении «Мой Билайн» → Роуминг',
|
||
'travel_tips.operators.yota.name': 'Yota',
|
||
'travel_tips.operators.yota.plan': 'Роуминг (сеть МегаФон)',
|
||
'travel_tips.operators.yota.calls_in': '~10 ₽/мин',
|
||
'travel_tips.operators.yota.calls_out': '~10 ₽/мин',
|
||
'travel_tips.operators.yota.internet': '~15 ₽/МБ. Пакеты роуминга не предусмотрены',
|
||
'travel_tips.operators.yota.bonus': '—',
|
||
'travel_tips.operators.yota.activation': 'Автоматически, проверьте в приложении Yota',
|
||
'travel_tips.operators.tele2.name': 'Tele2',
|
||
'travel_tips.operators.tele2.plan': 'Роуминг в Абхазии',
|
||
'travel_tips.operators.tele2.calls_in': '~10 ₽/мин',
|
||
'travel_tips.operators.tele2.calls_out': '~10 ₽/мин',
|
||
'travel_tips.operators.tele2.internet': '~15 ₽/МБ. Ограниченное покрытие — проверьте доступность',
|
||
'travel_tips.operators.tele2.bonus': '—',
|
||
'travel_tips.operators.tele2.activation': 'Проверьте в приложении Tele2 — может потребоваться подключение',
|
||
|
||
'travel_tips.operators.local.title': 'Местные операторы и SIM-карты',
|
||
'travel_tips.operators.local.desc': 'В Абхазии работают два местных оператора: А-Мобайл и Аквафон. Сразу после КПП «Псоу» на абхазской стороне работают точки продаж — можно купить SIM-карту, не доезжая до города. Также SIM-карты продаются в любом салоне связи в Гудауте или Гагре. Потребуется паспорт РФ. Стоимость стартового пакета — от 200 ₽. Местная связь выгоднее для звонков внутри Абхазии.',
|
||
'travel_tips.operators.local.note': 'Важно! Перед поездкой уточните актуальные условия в приложении вашего оператора — тарифы могут меняться.',
|
||
|
||
'travel_tips.note': 'Тарифы указаны ориентировочно. Пожалуйста, проверяйте актуальные условия у вашего оператора перед поездкой.'
|
||
},
|
||
|
||
en: {
|
||
// Navigation & General
|
||
'nav.about': 'About Us',
|
||
'nav.rooms': 'Rooms',
|
||
'nav.gallery': 'Gallery',
|
||
'nav.activities': 'Activities',
|
||
'nav.reviews': 'Reviews',
|
||
'nav.host': 'Host',
|
||
'nav.contact': 'Contact',
|
||
'nav.travel_tips': 'Tourist Tips',
|
||
'nav.admin': 'Management',
|
||
|
||
// Reviews Section
|
||
'reviews.title': 'Guest Reviews',
|
||
'reviews.subtitle': 'More than {count} happy guests recommend Hotel 777',
|
||
'reviews.leave_review': 'Leave a Review',
|
||
'reviews.write_review': 'Write a Review',
|
||
'reviews.avg_rating': 'Average rating',
|
||
'reviews.stars': 'stars',
|
||
'reviews.star': 'star',
|
||
'reviews.write_first': 'Be the first to leave a review!',
|
||
|
||
// Select Groups
|
||
'select.popular': 'Popular',
|
||
'select.alphabetical': 'Alphabetical',
|
||
|
||
// Review Form
|
||
'form.select_country': 'Select country',
|
||
'form.select_city': 'City (optional)',
|
||
'form.another_city': 'Other city',
|
||
'form.city_placeholder': 'Enter city name',
|
||
'form.rating': 'Rating',
|
||
'form.your_name': 'Your name',
|
||
'form.name_placeholder': 'John Smith',
|
||
'form.review_text': 'Review text',
|
||
'form.review_placeholder': 'Tell us about your experience at Hotel 777...',
|
||
'form.hotel_code': 'Hotel code',
|
||
'form.code_placeholder': 'Get at reception',
|
||
'form.code_hint': 'The code is provided to guests at the hotel reception',
|
||
'form.submit': 'Submit Review',
|
||
'form.cancel': 'Cancel',
|
||
|
||
// Validation Messages
|
||
'validation.required': 'This field is required',
|
||
'validation.country_required': 'Please select a country',
|
||
'validation.city_required': 'Please select or enter a city',
|
||
'validation.name_required': 'Please enter your name',
|
||
'validation.name_min': 'Name must be at least 2 characters',
|
||
'validation.review_required': 'Please write your review',
|
||
'validation.review_min': 'Review must be at least 20 characters',
|
||
'validation.code_required': 'Please enter hotel code',
|
||
'validation.code_invalid': 'Invalid hotel code',
|
||
'validation.rating_required': 'Please provide a rating',
|
||
'validation.rating_range': 'Rating must be between 0 and 5',
|
||
'validation.too_frequent': 'You have recently left a review. Please try again later.',
|
||
'validation.success': 'Thank you! Your review has been submitted for moderation and will be published after approval.',
|
||
|
||
// Admin
|
||
'admin.reviews': 'Reviews',
|
||
'admin.reviews_all': 'All Reviews',
|
||
'admin.reviews_pending': 'Pending',
|
||
'admin.reviews_approved': 'Approved',
|
||
'admin.reviews_rejected': 'Hidden',
|
||
'admin.approve': 'Approve',
|
||
'admin.reject': 'Hide',
|
||
'admin.delete': 'Delete',
|
||
'admin.approve_confirm': 'Approve this review?',
|
||
'admin.reject_confirm': 'Hide this review?',
|
||
'admin.delete_confirm': 'Delete this review?',
|
||
'admin.stats.total': 'Total reviews',
|
||
'admin.stats.pending': 'Awaiting moderation',
|
||
'admin.stats.approved': 'Published',
|
||
'admin.settings': 'Settings',
|
||
'admin.settings.review_code': 'Review access code',
|
||
'admin.settings.current_code': 'Current code',
|
||
'admin.settings.new_code': 'New code',
|
||
'admin.settings.save': 'Save',
|
||
'admin.settings.saved': 'Code word updated',
|
||
|
||
// Reviews List
|
||
'review.from': 'from',
|
||
'review.date_format': 'MMMM YYYY',
|
||
'review.no_reviews': 'No reviews yet',
|
||
|
||
// Footer
|
||
'footer.rights': 'All rights reserved',
|
||
'footer.hotel777': 'Hotel 777',
|
||
|
||
// Buttons
|
||
'btn.close': 'Close',
|
||
'btn.loading': 'Sending...',
|
||
'btn.show_code': 'Show',
|
||
'btn.hide_code': 'Hide',
|
||
|
||
// Language
|
||
'lang.switch': 'Русский',
|
||
'lang.current': 'English',
|
||
|
||
// Travel Tips
|
||
'travel_tips.badge': 'Tourist Tips',
|
||
'travel_tips.title': 'What Tourists Should Know',
|
||
'travel_tips.subtitle': 'Essential information for a comfortable and safe stay in Abkhazia: mobile service, traditions, important tips',
|
||
|
||
'travel_tips.important.title': 'Important Information',
|
||
'travel_tips.important.1.title': 'Border Crossing',
|
||
'travel_tips.important.1.desc': 'Russian citizens need a domestic passport. Children under 14 need a birth certificate. The border runs along the Psou River with two checkpoints. Expect queues during peak season — plan ahead.',
|
||
'travel_tips.important.2.title': 'Currency & Payments',
|
||
'travel_tips.important.2.desc': 'The Russian ruble is used throughout Abkhazia. ATMs are only available in major towns (Gagra, Sukhum, Gudauta). Cash is accepted everywhere; cards only in larger shops and hotels.',
|
||
'travel_tips.important.3.title': 'Healthcare & Insurance',
|
||
'travel_tips.important.3.desc': 'Russian MHI policies are not valid in Abkhazia. We recommend purchasing travel insurance. Pharmacies and a hospital are available in Gudauta. Bring any essential medications with you.',
|
||
'travel_tips.important.4.title': 'Transport',
|
||
'travel_tips.important.4.desc': 'Main transport options are minibuses (marshrutkas) and taxis. Buses connect major towns. Roads are mountainous — drive carefully. The hotel is about 30 minutes by taxi from the border.',
|
||
|
||
'travel_tips.customs.title': 'Local Customs & Traditions',
|
||
'travel_tips.customs.1.title': 'Abkhazian Hospitality',
|
||
'travel_tips.customs.1.desc': 'Hospitality is a sacred duty for Abkhazians. Guests are offered the best the house has. Refusing food or drink may be taken as disrespect — try at least a little.',
|
||
'travel_tips.customs.2.title': 'Feasting Traditions',
|
||
'travel_tips.customs.2.desc': 'The tamada (toastmaster) leads the table. Toasts are made in turn — the first is always to the Almighty. You do not need to empty your glass, but you should take a sip. Never interrupt a toast.',
|
||
'travel_tips.customs.3.title': 'Respect for Elders',
|
||
'travel_tips.customs.3.desc': 'Elders are deeply respected in Abkhazia. The younger person greets first. It is impolite to speak loudly, smoke, or sit casually in the presence of elders.',
|
||
'travel_tips.customs.4.title': 'Local Cuisine',
|
||
'travel_tips.customs.4.desc': 'Must-try dishes: abysta (corn porridge/mamalyga), adjika (spicy paste), khachapuri (cheese bread), smoked cheese, achapa (beans with walnuts), shashlik, and fresh trout. National drinks include chacha and local wine.',
|
||
|
||
'travel_tips.mobile.title': 'Mobile & Internet',
|
||
'travel_tips.mobile.subtitle': 'Which operators work in Abkhazia, roaming conditions, and how to get a local SIM card',
|
||
|
||
'travel_tips.operators.russian.title': 'Russian Operators in Abkhazia',
|
||
'travel_tips.operators.labels.plan': 'Plan',
|
||
'travel_tips.operators.labels.calls_in': 'Incoming',
|
||
'travel_tips.operators.labels.calls_out': 'Outgoing to Russia',
|
||
'travel_tips.operators.labels.internet': 'Internet',
|
||
'travel_tips.operators.labels.bonus': 'Bonuses',
|
||
'travel_tips.operators.labels.activation': 'Activation',
|
||
'travel_tips.operators.mts.name': 'MTS',
|
||
'travel_tips.operators.mts.plan': '"Zabugorishche"',
|
||
'travel_tips.operators.mts.calls_in': 'Free (first 10 min per call)',
|
||
'travel_tips.operators.mts.calls_out': '9.50 RUB/min',
|
||
'travel_tips.operators.mts.internet': '700 MB/month free. Beyond that — 3.50 RUB/MB',
|
||
'travel_tips.operators.mts.bonus': 'Yandex Maps, 2GIS and banking apps — unlimited, no data usage',
|
||
'travel_tips.operators.mts.activation': 'USSD *111*333# or in the My MTS app',
|
||
'travel_tips.operators.mts.badge': 'Best Deal',
|
||
'travel_tips.operators.megafon.name': 'MegaFon',
|
||
'travel_tips.operators.megafon.plan': 'Roaming in Abkhazia',
|
||
'travel_tips.operators.megafon.calls_in': '9 RUB/min',
|
||
'travel_tips.operators.megafon.calls_out': '9 RUB/min',
|
||
'travel_tips.operators.megafon.internet': '~9 RUB/MB without add-on. Recommended "Holiday Online" add-on — discounted minute + GB packages',
|
||
'travel_tips.operators.megafon.bonus': '"Holiday Online" add-on: packages from 300 RUB (minutes + GB)',
|
||
'travel_tips.operators.megafon.activation': 'MegaFon app → Roaming',
|
||
'travel_tips.operators.beeline.name': 'Beeline',
|
||
'travel_tips.operators.beeline.plan': 'Worldwide Roaming',
|
||
'travel_tips.operators.beeline.calls_in': '9 RUB/min',
|
||
'travel_tips.operators.beeline.calls_out': '9 RUB/min',
|
||
'travel_tips.operators.beeline.internet': 'GB packages in the app. Without package — ~10 RUB/MB',
|
||
'travel_tips.operators.beeline.bonus': 'Beeline app works without data usage. Packages from 300 RUB',
|
||
'travel_tips.operators.beeline.activation': 'My Beeline app → Roaming',
|
||
'travel_tips.operators.yota.name': 'Yota',
|
||
'travel_tips.operators.yota.plan': 'Roaming (MegaFon network)',
|
||
'travel_tips.operators.yota.calls_in': '~10 RUB/min',
|
||
'travel_tips.operators.yota.calls_out': '~10 RUB/min',
|
||
'travel_tips.operators.yota.internet': '~15 RUB/MB. No roaming packages available',
|
||
'travel_tips.operators.yota.bonus': '—',
|
||
'travel_tips.operators.yota.activation': 'Automatic — verify in the Yota app',
|
||
'travel_tips.operators.tele2.name': 'Tele2',
|
||
'travel_tips.operators.tele2.plan': 'Roaming in Abkhazia',
|
||
'travel_tips.operators.tele2.calls_in': '~10 RUB/min',
|
||
'travel_tips.operators.tele2.calls_out': '~10 RUB/min',
|
||
'travel_tips.operators.tele2.internet': '~15 RUB/MB. Limited coverage — verify availability',
|
||
'travel_tips.operators.tele2.bonus': '—',
|
||
'travel_tips.operators.tele2.activation': 'Check in the Tele2 app — manual activation may be required',
|
||
|
||
'travel_tips.operators.local.title': 'Local Operators & SIM Cards',
|
||
'travel_tips.operators.local.desc': 'Abkhazia has two local operators: A-Mobile and Aquafon. You can buy a SIM card right after the Psou border checkpoint on the Abkhazian side — no need to wait until you reach the city. SIM cards are also sold at any mobile shop in Gudauta or Gagra. A Russian passport is required. Starter packs start at 200 RUB. Local service is cheaper for calls within Abkhazia.',
|
||
'travel_tips.operators.local.note': 'Important! Check the latest tariffs in your operator\'s app before traveling — rates may change.',
|
||
|
||
'travel_tips.note': 'Tariffs are approximate. Please verify current conditions with your operator before traveling.'
|
||
}
|
||
};
|
||
|
||
function t(key, lang = 'ru', replacements = {}) {
|
||
let text = translations[lang]?.[key] || translations['ru'][key] || key;
|
||
|
||
Object.entries(replacements).forEach(([k, v]) => {
|
||
text = text.replace(`{${k}}`, v);
|
||
});
|
||
|
||
return text;
|
||
}
|
||
|
||
function getTranslations(lang) {
|
||
return translations[lang] || translations['ru'];
|
||
}
|
||
|
||
function getAvailableLanguages() {
|
||
return Object.keys(translations);
|
||
}
|
||
|
||
module.exports = { t, getTranslations, getAvailableLanguages, translations }; |