Skip to content

feat(i18n): migrar los paneles de APIs y las conexiones NaN/9Router a los catálogos ES/EN — T2c slice 2 C2 (#66) - #249

Open
danielgap wants to merge 4 commits into
egdev6:mainfrom
danielgap:feat/i18n-t2c-c2-apis
Open

danielgap wants to merge 4 commits into
egdev6:mainfrom
danielgap:feat/i18n-t2c-c2-apis

Conversation

@danielgap

@danielgap danielgap commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Related issue / Issue relacionada

Refs #66

ODD: fase T2c, slice 2, C2 (último tramo del slice 2). Sigue a #216 (C1a) y #217 (C1b). Anunciada en issues/66#issuecomment-6709121892 sobre main 79ee3cd.

Scope / Alcance

Los paneles de APIs y las conexiones de NaN/9Router pasan por los catálogos. Con es todo se ve igual que hoy. Con esto cierra el slice 2: ya no quedan paneles de Ajustes fuera de catálogo.

  • Paneles de OpenRouter, NaN Builders, 9Router, Anthropic API y OpenAI API: kicker, nota, Mostrar en el widget, periodos de 9Router (Hoy/24 h/7/30/60 días/Todo), presupuesto, suborbes ocultos y desplegables «Avanzado» (settings.providers.panels.{openrouter,nan,nineRouter,adminApi}.*).
  • Conexiones: NanConnect (cuenta conectada, envío de enlace, hint del magic link), NanProbe y NineRouterConnect (conectado/desconectado, placeholder configurada, «Guardar y probar») bajo settings.providers.{nanConnect,nanProbe,nineRouterConnect}.*.
  • CodexInstall (quedaba de C1b): las 11 vistas del aviso, los 4 botones y el desplegable «Qué instala exactamente» bajo settings.providers.codexInstall.*. Ahora acepta locale (default es); su SSR ya era posible porque el controlador pasa getServerSnapshot.
  • Reuso: showInWidget, apiKey, planLabel, connect, panels.stepsAria y accountEditor.{nanApiKeyAlt, adminKey, budgetTitle, budgetLabel} cuando el texto es idéntico.
  • Paneles extraídos verbatim para SSR (OpenRouterPanel, NanPanel, NineRouterPanel, AdminApiPanel); los tres connects ya eran módulo y reciben locale.
  • Guard settings-visibility migrado a forma por clave (patrón destructive-buttons): exige el valor verbatim en el catálogo es y el cableado t(locale, …) en los 11 toggles. Ninguna aserción quitada.
  • Texto con elementos dentro: frases partidas alrededor de <code>, <Link> y <b> (nota de NaN con /v1/usage, nota de 9Router con la marca en negrita, hints de Admin key, <li> de «Qué instala exactamente»).
  • Quedan literales: marcas y títulos (OpenRouter, NaN Builders, 9Router…), Base URL, Admin API key (sk-ant-admin…), opciones de plan (nan_community, nan_member, GLM Premium), labels de consolas de terceros (openrouter.ai › Keys, cloud.nan.builders › API Keys, Organization › Admin keys, Docs), el placeholder de URL del enlace de NaN y los mensajes del backend (msg, view.message), que son datos.

Fuera de alcance:

Tamaño: +848/−252 en el commit feat (6 archivos; 335 son el test nuevo y 246 los catálogos), más el inventario regenerado aparte. El foco de revisión: src/Settings.tsx (extracción + t()) y src/components/CodexInstall.tsx.

Commits: 481c994 (feat) y fcfd1e9 (inventario regenerado), sobre main 79ee3cd.

Coordination / Coordinación

Contribuidor: @danielgap
Evidencia: asignación en #66 y anuncio de C2.

Acceptance and validation / Aceptación y validación

  • Criterios cumplidos: paneles de APIs y conexiones por catálogo; es idéntico a hoy; en completo en esos paneles; sin aserciones quitadas.
  • Comprobaciones ejecutadas (RED→GREEN):
    • npx vitest run --dir src: 934/934 (71 archivos). 13 tests nuevos (src/Settings-api-panels-i18n.test.tsx): tras extraer sin migrar, los 6 de es pasaban (extracción verbatim) y fallaban los 7 de en; tras migrar, 13/13.
    • npm run typecheck: OK.
    • Suite completa node --test "scripts/*.test.mjs" "scripts/security/*.test.mjs": 282 pasan.
    • node scripts/i18n-inventory.mjs --check: OK sobre fcfd1e9.
  • Comprobaciones con fallos ambientales: 12 fallos en dos familias, reproducidos también en main 79ee3cd: EPERM de symlink en Windows (3 setup-signing, 1 provision-tools) y ausencia de python3 (alias del Store) en los tests de notarización/release de macOS (8). Nota: node --test scripts/ en forma directorio no parsea en node v24.19.0 + git-bash; usé la forma glob.
  • Comprobaciones no ejecutadas: cargo test, porque la rama no toca Rust.
  • Prueba manual EN: hecha por el contribuidor en Windows sobre esta rama antes de abrir la PR, con OK. Los tests SSR además cubren es verbatim y en con negativos de español en los mismos puntos.
  • Bloqueos pendientes: ninguno.

Copilot AI balanced review requested due to automatic review settings November 7, 2026 23:24

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

@egdev6 egdev6 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@danielgap muy buen cierre del slice 2. La extracción de los paneles es fiel al original y el guard de settings-visibility queda igual de estricto. Solo hay un detalle que bloquea:

Se pierde un espacio en el hint de Admin key de Anthropic (AdminApiPanel en src/Settings.tsx):

{t(locale, 'settings.providers.panels.adminApi.anthropicHintBefore')} <Link href={LINKS.anthropicAdmin}>Admin key</Link>
{t(locale, 'settings.providers.panels.adminApi.anthropicHintAfter')}

En JSX, el salto de línea entre </Link> y {…} se elimina, así que en es pasa de «…hace falta una Admin key (solo lectura de la organización).» a «…una Admin key(solo lectura de la organización).». Rompe la promesa de que es se ve igual que hoy, y los tests SSR no lo detectan. Basta con añadir {' '} tras </Link> (o unir ambas piezas en una línea) y, si puedes, una aserción sobre la frase completa para que no vuelva.

Detalles opcionales, no bloquean:

  • Algunas frases de en.ts suenan poco naturales: 'Month and today spend' (mejor "This month's and today's spend"), 'paints the period spend bar against the cap you set' ("shows the period spend bar against your cap"), '0 = any that spends' ("0 = show any with spend"), 'before considering it good' ("before accepting it").
  • codexInstall.installedRest menciona «Sign in»: conviene confirmar que coincide con el texto real del botón en en.

Con el espacio corregido, por mi parte está lista. ¡Gracias!

…es en inglés (egdev6#66)

- AdminApiPanel: {' '} tras </Link>; JSX descartaba el salto de línea y en es
  se leía «Admin key(solo lectura…».
- Test SSR con la frase completa en es y en para que no vuelva.
- en.ts: frases más naturales sugeridas en la revisión de egdev6#249.
@danielgap

Copy link
Copy Markdown
Contributor Author

@egdev6 gracias por la revisión, muy buena pillada lo del espacio. Ya está corregido en 04c97cf:

  • Espacio del hint de Admin key: añadido {' '} tras </Link> en AdminApiPanel. En es vuelve a leerse «…hace falta una Admin key (solo lectura de la organización).».
  • Aserción de la frase completa: el test SSR ahora comprueba Admin key</a> (solo lectura de la organización). en es y Admin key</a> (organization read-only). en en. Lo vi fallar en ambos idiomas antes del fix.
  • Frases de en.ts: aplicadas las cuatro que sugeriste ("This month's and today's spend", "shows the period spend bar against your cap", "0 = show any with spend", "before accepting it").
  • «Sign in» en codexInstall.installedRest: coincide con el texto real del botón en en (cliConnect.signIn), así que lo dejé igual.

El inventario está regenerado como último commit (083aaf6).

Checks en local: vitest 934/934, tsc OK, i18n-inventory --check OK.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants