fix: missing metadata
This commit is contained in:
parent
ff033eb1a1
commit
a9c98ee778
|
|
@ -6,10 +6,68 @@ import { getLocale, Lang } from "@/i18n/locales";
|
||||||
import Head from 'next/head';
|
import Head from 'next/head';
|
||||||
|
|
||||||
import { ThemeProvider } from "@/components/providers";
|
import { ThemeProvider } from "@/components/providers";
|
||||||
|
import { translations } from "@/i18n/translations";
|
||||||
import { Oxanium } from "next/font/google";
|
import { Oxanium } from "next/font/google";
|
||||||
import { headers } from "next/headers";
|
import { headers } from "next/headers";
|
||||||
const oxanium = Oxanium({ subsets: ["latin-ext"] })
|
const oxanium = Oxanium({ subsets: ["latin-ext"] })
|
||||||
|
|
||||||
|
import type { Metadata } from 'next';
|
||||||
|
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
params: Promise<{ locale: Lang }>
|
||||||
|
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function generateMetadata(
|
||||||
|
{ params }: Props,
|
||||||
|
): Promise<Metadata> {
|
||||||
|
// read route params
|
||||||
|
const locale = (await params).locale
|
||||||
|
|
||||||
|
const currentLang = getLocale(locale);
|
||||||
|
|
||||||
|
const t = translations[currentLang];
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: "CebulaCamp",
|
||||||
|
description: "An amazing gathering of hackers and open source enthusiasts.",
|
||||||
|
icons: {
|
||||||
|
icon: [
|
||||||
|
{ url: '/favicon-96x96.png', type: 'image/png' },
|
||||||
|
{ url: '/favicon.svg', type: 'image/svg+xml' },
|
||||||
|
{ url: '/favicon.ico', type: 'image/x-icon' }
|
||||||
|
],
|
||||||
|
apple: '/apple-touch-icon.png',
|
||||||
|
},
|
||||||
|
manifest: '/site.webmanifest',
|
||||||
|
other: {
|
||||||
|
'apple-mobile-web-app-title': t.siteTitle,
|
||||||
|
},
|
||||||
|
openGraph: {
|
||||||
|
title: t.siteTitle,
|
||||||
|
description: 'An amazing gathering of hackers and open source enthusiasts.',
|
||||||
|
url: 'https://cebula.camp',
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: 'https://cebula.camp/web-app-manifest-512x512.png',
|
||||||
|
width: 512,
|
||||||
|
height: 512,
|
||||||
|
alt: t.siteTitle,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
siteName: t.siteTitle,
|
||||||
|
type: 'website',
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
card: 'summary_large_image',
|
||||||
|
title: 'CebulaCamp',
|
||||||
|
description: 'An amazing gathering of hackers and open source enthusiasts.',
|
||||||
|
images: ['https://cebula.camp/web-app-manifest-512x512.png'],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export default async function RootLayout({
|
export default async function RootLayout({
|
||||||
children,
|
children,
|
||||||
|
|
@ -32,15 +90,19 @@ export default async function RootLayout({
|
||||||
const currentLang = getLocale(locale);
|
const currentLang = getLocale(locale);
|
||||||
const defaultTheme = isDarkOrLight ? preferedTheme : "dark";
|
const defaultTheme = isDarkOrLight ? preferedTheme : "dark";
|
||||||
|
|
||||||
|
const t = translations[currentLang];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<html lang={currentLang} className={`${oxanium.className} ${defaultTheme}`}>
|
<html lang={currentLang} className={`${oxanium.className} ${defaultTheme}`}>
|
||||||
<Head>
|
<Head>
|
||||||
|
<title>{t.siteTitle}</title>
|
||||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
<link rel="shortcut icon" href="/favicon.ico" />
|
<link rel="shortcut icon" href="/favicon.ico" />
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||||
<meta name="apple-mobile-web-app-title" content="CebulaCamp" />
|
<meta name="apple-mobile-web-app-title" content="CebulaCamp" />
|
||||||
<link rel="manifest" href="/site.webmanifest" />
|
<link rel="manifest" href="/site.webmanifest" />
|
||||||
|
|
||||||
</Head>
|
</Head>
|
||||||
<body className="bg-background text:foreground antialiased">
|
<body className="bg-background text:foreground antialiased">
|
||||||
<ThemeProvider>
|
<ThemeProvider>
|
||||||
|
|
|
||||||
|
|
@ -70,10 +70,7 @@ export function Nav({
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
<LanguageSelector />
|
<LanguageSelector />
|
||||||
<a href="#" className="text-xl font-bold tracking-tighter hover:text-primary transition-colors">
|
<a href="#" className="text-xl font-bold tracking-tighter hover:text-primary transition-colors">
|
||||||
|
<h1>{t.nav.title}</h1>
|
||||||
|
|
||||||
|
|
||||||
<h1>{t.siteTitle}</h1>
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,11 @@ import { useParams } from "next/navigation";
|
||||||
export const LanguageSelector = () => {
|
export const LanguageSelector = () => {
|
||||||
const params = useParams<{ locale: Lang }>();
|
const params = useParams<{ locale: Lang }>();
|
||||||
|
|
||||||
|
|
||||||
const lang = params?.locale || 'pl';
|
const lang = params?.locale || 'pl';
|
||||||
const hash = window?.location?.hash || '';
|
const hash = globalThis?.window?.location?.hash || '';
|
||||||
if (lang === 'pl') return (<>
|
if (lang === 'pl') return (<>
|
||||||
<Link className="pt-1" href={`/en${hash}`}>🇬🇧</Link></>);
|
<Link suppressHydrationWarning className="pt-1" href={`/en${hash}`}>🇬🇧</Link></>);
|
||||||
if (lang === 'en') return (<>
|
if (lang === 'en') return (<>
|
||||||
<Link className="pt-1" href={`/pl${hash}`}>🇵🇱</Link></>);
|
<Link suppressHydrationWarning className="pt-1" href={`/pl${hash}`}>🇵🇱</Link></>);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,9 @@ const common = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const pl = {
|
const pl = {
|
||||||
siteTitle: "CEBULACAMP",
|
siteTitle: "CebulaCamp",
|
||||||
nav: {
|
nav: {
|
||||||
|
title: "CEBULACAMP",
|
||||||
hero: "Cebula",
|
hero: "Cebula",
|
||||||
about: "O nas",
|
about: "O nas",
|
||||||
when: "Kiedy",
|
when: "Kiedy",
|
||||||
|
|
@ -65,8 +66,9 @@ const pl = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const en = {
|
const en = {
|
||||||
siteTitle: "CEBULACAMP",
|
siteTitle: "CebulaCamp 2025",
|
||||||
nav: {
|
nav: {
|
||||||
|
title: "CEBULACAMP",
|
||||||
hero: "Onion",
|
hero: "Onion",
|
||||||
about: "About us",
|
about: "About us",
|
||||||
when: "When",
|
when: "When",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue