···11+import type { Metadata } from "next";
12import Link from "next/link";
2334import { Button } from "@/components/ui/button";
45import { Card } from "@/components/ui/card";
56import { getRequestI18n } from "@/lib/i18n-server";
77+import { withTitle } from "@/lib/metadata";
88+99+export async function generateMetadata(): Promise<Metadata> {
1010+ const { t } = await getRequestI18n();
1111+ return withTitle(t("meta.notFound"));
1212+}
613714export default async function NotFound() {
815 const { t } = await getRequestI18n();
+10
lib/metadata.ts
···11+import type { Metadata } from "next";
22+33+export function resolveTitle(title: string | null | undefined, fallback: string) {
44+ const normalized = title?.trim();
55+ return normalized && normalized.length > 0 ? normalized : fallback;
66+}
77+88+export function withTitle(title: string): Metadata {
99+ return { title };
1010+}
+7
locales/en.yml
···1010 licensedUnder: Licensed under
1111 sourceCode: Source code
1212 reportBug: Report a bug
1313+meta:
1414+ untitledForm: Untitled form
1515+ dashboard: Dashboard
1616+ responses: Responses
1717+ response: "Response #{number}"
1818+ joinOrganization: Join organization
1919+ notFound: Not found
1320auth:
1421 continueWithGoogle: Continue with Google
1522workspace:
+7
locales/ru.yml
···1010 licensedUnder: Лицензия
1111 sourceCode: Исходный код
1212 reportBug: Сообщить об ошибке
1313+meta:
1414+ untitledForm: Форма без названия
1515+ dashboard: Дашборд
1616+ responses: Ответы
1717+ response: "Ответ №{number}"
1818+ joinOrganization: Вступить в организацию
1919+ notFound: Не найдено
1320auth:
1421 continueWithGoogle: Продолжить с Google
1522workspace: