From 9e5b26d25882272ab8953c3e88307c68d4c59c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Sch=C3=A4dlich?= Date: Thu, 9 Jul 2026 12:35:01 +0200 Subject: [PATCH 1/2] Localize Appearance settings strings (Sky behind cards, Card transparency) These four strings were added to SettingsView.swift's appearanceCard but never made it into the string catalog, so every locale fell back to the English source text. Adds de/es/fr/it/pt-PT/zh-Hans/zh-Hant translations. Co-Authored-By: Claude Sonnet 5 --- Strand/Resources/Localizable.xcstrings | 184 +++++++++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/Strand/Resources/Localizable.xcstrings b/Strand/Resources/Localizable.xcstrings index ead4e129c..eabb5820c 100644 --- a/Strand/Resources/Localizable.xcstrings +++ b/Strand/Resources/Localizable.xcstrings @@ -31598,6 +31598,52 @@ } } }, + "Card transparency": { + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kartentransparenz" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Transparencia de las tarjetas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Transparence des cartes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Trasparenza delle schede" + } + }, + "pt-PT": { + "stringUnit": { + "state": "needs_review", + "value": "Transparência dos cartões" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "卡片透明度" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "卡片透明度" + } + } + } + }, "Cardiac": { "localizations": { "de": { @@ -51179,6 +51225,52 @@ } } }, + "Extends the sky behind the whole Today screen, so lowering Card transparency lets it show through every card. Needs the day-cycle background on.": { + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erweitert den Himmel hinter dem gesamten Heute-Bildschirm, sodass er bei geringerer Kartentransparenz durch jede Karte hindurchscheint. Erfordert aktivierten Tageszyklus-Hintergrund." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Extiende el cielo detrás de toda la pantalla Hoy, de modo que al reducir la Transparencia de las tarjetas se vea a través de cada tarjeta. Requiere que el fondo según el ciclo del día esté activado." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Étend le ciel derrière tout l'écran Aujourd'hui, de sorte qu'en réduisant la Transparence des cartes, il apparaît à travers chaque carte. Nécessite que le fond du cycle journalier soit activé." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Estende il cielo dietro l'intera schermata Oggi, così riducendo la Trasparenza delle schede lo si vede attraverso ogni scheda. Richiede che lo sfondo del ciclo giornaliero sia attivo." + } + }, + "pt-PT": { + "stringUnit": { + "state": "needs_review", + "value": "Estende o céu atrás de todo o ecrã Hoje, para que, ao reduzir a Transparência dos cartões, ele apareça através de cada cartão. Requer que o fundo conforme o ciclo do dia esteja ativado." + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "将天空延伸到整个「今天」界面背后,这样调低卡片透明度时,它会透过每张卡片显现。需要开启日循环背景。" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "將天空延伸到整個「今天」畫面背後,這樣調低卡片透明度時,它會透過每張卡片顯現。需要開啟日循環背景。" + } + } + } + }, "FULL BOND": { "localizations": { "de": { @@ -59718,6 +59810,52 @@ } } }, + "How see-through the cards (Heart Rate, Key Metrics, Recovery Vitals, …) are. Left = solid, right = clear.": { + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wie durchsichtig die Karten (Herzfrequenz, Kernmetriken, Erholungswerte, …) sind. Links = deckend, rechts = durchsichtig." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cuánto se transparentan las tarjetas (Frecuencia cardíaca, Métricas clave, Datos de recuperación, …). Izquierda = sólido, derecha = transparente." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "À quel point les cartes (Fréquence cardiaque, Métriques clés, Données de récupération, …) sont transparentes. Gauche = opaque, droite = transparent." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Quanto sono trasparenti le schede (Frequenza cardiaca, Metriche chiave, Dati di recupero, …). Sinistra = opaco, destra = trasparente." + } + }, + "pt-PT": { + "stringUnit": { + "state": "needs_review", + "value": "Quão transparentes são os cartões (Frequência Cardíaca, Métricas chave, Dados de recuperação, …). Esquerda = opaco, direita = transparente." + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "卡片(心率、关键指标、恢复数据、…)的透明程度。左 = 不透明,右 = 透明。" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "卡片(心率、關鍵指標、恢復數據、…)的透明程度。左 = 不透明,右 = 透明。" + } + } + } + }, "How strong the buzz is.": { "localizations": { "de": { @@ -109278,6 +109416,52 @@ } } }, + "Sky behind cards": { + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Himmel hinter Karten" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cielo detrás de las tarjetas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ciel derrière les cartes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cielo dietro le schede" + } + }, + "pt-PT": { + "stringUnit": { + "state": "needs_review", + "value": "Céu atrás dos cartões" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "卡片后方的天空" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "卡片後方的天空" + } + } + } + }, "Sleep": { "localizations": { "de": { From 7c4f8bd3e34c8430e327096a715b99877ed2abf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Sch=C3=A4dlich?= Date: Thu, 9 Jul 2026 12:46:25 +0200 Subject: [PATCH 2/2] Fix CI: ReadinessChecklistCard.lead type mismatch in HealthView.swift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fitnessReadyLead() returns an already-localized String (via String(localized:)), but ReadinessChecklistCard.lead was typed LocalizedStringKey?, which SwiftUI treats as a lookup key rather than literal text. Retype to String? — Text(_:) accepts both, and this is the correct type for pre-resolved copy. Pre-existing break from commit 75a096a1 (PR #81), unrelated to this branch's localization change; fixing here so PR #5's CI build passes. Co-Authored-By: Claude Sonnet 5 --- Strand/Screens/HealthView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Strand/Screens/HealthView.swift b/Strand/Screens/HealthView.swift index eaaee32d8..9269936fc 100644 --- a/Strand/Screens/HealthView.swift +++ b/Strand/Screens/HealthView.swift @@ -882,7 +882,7 @@ private struct FitnessAgeSection: View { private struct ReadinessChecklistCard: View { let readiness: FitnessAgeReadiness /// Optional intro line shown above the groups (e.g. the "a few more days" no-value message). - let lead: LocalizedStringKey? + let lead: String? /// Invoked when the user taps a required-missing row's "Fix in Settings". let onFix: () -> Void