Files
moybeach-main/app/[lang]/layout.tsx
T

165 lines
4.6 KiB
TypeScript
Raw 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.
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>
);
}