diff --git a/frontend/app/[locale]/about/page.tsx b/frontend/app/[locale]/about/page.tsx index 19c7c1b..e239c0e 100644 --- a/frontend/app/[locale]/about/page.tsx +++ b/frontend/app/[locale]/about/page.tsx @@ -12,7 +12,7 @@ export default function ResumePage() {

Хохлов Дмитрий

-

Frontend Developer (React)

+

FullStack Developer (TypeScript, Rust)

@@ -30,7 +30,7 @@ export default function ResumePage() {

Обо мне

- Я опытный frontend разработчик с более чем четырехлетним опытом в создании + Я опытный FullStack разработчик с более чем четырехлетним опытом в создании эффективных веб-приложений. Мои навыки охватывают весь цикл разработки, от концепции и дизайна до реализации и поддержки.

diff --git a/frontend/app/[locale]/layout.tsx b/frontend/app/[locale]/layout.tsx index 475548a..73988de 100644 --- a/frontend/app/[locale]/layout.tsx +++ b/frontend/app/[locale]/layout.tsx @@ -1,28 +1,46 @@ /* eslint-disable @next/next/no-page-custom-font */ -import { ThemeProvider } from "@/components/theme-provider"; -import StoreProvider from "@/store/StoreProvider"; -import { SidebarInset, SidebarProvider } from '@/components/ui/sidebar7'; +import { Metadata } from "next"; import { NextIntlClientProvider } from 'next-intl'; -import { getMessages, unstable_setRequestLocale } from 'next-intl/server'; -import Header from '../_components/Header/Header'; -import Sidebar from '../_components/Sidebar/Sidebar'; -import '../_styles/globals.css'; -import { GoogleAnalytics } from '@next/third-parties/google' +import { getMessages, getTranslations, unstable_setRequestLocale } from 'next-intl/server'; import Script from "next/script.js"; +import { GoogleAnalytics } from '@next/third-parties/google'; +import { ThemeProvider } from "@/components/theme-provider"; +import { SidebarInset, SidebarProvider } from '@/components/ui/sidebar7'; +import StoreProvider from "@/store/StoreProvider"; import { locales as appLocales } from '@/types/i18n'; -import "@fontsource/material-symbols-outlined" +import Header from '../_components/Header/Header'; import NowPlaying from "../_components/NowPlaying/NowPlaying"; +import AppSidebar from '../_components/Sidebar/Sidebar'; +import '../_styles/globals.css'; +import "@fontsource/material-symbols-outlined"; type Props = { children: React.ReactNode; - params: Promise<{ locale: string }>; + params: { locale: string }; }; +export async function generateMetadata({ params }: Props): Promise { + const { locale } = await params; + const t = await getTranslations({ locale, namespace: 'Metadata' }); + + return { + title: { + default: t('defaultTitle'), + template: `%s | ${t('template')}`, + }, + description: t('defaultDescription'), + keywords: ['Дмитрий Хохлов', 'Dmitry Khokhlov', 'FullStack Developer', 'React', 'Next.js', 'TypeScript', 'Портфолио', 'Rust'], + authors: [{ name: 'Dmitry Khokhlov', url: 'https://diametrfq.ru' }], + creator: 'Dmitry Khokhlov', + }; +} + export function generateStaticParams() { return appLocales.map((locale) => ({locale})); } export default async function LocaleLayout({ children, params }: Props) { + // КЛЮЧЕВОЕ ИЗМЕНЕНИЕ: НЕ деструктурируем в сигнатуре. const { locale } = await params; unstable_setRequestLocale(locale); @@ -35,7 +53,6 @@ export default async function LocaleLayout({ children, params }: Props) { rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap" /> -