Adds a Russian version (data/resume.ru.json, default language) with an RU/EN switch stored under the key shared with the front page and the portfolio. The top bar becomes the site-wide one (brand, Resume, Portfolio, Gitea, Contact, language, theme) with a second row of anchors for this page's sections, and the fonts move to Unbounded and Onest so the three pages share one type system. Portfolio links now point at /portfolio/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XtcZtnG4GQA1d6mW5PNrS9
31 lines
1.3 KiB
TypeScript
31 lines
1.3 KiB
TypeScript
import type { Metadata } from 'next'
|
|
import './globals.css'
|
|
|
|
export const metadata: Metadata = {
|
|
title: 'Эмиль Шанаев — Резюме',
|
|
description: 'Резюме Эмиля Шанаева: бэкенд, DevOps, системы на базе ИИ, научное ПО и игровые технологии.',
|
|
authors: [{ name: 'Эмиль Шанаев' }],
|
|
}
|
|
|
|
// Before the first paint: the language (the stored choice, otherwise Russian) and the theme (dark unless "light" was
|
|
// chosen). Both keys are shared with the rest of shanaty.ru, so a choice carries over between the pages.
|
|
const BOOT_SCRIPT = `try{var d=document.documentElement,l=localStorage.getItem('lang');if(l!=='ru'&&l!=='en')l='ru';d.dataset.lang=l;d.lang=l;if(localStorage.getItem('theme')==='light')d.dataset.theme='light';document.title=d.getAttribute('data-title-'+l)||document.title}catch(e){}`
|
|
|
|
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
|
|
return (
|
|
<html
|
|
lang="ru"
|
|
data-lang="ru"
|
|
data-theme="dark"
|
|
data-title-ru="Эмиль Шанаев — Резюме"
|
|
data-title-en="Emil Shanayev — Resume"
|
|
suppressHydrationWarning
|
|
>
|
|
<head>
|
|
<script dangerouslySetInnerHTML={{ __html: BOOT_SCRIPT }} />
|
|
</head>
|
|
<body>{children}</body>
|
|
</html>
|
|
)
|
|
}
|