diff --git a/apps/login/locales/de.json b/apps/login/locales/de.json index 7b2a507fe4..5d5a4b5927 100644 --- a/apps/login/locales/de.json +++ b/apps/login/locales/de.json @@ -1,6 +1,7 @@ { "common": { - "back": "Zurück" + "back": "Zurück", + "title": "Anmelden mit Zitadel" }, "accounts": { "title": "Konten", diff --git a/apps/login/locales/en.json b/apps/login/locales/en.json index e1b7e4e82c..606065bd97 100644 --- a/apps/login/locales/en.json +++ b/apps/login/locales/en.json @@ -1,6 +1,7 @@ { "common": { - "back": "Back" + "back": "Back", + "title": "Login with Zitadel" }, "accounts": { "title": "Accounts", diff --git a/apps/login/locales/es.json b/apps/login/locales/es.json index b1c63583a7..34e9bf7002 100644 --- a/apps/login/locales/es.json +++ b/apps/login/locales/es.json @@ -1,6 +1,7 @@ { "common": { - "back": "Atrás" + "back": "Atrás", + "title": "Iniciar sesión con Zitadel" }, "accounts": { "title": "Cuentas", diff --git a/apps/login/locales/it.json b/apps/login/locales/it.json index a71b48ed04..8e71997e0c 100644 --- a/apps/login/locales/it.json +++ b/apps/login/locales/it.json @@ -1,6 +1,7 @@ { "common": { - "back": "Indietro" + "back": "Indietro", + "title": "Accedi con Zitadel" }, "accounts": { "title": "Account", diff --git a/apps/login/locales/pl.json b/apps/login/locales/pl.json index 3e8562a220..8fce97170f 100644 --- a/apps/login/locales/pl.json +++ b/apps/login/locales/pl.json @@ -1,6 +1,7 @@ { "common": { - "back": "Powrót" + "back": "Powrót", + "title": "Zaloguj się za pomocą Zitadel" }, "accounts": { "title": "Konta", diff --git a/apps/login/locales/ru.json b/apps/login/locales/ru.json index 6ba2917e16..d5b8575f93 100644 --- a/apps/login/locales/ru.json +++ b/apps/login/locales/ru.json @@ -1,6 +1,7 @@ { "common": { - "back": "Назад" + "back": "Назад", + "title": "Войти с Zitadel" }, "accounts": { "title": "Аккаунты", diff --git a/apps/login/locales/zh.json b/apps/login/locales/zh.json index fe5f2d1867..2f8f183248 100644 --- a/apps/login/locales/zh.json +++ b/apps/login/locales/zh.json @@ -1,6 +1,7 @@ { "common": { - "back": "返回" + "back": "返回", + "title": "使用 Zitadel 登录" }, "accounts": { "title": "账户", diff --git a/apps/login/src/app/(login)/accounts/page.tsx b/apps/login/src/app/(login)/accounts/page.tsx index e4e6b387dc..50407e9964 100644 --- a/apps/login/src/app/(login)/accounts/page.tsx +++ b/apps/login/src/app/(login)/accounts/page.tsx @@ -10,10 +10,17 @@ import { } from "@/lib/zitadel"; import { UserPlusIcon } from "@heroicons/react/24/outline"; import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; // import { getLocale } from "next-intl/server"; import { headers } from "next/headers"; import Link from "next/link"; +export async function generateMetadata(): Promise { + const t = await getTranslations("accounts"); + return { title: t('title')}; +} + async function loadSessions({ serviceUrl }: { serviceUrl: string }) { const cookieIds = await getAllSessionCookieIds(); diff --git a/apps/login/src/app/(login)/authenticator/set/page.tsx b/apps/login/src/app/(login)/authenticator/set/page.tsx index e08367f589..1f8912d95c 100644 --- a/apps/login/src/app/(login)/authenticator/set/page.tsx +++ b/apps/login/src/app/(login)/authenticator/set/page.tsx @@ -19,9 +19,16 @@ import { } from "@/lib/zitadel"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; // import { getLocale } from "next-intl/server"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; import { redirect } from "next/navigation"; +export async function generateMetadata(): Promise { + const t = await getTranslations("authenticator"); + return { title: t('title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/device/page.tsx b/apps/login/src/app/(login)/device/page.tsx index e8761d25de..0164640a49 100644 --- a/apps/login/src/app/(login)/device/page.tsx +++ b/apps/login/src/app/(login)/device/page.tsx @@ -4,8 +4,15 @@ import { Translated } from "@/components/translated"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { getBrandingSettings, getDefaultOrg } from "@/lib/zitadel"; import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("device"); + return { title: t('usercode.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/idp/page.tsx b/apps/login/src/app/(login)/idp/page.tsx index 51b4f71bb2..839efada0b 100644 --- a/apps/login/src/app/(login)/idp/page.tsx +++ b/apps/login/src/app/(login)/idp/page.tsx @@ -3,8 +3,15 @@ import { SignInWithIdp } from "@/components/sign-in-with-idp"; import { Translated } from "@/components/translated"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { getActiveIdentityProviders, getBrandingSettings } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("idp"); + return { title: t('title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/layout.tsx b/apps/login/src/app/(login)/layout.tsx index dbce9804c9..a28ad843ca 100644 --- a/apps/login/src/app/(login)/layout.tsx +++ b/apps/login/src/app/(login)/layout.tsx @@ -9,17 +9,25 @@ import * as Tooltip from "@radix-ui/react-tooltip"; import { Analytics } from "@vercel/analytics/react"; import { Lato } from "next/font/google"; import { ReactNode, Suspense } from "react"; +import type { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; const lato = Lato({ weight: ["400", "700", "900"], subsets: ["latin"], }); +export async function generateMetadata(): Promise { + const t = await getTranslations("common"); + return { title: t('title')}; +} + export default async function RootLayout({ children, }: { children: ReactNode; }) { + return ( diff --git a/apps/login/src/app/(login)/loginname/page.tsx b/apps/login/src/app/(login)/loginname/page.tsx index f19d9986d1..7694e43b19 100644 --- a/apps/login/src/app/(login)/loginname/page.tsx +++ b/apps/login/src/app/(login)/loginname/page.tsx @@ -10,8 +10,15 @@ import { getLoginSettings, } from "@/lib/zitadel"; import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("loginname"); + return { title: t('title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/logout/page.tsx b/apps/login/src/app/(login)/logout/page.tsx index c96675e85d..d20489a3a4 100644 --- a/apps/login/src/app/(login)/logout/page.tsx +++ b/apps/login/src/app/(login)/logout/page.tsx @@ -5,8 +5,15 @@ import { getAllSessionCookieIds } from "@/lib/cookies"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { getBrandingSettings, getDefaultOrg, listSessions } from "@/lib/zitadel"; import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("logout"); + return { title: t('title')}; +} + async function loadSessions({ serviceUrl }: { serviceUrl: string }) { const cookieIds = await getAllSessionCookieIds(); diff --git a/apps/login/src/app/(login)/mfa/page.tsx b/apps/login/src/app/(login)/mfa/page.tsx index 5543cdf66f..35af054743 100644 --- a/apps/login/src/app/(login)/mfa/page.tsx +++ b/apps/login/src/app/(login)/mfa/page.tsx @@ -12,8 +12,15 @@ import { getSession, listAuthenticationMethodTypes, } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("mfa"); + return { title: t('verify.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/mfa/set/page.tsx b/apps/login/src/app/(login)/mfa/set/page.tsx index ebfa358d6d..0203ba3415 100644 --- a/apps/login/src/app/(login)/mfa/set/page.tsx +++ b/apps/login/src/app/(login)/mfa/set/page.tsx @@ -16,8 +16,15 @@ import { } from "@/lib/zitadel"; import { Timestamp, timestampDate } from "@zitadel/client"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("mfa"); + return { title: t('set.title')}; +} + function isSessionValid(session: Partial): { valid: boolean; verifiedAt?: Timestamp; diff --git a/apps/login/src/app/(login)/otp/[method]/page.tsx b/apps/login/src/app/(login)/otp/[method]/page.tsx index 1b1356315a..d39c9ffdae 100644 --- a/apps/login/src/app/(login)/otp/[method]/page.tsx +++ b/apps/login/src/app/(login)/otp/[method]/page.tsx @@ -11,8 +11,15 @@ import { getLoginSettings, getSession, } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("otp"); + return { title: t('verify.title')}; +} + export default async function Page(props: { searchParams: Promise>; params: Promise>; diff --git a/apps/login/src/app/(login)/passkey/page.tsx b/apps/login/src/app/(login)/passkey/page.tsx index bef71986f3..7a287d5acf 100644 --- a/apps/login/src/app/(login)/passkey/page.tsx +++ b/apps/login/src/app/(login)/passkey/page.tsx @@ -7,8 +7,15 @@ import { getSessionCookieById } from "@/lib/cookies"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { loadMostRecentSession } from "@/lib/session"; import { getBrandingSettings, getSession } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("passkey"); + return { title: t('verify.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/passkey/set/page.tsx b/apps/login/src/app/(login)/passkey/set/page.tsx index 52c195e6cf..47b13a3fcc 100644 --- a/apps/login/src/app/(login)/passkey/set/page.tsx +++ b/apps/login/src/app/(login)/passkey/set/page.tsx @@ -6,8 +6,15 @@ import { UserAvatar } from "@/components/user-avatar"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { loadMostRecentSession } from "@/lib/session"; import { getBrandingSettings } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("passkey"); + return { title: t('set.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/password/change/page.tsx b/apps/login/src/app/(login)/password/change/page.tsx index 78ba88d282..fe920cda8a 100644 --- a/apps/login/src/app/(login)/password/change/page.tsx +++ b/apps/login/src/app/(login)/password/change/page.tsx @@ -10,8 +10,15 @@ import { getLoginSettings, getPasswordComplexitySettings, } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("password"); + return { title: t('change.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/password/page.tsx b/apps/login/src/app/(login)/password/page.tsx index a9ab4091f9..97be81e7b8 100644 --- a/apps/login/src/app/(login)/password/page.tsx +++ b/apps/login/src/app/(login)/password/page.tsx @@ -11,8 +11,15 @@ import { getLoginSettings, } from "@/lib/zitadel"; import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("password"); + return { title: t('verify.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/password/set/page.tsx b/apps/login/src/app/(login)/password/set/page.tsx index c47305929a..738b68df2b 100644 --- a/apps/login/src/app/(login)/password/set/page.tsx +++ b/apps/login/src/app/(login)/password/set/page.tsx @@ -13,8 +13,15 @@ import { } from "@/lib/zitadel"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; import { HumanUser, User } from "@zitadel/proto/zitadel/user/v2/user_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("password"); + return { title: t('set.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/register/page.tsx b/apps/login/src/app/(login)/register/page.tsx index 221679ef07..5a11ca1f89 100644 --- a/apps/login/src/app/(login)/register/page.tsx +++ b/apps/login/src/app/(login)/register/page.tsx @@ -14,8 +14,15 @@ import { } from "@/lib/zitadel"; import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb"; import { PasskeysType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("register"); + return { title: t('title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/signedin/page.tsx b/apps/login/src/app/(login)/signedin/page.tsx index 5b2ed5fbf4..a9b0660e24 100644 --- a/apps/login/src/app/(login)/signedin/page.tsx +++ b/apps/login/src/app/(login)/signedin/page.tsx @@ -15,9 +15,16 @@ import { getLoginSettings, getSession, } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; import Link from "next/link"; +export async function generateMetadata(): Promise { + const t = await getTranslations("signedin"); + return { title: t('title', { user: '' })}; +} + async function loadSessionById( serviceUrl: string, sessionId: string, diff --git a/apps/login/src/app/(login)/u2f/page.tsx b/apps/login/src/app/(login)/u2f/page.tsx index c54b45103f..5bf8928461 100644 --- a/apps/login/src/app/(login)/u2f/page.tsx +++ b/apps/login/src/app/(login)/u2f/page.tsx @@ -7,8 +7,15 @@ import { getSessionCookieById } from "@/lib/cookies"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { loadMostRecentSession } from "@/lib/session"; import { getBrandingSettings, getSession } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("u2f"); + return { title: t('verify.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/u2f/set/page.tsx b/apps/login/src/app/(login)/u2f/set/page.tsx index 79f64bf67d..455b917a26 100644 --- a/apps/login/src/app/(login)/u2f/set/page.tsx +++ b/apps/login/src/app/(login)/u2f/set/page.tsx @@ -6,8 +6,15 @@ import { UserAvatar } from "@/components/user-avatar"; import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { loadMostRecentSession } from "@/lib/session"; import { getBrandingSettings } from "@/lib/zitadel"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("u2f"); + return { title: t('set.title')}; +} + export default async function Page(props: { searchParams: Promise>; }) { diff --git a/apps/login/src/app/(login)/verify/page.tsx b/apps/login/src/app/(login)/verify/page.tsx index 7497698222..67166ed370 100644 --- a/apps/login/src/app/(login)/verify/page.tsx +++ b/apps/login/src/app/(login)/verify/page.tsx @@ -8,8 +8,15 @@ import { getServiceUrlFromHeaders } from "@/lib/service-url"; import { loadMostRecentSession } from "@/lib/session"; import { getBrandingSettings, getUserByID } from "@/lib/zitadel"; import { HumanUser, User } from "@zitadel/proto/zitadel/user/v2/user_pb"; +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; import { headers } from "next/headers"; +export async function generateMetadata(): Promise { + const t = await getTranslations("verify"); + return { title: t('verify.title')}; +} + export default async function Page(props: { searchParams: Promise }) { const searchParams = await props.searchParams;