Skip to content

feat(i18n): selector de idioma del cliente al compartir una cotizacion (tarea 12) - #75

Merged
keilynrp merged 2 commits into
masterfrom
feat/i18n-share-locale-selector
Oct 8, 2026
Merged

keilynrp merged 2 commits into
masterfrom
feat/i18n-share-locale-selector

Conversation

@keilynrp

@keilynrp keilynrp commented Oct 8, 2026

Copy link
Copy Markdown
Collaborator

Resumen

Último punto de la tarea 12 que seguía abierto desde la tarea 2: el diálogo de compartir cotización deja elegir el idioma del cliente. El backend ya guardaba locale en la sesión de portal y lo usa para redactar el correo que se le manda al cliente (desde #74 acepta en); faltaba que la interfaz lo enviara.

  • QuoteDetail: desplegable «Idioma del cliente» con los idiomas ofrecidos, cada uno escrito en sí mismo. Propone el idioma de la interfaz (quien vende suele escribirle al cliente en el suyo) y siempre manda un idioma concreto, tanto al copiar el enlace como al enviar el correo. Se restablece al cerrar el diálogo. Como el selector de la interfaz, no se dibuja si solo hay un idioma ofrecido.
  • Texto de ayuda veraz: «El correo al cliente sale en este idioma». La página del portal sigue el idioma del navegador del cliente, no el de la sesión (no lo he cambiado), y el texto no promete lo contrario.
  • services/portal.ts: locale en PortalSession y en CreateSessionDto.
  • i18n/languageName.ts: el nombre de un idioma en sí mismo sale de LanguageSelector a un módulo propio para compartirlo.
  • Dos claves nuevas en sales (es y en): shareDialog.clientLanguage y shareDialog.clientLanguageHint.

Tests

  • En español: se propone el idioma de la interfaz y se envía con la sesión, se puede escribir al cliente en otro idioma, y se restablece al cerrar y reabrir el diálogo.
  • En inglés real (english-sales.test.tsx): se propone en y se puede cambiar a es.

Verificación

  • Mutaciones: no enviar locale hace fallar 3 tests; una copia del texto en español falla el check de catálogos y el test.
  • Typecheck y lint limpios.
  • Suite completa del frontend: 51 ficheros, 773 tests.
  • Backend sin cambios (los recuentos documentados no varían).
  • El plan marca el punto como hecho.

Siguiente

Recorrer la app en inglés: textos concatenados, plurales y formato de fechas e importes (decisión babel o tabla propia, pendiente desde la tarea 10), y lo que ahora se nota más porque en ya se ofrece: el PDF de cotización (sales/pdf.py) y la prosa en español de las respuestas del portal.

🤖 Generated with Claude Code

Ultimo punto de la tarea 12 que quedaba abierto desde la tarea 2: el dialogo de compartir
cotizacion deja elegir el idioma del cliente. El backend ya guardaba `locale` en la sesion
de portal y lo usa para redactar el correo que le manda al cliente; faltaba que la
interfaz lo enviara.

- `QuoteDetail`: un desplegable «Idioma del cliente» con los idiomas ofrecidos, cada uno
  escrito en si mismo. Propone el idioma de la interfaz (el vendedor suele escribirle al
  cliente en el suyo) y siempre manda un idioma concreto, tanto al copiar el enlace como
  al enviar el correo. Se restablece al cerrar el dialogo. Como el selector de la
  interfaz, no se dibuja si solo hay un idioma ofrecido.
- Un texto de ayuda dice solo lo que es cierto: «El correo al cliente sale en este
  idioma». La pagina del portal sigue el idioma del navegador del cliente, no el de la
  sesion, y el texto no promete lo contrario.
- `services/portal.ts`: `locale` en `PortalSession` y en `CreateSessionDto`.
- `i18n/languageName.ts`: el nombre de un idioma en si mismo sale de `LanguageSelector` a
  un modulo propio para compartirlo con el dialogo.
- Dos claves nuevas en `sales` (es y en): `shareDialog.clientLanguage` y
  `shareDialog.clientLanguageHint`.

Tests: en espanol, que se propone el idioma de la interfaz y se envia con la sesion, que
se puede escribir al cliente en otro idioma y que se restablece al reabrir; en ingles
real, que se propone `en` y se puede cambiar a `es`. Comprobado con mutaciones: no enviar
`locale` hace fallar tres tests, y una copia del texto en espanol falla el check de
catalogos y el test.

El plan marca el punto como hecho.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-08T21:34:28.458626Z 398b25d PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 398b25d53a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


{/* Share dialog */}
<Dialog open={shareOpen} onOpenChange={(o) => { setShareOpen(o); if (!o) { setShareEmail(""); setShareName(""); setShareDays(14); } }}>
<Dialog open={shareOpen} onOpenChange={(o) => { setShareOpen(o); if (!o) { setShareEmail(""); setShareName(""); setShareDays(14); setShareLocale(null); } }}>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reset the locale after successful email sends

Resetting shareLocale only in onOpenChange misses the successful-send path: sendPortalEmailMutation.onSuccess closes this controlled dialog directly with setShareOpen(false), which does not invoke onOpenChange. After sending to one customer in a non-default language, reopening the dialog retains that language and can send the next customer's email in it instead of proposing the interface language as intended. Route successful closure through the reset logic or reset shareLocale in the success handler.

Useful? React with 👍 / 👎.

…selector

La politica de gobernanza exige tocar este documento cuando cambia una pagina o un
servicio, y este PR toca `QuoteDetail` y `services/portal.ts`. Ademas la fila de
internacionalizacion habia quedado desactualizada en #74: seguia diciendo que `en`
estaba retenido en `UNRELEASED_LOCALES` y que ningun segundo idioma se ofrecia.

Ahora dice que `en` se ofrece (`SUPPORTED_LOCALES`), que el selector del dialogo de
compartir cotizacion fija el idioma del correo al cliente (`portal_sessions.locale`) y
que la pagina del portal sigue el idioma del navegador del cliente. Lo que sigue sin
construir se mantiene: el PDF de cotizacion, la prosa en espanol de algunas respuestas
del portal y del `send_email` de los workflows, y el formato de fechas e importes en lo
que renderiza el servidor.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@keilynrp
keilynrp merged commit 1ecd3d9 into master Oct 8, 2026
5 checks passed
@keilynrp
keilynrp deleted the feat/i18n-share-locale-selector branch October 9, 2026 02:19
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.

1 participant