diff --git a/web-next/app/[locale]/expired-link/page.tsx b/web-next/app/[locale]/expired-link/page.tsx new file mode 100644 index 0000000..49df8e1 --- /dev/null +++ b/web-next/app/[locale]/expired-link/page.tsx @@ -0,0 +1,43 @@ +import type { Metadata } from 'next' +import { getTranslations, setRequestLocale } from 'next-intl/server' +import { Link } from '@/i18n/navigation' +import { PageShell } from '@/components/PageShell' +import { ServiceBox } from '@/components/ServiceBox' + +export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'Misc' }) + return { title: t('expiredLink.pageTitle') } +} + +/** + * Enlace caducado — réplica del partial Django `partials/expired_link.html`, + * al que se llega desde los correos de confirmación (cambio de correo, alta…). + * + * Con dos erratas del original SIN copiar: tenía un «No hay códigos de promoción + * disponibles» de otra página, y el botón "Solicitar nuevo cambio de correo" + * enlazaba a `expired-link`, o sea a sí misma. Aquí lleva a /change-email, que + * es lo que pretendía. + */ +export default async function ExpiredLinkPage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params + setRequestLocale(locale) + const t = await getTranslations('Misc') + + return ( + + +
+
+
+ {t('expiredLink.message')} +
+
+ + {t('expiredLink.requestNew')} + +
+
+
+ ) +} diff --git a/web-next/app/[locale]/maintenance/page.tsx b/web-next/app/[locale]/maintenance/page.tsx new file mode 100644 index 0000000..504d555 --- /dev/null +++ b/web-next/app/[locale]/maintenance/page.tsx @@ -0,0 +1,49 @@ +import type { Metadata } from 'next' +import { getTranslations, setRequestLocale } from 'next-intl/server' + +export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'Misc' }) + return { title: t('maintenance.pageTitle') } +} + +/** Mantenimiento — réplica del partial Django `partials/maintenance.html`. */ +export default async function MaintenancePage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params + setRequestLocale(locale) + const t = await getTranslations('Misc') + + return ( +
+
+
+
+

{t('maintenance.pageTitle')}

+
+
+
+

{t('maintenance.line1')}

+

{t('maintenance.line2')}

+
+

+ {t.rich('maintenance.discord', { + link: (c) => ( + + {c} + + ), + })} +

+ {/* eslint-disable-next-line @next/next/no-img-element */} + {t('maintenance.pageTitle')} +
+
+
+
+
+ ) +} diff --git a/web-next/messages/en.json b/web-next/messages/en.json index c7908c2..b96a24a 100644 --- a/web-next/messages/en.json +++ b/web-next/messages/en.json @@ -1373,6 +1373,17 @@ "contentType": "Content type", "media": "Media" }, + "expiredLink": { + "pageTitle": "Expired Link", + "message": "Sorry, the link you used has expired or is not valid.", + "requestNew": "Request a new email change" + }, + "maintenance": { + "pageTitle": "Maintenance", + "line1": "Our website is currently under maintenance to improve our users experience.", + "line2": "We appreciate your patience and understanding.", + "discord": "To stay informed about the maintenance status and get real-time updates, join our Discord server." + }, "downloadAddons": { "title": "Addon download", "recommended": "Recommended addons", diff --git a/web-next/messages/es.json b/web-next/messages/es.json index 417335a..461a685 100644 --- a/web-next/messages/es.json +++ b/web-next/messages/es.json @@ -1373,6 +1373,17 @@ "contentType": "Tipo de contenido", "media": "Medios" }, + "expiredLink": { + "pageTitle": "Enlace Expirado", + "message": "Lo sentimos, el enlace que ha utilizado ha expirado o no es válido.", + "requestNew": "Solicitar nuevo cambio de correo" + }, + "maintenance": { + "pageTitle": "Mantenimiento", + "line1": "Nuestro sitio web está actualmente en mantenimiento para mejorar la experiencia de nuestros usuarios.", + "line2": "Agradecemos su paciencia y comprensión.", + "discord": "Para mantenerse informados sobre el estado del mantenimiento y recibir actualizaciones en tiempo real, únanse a nuestro servidor de Discord." + }, "downloadAddons": { "title": "Descarga de addons", "recommended": "Addons recomendados",