OpenSignup has no message catalogs or translator, so none of its text can be translated
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
- 38/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- eslint, next.js, node.js, playwright, typescript
- Área
- backend, internationalization, testing, tooling
Línea de trabajo
Start with next.config.mjs, eslint.config.mjs, budgets.json, and the worker test at src/email/templates/worker-render.test.ts; inspect the existing package, test, and lint setup before adding the translator plumbing. The issue lists the required catalog and i18n entry points, plus checks to run: lint, typecheck, knip, tests, build, and budgets. Done means translation works in server, test, and worker contexts, client imports are rejected by lint, and first-load JavaScript budgets pass.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Needs your OK: this adds next-intl and the translation plumbing the rest of #619 builds on. Nothing anyone sees changes. Swap pipeline:proposed for pipeline:ready to have it built.
What happens
Every string a person sees is typed inline, in English, in components, emails and helpers. There's no catalog to translate and no function to look a message up. Text is rendered in three places with different limits:
- Server components, the bulk of the app.
'use client'bundles, whose sizebudgets.jsoncaps.- The pg-boss worker (
pnpm worker, plain Node undertsx, no Next runtime), which renders the reminder and time-changed emails.
Fix, in outline
- Packages. Add
next-intlanduse-intlat the same exact version. pnpm's isolatednode_moduleswon't resolveuse-intl/coreas a transitive dependency, and knip flags unlisted imports. Wrapnext.config.mjswithcreateNextIntlPlugin, keepingoutput: 'standalone',serverExternalPackagesandheaders()as they are. - Catalog.
src/messages/en.json, undersrc/because the runner image copies onlysrc/and the worker runs from it (a rootmessages/folder would crash the first reminder job in production). Top-level namespaces by audience:participant,email,organizer,auth,site,common. Types come from next-intl'sAppConfigaugmentation overen.json, so a missing key or a wrong argument fails typecheck. src/i18n/config.ts, pure (nonext/*, noenv.ts):CATALOG_LOCALES(justenfor now) andSHIPPED = { participant: ['en'], organizer: ['en'], site: ['en'] }, the languages complete and reviewed for each audience.src/i18n/translator.ts:getTranslator(locale, namespace, { onError }), synchronous, built onuse-intl/core'screateTranslatorover the catalogs imported as modules. English is merged under the requested language per namespace, so a gap shows English, not a key path likeparticipant.signUp. No logging import, because Playwright specs import app copy modules. It returns the same function typeuseTranslationsdoes, so a helper written against it also works in a client component.src/i18n/server.ts: passes anonErrorthat logs one pino line per missing key. The worker will import it, so nothing fromnext/*goes in it.src/i18n/request.ts: the request config the plugin requires. For now it returnsenandtimeZone: 'UTC'.- A lint rule keyed on the
'use client'directive, in a small local ESLint plugin ineslint.config.mjs: a client file may not import the translator,server.tsor a catalog, since each carries every language. Client files live outside any fixed directory list, so read the file's leading directive rather than matching paths. - Tests: an English test translator whose
onErrorthrows, so a missing key fails a test. - knip: entries for the request config and the catalogs, with a comment saying why.
Watch for
- Don't use next-intl's server hooks (
getTranslations, oruseTranslationsin server components). 18 jsdom test files render server components synchronously withrender(), and async components would break them. Server code takes a translator fromgetTranslator. server-onlycan't guard the translator: it throws undertsxand vitest. The lint rule andpnpm budgets(a client chunk with every catalog in it blows the 108 KB*budget) are the guards.- Move no copy yet beyond what the tests need. Extraction comes in later steps of #619.
- Pieces with no caller yet wait for the step that first uses them (
resolveLocale,defaultFor, language names, the client provider wrapper), or knip fails.
Choices this makes
- next-intl, over Lingui, Paraglide, react-intl and i18next. Default: next-intl. Measured client runtimes (esbuild, minified, gzip, React excluded): use-intl 11.6 KB, or 2.8 KB with its
precompileoption (a later step); Lingui 3.4 KB, but its macros need an SWC plugin tied to Next's exactswc_coreand can't run undertsx; Paraglide 2 is built for Vite and fetches plugins from a CDN at build time; react-intl 14.9 KB; i18next 17.2 KB. - ICU MessageFormat in JSON. Default: yes. Translation tools such as Weblate read it.
- One synchronous translator for server code, emails, the worker and tests, with next-intl's React provider only around client components that need text. Default: yes.
Done when
getTranslator('en', …)works in a server component, in a unit test, and under the worker toolchain (thesrc/email/templates/worker-render.test.tspattern).- A client file that imports the translator fails lint.
- No page's first-load JS changes (
pnpm build && pnpm budgets). pnpm lint && pnpm typecheck && pnpm knip && pnpm testpass.
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 step 0.1 there.
- Lenguaje dominante
- TypeScript
- Estrellas
- 19
- Forks
- 4
- Merge medio
- 19 h 34 min
- PR fusionados (30 d)
- 165
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 signupAbiertoenhancement pipeline:proposed pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
richshaw/OpenSignup#653 ·
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
-
A signup page's first Tab skips the header and lands on the next tabPosiblemente ocupada @richshaw la tomó hoy. Abiertobug good first issue pipeline:building pipeline:ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
richshaw/OpenSignup#644 · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de richshaw/OpenSignup
Issues similares
-
e2e-failure ready-to-code
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
redhat-developer/rhdh-plugin-export-overlays#4580 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
devdotfast/whiteboard#1415 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
area/sessions comp/desktop desktop/sessions P2 type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
NousResearch/hermes-agent#145383 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
enhancement p2 setup
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
vercel/eve#5419 · 1 comentario ·
Los mantenedores suelen responder en 1 día