Files
AyrisAIandClaude Sonnet 5 1b8cfeda95 feat: harden admin security, add AI trip planner, map view, and SEO/notification improvements
Security:
- requireAdmin() session check added to every admin-only server action
  (previously relied only on middleware path matching, which Next.js
  Server Actions don't reliably respect)
- Real Prisma + bcrypt admin auth, replacing hardcoded credentials; split
  into an Edge-safe auth.config.ts (used by proxy.ts) and the full
  Prisma-backed auth.ts (route handler, server actions, server components)
- Removed hardcoded fallback secret on the Instagram sync cron endpoint
- Honeypot field + per-IP rate limiting on contact/business-submission
  forms and the analytics events endpoint

Features:
- AI trip planner (/plan-olustur, /plan/[id]) backed by DeepSeek, grounded
  to only recommend isLocalApproved listings, with a deterministic
  link-injection fallback for anything the model doesn't format as markdown
- Interactive Leaflet/OpenStreetMap view on category listing pages
- Telegram notifications for new contact messages and business submissions

SEO:
- Brand-consistent favicon/apple-icon/PWA icons and default Open Graph/
  Twitter share images, generated via next/og (replacing default Next.js
  placeholders)
- BreadcrumbList structured data on category and listing detail pages
- Fixed two remaining raw <img> tags to use next/image

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 00:01:06 +03:00

123 lines
6.3 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"nav": {
"home": "Главная",
"restaurants": "Рестораны",
"aparts": "Апартаменты",
"businesses": "Услуги",
"about": "О нас",
"contact": "Контакты",
"addBusiness": "Добавить бизнес",
"admin": "Админ-панель",
"login": "Войти",
"blog": "Блог",
"collections": "Подборки",
"saved": "Избранное",
"events": "Мероприятия",
"aiPlanner": "AI Планировщик"
},
"events": {
"title": "календарь событий мармариса",
"subtitle": "текущее расписание живой музыки, джазовых вечеров, гастрономии и фестивалей в заведениях, одобренных мармарис локал.",
"sponsored": "Спонсорский",
"details": "Подробнее",
"date": "Дата",
"noEvents": "Ближайших мероприятий не запланировано. Оставайтесь на связи!",
"venue": "Заведение"
},
"planner": {
"title": "AI планировщик путешествий",
"subtitle": "персонализируйте свой отдых в мармарисе на основе ваших интересов, количества дней и одобренных местных заведений.",
"days": "Сколько дней вы пробудете?",
"style": "Какой у вас стиль путешествия?",
"neighborhoods": "Какие районы вы хотите исследовать?",
"generate": "Создать план поездки",
"generating": "Подготовка вашего плана...",
"viewPlan": "Посмотреть план",
"placesInPlan": "места из этого плана",
"styles": {
"gastronomy": "Гурман и гастрономия",
"relaxation": "Покой и отдых",
"adventure": "Приключения и природа"
}
},
"hero": {
"title": "Лучшие места Мармариса",
"subtitle": "Инсайдерская информация, скрытая от обычных туристов. Проверенные рестораны, апарт-отели и секретные места, одобренные местными жителями.",
"searchPlaceholder": "Поиск заведения, категории или района...",
"cta": "Начать исследование",
"approvedBadge": "Одобрено местными",
"approvedExplain": "Знак «Одобрено местными» отмечает заведения, лично проверенные редакторами Marmaris Local."
},
"home": {
"categories": "Категории",
"categoriesSubtitle": "Все, что нужно, чтобы прочувствовать Мармарис как местный житель",
"featured": "Рекомендуемые заведения",
"featuredSubtitle": "Места, выбранные нашими редакторами, с гарантией качества и вкуса",
"neighborhoods": "Районы",
"neighborhoodsSubtitle": "Исследуйте Мармарис по районам",
"explore": "Исследовать"
},
"categories": {
"restoran": "Рестораны",
"apart": "Апартаменты",
"isletme": "Услуги и Сервисы",
"filterNeighborhood": "Фильтр по районам",
"filterPrice": "Диапазон цен",
"filterApproved": "Только одобренные",
"noResults": "Ничего не найдено по вашему запросу.",
"allNeighborhoods": "Все районы",
"allPrices": "Любые цены",
"rating": "Оценка Google",
"address": "Адрес",
"phone": "Телефон",
"price": "Цена",
"viewDetails": "Подробнее",
"map": "Вид на карте"
},
"detail": {
"approved": "Заведение со знаком «Одобрено местными»",
"rating": "Оценка Google",
"price": "Уровень цен",
"address": "Адрес",
"hours": "Часы работы",
"contact": "Контакты",
"call": "Позвонить",
"whatsapp": "Написать в WhatsApp",
"phone": "Телефон",
"website": "Сайт",
"instagram": "Instagram",
"location": "Расположение / Карта",
"related": "Похожие места",
"noHours": "Часы работы не указаны.",
"viewMenu": "Посмотреть меню",
"shareWhatsapp": "Поделиться в WhatsApp",
"save": "Сохранить",
"saved": "Сохранено",
"instagramFeed": "Последние публикации в Instagram",
"newlyAdded": "Недавно добавленные",
"newlyAddedSubtitle": "Последние поступления в наш местный путеводитель"
},
"forms": {
"name": "Имя и Фамилия",
"email": "Эл. почта",
"message": "Ваше сообщение",
"subject": "Тема",
"businessName": "Название заведения",
"category": "Категория",
"neighborhood": "Район",
"address": "Адрес заведения",
"phone": "Номер телефона",
"whatsapp": "Номер WhatsApp (необязательно)",
"description": "Краткое описание",
"image": "Изображение или ссылка (необязательно)",
"submit": "Отправить",
"sending": "Отправка...",
"success": "Ваша заявка успешно отправлена! Она будет опубликована после модерации.",
"contactSuccess": "Ваше сообщение успешно отправлено. Мы ответим вам в ближайшее время."
},
"footer": {
"rights": "© 2026 Marmaris Local. Все права защищены.",
"about": "Marmaris Local — это путеводитель, в котором собраны лучшие рестораны, отели и услуги в Мармарисе."
}
}