217 lines
9.4 KiB
JavaScript
217 lines
9.4 KiB
JavaScript
const translations = {
|
||
ru: {
|
||
// Navigation & General
|
||
'nav.about': 'О нас',
|
||
'nav.rooms': 'Номера',
|
||
'nav.gallery': 'Галерея',
|
||
'nav.activities': 'Развлечения',
|
||
'nav.reviews': 'Отзывы',
|
||
'nav.host': 'Хозяин',
|
||
'nav.contact': 'Контакты',
|
||
'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': 'Русский'
|
||
},
|
||
|
||
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.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'
|
||
}
|
||
};
|
||
|
||
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 }; |