EPPA — Clinical Translation Review Packet (L22)¶
Status: Draft pending clinical reviewer sign-off Source of truth:
messages/es.json(clinician-authored, Spanish – Rioplatense register) Locales under review:en,de,pt-BR(machine-drafted, no clinical review yet) Repo path:fronts/eppa/messages/
0. How to use this packet¶
- Read the Glossary first. It captures the clinical / anatomical / protocol vocabulary that recurs across the UI. Fixing a term here propagates to every screen.
- Then walk the By-namespace review tables. Each row is a single UI string, identified by its flat JSON key (e.g.
home.howToStart.step3) so a developer can find it instantly in code. - Any row that the auto-review flagged as suspicious carries a ⚠️ in the rightmost column. Replace ⚠️ with ✅ once you have validated the translation, or write the corrected wording directly into that cell.
- The Known concerns section calls out structural risks (button overflow, locale dialect, decimal separator) that no per-string review can catch.
- Finish with the Sign-off checklist at the bottom.
Sign-off process¶
| Step | Owner | Action |
|---|---|---|
| 1 | Clinical reviewer | Annotate this file directly (replace ⚠️ with ✅ or with corrected text). |
| 2 | Clinical reviewer | Sign the checklist at the bottom (name + date). |
| 3 | Dev team | Apply corrections to messages/{en,de,pt-BR}.json. |
| 4 | Dev team | Update _meta.lastReviewed and _meta.reviewer in each JSON; set _meta.translationStatus to "clinically-reviewed". |
| 5 | Dev team | Visual QA pass (especially German button widths). |
Deadline¶
Target sign-off date: TBD — to be confirmed with project lead.
Feedback channel¶
Email: TBD — to be configured (placeholder: labis-eppa@uca.edu.ar).
1. Glossary — Clinical / Anatomical / Protocol Terms¶
The terms below are the clinical vocabulary that drives EPPA. If the reviewer disagrees with any of these, almost every UI table downstream will need a follow-up correction. Review this section first.
| # | es (source) | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| G01 | Evaluación Posturográfica de Pie Automatizada | Automated Standing Postural Assessment | Automatisierte posturale Standanalyse | Avaliação Posturográfica Automatizada em Pé | ⚠️ |
| G02 | marcadores anatómicos | anatomical markers | anatomische Marker | marcadores anatômicos | ⚠️ |
| G03 | puntos anatómicos | anatomical points / landmarks | anatomische Punkte | pontos anatômicos | ⚠️ |
| G04 | captura de marcadores | marker capture | Markererfassung | captura de marcadores | ⚠️ |
| G05 | vista anterior | anterior view | Vorderansicht | vista anterior | ⚠️ |
| G06 | vista posterior | posterior view | Rückansicht | vista posterior | ⚠️ |
| G07 | perfil derecho / lateral derecha | right profile / right lateral | Profil rechts | perfil direito | ⚠️ |
| G08 | perfil izquierdo / lateral izquierda | left profile / left lateral | Profil links | perfil esquerdo | ⚠️ |
| G09 | análisis en plano frontal | frontal plane analysis | Analyse in der Frontalebene | análise no plano frontal | ⚠️ |
| G10 | análisis en plano posterior | posterior plane analysis | Analyse in der Rückenebene | análise no plano posterior | ⚠️ |
| G11 | alineación sagital derecha | right sagittal alignment | sagittale Ausrichtung rechts | alinhamento sagital direito | ⚠️ |
| G12 | alineación sagital izquierda | left sagittal alignment | sagittale Ausrichtung links | alinhamento sagital esquerdo | ⚠️ |
| G13 | calibrar la imagen | calibrate the image | das Bild kalibrieren | calibrar a imagem | ⚠️ |
| G14 | calibrar la grilla | calibrate the grid | das Raster kalibrieren | calibrar a grade | ⚠️ |
| G15 | análisis postural por vista | per-view postural analysis | ansichtsbasierte Posturanalyse | análise postural por vista | ⚠️ |
| G16 | flujo clínico | clinical workflow | klinischer Ablauf | fluxo clínico | ⚠️ |
| G17 | captura clínica de puntos anatómicos | clinical capture of anatomical landmarks | klinische Erfassung anatomischer Punkte | captura clínica de pontos anatômicos | ⚠️ |
| G18 | ID Paciente / ID del paciente | Patient ID | Patienten-ID | ID do paciente | ⚠️ |
| G19 | sesión local | local session | lokale Sitzung | sessão local | ⚠️ |
| G20 | reporte CSV / informe | CSV report | CSV-Bericht | relatório CSV | ⚠️ |
| G21 | resultados reproducibles | reproducible results | reproduzierbare Ergebnisse | resultados reproduzíveis | ⚠️ |
| G22 | Solo uso de investigación. No es un dispositivo médico. | Research use only. Not a medical device. | Nur für Forschungszwecke. Kein Medizinprodukt. | Uso apenas para pesquisa. Não é um dispositivo médico. | ⚠️ |
| G23 | profesional clínico | clinical practitioner | Klinische Fachperson | profissional clínico | ⚠️ |
| G24 | estimado por IA | AI-estimated | KI-geschätzt | estimado por IA | ⚠️ |
| G25 | punto de referencia temporal | temporary reference point | temporärer Referenzpunkt | ponto de referência temporário | ⚠️ |
| G26 | auto-detectar (marcadores) | auto-detect (markers) | automatisch erkennen | detectar automaticamente | ⚠️ |
| G27 | detección automática de marcadores | automatic marker detection | automatische Markererkennung | detecção automática de marcadores | ⚠️ |
| G28 | marcadores verdes | green markers | grüne Marker | marcadores verdes | ⚠️ |
| G29 | tipo de vista | view type | Ansichtstyp | tipo de vista | ⚠️ |
| G30 | fotografía postural (implícito) | postural photograph (implicit) | posturale Aufnahme (implicit) | fotografia postural (implícito) | ⚠️ |
Notes for the reviewer:
- G01 — The Spanish full name carries "de Pie" (standing). The German rendering folds this into "Stand". Confirm "Standanalyse" reads as "standing analysis" and not "stance analysis" / "Standanalyse als Branding".
- G06 / G10 — German
Rückenebeneis unusual; standard anatomy isFrontalebene(anterior) vsDorsalebene/Sagittalebene. The current draft says "Rückenebene" — please confirm or replace withDorsalebene/Hinteransicht-Ebene. - G07–G12 — The Spanish source uses two registers:
Perfil Derecho(in route labels) andLateral Der.(in short tags). The other locales preserve this. Confirm both registers are clinically acceptable. - G14 — pt-BR
gradefor grid. In Brazilian physiotherapy literature, bothgradeandgrelhaappear; please confirmgradeis the standard. - G22 — Disclaimer wording. This is regulatory-adjacent. Please confirm wording in each locale satisfies the local regulator's expectations for "research use only / not a medical device" claims.
2. By-namespace review tables¶
Convention: rightmost column is per-row sign-off. ⚠️ = auto-review flagged. ✅ = reviewer signed off. Replace ⚠️ with ✅ (or with corrected text) as you walk down the table.
2.1 common (4 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| common.appName | EPPA | EPPA | EPPA | EPPA | ✅ |
| common.appTagline | Evaluación Posturográfica de Pie Automatizada | Automated Standing Postural Assessment | Automatisierte posturale Standanalyse | Avaliação Posturográfica Automatizada em Pé | ⚠️ |
| common.labisCredit | LABIS UCA | LABIS UCA | LABIS UCA | LABIS UCA | ✅ |
| common.researchUseOnly | Solo uso de investigación — No es un dispositivo médico | Research use only — Not a medical device | Nur für Forschungszwecke — Kein Medizinprodukt | Uso apenas para pesquisa — Não é um dispositivo médico | ⚠️ |
(<5 strings would merge into Misc, but this is a high-impact namespace — kept as its own table.)
2.2 layout (4 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| layout.skipToContent | Ir al contenido | Skip to content | Zum Inhalt springen | Pular para o conteúdo | ✅ |
| layout.tutorial | Tutorial | Tutorial | Tutorial | Tutorial | ✅ |
| layout.themeToggle | Cambiar tema | Toggle theme | Design umschalten | Alternar tema | ⚠️ |
| layout.languageSwitcher | Idioma | Language | Sprache | Idioma | ✅ |
layout.themeToggle — German Design umschalten reads as "toggle design". Confirm vs Thema umschalten / Erscheinungsbild umschalten.
2.3 header (4 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| header.brand | EPPA | EPPA | EPPA | EPPA | ✅ |
| header.home | Inicio | Home | Start | Início | ✅ |
| header.markerCapture | Captura de Marcadores | Marker Capture | Markererfassung | Captura de Marcadores | ⚠️ |
| header.patientBadge | Paciente: {id} | Patient: {id} | Patient: {id} | Paciente: {id} | ✅ |
Markererfassung is a compound noun — may overflow on narrow header. See Known Concerns §4.1.
2.4 routes (6 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| routes.home | Inicio | Home | Start | Início | ✅ |
| routes.markerCapture | Captura de Marcadores | Marker Capture | Markererfassung | Captura de Marcadores | ⚠️ |
| routes.anterior | Vista Anterior | Anterior View | Vorderansicht | Vista Anterior | ✅ |
| routes.posterior | Vista Posterior | Posterior View | Rückansicht | Vista Posterior | ⚠️ |
| routes.lateralDerecha | Perfil Derecho | Right Profile | Profil rechts | Perfil Direito | ✅ |
| routes.lateralIzquierda | Perfil Izquierdo | Left Profile | Profil links | Perfil Esquerdo | ✅ |
Note: route keys lateralDerecha / lateralIzquierda keep Spanish casing in the JSON keys (internal only, not user-visible). Confirm Rückansicht (G06).
2.5 home (17 strings, including nested howToStart)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| home.heroHeading | Flujo clínico | Clinical workflow | Klinischer Ablauf | Fluxo clínico | ✅ |
| home.heroDescription | Capture marcadores anatómicos, calibre la imagen y ejecute el análisis postural por vista con resultados reproducibles. | Capture anatomical markers, calibrate the image, and run per-view postural analysis with reproducible results. | Erfassen Sie anatomische Marker, kalibrieren Sie das Bild und führen Sie eine ansichtsbasierte Posturanalyse mit reproduzierbaren Ergebnissen durch. | Capture marcadores anatômicos, calibre a imagem e execute a análise postural por vista com resultados reproduzíveis. | ⚠️ |
| home.sessionBadge | Sesión local | Local session | Lokale Sitzung | Sessão local | ✅ |
| home.newSession | Nueva sesión | New session | Neue Sitzung | Nova sessão | ✅ |
| home.patientIdLabel | ID Paciente | Patient ID | Patienten-ID | ID do paciente | ✅ |
| home.patientIdPlaceholder | Ej: PAC-001 | e.g. PAT-001 | z. B. PAT-001 | Ex.: PAC-001 | ⚠️ |
| home.markerCaptureTitle | Captura de Marcadores | Marker Capture | Markererfassung | Captura de Marcadores | ✅ |
| home.markerCaptureDescription | Cargar imagen, seleccionar vista y ubicar puntos anatómicos. | Upload an image, choose a view, and place anatomical points. | Bild hochladen, Ansicht auswählen und anatomische Punkte setzen. | Carregar imagem, selecionar vista e marcar pontos anatômicos. | ✅ |
| home.sessionProgressHeading | Progreso de la sesión | Session progress | Sitzungsfortschritt | Progresso da sessão | ✅ |
| home.generateReportCsv | Generar Reporte CSV | Generate CSV Report | CSV-Bericht erstellen | Gerar Relatório CSV | ✅ |
| home.sessionSummaryWithPatient | Paciente: {patientId} | Patient: {patientId} | Patient: {patientId} | Paciente: {patientId} | ✅ |
| home.sessionSummaryNoPatient | Sin ID de paciente | No patient ID | Keine Patienten-ID | Sem ID de paciente | ✅ |
| home.sessionSummaryCompleted | {ICU plural — see es.json} | {ICU plural — see en.json} | {ICU plural — see de.json} | {ICU plural — see pt-BR.json} | ⚠️ |
| home.howToStart.title | Cómo empezar | How to start | Erste Schritte | Como começar | ✅ |
| home.howToStart.step1 | Abra Captura de Marcadores y cargue la imagen del paciente. | Open Marker Capture and upload the patient image. | Öffnen Sie Markererfassung und laden Sie das Patientenbild hoch. | Abra Captura de Marcadores e carregue a imagem do paciente. | ✅ |
| home.howToStart.step2 | Seleccione la vista correspondiente y ubique los puntos anatómicos requeridos. | Select the corresponding view and place the required anatomical points. | Wählen Sie die entsprechende Ansicht aus und setzen Sie die erforderlichen anatomischen Punkte. | Selecione a vista correspondente e marque os pontos anatômicos necessários. | ✅ |
| home.howToStart.step3 | Ingrese a la vista de análisis, calibre la grilla y ejecute los cálculos. | Enter the analysis view, calibrate the grid and run the calculations. | Wechseln Sie zur Analyseansicht, kalibrieren Sie das Raster und führen Sie die Berechnungen aus. | Entre na vista de análise, calibre a grade e execute os cálculos. | ⚠️ |
| home.howToStart.step4 | Exporte los resultados como CSV o capture la pantalla para el informe. | Export the results as CSV or take a screenshot for the report. | Exportieren Sie die Ergebnisse als CSV oder erstellen Sie einen Screenshot für den Bericht. | Exporte os resultados em CSV ou capture a tela para o relatório. | ✅ |
| home.tutorialMarkerCapture | Tutorial: Captura de Marcadores | Tutorial: Marker Capture | Tutorial: Markererfassung | Tutorial: Captura de Marcadores | ✅ |
| home.tutorialAnteriorAnalysis | Tutorial: Análisis Anterior | Tutorial: Anterior Analysis | Tutorial: Vorderansicht-Analyse | Tutorial: Análise Anterior | ⚠️ |
patientIdPlaceholder — Spanish uses PAC-001, English/German use PAT-001, pt-BR keeps PAC-001. Confirm whether the placeholder format should be unified (e.g. PAC- everywhere) or localized.
2.6 analysisViews (12 strings, 4 nested groups)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| analysisViews.anterior.title | Vista Anterior | Anterior View | Vorderansicht | Vista Anterior | ✅ |
| analysisViews.anterior.detail | Análisis en plano frontal | Frontal plane analysis | Analyse in der Frontalebene | Análise no plano frontal | ✅ |
| analysisViews.anterior.short | Anterior | Anterior | Frontal | Anterior | ⚠️ |
| analysisViews.posterior.title | Vista Posterior | Posterior View | Rückansicht | Vista Posterior | ⚠️ |
| analysisViews.posterior.detail | Análisis en plano posterior | Posterior plane analysis | Analyse in der Rückenebene | Análise no plano posterior | ⚠️ |
| analysisViews.posterior.short | Posterior | Posterior | Dorsal | Posterior | ⚠️ |
| analysisViews.lateralDerecha.title | Perfil Derecho | Right Profile | Profil rechts | Perfil Direito | ✅ |
| analysisViews.lateralDerecha.detail | Alineación sagital derecha | Right sagittal alignment | Sagittale Ausrichtung rechts | Alinhamento sagital direito | ✅ |
| analysisViews.lateralDerecha.short | Lateral Der. | Right lat. | Lateral R. | Lateral Dir. | ⚠️ |
| analysisViews.lateralIzquierda.title | Perfil Izquierdo | Left Profile | Profil links | Perfil Esquerdo | ✅ |
| analysisViews.lateralIzquierda.detail | Alineación sagital izquierda | Left sagittal alignment | Sagittale Ausrichtung links | Alinhamento sagital esquerdo | ✅ |
| analysisViews.lateralIzquierda.short | Lateral Izq. | Left lat. | Lateral L. | Lateral Esq. | ⚠️ |
Concern: the German short values (Frontal, Dorsal) drift from the longer title values (Vorderansicht, Rückansicht). Decide whether the short tag should mirror the title's root (Vorder. / Rück.) or use the anatomical plane terms.
2.7 dashboard (13 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| dashboard.welcome | Bienvenido/a, {email} | Welcome, {email} | Willkommen, {email} | Bem-vindo/a, {email} | ✅ |
| dashboard.welcomeRole | {ICU select — Administrador/a / Profesional clínico / Modo lectura / Profesional} | {ICU select — Administrator / Clinical practitioner / Read-only / Practitioner} | {ICU select — Administrator/in / Klinische Fachperson / Nur-Lese-Modus / Fachperson} | {ICU select — Administrador/a / Profissional clínico / Somente leitura / Profissional} | ⚠️ |
| dashboard.quickActionsHeading | Acciones rápidas | Quick actions | Schnellaktionen | Ações rápidas | ✅ |
| dashboard.newCaptureTitle | Iniciar captura de marcadores | Start marker capture | Markererfassung starten | Iniciar captura de marcadores | ✅ |
| dashboard.newCaptureDescription | Cargar imagen, seleccionar vista y ubicar puntos anatómicos. | Upload an image, choose a view, and place anatomical points. | Bild hochladen, Ansicht auswählen und anatomische Punkte setzen. | Carregar imagem, selecionar vista e marcar pontos anatômicos. | ✅ |
| dashboard.openAnalysisTitle | Abrir vista de análisis | Open analysis view | Analyseansicht öffnen | Abrir vista de análise | ✅ |
| dashboard.openAnalysisDescription | Anterior · Posterior · Lateral derecho · Lateral izquierdo | Anterior · Posterior · Right profile · Left profile | Vorderansicht · Rückansicht · Rechtes Profil · Linkes Profil | Anterior · Posterior · Perfil direito · Perfil esquerdo | ⚠️ |
| dashboard.recentActivityHeading | Actividad reciente | Recent activity | Letzte Aktivität | Atividade recente | ✅ |
| dashboard.recentActivityEmpty | Sin actividad reciente. Iniciá una captura para empezar. | No recent activity. Start a capture to begin. | Keine kürzliche Aktivität. Starten Sie eine Erfassung, um zu beginnen. | Sem atividade recente. Inicie uma captura para começar. | ⚠️ |
| dashboard.recentSessionLabel | Paciente: {patientId} | Patient: {patientId} | Patient: {patientId} | Paciente: {patientId} | ✅ |
| dashboard.recentSessionViewCount | {ICU plural} | {ICU plural} | {ICU plural} | {ICU plural} | ✅ |
| dashboard.patientListHeading | Lista de pacientes | Patient list | Patientenliste | Lista de pacientes | ✅ |
| dashboard.patientListComingSoon | Próximamente. Por ahora, los datos viven en tu sesión del navegador hasta que se vincule un paciente a este dispositivo. | Coming soon. For now, data lives in your browser session until a patient is bound to this device. | Demnächst verfügbar. Vorerst bleiben die Daten in Ihrer Browser-Sitzung, bis ein Patient mit diesem Gerät verknüpft wird. | Em breve. Por enquanto, os dados ficam na sessão do navegador até que um paciente seja vinculado a este dispositivo. | ⚠️ |
| dashboard.complianceFooter | Solo uso de investigación. No es un dispositivo médico. | Research use only. Not a medical device. | Nur für Forschungszwecke. Kein Medizinprodukt. | Uso apenas para pesquisa. Não é um dispositivo médico. | ⚠️ |
dashboard.welcomeRole — German Klinische Fachperson is gender-neutral and matches the inclusive register of the Spanish "Profesional clínico". Confirm acceptable in DACH clinical settings.
dashboard.recentActivityEmpty — Spanish uses voseo ("Iniciá") which is es-AR. See Known Concerns §4.3.
2.8 auth (32 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| auth.loginTitle | Iniciar sesión | Sign in | Anmelden | Entrar | ✅ |
| auth.loginSubtitle | Accedé a tu cuenta clínica | Access your clinical account | Zugang zu Ihrem klinischen Konto | Acesse sua conta clínica | ⚠️ |
| auth.emailLabel | Correo electrónico | ✅ | |||
| auth.emailPlaceholder | tu.email@clinica.com | you@clinic.com | sie@klinik.de | voce@clinica.com | ⚠️ |
| auth.passwordLabel | Contraseña | Password | Passwort | Senha | ✅ |
| auth.passwordPlaceholder | •••••••••• | •••••••••• | •••••••••• | •••••••••• | ✅ |
| auth.loginButton | Iniciar sesión | Sign in | Anmelden | Entrar | ✅ |
| auth.loggingIn | Iniciando sesión… | Signing in… | Anmeldung… | Entrando… | ⚠️ |
| auth.forgotPassword | ¿Olvidaste tu contraseña? | Forgot your password? | Passwort vergessen? | Esqueceu sua senha? | ✅ |
| auth.logoutButton | Cerrar sesión | Sign out | Abmelden | Sair | ✅ |
| auth.errorInvalid | Correo o contraseña incorrectos | Incorrect email or password | E-Mail oder Passwort falsch | E-mail ou senha incorretos | ✅ |
| auth.errorRateLimit | Demasiados intentos. Esperá unos minutos. | Too many attempts. Wait a few minutes. | Zu viele Versuche. Bitte einige Minuten warten. | Muitas tentativas. Aguarde alguns minutos. | ⚠️ |
| auth.errorNetwork | Error de red. Reintentá. | Network error. Retry. | Netzwerkfehler. Erneut versuchen. | Erro de rede. Tente novamente. | ⚠️ |
| auth.errorGeneric | No se pudo iniciar sesión. Reintentá. | Could not sign in. Retry. | Anmeldung fehlgeschlagen. Erneut versuchen. | Não foi possível entrar. Tente novamente. | ✅ |
| auth.researchOnlyDisclaimer | Uso de investigación. No es un dispositivo médico. | Research use only. Not a medical device. | Nur für Forschungszwecke. Kein Medizinprodukt. | Uso apenas para pesquisa. Não é um dispositivo médico. | ⚠️ |
| auth.forgotPasswordTitle | Recuperar contraseña | Reset password | Passwort zurücksetzen | Recuperar senha | ⚠️ |
| auth.forgotPasswordSubtitle | Te enviaremos un enlace para restablecer tu contraseña. | We'll email you a link to reset your password. | Wir senden Ihnen einen Link zum Zurücksetzen Ihres Passworts. | Vamos enviar um link para você redefinir sua senha. | ✅ |
| auth.forgotPasswordSubmit | Enviar enlace | Send reset link | Link senden | Enviar link | ⚠️ |
| auth.forgotPasswordSubmitting | Enviando… | Sending… | Wird gesendet… | Enviando… | ✅ |
| auth.forgotPasswordSuccess | Si existe una cuenta con ese correo, recibirás un enlace para restablecer la contraseña. | If an account with that email exists, you'll receive a password reset link. | Wenn ein Konto mit dieser E-Mail existiert, erhalten Sie einen Link zum Zurücksetzen des Passworts. | Se existir uma conta com esse e-mail, você receberá um link para redefinir a senha. | ✅ |
| auth.forgotPasswordBackToLogin | Volver a iniciar sesión | Back to sign in | Zurück zur Anmeldung | Voltar para entrar | ⚠️ |
| auth.resetPasswordTitle | Nueva contraseña | New password | Neues Passwort | Nova senha | ✅ |
| auth.resetPasswordSubtitle | Elegí una contraseña nueva para tu cuenta. | Choose a new password for your account. | Wählen Sie ein neues Passwort für Ihr Konto. | Escolha uma nova senha para sua conta. | ⚠️ |
| auth.resetPasswordNewLabel | Contraseña nueva | New password | Neues Passwort | Nova senha | ✅ |
| auth.resetPasswordConfirmLabel | Confirmar contraseña | Confirm password | Passwort bestätigen | Confirmar senha | ✅ |
| auth.resetPasswordSubmit | Guardar contraseña | Save password | Passwort speichern | Salvar senha | ✅ |
| auth.resetPasswordSubmitting | Guardando… | Saving… | Wird gespeichert… | Salvando… | ✅ |
| auth.resetPasswordSuccess | Tu contraseña fue actualizada. Ya podés iniciar sesión. | Your password has been updated. You can now sign in. | Ihr Passwort wurde aktualisiert. Sie können sich jetzt anmelden. | Sua senha foi atualizada. Agora você pode entrar. | ⚠️ |
| auth.resetPasswordInvalidLink | Este enlace no es válido o ya expiró. | This link is invalid or has expired. | Dieser Link ist ungültig oder abgelaufen. | Este link é inválido ou já expirou. | ✅ |
| auth.resetPasswordInvalidLinkAction | Solicitar un nuevo enlace | Request a new link | Neuen Link anfordern | Solicitar um novo link | ✅ |
| auth.resetPasswordErrorMismatch | Las contraseñas no coinciden. | Passwords do not match. | Passwörter stimmen nicht überein. | As senhas não coincidem. | ✅ |
| auth.resetPasswordErrorTooShort | La contraseña debe tener al menos 10 caracteres. | Password must be at least 10 characters. | Das Passwort muss mindestens 10 Zeichen lang sein. | A senha deve ter pelo menos 10 caracteres. | ✅ |
| auth.resetPasswordErrorTokenInvalid | El enlace de recuperación no es válido o ya expiró. | The recovery link is invalid or has expired. | Der Wiederherstellungslink ist ungültig oder abgelaufen. | O link de recuperação é inválido ou expirou. | ✅ |
| auth.resetPasswordBackToLogin | Ir a iniciar sesión | Go to sign in | Zur Anmeldung | Ir para entrar | ⚠️ |
auth.loggingIn — German Anmeldung… is a noun ("login…") not a gerund. Confirm whether Anmelden… (verb) would read better. Same shape as the source's gerund.
auth.emailPlaceholder — voce@clinica.com is missing diacritic (você). Confirm whether placeholders should keep ASCII for usability or use proper pt-BR diacritics.
2.9 imageDisplay (9 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| imageDisplay.loupe | Lupa | Loupe | Lupe | Lupa | ✅ |
| imageDisplay.loupeTitle | Lupa (mantener Shift o alternar) | Loupe (hold Shift or toggle) | Lupe (Shift halten oder umschalten) | Lupa (segurar Shift ou alternar) | ✅ |
| imageDisplay.zoomIn | Acercar | Zoom in | Vergrößern | Aproximar | ✅ |
| imageDisplay.zoomOut | Alejar | Zoom out | Verkleinern | Afastar | ✅ |
| imageDisplay.actualSize | Tamaño real (1:1) | Actual size (1:1) | Originalgröße (1:1) | Tamanho real (1:1) | ✅ |
| imageDisplay.fit | Encuadrar | Fit to viewport | An Ansicht anpassen | Enquadrar | ⚠️ |
| imageDisplay.minimap | Mini mapa de la imagen | Image mini-map | Bild-Übersicht | Minimapa da imagem | ⚠️ |
| imageDisplay.estimatedByAi | estimado por IA | AI-estimated | KI-geschätzt | estimado por IA | ✅ |
| imageDisplay.tempReferencePoint | Punto de referencia temporal | Temporary reference point | Temporärer Referenzpunkt | Ponto de referência temporário | ✅ |
imageDisplay.fit — English "Fit to viewport" is more descriptive than the Spanish "Encuadrar" / German "An Ansicht anpassen". Confirm consistency target (terse vs descriptive).
2.10 toast (top-level, 8 strings)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| toast.newSessionTitle | Nueva sesión iniciada | New session started | Neue Sitzung gestartet | Nova sessão iniciada | ✅ |
| toast.newSessionDescription | Se borraron los datos del paciente y los resultados anteriores. | Patient data and previous results have been cleared. | Patientendaten und vorherige Ergebnisse wurden gelöscht. | Os dados do paciente e os resultados anteriores foram apagados. | ✅ |
| toast.csvGeneratedTitle | Reporte CSV generado | CSV report generated | CSV-Bericht erstellt | Relatório CSV gerado | ✅ |
| toast.csvGeneratedDescription | El archivo se descargó correctamente. | The file was downloaded successfully. | Die Datei wurde erfolgreich heruntergeladen. | O arquivo foi baixado com sucesso. | ✅ |
| toast.noResultsTitle | Sin resultados | No results | Keine Ergebnisse | Sem resultados | ✅ |
| toast.noResultsDescription | Complete al menos una vista de análisis antes de generar el reporte. | Complete at least one analysis view before generating the report. | Bitte schließen Sie mindestens eine Analyseansicht ab, bevor Sie den Bericht erstellen. | Conclua pelo menos uma vista de análise antes de gerar o relatório. | ✅ |
| toast.selectMarkerTitle | Seleccione marcador | Select marker | Marker auswählen | Selecione um marcador | ✅ |
| toast.selectMarkerDescription | Por favor, elija un marcador de una de las listas. | Please choose a marker from one of the lists. | Bitte wählen Sie einen Marker aus einer der Listen. | Por favor, escolha um marcador em uma das listas. | ✅ |
2.11 markers (top-level — 20 strings, plus nested dialogs and 32-string markers.toast)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| markers.srHeading | Captura clínica de puntos anatómicos | Clinical capture of anatomical landmarks | Klinische Erfassung anatomischer Punkte | Captura clínica de pontos anatômicos | ⚠️ |
| markers.homeButton | PANTALLA PRINCIPAL | HOME SCREEN | STARTBILDSCHIRM | TELA PRINCIPAL | ⚠️ |
| markers.openButton | Abrir | Open | Öffnen | Abrir | ✅ |
| markers.fileInputAria | Seleccionar imagen del paciente | Select patient image | Patientenbild auswählen | Selecionar imagem do paciente | ✅ |
| markers.useCameraButton | Usar Cámara | Use Camera | Kamera verwenden | Usar Câmera | ✅ |
| markers.detectingButton | Detectando... | Detecting… | Erkenne… | Detectando… | ⚠️ |
| markers.idLabel | ID | ID | ID | ID | ✅ |
| markers.heading | Marcadores | Markers | Marker | Marcadores | ✅ |
| markers.selectMarkerPlaceholder | Elegir Marcador | Choose marker | Marker auswählen | Escolher Marcador | ✅ |
| markers.selectButton | Seleccionar | Select | Auswählen | Selecionar | ✅ |
| markers.autoDetectButton | Auto-detectar | Auto-detect | Automatisch erkennen | Detectar automaticamente | ⚠️ |
| markers.capturedHeading | Capturados ({count}) | Captured ({count}) | Erfasst ({count}) | Capturados ({count}) | ✅ |
| markers.emptyMessage | No hay marcadores aún. | No markers yet. | Noch keine Marker. | Ainda não há marcadores. | ✅ |
| markers.estimatedByAiSuffix | (IA) | (AI) | (KI) | (IA) | ✅ |
| markers.deleteRowButton | Borrar Fila | Delete Row | Zeile löschen | Apagar Linha | ✅ |
| markers.saveButton | Guardar | Save | Speichern | Salvar | ✅ |
| markers.openImagePrompt | Abra una imagen para comenzar | Open an image to begin | Öffnen Sie ein Bild, um zu beginnen | Abra uma imagem para começar | ✅ |
| markers.imageFormatsHint | JPG o PNG | JPG or PNG | JPG oder PNG | JPG ou PNG | ✅ |
| markers.cameraDialog.title | Seleccionar Vista para Cámara | Select View for Camera | Ansicht für Kamera auswählen | Selecionar Vista para Câmera | ✅ |
| markers.cameraDialog.description | Elija el tipo de vista antes de abrir la cámara. Esto permite la detección automática de marcadores. | Choose the view type before opening the camera. This enables automatic marker detection. | Wählen Sie den Ansichtstyp, bevor Sie die Kamera öffnen. Dies ermöglicht die automatische Markererkennung. | Escolha o tipo de vista antes de abrir a câmera. Isso permite a detecção automática de marcadores. | ✅ |
| markers.cameraDialog.cancel | Cancelar | Cancel | Abbrechen | Cancelar | ✅ |
| markers.cameraDialog.confirm | Abrir Cámara | Open Camera | Kamera öffnen | Abrir Câmera | ✅ |
| markers.viewDialog.title | Seleccionar Tipo de Vista | Select View Type | Ansichtstyp auswählen | Selecionar Tipo de Vista | ✅ |
| markers.viewDialog.description | Por favor, elija el tipo de vista para la imagen cargada. Esta selección es final para esta imagen. | Please choose the view type for the loaded image. This selection is final for this image. | Bitte wählen Sie den Ansichtstyp für das geladene Bild. Diese Auswahl ist für dieses Bild endgültig. | Por favor, escolha o tipo de vista para a imagem carregada. Esta seleção é final para esta imagem. | ✅ |
| markers.viewDialog.cancel | Cancelar | Cancel | Abbrechen | Cancelar | ✅ |
| markers.viewDialog.confirm | OK | OK | OK | OK | ✅ |
markers.detectingButton — Spanish uses three dots ... (ASCII) while en/de/pt-BR use the ellipsis character …. Trivial, but worth flagging for consistency.
markers.homeButton — German STARTBILDSCHIRM (15 chars) is significantly longer than the others. Visual QA needed if displayed in a fixed-width button.
2.12 markers.toast (32 strings — nested under markers)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| markers.toast.sessionRestoredTitle | Datos Cargados | Data Loaded | Daten geladen | Dados Carregados | ✅ |
| markers.toast.sessionRestoredDescription | Se han cargado los datos de la sesión anterior. | Previous session data has been restored. | Daten aus der vorherigen Sitzung wurden geladen. | Os dados da sessão anterior foram carregados. | ✅ |
| markers.toast.imageErrorTitle | Error de Imagen | Image Error | Bildfehler | Erro de Imagem | ✅ |
| markers.toast.imageErrorDescription | No se pudo cargar la imagen. Intente con otra. | Could not load the image. Try another one. | Bild konnte nicht geladen werden. Versuchen Sie es mit einem anderen. | Não foi possível carregar a imagem. Tente outra. | ✅ |
| markers.toast.fileErrorTitle | Error de Archivo | File Error | Dateifehler | Erro de Arquivo | ✅ |
| markers.toast.fileErrorDescription | No se pudo leer el archivo. | Could not read the file. | Datei konnte nicht gelesen werden. | Não foi possível ler o arquivo. | ✅ |
| markers.toast.errorTitle | Error | Error | Fehler | Erro | ✅ |
| markers.toast.selectMarkerListDescription | Por favor, elija un marcador de una de las listas. | Please choose a marker from one of the lists. | Bitte wählen Sie einen Marker aus einer der Listen. | Por favor, escolha um marcador em uma das listas. | ✅ |
| markers.toast.noImageDescription | Cargue una imagen primero. | Upload an image first. | Bitte zuerst ein Bild hochladen. | Carregue uma imagem primeiro. | ✅ |
| markers.toast.selectMarkerActiveTitle | Seleccione Marcador | Select Marker | Marker auswählen | Selecione um Marcador | ✅ |
| markers.toast.selectMarkerActiveDescription | Por favor, use el botón 'Seleccionar' para activar un marcador antes de hacer clic en la imagen. | Please use the 'Select' button to activate a marker before clicking on the image. | Bitte verwenden Sie die Schaltfläche „Auswählen“, um einen Marker zu aktivieren, bevor Sie auf das Bild klicken. | Por favor, use o botão 'Selecionar' para ativar um marcador antes de clicar na imagem. | ✅ |
| markers.toast.selectViewTitle | Seleccione Vista | Select View | Ansicht auswählen | Selecione a Vista | ✅ |
| markers.toast.selectViewDescription | Por favor, seleccione un tipo de vista para la imagen. | Please select a view type for the image. | Bitte wählen Sie einen Ansichtstyp für das Bild. | Por favor, selecione um tipo de vista para a imagem. | ✅ |
| markers.toast.selectViewFirstDescription | Seleccione un tipo de vista primero. | Select a view type first. | Bitte zuerst einen Ansichtstyp auswählen. | Selecione um tipo de vista primeiro. | ✅ |
| markers.toast.noDataTitle | Sin Datos | No Data | Keine Daten | Sem Dados | ✅ |
| markers.toast.noMarkersToDeleteDescription | No hay marcadores para eliminar. | There are no markers to delete. | Es gibt keine Marker zum Löschen. | Não há marcadores para apagar. | ✅ |
| markers.toast.rowDeletedTitle | Fila Eliminada | Row Deleted | Zeile gelöscht | Linha Apagada | ✅ |
| markers.toast.rowDeletedDescription | La fila seleccionada ha sido eliminada. | The selected row has been deleted. | Die ausgewählte Zeile wurde gelöscht. | A linha selecionada foi apagada. | ✅ |
| markers.toast.lastRowDeletedTitle | Última Fila Eliminada | Last Row Deleted | Letzte Zeile gelöscht | Última Linha Apagada | ✅ |
| markers.toast.lastRowDeletedDescription | La última fila ha sido eliminada. | The last row has been deleted. | Die letzte Zeile wurde gelöscht. | A última linha foi apagada. | ✅ |
| markers.toast.nothingToSaveDescription | No hay marcadores ni ID de paciente para guardar. | There are no markers or patient ID to save. | Es gibt keine Marker oder Patienten-ID zum Speichern. | Não há marcadores nem ID de paciente para salvar. | ✅ |
| markers.toast.validationErrorsTitle | Errores de Validación | Validation Errors | Validierungsfehler | Erros de Validação | ✅ |
| markers.toast.validationErrorsDescription | {ICU plural — corríjalo / corríjalos} | {ICU plural — fix it / fix them} | {ICU plural — beheben Sie ihn / sie} | {ICU plural — corrija-o / corrija-os} | ⚠️ |
| markers.toast.exportedTitle | Datos Exportados y Guardados | Data Exported and Saved | Daten exportiert und gespeichert | Dados Exportados e Salvos | ✅ |
| markers.toast.exportedDescription | {ICU plural — archivo TXT / archivos TXT} | {ICU plural — TXT file / TXT files} | {ICU plural — TXT-Datei / TXT-Dateien} | {ICU plural — arquivo TXT / arquivos TXT} | ✅ |
| markers.toast.idSavedTitle | ID Guardado en Sesión | ID Saved to Session | ID in Sitzung gespeichert | ID Salvo na Sessão | ✅ |
| markers.toast.idSavedDescription | El ID del paciente {patientId} se ha guardado en la sesión. No hay marcadores para exportar. | Patient ID {patientId} has been saved to the session. No markers to export. | Patienten-ID {patientId} wurde in der Sitzung gespeichert. Keine Marker zum Exportieren. | O ID do paciente {patientId} foi salvo na sessão. Não há marcadores para exportar. | ✅ |
| markers.toast.sessionSavedTitle | Guardado en Sesión | Saved to Session | In Sitzung gespeichert | Salvo na Sessão | ✅ |
| markers.toast.sessionSavedWithIdDescription | Los datos para el paciente {patientId} se han guardado en esta sesión. No hay marcadores para exportar. | Data for patient {patientId} has been saved to this session. No markers to export. | Daten für Patient {patientId} wurden in dieser Sitzung gespeichert. Keine Marker zum Exportieren. | Os dados do paciente {patientId} foram salvos nesta sessão. Não há marcadores para exportar. | ✅ |
| markers.toast.sessionSavedDescription | Los datos se han guardado en esta sesión. No hay marcadores ni ID para exportar. | Data has been saved to this session. No markers or ID to export. | Daten wurden in dieser Sitzung gespeichert. Keine Marker oder ID zum Exportieren. | Os dados foram salvos nesta sessão. Não há marcadores nem ID para exportar. | ✅ |
| markers.toast.photoCapturedAutoTitle | Foto capturada automáticamente | Photo captured automatically | Foto automatisch aufgenommen | Foto capturada automaticamente | ✅ |
| markers.toast.photoCapturedTitle | Foto capturada | Photo captured | Foto aufgenommen | Foto capturada | ✅ |
| markers.toast.noGreenMarkersDescription | No se detectaron marcadores verdes en la imagen. | No green markers were detected in the image. | Im Bild wurden keine grünen Marker erkannt. | Não foram detectados marcadores verdes na imagem. | ⚠️ |
| markers.toast.autoDetectStatsDescription | {total} marcadores detectados de {expected} esperados. | {total} markers detected out of {expected} expected. | {total} von {expected} erwarteten Markern erkannt. | {total} marcadores detectados de {expected} esperados. | ✅ |
| markers.toast.markersDetectedTitle | Marcadores Detectados | Markers Detected | Marker erkannt | Marcadores Detectados | ✅ |
| markers.toast.markersDetectedColorDescription | {byMarker} marcadores detectados de {expected} esperados: {names} | {byMarker} markers detected out of {expected} expected: {names} | {byMarker} von {expected} erwarteten Markern erkannt: {names} | {byMarker} marcadores detectados de {expected} esperados: {names} | ✅ |
| markers.toast.markersDetectedMixedDescription | {byMarker} por color + {byPose} estimados por IA = {total}/{expected} total. {names} | {byMarker} by color + {byPose} estimated by AI = {total}/{expected} total. {names} | {byMarker} per Farbe + {byPose} per KI geschätzt = {total}/{expected} insgesamt. {names} | {byMarker} por cor + {byPose} estimados por IA = {total}/{expected} total. {names} | ⚠️ |
| markers.toast.markersDetectedColorShortDescription | {byMarker} marcadores detectados de {expected} esperados. | {byMarker} markers detected out of {expected} expected. | {byMarker} von {expected} erwarteten Markern erkannt. | {byMarker} marcadores detectados de {expected} esperados. | ✅ |
| markers.toast.markersDetectedMixedShortDescription | {byMarker} por color + {byPose} estimados por IA = {total}/{expected} total. | {byMarker} by color + {byPose} estimated by AI = {total}/{expected} total. | {byMarker} per Farbe + {byPose} per KI geschätzt = {total}/{expected} insgesamt. | {byMarker} por cor + {byPose} estimados por IA = {total}/{expected} total. | ✅ |
| markers.toast.detectionErrorTitle | Error de Detección | Detection Error | Erkennungsfehler | Erro de Detecção | ✅ |
| markers.toast.detectionErrorDescription | No se pudieron detectar los marcadores. | Could not detect markers. | Marker konnten nicht erkannt werden. | Não foi possível detectar os marcadores. | ✅ |
| markers.toast.noMarkersFoundTitle | Sin Marcadores | No Markers | Keine Marker | Sem Marcadores | ✅ |
2.13 Misc — localeSwitcher + errors (8 strings combined, each <5)¶
| key | es | en | de | pt-BR | Status |
|---|---|---|---|---|---|
| localeSwitcher.label | Idioma | Language | Sprache | Idioma | ✅ |
| localeSwitcher.es | Español | Español | Español | Español | ✅ |
| localeSwitcher.en | English | English | English | English | ✅ |
| localeSwitcher.de | Deutsch | Deutsch | Deutsch | Deutsch | ✅ |
| localeSwitcher.pt-BR | Português (BR) | Português (BR) | Português (BR) | Português (BR) | ✅ |
| errors.loadImage | No se pudo cargar la imagen | Could not load the image | Bild konnte nicht geladen werden | Não foi possível carregar a imagem | ✅ |
| errors.loadMarkers | No se pudieron cargar los marcadores | Could not load the markers | Marker konnten nicht geladen werden | Não foi possível carregar os marcadores | ✅ |
| errors.analysisFailed | Falló el análisis | Analysis failed | Analyse fehlgeschlagen | A análise falhou | ✅ |
Locale labels are intentionally left in their native language (endonym convention) — confirm OK.
3. Known concerns¶
3.1 German compound nouns may overflow button widths¶
German agglutinates nouns: Markererfassung (15 chars), STARTBILDSCHIRM (15), CSV-Bericht erstellen (21), Patientenbild auswählen (24). The Spanish source averages 30–50% shorter. Specific risk areas:
markers.homeButton— Spanish 17 chars, German 15 chars (similar, but uppercase consumes more pixel width).markers.detectingButton— GermanErkenne…(8) — short, ok.markers.autoDetectButton— GermanAutomatisch erkennen(20) vs SpanishAuto-detectar(13).home.generateReportCsv— GermanCSV-Bericht erstellen(21) vs SpanishGenerar Reporte CSV(19) — fine.dashboard.openAnalysisDescription— GermanVorderansicht · Rückansicht · Rechtes Profil · Linkes Profil(60 chars) — likely fine since it's a description, but may wrap awkwardly in narrow cards.
Recommendation: visual QA in German with a 320px-wide viewport to catch wrap/overflow before launch.
3.2 Decimal separator handling — already addressed¶
The app uses Intl.NumberFormat from the standard react-intl / next-intl toolchain (per project convention). This means numeric values (counts, measurements, ratios) are automatically formatted with the locale-correct decimal separator:
esandpt-BR: comma (0,5)de: comma (0,5)en: period (0.5)
No manual review needed for number formatting. Reviewers can ignore decimal-separator concerns in this packet.
3.3 Spanish dialect — es-AR (Rioplatense / voseo) vs es-ES (peninsular)¶
The Spanish source uses voseo verb forms (es-AR, Rioplatense):
dashboard.recentActivityEmpty: "Iniciá una captura" (vs es-ES "Inicia una captura")auth.loginSubtitle: "Accedé a tu cuenta" (vs es-ES "Accede a tu cuenta")auth.errorRateLimit: "Esperá unos minutos" (vs es-ES "Espera unos minutos")auth.errorNetwork: "Reintentá" (vs es-ES "Reinténtalo")auth.forgotPassword: "¿Olvidaste tu contraseña?" (compatible with both)auth.resetPasswordSubtitle: "Elegí una contraseña" (vs es-ES "Elige una contraseña")auth.resetPasswordSuccess: "Ya podés iniciar sesión" (vs es-ES "Ya puedes iniciar sesión")
Decision needed: is the deployment target only Argentina / Rioplatense Spanish, or pan-Hispanic? If the latter, plan to add an es-419 (Latin American neutral) locale or normalize to tuteo. Not blocking for sign-off but should be acknowledged.
3.4 ICU plural / select syntax preserved across locales¶
All locales preserve the {count, plural, ...} and {role, select, ...} ICU MessageFormat syntax. This is automatic and the reviewer does not need to verify the syntax — only the wording inside each branch (one, other, admin, clinician, etc.).
3.5 Ellipsis character consistency¶
The source mixes ASCII ... (e.g. markers.detectingButton: "Detectando...") with the Unicode ellipsis … (e.g. auth.loggingIn: "Iniciando sesión…"). The non-Spanish locales use … consistently. Recommend normalizing the Spanish source to … everywhere; trivial cosmetic fix, not blocking clinical sign-off.
3.6 Audience — clinician-facing, not patient-facing¶
EPPA is a clinician-facing tool, not patient-facing. No strings in the catalog are shown to patients. Disclaimers (researchOnlyDisclaimer, complianceFooter, common.researchUseOnly) are aimed at the clinician operator and at regulators/auditors. Patient-facing translation review is not required for this release.
3.7 Disclaimer wording — regulatory-adjacent¶
The "Research use only — Not a medical device" disclaimer appears in 3 places:
- common.researchUseOnly
- dashboard.complianceFooter
- auth.researchOnlyDisclaimer
These three strings have slight wording drift (en-dash vs period; one variant lacks the leading "Solo"). Recommend the clinical reviewer dictate a single canonical phrasing per locale and the dev team applies it to all three keys.
4. Sign-off checklist¶
Reviewer: check each item once verified. Add corrections inline above the checklist.
- [ ] Anatomical accuracy — all anatomical terms in the Glossary (G02–G17, G25) are clinically correct in each locale.
- [ ] Clinical protocol vocabulary — terms specific to the EPPA protocol (marker capture, view types, calibration, sagittal alignment) are consistent with how the clinical team would describe them aloud.
- [ ] UI imperative tone — instructional strings (button labels, step-by-step prompts) use the appropriate imperative register for each locale.
- [ ] Button-label length — verified that translated button labels fit their containers (especially German). Run visual QA in 320px and 768px viewports.
- [ ] Disclaimer wording — the "research use only / not a medical device" phrasing is acceptable in each locale and consistent across all 3 places it appears.
- [ ] Patient-facing strings — Not applicable: app is clinician-facing only.
- [ ] Glossary section — all 30 glossary rows reviewed (⚠️ replaced with ✅ or with corrected wording).
- [ ] By-namespace tables — all flagged ⚠️ rows reviewed and resolved.
- [ ] Spanish dialect decision (§3.3) — confirmed whether es is es-AR only or needs es-419 normalization.
Reviewer attestation¶
| Field | Value |
|---|---|
| Reviewer name | _______ |
| Role / affiliation | _______ |
| Locale(s) reviewed | ☐ en ☐ de ☐ pt-BR |
| Date | _______ |
| Signature | _______ |
End of packet. Once signed, return to the EPPA dev team (email TBD) for application of corrections and release tagging.