165 lines
4.6 KiB
TypeScript
165 lines
4.6 KiB
TypeScript
import type { Metadata } from "next";
|
||
import { Bodoni_Moda } from "next/font/google";
|
||
import "../globals.css";
|
||
import { prisma } from "@/lib/db";
|
||
|
||
const bodoni = Bodoni_Moda({
|
||
variable: "--font-bodoni",
|
||
subsets: ["latin"],
|
||
display: "swap",
|
||
});
|
||
|
||
export async function generateStaticParams() {
|
||
return [{ lang: 'tr' }, { lang: 'en' }];
|
||
}
|
||
|
||
export async function generateMetadata(
|
||
{ params }: { params: Promise<{ lang: string }> }
|
||
): Promise<Metadata> {
|
||
const { lang } = await params;
|
||
const settings = await prisma.siteSettings.findFirst();
|
||
|
||
const isTr = lang === 'tr';
|
||
|
||
const title = isTr
|
||
? (settings?.metaTitleTr || 'Moy Beach Akyaka | Lüks & Huzur')
|
||
: (settings?.metaTitleEn || 'Moy Beach Akyaka | Luxury & Serenity');
|
||
|
||
const description = isTr
|
||
? (settings?.metaDescTr || "Akyaka'nın kalbinde doğayla iç içe lüks bir beach, restoran ve otel deneyimi.")
|
||
: (settings?.metaDescEn || 'A luxury beach, restaurant and hotel experience immersed in nature at the heart of Akyaka.');
|
||
|
||
const keywords = isTr
|
||
? (settings?.metaKeywordsTr || 'moy beach, akyaka, beach, restoran, otel, muğla, deniz, tatil')
|
||
: (settings?.metaKeywordsEn || 'moy beach, akyaka, beach, restaurant, hotel, mugla, sea, holiday');
|
||
|
||
const siteUrl = settings?.siteUrl || 'https://moybeach.com';
|
||
const ogImage = settings?.ogImage || `${siteUrl}/moy-beach.jpg`;
|
||
|
||
return {
|
||
title,
|
||
description,
|
||
keywords,
|
||
authors: [{ name: 'Moy Beach' }],
|
||
creator: 'Moy Beach',
|
||
publisher: 'Moy Beach',
|
||
robots: {
|
||
index: true,
|
||
follow: true,
|
||
googleBot: {
|
||
index: true,
|
||
follow: true,
|
||
'max-video-preview': -1,
|
||
'max-image-preview': 'large',
|
||
'max-snippet': -1,
|
||
},
|
||
},
|
||
alternates: {
|
||
canonical: `${siteUrl}/${lang}`,
|
||
languages: {
|
||
'tr': `${siteUrl}/tr`,
|
||
'en': `${siteUrl}/en`,
|
||
},
|
||
},
|
||
openGraph: {
|
||
type: 'website',
|
||
locale: isTr ? 'tr_TR' : 'en_US',
|
||
alternateLocale: isTr ? 'en_US' : 'tr_TR',
|
||
url: `${siteUrl}/${lang}`,
|
||
siteName: 'Moy Beach',
|
||
title,
|
||
description,
|
||
images: [
|
||
{
|
||
url: ogImage,
|
||
width: 1200,
|
||
height: 630,
|
||
alt: title,
|
||
},
|
||
],
|
||
},
|
||
twitter: {
|
||
card: 'summary_large_image',
|
||
title,
|
||
description,
|
||
images: [ogImage],
|
||
...(settings?.twitterHandle ? { creator: `@${settings.twitterHandle}`, site: `@${settings.twitterHandle}` } : {}),
|
||
},
|
||
verification: {
|
||
...(settings?.googleVerify ? { google: settings.googleVerify } : {}),
|
||
},
|
||
other: {
|
||
'theme-color': '#1a1a2e',
|
||
},
|
||
};
|
||
}
|
||
|
||
export default async function RootLayout({
|
||
children,
|
||
params,
|
||
}: Readonly<{
|
||
children: React.ReactNode;
|
||
params: Promise<{ lang: string }>;
|
||
}>) {
|
||
const { lang } = await params;
|
||
const settings = await prisma.siteSettings.findFirst();
|
||
const siteUrl = settings?.siteUrl || 'https://moybeach.com';
|
||
|
||
// JSON-LD Structured Data
|
||
const jsonLd = {
|
||
'@context': 'https://schema.org',
|
||
'@type': 'LocalBusiness',
|
||
'@id': siteUrl,
|
||
name: 'Moy Beach',
|
||
url: siteUrl,
|
||
logo: settings?.logoUrl || `${siteUrl}/logo.png`,
|
||
image: settings?.ogImage || `${siteUrl}/moy-beach.jpg`,
|
||
description: lang === 'tr'
|
||
? (settings?.metaDescTr || "Akyaka'nın kalbinde doğayla iç içe lüks bir beach, restoran ve otel deneyimi.")
|
||
: (settings?.metaDescEn || 'A luxury beach, restaurant and hotel experience immersed in nature at the heart of Akyaka.'),
|
||
telephone: settings?.phone || '',
|
||
email: settings?.email || '',
|
||
address: {
|
||
'@type': 'PostalAddress',
|
||
streetAddress: settings?.addressText1 || '',
|
||
addressLocality: 'Akyaka',
|
||
addressRegion: 'Muğla',
|
||
addressCountry: 'TR',
|
||
},
|
||
openingHours: settings?.workingHours || '',
|
||
sameAs: [
|
||
settings?.instagramUrl,
|
||
settings?.facebookUrl,
|
||
settings?.youtubeUrl,
|
||
].filter(Boolean),
|
||
servesCuisine: ['Turkish', 'Mediterranean', 'Seafood'],
|
||
priceRange: '₺₺₺',
|
||
geo: {
|
||
'@type': 'GeoCoordinates',
|
||
latitude: 37.0437,
|
||
longitude: 28.3249,
|
||
},
|
||
};
|
||
|
||
return (
|
||
<html lang={lang} className={`scroll-smooth ${bodoni.variable}`}>
|
||
<head>
|
||
<script
|
||
type="application/ld+json"
|
||
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
||
/>
|
||
</head>
|
||
<body className="antialiased font-sans">
|
||
{children}
|
||
<div
|
||
data-marmaris-widget="marmaris"
|
||
data-limit="3"
|
||
data-lang="tr"
|
||
style={{ display: 'none' }}
|
||
/>
|
||
<script src="https://marmarislocal.com/widget.js" async />
|
||
</body>
|
||
</html>
|
||
);
|
||
}
|