Public signup pages always say lang="en", whatever the signup's language
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- next.js, react, typescript
Línea de trabajo
Read src/services/signups.ts, src/services/signups.cached.ts, and the signup layout and page files named in the issue; check prerequisites #621 and #625 first. Trace how the row is loaded and how locale reaches metadata and the preview, then run the query-budget test and the named unit, database, and accessibility checks. Done means Swedish renders lang="sv" and sv_SE, English remains unchanged, and the public page stays within five statements.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Needs your OK: this marks a signup's pages, and its organizer preview, with the signup's language, for screen readers and link previews. Until Swedish ships every signup is English, so nothing changes yet. Swap pipeline:proposed for pipeline:ready to have it built.
What happens
After #621 the participant pages have their own root layout, but it still says lang="en". Screen readers read Swedish content with English pronunciation, and browsers offer to translate it "from English".
Fix, in outline
- One cached read, shared by the layout and the page.
- Split a pure
getSignupRowBySlug(db, slug)(one statement, skipping deleted rows) out ofgetPublicSignupinsrc/services/signups.ts. - Have
getPublicSignupaccept the row it already read rather than reading it again. It's also called with a rawdbby/api/public/signups/[slug]. - Its
cache()wrapper,loadSignupRowBySlug, lives insrc/services/signups.cached.ts. - Both the layout and
loadPublicSignupgo through it, so React dedupes it within a request andGET /s/[slug]stays at 5 statements.
- Split a pure
- The layout sets
<html lang>and next-intl's request language from the signup:resolveLocale(settings.locale, defaultFor('participant', instanceDefaultLocale()))(#625). An unknown or deleted slug gets the default. - Every page passes its own language too. A soft navigation renders a page without its layout; the "Edit" links on the signup page are
<Link>s. - Not-found pages get no params. The middleware (
src/middleware.ts) copies/s/:path*paths into the request header it already sets for/app.src/i18n/request.tsthen resolves the slug's language from it, or the participant default when there's no live signup. og:locale. Set it in the page's owngenerateMetadataopenGraph, because Next replaces a parent'sopenGraphper segment. Set it in the layout's for the edit and unsubscribe pages, which set none.- The organizer's Preview (
src/app/app/signups/[id]/preview/page.tsx) wraps the participant view inlang={signupLocale}.
Watch for
- The query-budget test (
src/app/query-budget.db.test.ts) callsPublicSignupPage()directly under vitest, wherecache()does nothing and there's no layout. Keep it counting the page alone, with a comment saying why. Add a unit test (a spy) thatloadPublicSignupgets its row throughloadSignupRowBySlug, so a second read can't creep back. - The edit and unsubscribe pages load by token, so the layout's read is one extra statement there. They have no statement budget.
- A deleted signup is gone to every service (CLAUDE.md), so the new read must skip deleted rows.
- The middleware change goes to the owner as high risk.
Order
After #621 and #625: the layout comes from #621, and the signup's language and defaultFor from #625.
Done when
- A signup with
settings.locale = 'sv'(set directly in a test) renderslang="sv"andog:localesv_SE, and an English signup is unchanged. GET /s/[slug]stays within its 5-statement budget, and the spy test passes.pnpm lint && pnpm typecheck && pnpm knip && pnpm test,pnpm test:dband the a11y e2e spec pass.
Planned with the owner in https://claude.ai/code/session_01EFKmj716ZY3b3SwR8TV8Y2 and checked against the code on main at 35288fa. The full plan is private to the owner's account: https://claude.ai/artifact/VgQH6U2s2EVx3LX991fJi8 (a Claude session on that account can open it with the Artifact tool's read action). This is part of step 1.1 there.
- Lenguaje dominante
- TypeScript
- Estrellas
- 19
- Forks
- 4
- Merge medio
- 21 h 3 min
- PR fusionados (30 d)
- 176
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de richshaw/OpenSignup
-
enhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
richshaw/OpenSignup#654 ·
Los mantenedores suelen responder en 1 día
-
The help pages never say "pause", so organizers looking for it miss Close or reopen a signupPosiblemente ocupada @richshaw la tomó hoy. Abiertoenhancement pipeline:building pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
richshaw/OpenSignup#653 · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
enhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
richshaw/OpenSignup#652 ·
Los mantenedores suelen responder en 1 día
-
SMTP timeout notes in smtp.ts and the changelog describe nodemailer 10.0, not 10.1Posiblemente ocupada @agammann la tomó hace 1 día. Abiertoenhancement good first issue pipeline:ready
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
richshaw/OpenSignup#645 ·
Los mantenedores suelen responder en 1 día
-
enhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
richshaw/OpenSignup#589 ·
Los mantenedores suelen responder en 1 día
Todos los issues de richshaw/OpenSignup
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 84/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
keptinventory/kept#336 ·
Los mantenedores suelen responder en 1 día
-
good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
-
hemi-earn
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
vetro-protocol/vetro-monorepo#1013 ·
Los mantenedores suelen responder en 1 día