From b5d3621445371309bd87b2aa4c06ea918c8a6c3b Mon Sep 17 00:00:00 2001 From: nico Date: Sun, 30 Aug 2026 22:15:03 +0200 Subject: [PATCH 1/2] i18n(es): translate the 29 strings missing from app_es.arb app_es.arb carried 2306 of the template's 2335 keys, so a Spanish user hit English mid-screen: the home connecting/syncing/analyzing cards, the sleep "not sleep" rejection flow, the two no-MET calorie notes, and the entire Community section plus its Discord/sponsor nudges. Before: tapping Sync showed "Connecting to your band" and "Hang on - this usually takes a few seconds" inside an otherwise Spanish UI. After: both render in Spanish. Terminology follows the existing file rather than inventing new terms: banda, Recuperacion, Esfuerzo, Sueno, Preparacion, peninsular tuteo, and infinitive button labels. MET stays untranslated, as it is everywhere else. Keys are inserted at their template positions and no existing string is touched, so the diff is additions only. app_es.arb is now at full key parity with app_en.arb: 2335/2335. --- lib/l10n/app_es.arb | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 96804076..a019de62 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1424,6 +1424,12 @@ "homeTryAgain": "Intentar de nuevo", "homeNothingDerivedTitle": "Aún no se ha calculado nada", "homeNothingDerivedBody": "Todavía no se ha procesado ninguna grabación de la correa.", + "homeSyncingTitle": "Sincronizando con tu banda", + "homeSyncingBody": "Descargando datos — puede tardar unos minutos si hay mucho acumulado.", + "homeAnalyzingTitle": "Calculando los números de anoche", + "homeAnalyzingBody": "Los datos ya están — ahora vienen el sueño, la recuperación y el esfuerzo.", + "homeConnectingTitle": "Conectando con tu banda", + "homeConnectingBody": "Un momento — esto suele tardar unos segundos.", "homeAskCoach": "Preguntar al entrenador", "homeProfileSettings": "Perfil y ajustes", "homeNothingTodayTitle": "Nada registrado hoy", @@ -1623,6 +1629,10 @@ "sleepDetailChangeTimes": "Cambiar las horas", "sleepDetailSetTimesMyself": "Establecer las horas yo mismo", "sleepDetailBackToAutomatic": "Volver a automático", + "sleepDetailNotSleep": "No es sueño", + "sleepDetailRejectedTitle": "No contabilizado como sueño", + "sleepDetailRejectedBody": "Nos has dicho que este intervalo no era sueño, así que no se puntúa nada.", + "sleepDetailUndoRejection": "Deshacer — volver a automático", "sleepDetailReanalysing": "Reanalizando la noche…", "sleepDetailCorrectionFailedTitle": "Esa corrección no se ha aplicado", "sleepDetailBedTimeHelp": "CUÁNDO TE ACOSTASTE", @@ -1805,6 +1815,8 @@ "activitySetupPrivateLabel": "Sesión privada", "activitySetupPrivateDetail": "Oculta en resúmenes y exportaciones", "activitySetupCaloriesNeedWeight": "Las calorías necesitan tu peso.", + "activitySetupNoMetEstimate": "Sin estimación previa: ningún MET publicado se aplica a una sesión que no nombra una actividad. Las calorías salen de tu frecuencia cardíaca — siempre que tu edad, peso y sexo estén configurados, y que tus frecuencias en reposo y máxima estén medidas y no supuestas.", + "activitySummaryCalorieNoMet": "Estimado a partir de tu frecuencia cardíaca y tu peso. En esta cifra no hay ningún MET: la sesión no nombró ninguna actividad a la que aplicarlo.", "activitySetupCalorieEstimate": "Unas {est} kcal cada {minutes} min, a partir de {met} MET y tu peso.", "activitySetupTrackSets": "Series, repeticiones y carga: registradas por ti", "activitySetupTrackDistanceGps": "Distancia, ritmo y frecuencia cardíaca", @@ -2305,5 +2317,22 @@ "deviceActionLogWaterLabel": "Registrar agua", "deviceActionLogWaterBlurb": "Añade un vaso al agua de hoy, el mismo paso que el + de la pantalla de nutrición.", "deviceActionBroadcastToTaskerLabel": "Emitir a Tasker", - "deviceActionBroadcastToTaskerBlurb": "Enviar un intent de difusión para que Tasker pueda disparar cualquier automatización." + "deviceActionBroadcastToTaskerBlurb": "Enviar un intent de difusión para que Tasker pueda disparar cualquier automatización.", + "profileCommunityGroup": "Comunidad", + "profileGithubTitle": "GitHub", + "profileGithubSub": "Dale una estrella y muestra tu apoyo — ayuda a que el proyecto crezca", + "profileRedditTitle": "Reddit", + "profileRedditSub": "Únete a r/OpenStrap — publica tus logros, tus dudas, lo que sea", + "profileDiscordTitle": "Discord", + "profileDiscordSub": "Charla con otros usuarios y con quienes construyen esto", + "profileSponsorTitle": "Patrocinar", + "profileSponsorSub": "Este es un proyecto libre y de código abierto — patrocinarlo lo mantiene en marcha", + "nudgeDiscordTitle": "Ven a saludar", + "nudgeDiscordBody": "Otros usuarios de OpenStrap se juntan en Discord — errores, ideas y gente con la misma banda que tú.", + "nudgeDiscordCta": "Unirse a Discord", + "nudgeDonateTitle": "¿Te gusta OpenStrap?", + "nudgeDonateBody": "Es un proyecto libre y de código abierto, sin suscripción. Patrocinarlo permite mantenerlo.", + "nudgeDonateCta": "Apoyar el proyecto", + "nudgeNotNow": "Ahora no", + "nudgeDontShowAgain": "No volver a mostrar" } From 07c27efcdc2a55c880bf22ca01a5ea36673fc8da Mon Sep 17 00:00:00 2001 From: nico Date: Sun, 30 Aug 2026 23:48:34 +0200 Subject: [PATCH 2/2] i18n(es): spell out both heart-rate values in activitySetupNoMetEstimate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses the review comment on the PR. The string coordinated a prepositional phrase with an adjective ("en reposo y máxima"), which mirrored the English source ("your resting and maximum rates") but reads awkwardly in Spanish. Both values are now named in full. No other string is touched; key parity with app_en.arb stays at 2335/2335. --- lib/l10n/app_es.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index a019de62..7c06b2eb 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1815,7 +1815,7 @@ "activitySetupPrivateLabel": "Sesión privada", "activitySetupPrivateDetail": "Oculta en resúmenes y exportaciones", "activitySetupCaloriesNeedWeight": "Las calorías necesitan tu peso.", - "activitySetupNoMetEstimate": "Sin estimación previa: ningún MET publicado se aplica a una sesión que no nombra una actividad. Las calorías salen de tu frecuencia cardíaca — siempre que tu edad, peso y sexo estén configurados, y que tus frecuencias en reposo y máxima estén medidas y no supuestas.", + "activitySetupNoMetEstimate": "Sin estimación previa: ningún MET publicado se aplica a una sesión que no nombra una actividad. Las calorías salen de tu frecuencia cardíaca — siempre que tu edad, peso y sexo estén configurados, y que tu frecuencia cardíaca en reposo y tu frecuencia cardíaca máxima estén medidas y no supuestas.", "activitySummaryCalorieNoMet": "Estimado a partir de tu frecuencia cardíaca y tu peso. En esta cifra no hay ningún MET: la sesión no nombró ninguna actividad a la que aplicarlo.", "activitySetupCalorieEstimate": "Unas {est} kcal cada {minutes} min, a partir de {met} MET y tu peso.", "activitySetupTrackSets": "Series, repeticiones y carga: registradas por ti",