From d908d83ca53ad1899d9f258feb055f401bd3a7d2 Mon Sep 17 00:00:00 2001 From: ayrisdev Date: Tue, 9 Jun 2026 15:15:40 +0300 Subject: [PATCH] b --- .gitignore | 2 + Dockerfile | 54 + app/[lang]/aktiviteler/page.tsx | 103 ++ app/[lang]/cerez/page.tsx | 61 + app/[lang]/dictionaries.ts | 16 + app/{ => [lang]}/etkinlikler/page.tsx | 68 +- app/{ => [lang]}/galeri/page.tsx | 6 +- app/[lang]/gizlilik/page.tsx | 75 + app/{ => [lang]}/hakkimizda/page.tsx | 2 +- app/{ => [lang]}/iletisim/page.tsx | 0 app/[lang]/kvkk/page.tsx | 80 ++ app/{ => [lang]}/layout.tsx | 16 +- app/{ => [lang]}/odalar/page.tsx | 0 app/{ => [lang]}/page.tsx | 320 +++-- app/{ => [lang]}/restoran/page.tsx | 0 app/actions/about.ts | 65 + app/actions/activities.ts | 152 ++ app/actions/auth.ts | 34 + app/actions/events.ts | 102 ++ app/actions/features.ts | 86 ++ app/actions/hero.ts | 48 + app/actions/settings.ts | 38 + app/admin/about/AboutForm.tsx | 219 +++ app/admin/about/page.tsx | 22 + app/admin/activities/ActivitiesClient.tsx | 255 ++++ app/admin/activities/page.tsx | 14 + app/admin/components/SidebarNav.tsx | 46 + app/admin/events/EventsClient.tsx | 269 ++++ app/admin/events/page.tsx | 14 + app/admin/features/FeaturesClient.tsx | 250 ++++ app/admin/features/page.tsx | 17 + app/admin/hero/HeroForm.tsx | 169 +++ app/admin/hero/page.tsx | 14 + app/admin/layout.tsx | 76 + app/admin/login/page.tsx | 86 ++ app/admin/page.tsx | 16 + app/admin/settings/SettingsForm.tsx | 111 ++ app/admin/settings/page.tsx | 15 + app/aktiviteler/page.tsx | 170 --- app/favicon.ico | Bin 25931 -> 15406 bytes components/Footer.tsx | 26 +- components/Navbar.tsx | 25 +- dictionaries/en.json | 11 + dictionaries/tr.json | 11 + lib/prisma.ts | 18 + next.config.ts | 1 + package-lock.json | 1279 ++++++++++++++++- package.json | 9 + prisma.config.ts | 14 + .../migration.sql | 12 + .../migration.sql | 14 + .../migration.sql | 32 + .../migration.sql | 13 + .../migration.sql | 20 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 85 ++ proxy.ts | 75 + public/logo.png | Bin 0 -> 143294 bytes 58 files changed, 4320 insertions(+), 419 deletions(-) create mode 100644 Dockerfile create mode 100644 app/[lang]/aktiviteler/page.tsx create mode 100644 app/[lang]/cerez/page.tsx create mode 100644 app/[lang]/dictionaries.ts rename app/{ => [lang]}/etkinlikler/page.tsx (68%) rename app/{ => [lang]}/galeri/page.tsx (92%) create mode 100644 app/[lang]/gizlilik/page.tsx rename app/{ => [lang]}/hakkimizda/page.tsx (98%) rename app/{ => [lang]}/iletisim/page.tsx (100%) create mode 100644 app/[lang]/kvkk/page.tsx rename app/{ => [lang]}/layout.tsx (75%) rename app/{ => [lang]}/odalar/page.tsx (100%) rename app/{ => [lang]}/page.tsx (67%) rename app/{ => [lang]}/restoran/page.tsx (100%) create mode 100644 app/actions/about.ts create mode 100644 app/actions/activities.ts create mode 100644 app/actions/auth.ts create mode 100644 app/actions/events.ts create mode 100644 app/actions/features.ts create mode 100644 app/actions/hero.ts create mode 100644 app/actions/settings.ts create mode 100644 app/admin/about/AboutForm.tsx create mode 100644 app/admin/about/page.tsx create mode 100644 app/admin/activities/ActivitiesClient.tsx create mode 100644 app/admin/activities/page.tsx create mode 100644 app/admin/components/SidebarNav.tsx create mode 100644 app/admin/events/EventsClient.tsx create mode 100644 app/admin/events/page.tsx create mode 100644 app/admin/features/FeaturesClient.tsx create mode 100644 app/admin/features/page.tsx create mode 100644 app/admin/hero/HeroForm.tsx create mode 100644 app/admin/hero/page.tsx create mode 100644 app/admin/layout.tsx create mode 100644 app/admin/login/page.tsx create mode 100644 app/admin/page.tsx create mode 100644 app/admin/settings/SettingsForm.tsx create mode 100644 app/admin/settings/page.tsx delete mode 100644 app/aktiviteler/page.tsx create mode 100644 dictionaries/en.json create mode 100644 dictionaries/tr.json create mode 100644 lib/prisma.ts create mode 100644 prisma.config.ts create mode 100644 prisma/migrations/20260609105103_init_site_settings/migration.sql create mode 100644 prisma/migrations/20260609105909_add_hero_section/migration.sql create mode 100644 prisma/migrations/20260609110343_add_activities_events/migration.sql create mode 100644 prisma/migrations/20260609115958_add_feature_model/migration.sql create mode 100644 prisma/migrations/20260609120648_add_about_section/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 proxy.ts create mode 100644 public/logo.png diff --git a/.gitignore b/.gitignore index 5ef6a52..45254b6 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +/app/generated/prisma diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..79e42d4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +# 1. Base image +FROM node:20-alpine AS base + +# 2. Dependencies +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies +COPY package.json package-lock.json* ./ +RUN npm ci --legacy-peer-deps + + +# 3. Builder +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Environment variables must be present at build time for Next.js +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN npx prisma generate +RUN npm run build + +# 4. Runner +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +# Start the server +CMD ["node", "server.js"] diff --git a/app/[lang]/aktiviteler/page.tsx b/app/[lang]/aktiviteler/page.tsx new file mode 100644 index 0000000..7425e28 --- /dev/null +++ b/app/[lang]/aktiviteler/page.tsx @@ -0,0 +1,103 @@ +import Image from "next/image"; +import Link from "next/link"; +import { ArrowRight, Clock, Users } from "lucide-react"; +import ScrollReveal from "@/components/ScrollReveal"; + +import prisma from "@/lib/prisma"; + +export default async function AktivitelerPage({ params }: { params: Promise<{ lang: string }> }) { + const { lang } = await params; + const activities = await prisma.activity.findMany({ where: { lang }, orderBy: { order: "asc" } }); + + return ( +
+ + {/* Page Header */} +
+
+ Aktiviteler +
+
+
+ + Deneyimler + +

+ Aktiviteler +

+

+ Rüzgarı hisset, doğayla bir ol. +

+
+
+ + {/* Activities */} +
+
+ {activities.length > 0 ? activities.map((act, i) => ( + +
+
+ {act.title} + {act.badge && ( + + {act.badge} + + )} +
+ +
+

{act.title}

+

{act.description}

+ +
+
+ {act.price} +
+ + Bilgi Al + + +
+
+
+
+ )) : ( +
Henüz aktivite eklenmedi.
+ )} +
+
+ + {/* CTA */} +
+
+

+ Özel Paket Teklifi Al +

+

+ Kitesurf + konaklama veya yoga + SUP gibi özel aktivite paketleri için bizimle iletişime geçin. +

+ + İletişime Geç + +
+
+
+ ); +} diff --git a/app/[lang]/cerez/page.tsx b/app/[lang]/cerez/page.tsx new file mode 100644 index 0000000..0dda809 --- /dev/null +++ b/app/[lang]/cerez/page.tsx @@ -0,0 +1,61 @@ +export default async function CookiesPage({ params }: { params: Promise<{ lang: string }> }) { + const { lang } = await params; + + const content = { + tr: { + title: "Çerez Politikası", + subtitle: "Web sitemizdeki çerez kullanımı hakkında bilgiler.", + text: `Kite Beach Akyaka olarak, web sitemizden en verimli şekilde faydalanabilmeniz ve kullanıcı deneyiminizi geliştirebilmek amacıyla Çerezler (Cookies) kullanmaktayız. Çerez kullanılmasını tercih etmezseniz tarayıcınızın ayarlarından çerezleri silebilir ya da engelleyebilirsiniz. + +1. Çerez Nedir? +Çerezler, bir web sitesini ziyaret ettiğinizde bilgisayarınıza veya mobil cihazınıza kaydedilen küçük metin dosyalarıdır. Bu dosyalar, web sitesinin daha verimli çalışmasını sağlamak ve ziyaretçilere kişiselleştirilmiş bir deneyim sunmak için kullanılır. + +2. Hangi Çerezleri Kullanıyoruz? +- **Zorunlu Çerezler:** Sitemizin temel işlevlerini yerine getirebilmesi için kesinlikle gerekli olan çerezlerdir. (Örn: Oturum yönetimi, dil tercihi) +- **Performans ve Analitik Çerezleri:** Sitemizin ziyaretçiler tarafından nasıl kullanıldığını analiz etmek, en çok ziyaret edilen sayfaları belirlemek ve sitemizin performansını artırmak için kullanılır. (Örn: Google Analytics çerezleri) +- **İşlevsellik Çerezleri:** Ziyaretleriniz sırasındaki tercihlerinizi (seçtiğiniz dil veya bölge vb.) hatırlamamızı sağlayan çerezlerdir. + +3. Çerezlerin Yönetimi +Tarayıcınızın ayarlarını değiştirerek çerezlere ilişkin tercihlerinizi kişiselleştirme imkanına sahipsiniz. Çoğu tarayıcı, çerezleri otomatik olarak kabul eder ancak çerezleri reddetmek veya çerez gönderildiğinde uyarı almak için ayarlarınızı değiştirebilirsiniz. + +Çerez ayarlarınızı nasıl yöneteceğinizi öğrenmek için tarayıcınızın (Chrome, Safari, Firefox, Edge vb.) "Yardım" veya "Ayarlar" menüsünü kullanabilirsiniz. +`, + }, + en: { + title: "Cookie Policy", + subtitle: "Information about the use of cookies on our website.", + text: `As Kite Beach Akyaka, we use Cookies in order for you to benefit from our website in the most efficient way and to improve your user experience. If you prefer not to use cookies, you can delete or block cookies from your browser settings. + +1. What is a Cookie? +Cookies are small text files that are saved on your computer or mobile device when you visit a website. These files are used to make the website work more efficiently and to offer a personalized experience to visitors. + +2. Which Cookies Do We Use? +- **Strictly Necessary Cookies:** These are cookies that are absolutely necessary for our site to fulfill its basic functions. (E.g. Session management, language preference) +- **Performance and Analytical Cookies:** Used to analyze how our site is used by visitors, identify the most visited pages, and improve the performance of our site. (E.g. Google Analytics cookies) +- **Functionality Cookies:** These are cookies that allow us to remember your preferences (language or region you have chosen, etc.) during your visits. + +3. Management of Cookies +You have the opportunity to personalize your preferences regarding cookies by changing your browser settings. Most browsers automatically accept cookies, but you can change your settings to reject cookies or to receive a warning when a cookie is sent. + +You can use the "Help" or "Settings" menu of your browser (Chrome, Safari, Firefox, Edge, etc.) to learn how to manage your cookie settings.` + } + }; + + const t = content[lang as keyof typeof content] || content.tr; + + return ( +
+
+

{t.title}

+

{t.subtitle}

+
+ {t.text.split('\n\n').map((paragraph, index) => ( +

+ {paragraph} +

+ ))} +
+
+
+ ); +} diff --git a/app/[lang]/dictionaries.ts b/app/[lang]/dictionaries.ts new file mode 100644 index 0000000..c414a7d --- /dev/null +++ b/app/[lang]/dictionaries.ts @@ -0,0 +1,16 @@ +import "server-only"; + +const dictionaries = { + en: () => import("../../dictionaries/en.json").then((module) => module.default), + tr: () => import("../../dictionaries/tr.json").then((module) => module.default), +}; + +export type Locale = keyof typeof dictionaries; + +export const hasLocale = (locale: string): locale is Locale => + locale in dictionaries; + +export const getDictionary = async (locale: Locale) => { + if (!hasLocale(locale)) return dictionaries.tr(); + return dictionaries[locale](); +}; diff --git a/app/etkinlikler/page.tsx b/app/[lang]/etkinlikler/page.tsx similarity index 68% rename from app/etkinlikler/page.tsx rename to app/[lang]/etkinlikler/page.tsx index c49862c..c1801a9 100644 --- a/app/etkinlikler/page.tsx +++ b/app/[lang]/etkinlikler/page.tsx @@ -3,51 +3,17 @@ import Link from "next/link"; import { ArrowRight, Calendar, Clock, MapPin, Music } from "lucide-react"; import ScrollReveal from "@/components/ScrollReveal"; -const events = [ - { - id: "mahmut-orhan", - title: "Mahmut Orhan - Sunset Session", - date: "15 Ağustos 2026", - time: "18:00 - 23:30", - location: "Kite Beach Akyaka, Beach Club", - category: "Elektronik Müzik / DJ Performans", - price: "Biletler Yakında", - image: "https://images.unsplash.com/photo-1540039155732-680c74f07599?q=80&w=2832&auto=format&fit=crop", - description: "Dünyaca ünlü DJ Mahmut Orhan, unutulmaz bir gün batımı performansı için Kite Beach Akyaka'da! Ege'nin muhteşem manzarasına karşı elektronik müziğin ritmini hissedeceğiniz bu özel geceyi kaçırmayın. Bilet detayları çok yakında açıklanacaktır.", - featured: true, - }, - { - id: "kite-festival", - title: "Akyaka Kitesurf Festivali '26", - date: "20-22 Eylül 2026", - time: "Tüm Gün", - location: "Kite Beach Sahili", - category: "Spor & Festival", - price: "Ücretsiz Katılım", - image: "https://images.unsplash.com/photo-1533000756353-909d73d2a3c7?q=80&w=2940&auto=format&fit=crop", - description: "Geleneksel Kitesurf festivalimiz bu yıl daha da büyük! Profesyonel yarışçılar, amatör denemeler, gün boyu müzik ve sahil etkinlikleri ile rüzgarın tadını çıkarın.", - featured: false, - }, - { - id: "yoga-retreat", - title: "Dolunay Yoga & Meditasyon", - date: "28 Ekim 2026", - time: "19:00 - 21:00", - location: "Nehir Platformu", - category: "Wellness", - price: "₺450", - image: "https://images.unsplash.com/photo-1599901860904-17e08627c271?q=80&w=2940&auto=format&fit=crop", - description: "Dolunayın büyüleyici enerjisinde, Azmak Nehri'nin sessizliğinde özel bir yoga ve ses banyosu meditasyonu. Tüm seviyeler için uygundur. Matlar tarafımızdan temin edilir.", - featured: false, - } -]; +import prisma from "@/lib/prisma"; export const metadata = { title: "Etkinlikler | Kite Beach Akyaka", description: "Mahmut Orhan konserinden Kitesurf festivallerine, Akyaka'daki en özel etkinlikler ve gün batımı partileri.", }; -export default function EventsPage() { +export default async function EventsPage({ params }: { params: Promise<{ lang: string }> }) { + const { lang } = await params; + const events = await prisma.event.findMany({ where: { lang }, orderBy: { date: "asc" } }); + return (
@@ -88,7 +54,7 @@ export default function EventsPage() {
- {events.map((event, index) => ( + {events.length > 0 ? events.map((event, index) => (
@@ -100,20 +66,17 @@ export default function EventsPage() { fill className="object-cover" /> - {event.featured && ( + {event.badge && (
- Öne Çıkan + {event.badge}
)}
{/* Content Container */}
- - {event.category} - -

+

{event.title}

@@ -137,21 +100,20 @@ export default function EventsPage() {

- {event.price} - Bilet / Bilgi + Bize Ulaşın
- ))} + )) : ( +
Henüz etkinlik eklenmedi.
+ )}
diff --git a/app/galeri/page.tsx b/app/[lang]/galeri/page.tsx similarity index 92% rename from app/galeri/page.tsx rename to app/[lang]/galeri/page.tsx index 001e0f8..f1a84ca 100644 --- a/app/galeri/page.tsx +++ b/app/[lang]/galeri/page.tsx @@ -8,13 +8,13 @@ type Filter = (typeof filters)[number]; const gallery: { src: string; alt: string; category: Exclude }[] = [ { src: "https://images.unsplash.com/photo-1582719478250-c89404bb8a0e?q=80&w=2940&auto=format&fit=crop", alt: "Standart Oda", category: "Odalar" }, - { src: "https://images.unsplash.com/photo-1533000756353-909d73d2a3c7?q=80&w=2940&auto=format&fit=crop", alt: "Kitesurf", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1526367790999-0150786686a2?q=80&w=2940&auto=format&fit=crop", alt: "Kitesurf", category: "Aktiviteler" }, { src: "https://images.unsplash.com/photo-1544551763-46a013bb70d5?q=80&w=2940&auto=format&fit=crop", alt: "Nehir Doğa", category: "Doğa" }, { src: "https://images.unsplash.com/photo-1566665797739-1674de7a421a?q=80&w=2874&auto=format&fit=crop", alt: "Nehir Manzaralı Oda",category: "Odalar" }, { src: "https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?q=80&w=2940&auto=format&fit=crop", alt: "Restoran", category: "Restoran" }, - { src: "https://images.unsplash.com/photo-1599901860904-17e08627c271?q=80&w=2940&auto=format&fit=crop", alt: "Yoga", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1544367567-0f2fcb009e0b?q=80&w=2940&auto=format&fit=crop", alt: "Yoga", category: "Aktiviteler" }, { src: "https://images.unsplash.com/photo-1499955085172-a104c9463ece?q=80&w=2940&auto=format&fit=crop", alt: "Bungalow", category: "Odalar" }, - { src: "https://images.unsplash.com/photo-1544606771-46abcf9dbb83?q=80&w=2924&auto=format&fit=crop", alt: "SUP", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1522883392419-7d8cb2435728?q=80&w=2924&auto=format&fit=crop", alt: "SUP", category: "Aktiviteler" }, { src: "https://images.unsplash.com/photo-1551504734-5ee1c4a1479b?q=80&w=2940&auto=format&fit=crop", alt: "Kahvaltı", category: "Restoran" }, { src: "https://images.unsplash.com/photo-1511994298241-608e28f14fde?q=80&w=2940&auto=format&fit=crop", alt: "Bisiklet", category: "Aktiviteler" }, { src: "https://images.unsplash.com/photo-1544148103-0773bf10d330?q=80&w=2940&auto=format&fit=crop", alt: "Restoran Ambiyans", category: "Restoran" }, diff --git a/app/[lang]/gizlilik/page.tsx b/app/[lang]/gizlilik/page.tsx new file mode 100644 index 0000000..a123fef --- /dev/null +++ b/app/[lang]/gizlilik/page.tsx @@ -0,0 +1,75 @@ +export default async function PrivacyPage({ params }: { params: Promise<{ lang: string }> }) { + const { lang } = await params; + + const content = { + tr: { + title: "Gizlilik Politikası", + subtitle: "Verilerinizin güvenliği bizim için önemlidir.", + text: `Kite Beach Akyaka (“Biz”, “Şirketimiz” veya “Otel”) olarak, web sitemizi ziyaret eden ve hizmetlerimizden faydalanan misafirlerimizin ("Kullanıcı" veya "Misafir") gizliliğini korumayı taahhüt ediyoruz. Bu Gizlilik Politikası, web sitemiz (www.kitebeachakyaka.com.tr) üzerinden toplanan bilgilerin nasıl kullanıldığını ve korunduğunu açıklar. + +1. Hangi Bilgileri Topluyoruz? +Size daha iyi hizmet verebilmek amacıyla adınız, soyadınız, e-posta adresiniz, telefon numaranız ve rezervasyon detaylarınız gibi bilgileri doğrudan sizden talep etmekteyiz. Ayrıca web sitemizi ziyaret ettiğinizde otomatik olarak IP adresi, tarayıcı türü, ziyaret süresi gibi standart log bilgileri de toplanabilmektedir. + +2. Bilgilerinizi Nasıl Kullanıyoruz? +Topladığımız bilgiler aşağıdaki amaçlar için kullanılmaktadır: +- Rezervasyon işlemlerinizi gerçekleştirmek ve onaylamak, +- Sizinle iletişim kurmak ve taleplerinize yanıt vermek, +- Otel ve kitesurf okulu hizmetlerimizi geliştirmek, +- Pazarlama ve tanıtım bildirimleri göndermek (Yalnızca açık rızanız olması halinde), +- Yasal yükümlülüklerimizi yerine getirmek. + +3. Bilgi Güvenliği +Kişisel bilgilerinizin yetkisiz erişime, değişime, ifşaya veya imhaya karşı korunması için gerekli teknik ve idari güvenlik önlemlerini almaktayız. Web sitemizdeki tüm veri akışları şifrelenmiş bağlantılar (SSL) üzerinden yapılmaktadır. + +4. Üçüncü Taraflarla Paylaşım +Bilgilerinizi izniniz olmadan üçüncü taraflarla satmıyor, kiralamıyor veya paylaşmıyoruz. Sadece hizmet sağlamak için işbirliği yaptığımız ödeme sağlayıcıları gibi güvenilir partnerlerle, gizlilik sözleşmeleri çerçevesinde veri paylaşımı yapılabilmektedir. + +5. Değişiklikler +Bu Gizlilik Politikası, zaman zaman güncellenebilir. Herhangi bir değişiklik durumunda yeni politika sitemizde yayınlanarak yürürlüğe girecektir. +`, + }, + en: { + title: "Privacy Policy", + subtitle: "The security of your data is important to us.", + text: `As Kite Beach Akyaka ("We", "Our Company" or "Hotel"), we are committed to protecting the privacy of our guests ("User" or "Guest") who visit our website and benefit from our services. This Privacy Policy explains how the information collected through our website is used and protected. + +1. What Information Do We Collect? +In order to serve you better, we request information such as your name, surname, email address, phone number, and reservation details directly from you. In addition, standard log information such as IP address, browser type, and visit duration may be automatically collected when you visit our website. + +2. How Do We Use Your Information? +The information we collect is used for the following purposes: +- Processing and confirming your reservations, +- Communicating with you and responding to your requests, +- Improving our hotel and kitesurf school services, +- Sending marketing and promotional notifications (Only with your explicit consent), +- Fulfilling our legal obligations. + +3. Information Security +We take the necessary technical and administrative security measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. All data flows on our website are carried out over encrypted connections (SSL). + +4. Sharing with Third Parties +We do not sell, rent, or share your information with third parties without your permission. Data sharing can only be done with reliable partners, such as payment providers with whom we cooperate to provide services, within the framework of confidentiality agreements. + +5. Changes +This Privacy Policy may be updated from time to time. In case of any changes, the new policy will come into effect by being published on our site.` + } + }; + + const t = content[lang as keyof typeof content] || content.tr; + + return ( +
+
+

{t.title}

+

{t.subtitle}

+
+ {t.text.split('\n\n').map((paragraph, index) => ( +

+ {paragraph} +

+ ))} +
+
+
+ ); +} diff --git a/app/hakkimizda/page.tsx b/app/[lang]/hakkimizda/page.tsx similarity index 98% rename from app/hakkimizda/page.tsx rename to app/[lang]/hakkimizda/page.tsx index 4a9d3a4..1e3d253 100644 --- a/app/hakkimizda/page.tsx +++ b/app/[lang]/hakkimizda/page.tsx @@ -84,7 +84,7 @@ export default function HakkimizdaPage() {
Kitesurf }) { + const { lang } = await params; + + const content = { + tr: { + title: "Kişisel Verilerin Korunması", + subtitle: "Kişisel Verilerin Korunması Kanunu (KVKK) Aydınlatma Metni", + text: `Kite Beach Akyaka olarak, kişisel verilerinizin güvenliğine büyük önem veriyoruz. 6698 sayılı Kişisel Verilerin Korunması Kanunu (“Kanun”) uyarınca, elde edilen kişisel verileriniz veri sorumlusu sıfatıyla Kite Beach Akyaka tarafından aşağıda açıklanan kapsamda işlenebilecektir. + +1. Kişisel Verilerin İşlenme Amacı +Kişisel verileriniz; +- Otelimizde konaklama ve kitesurf okulumuzdaki faaliyetlerin gerçekleştirilebilmesi, +- Sizlere sunulan ürün ve hizmetlerin beğeni, kullanım alışkanlıkları ve ihtiyaçlarınıza göre özelleştirilerek önerilmesi, +- Rezervasyon, iletişim ve müşteri memnuniyeti süreçlerinin yürütülmesi, +- İlgili mevzuat gereği yasal yükümlülüklerin yerine getirilmesi amacıyla işlenmektedir. + +2. İşlenen Kişisel Verilerin Kimlere ve Hangi Amaçla Aktarılabileceği +Toplanan kişisel verileriniz; yasal yükümlülüklerimizin yerine getirilmesi, hizmetlerimizin sağlanabilmesi ve müşteri memnuniyeti süreçleri dahilinde; iş ortaklarımıza, tedarikçilerimize, kanunen yetkili kamu kurumlarına ve özel kişilere Kanun’un 8. ve 9. maddelerinde belirtilen şartlar dahilinde aktarılabilecektir. + +3. Kişisel Veri Toplamanın Yöntemi ve Hukuki Sebebi +Kişisel verileriniz, web sitemiz, rezervasyon formları, e-posta iletişimleri ve otel resepsiyonu gibi kanallar aracılığıyla fiziksel veya elektronik ortamda toplanmaktadır. + +4. Veri Sahibinin Hakları +KVKK’nın 11. maddesi uyarınca; +- Kişisel veri işlenip işlenmediğini öğrenme, +- Kişisel veriler işlenmişse buna ilişkin bilgi talep etme, +- Amacına uygun kullanılıp kullanılmadığını öğrenme, +- Yurt içinde veya yurt dışında aktarıldığı üçüncü kişileri bilme, +- Eksik veya yanlış işlenmişse düzeltilmesini isteme haklarına sahipsiniz. + +Detaylı bilgi ve talepleriniz için info@kitebeachakyaka.com.tr adresi üzerinden bizimle iletişime geçebilirsiniz.`, + }, + en: { + title: "Personal Data Protection", + subtitle: "Information Text on the Protection of Personal Data", + text: `As Kite Beach Akyaka, we attach great importance to the security of your personal data. In accordance with the Personal Data Protection Law No. 6698 ("Law"), your personal data may be processed by Kite Beach Akyaka as the data controller within the scope described below. + +1. Purpose of Processing Personal Data +Your personal data is processed to; +- Carry out accommodation in our hotel and activities in our kitesurf school, +- Customize and recommend the products and services offered to you according to your tastes, usage habits, and needs, +- Manage reservation, communication, and customer satisfaction processes, +- Fulfill legal obligations in accordance with the relevant legislation. + +2. To Whom and for What Purpose the Processed Personal Data Can Be Transferred +Your collected personal data may be transferred to our business partners, suppliers, legally authorized public institutions, and private persons within the conditions specified in Articles 8 and 9 of the Law in order to fulfill our legal obligations, provide our services, and within customer satisfaction processes. + +3. Method and Legal Reason for Collecting Personal Data +Your personal data is collected in physical or electronic environment through channels such as our website, reservation forms, email communications, and hotel reception. + +4. Rights of the Data Subject +In accordance with Article 11 of the KVKK, you have the right to; +- Learn whether personal data is processed, +- Request information if personal data has been processed, +- Learn the purpose of processing personal data and whether they are used appropriately, +- Know the third parties to whom personal data is transferred domestically or abroad, +- Request the correction of personal data if it is incomplete or improperly processed. + +For detailed information and requests, you can contact us at info@kitebeachakyaka.com.tr.` + } + }; + + const t = content[lang as keyof typeof content] || content.tr; + + return ( +
+
+

{t.title}

+

{t.subtitle}

+
+ {t.text.split('\n\n').map((paragraph, index) => ( +

+ {paragraph} +

+ ))} +
+
+
+ ); +} diff --git a/app/layout.tsx b/app/[lang]/layout.tsx similarity index 75% rename from app/layout.tsx rename to app/[lang]/layout.tsx index f8c9d80..1cab333 100644 --- a/app/layout.tsx +++ b/app/[lang]/layout.tsx @@ -1,6 +1,6 @@ import type { Metadata } from "next"; import { Inter, Playfair_Display } from "next/font/google"; -import "./globals.css"; +import "../globals.css"; import Navbar from "@/components/Navbar"; import Footer from "@/components/Footer"; import WhatsAppButton from "@/components/WhatsAppButton"; @@ -20,17 +20,25 @@ export const metadata: Metadata = { description: "Nehrin huzuru, denizin enerjisi — tek bir noktada. Kite Beach Akyaka butik otel ve kitesurf merkezine hoş geldiniz.", }; -export default function RootLayout({ +export async function generateStaticParams() { + return [{ lang: 'tr' }, { lang: 'en' }] +} + +export default async function RootLayout({ children, + params, }: Readonly<{ children: React.ReactNode; + params: Promise<{ lang: string }>; }>) { + const { lang } = await params; return ( - +
{children}