Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a50d8be
test(home): red tests for the details card, spiral and stage rings, a…
mikenrafter Nov 9, 2026
bcad845
feat(home): spiral and sleep-stage rings
mikenrafter Nov 9, 2026
3cb3b26
feat(home): details in the ring card and plainer Home labels
mikenrafter Nov 9, 2026
1a35f8d
fix(home): recovery why is the plain score; single-composite rings wi…
mikenrafter Nov 9, 2026
a10674d
fix(home): read today and its stages in one shared day-read scope
mikenrafter Nov 9, 2026
218741f
fix(home): choose tonight's alarm by local calendar, not a fixed 24 h
mikenrafter Nov 9, 2026
1868c04
fix(home): translate the coach chip in es/fr/hi/zh; test cycle string…
mikenrafter Nov 9, 2026
58e302f
fix(home): spiral no-crack test picks join pixels from geometry and a…
mikenrafter Nov 9, 2026
ed50e0d
fix(home): measure the Thai caption with a Thai font; shorten the Tha…
mikenrafter Nov 9, 2026
c50b5e4
fix(home): pick tonight's alarm by local night boundary; verify Thai …
mikenrafter Nov 9, 2026
4cab5ef
fix(home): before 04:00 the night ends at today's noon, not tomorrow's
mikenrafter Nov 9, 2026
55c8394
refactor(home): leave the pre-sleep estimate for the wake-to-wake work
mikenrafter Nov 9, 2026
eb3190a
fix(home): drop the redundant past-day need read, format the strain t…
mikenrafter Nov 9, 2026
6aca1a6
test(home): the withheld-rollup card reads "Updating your trends"
mikenrafter Nov 9, 2026
ca5091c
merge main
mikenrafter Nov 10, 2026
96b497e
fix(home): awake shares the sleep ring's sweep instead of extending it
mikenrafter Nov 11, 2026
c56f436
merge main
abdulsaheel Nov 13, 2026
4c5aa6d
month grid strip gets a full tap target, spanish coach chip had a sta…
abdulsaheel Nov 13, 2026
6f9f3bc
merge main
abdulsaheel Nov 13, 2026
c31c58e
merge main
abdulsaheel Nov 13, 2026
94d91e8
illness text in thai and chinese no longer says several nights, drop …
abdulsaheel Nov 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 86 additions & 14 deletions lib/l10n/app_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -1505,33 +1505,105 @@
"homeDriverRhr": "Ruhepuls",
"homeDriverResp": "Atemfrequenz",
"homeDriverTemp": "Hauttemperatur",
"homeDbRebuiltTitle": "Die Datenbank musste für den App-Start neu erstellt werden",
"homeDbRebuiltTitle": "Deine Datenbank wurde neu aufgebaut",
"homeDbRebuiltNothingRecovered": "Es konnte nichts wiederhergestellt werden.",
"homeDbRebuiltRecovered": "Wiederhergestellt: {list}.",
"homeDbRebuiltEmpty": "Leer: {list}.",
"homeDbRebuiltKept": "Die ursprüngliche Datei bleibt unter {path} erhalten. Es wurde nichts gelöscht.",
"homeWorkoutHoldTitle": "Ein Training läuft noch",
"homeWorkoutHoldBody": "Der heutige Tag wartet, solange ein Training läuft: Das Band zeichnet weiter auf, berechnet wird aber erst nach dem Ende. Beende das Training über die Leiste unten, dann wird der Tag ausgewertet – Synchronisieren allein reicht nicht.",
"homeInsightsRebuildingTitle": "Deine tagesübergreifenden Auswertungen werden neu berechnet",
"homeInsightsRebuildingAlgoVersion": "Die Berechnung hat sich mit dem letzten Update geändert.",
"homeWorkoutHoldBody": "Heute füllt sich, sobald du das Training beendest.",
"homeInsightsRebuildingTitle": "Deine Trends werden aktualisiert",
"homeInsightsRebuildingAlgoVersion": "Wird nach dem letzten App-Update aktualisiert.",
"homeInsightsStaleOverWeek": "Die letzte Auswertung wurde vor über einer Woche erstellt – zu alt, um sich darauf zu verlassen.",
"homeInsightsStaleOnDay": "Die letzte Auswertung wurde am {day} erstellt – zu alt, um sich darauf zu verlassen.",
"homeInsightsNoVersionStamp": "Die gespeicherte Auswertung hat keine Versionsangabe.",
"homeSyncBand": "Band synchronisieren",
"homeWhyLabel": "Warum?",
"homeCalibrating": "Wird kalibriert",
"homeCalibratingNights": "{have} von {need} Nächten",
"homeCalibratingDays": "{have} von {need} Tagen",
"homeGapNoReason": "Aus den gespeicherten Daten geht nicht hervor, warum das fehlt.",
"homeGapNoReason": "Kein Grund erfasst.",
"homeRingRecovery": "Erholung",
"homeRingStrain": "Strain",
"homeRingSleep": "Schlaf",
"homeRingNoStrain": "Kein Strain",
"homeRingNoSleep": "Kein Schlaf",
"homeSleepGapFallback": "Es wurde keine Nacht aufgezeichnet, die lang genug für eine Auswertung war.",
"homeSleepPctOf": "{pct} % von {target}",
"homeSleepPctOfDefault": "{pct} % von {target} (Standard)",
"homeSleepPctCompact": "{pct} % von {target}",
"@homeSleepPctCompact": {
"description": "Short sleep caption against a learned target.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String"
}
}
},
"homeSleepPctDefaultCompact": "{pct} % von {target} · Standardziel",
"@homeSleepPctDefaultCompact": {
"description": "Short sleep caption that keeps an explicit default-target qualifier.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String"
}
}
},
"homeSleepPctDefaultTight": "{pct} % von {target} (Standard)",
"@homeSleepPctDefaultTight": {
"description": "Tightest sleep caption when the target is the default: still names the target as the default.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String"
}
}
},
"homeWhyRecoveryTitle": "Erholung ist niedrig",
"homeWhyRecoveryPlain": "Erholung {score} von 100",
"@homeWhyRecoveryPlain": {
"placeholders": {
"score": {
"type": "int"
}
}
},
"homeWhySleepTitle": "Schlaf reicht nicht aus",
"homeWhySleepBody": "Dein bewerteter Schlaf lag unter deinem Bedarf.",
"homeWhySleepDetail": "{asleep} geschlafen, {gap} unter deinem Bedarf von {need}.",
"@homeWhySleepDetail": {
"placeholders": {
"asleep": {
"type": "String"
},
"gap": {
"type": "String"
},
"need": {
"type": "String"
}
}
},
"homeWhyStrainTitle": "Belastung über dem Ziel",
"homeWhyStrainBody": "Strain {strain}, über dem heutigen Ziel von {range}.",
"@homeWhyStrainBody": {
"placeholders": {
"strain": {
"type": "String"
},
"range": {
"type": "String"
}
}
},
"homeStrainOf21": "von 21",
"homeSleepNoTarget": "Noch kein Ziel",
"homeOfSpan": "von {duration}",
"homeLoadFailedTitle": "Der heutige Tag konnte nicht geladen werden",
"homeLoadFailedBody": "Der gespeicherte Tag konnte nicht geladen werden. Es wurde nichts gelöscht – das ist ein Ladefehler, es fehlen keine Daten.",
"homeDayLoadFailedTitle": "{day} konnte nicht geladen werden",
Expand All @@ -1551,13 +1623,13 @@
"homeAskCoach": "Coach fragen",
"homeProfileSettings": "Profil und Einstellungen",
"homeNothingTodayTitle": "Für heute nichts aufgezeichnet",
"homeNothingTodayBody": "Die zuletzt ausgewertete Nacht war {day}. Seitdem ist nichts Neues angekommen.",
"homeNothingTodayBody": "Zuletzt ausgewertete Nacht: {day}.",
"homeNoDataThisDayTitle": "Keine Daten für diesen Tag",
"homeNoDataThisDayBody": "An diesem Tag wurde nichts aufgezeichnet.",
"homeSomeDayDataMissingTitle": "Einige Daten dieses Tages fehlen",
"homeReadinessNotScoredTitle": "Heute keine Erholung berechnet",
"homeReadinessNeedBody": "{need}, um zu wissen, was für dich normal ist.",
"homeReadinessNoReason": "Aus den gespeicherten Daten geht nicht hervor, warum.",
"homeReadinessNoReason": "Kein Grund erfasst.",
"homeSeeWhatWasMissing": "Anzeigen, was gefehlt hat",
"homeAtAGlance": "Auf einen Blick",
"homeTodaysPlan": "Plan für heute",
Expand All @@ -1568,9 +1640,9 @@
"homeIllnessRedTitle": "Die letzten Nächte ergeben zusammen einen erhöhten Ruhepuls",
"homeIllnessAmberSameNight": "Letzte Nacht lag außerhalb deines Normalbereichs",
"homeIllnessAmberOtherNight": "{day} lag außerhalb deines Normalbereichs",
"homeIllnessBodyNoZ": "Deine nächtlichen Ruhepulswerte der letzten Nächte ergeben zusammen einen Anstieg über deine Baseline. Hier wird nur ein einziges Signal ausgewertet. Es zeigt ein Muster, aber keine Ursache.",
"homeIllnessBodyAbove": "Deine nächtlichen Ruhepulswerte der letzten Nächte ergeben zusammen einen Anstieg über deine Baseline; in dieser Nacht lag der Wert {z} Standardabweichungen darüber. Hier wird nur ein einziges Signal ausgewertet. Es zeigt ein Muster, aber keine Ursache.",
"homeIllnessBodyBelow": "Deine nächtlichen Ruhepulswerte der letzten Nächte ergeben zusammen einen Anstieg über deine Baseline; in dieser Nacht lag der Wert {z} Standardabweichungen darunter. Hier wird nur ein einziges Signal ausgewertet. Es zeigt ein Muster, aber keine Ursache.",
"homeIllnessBodyNoZ": "Dein Ruhepuls lag in den letzten Nächten über deinem Üblichen. Ein Muster, keine Ursache.",
"homeIllnessBodyAbove": "Die letzten Nächte haben deinen Ruhepuls über dein Übliches gebracht. Auch diese Nacht lag darüber. Ein Muster, keine Ursache.",
"homeIllnessBodyBelow": "Die letzten Nächte zusammen haben deinen Ruhepuls über dein Übliches gebracht, auch wenn diese Nacht allein darunter lag. Ein Muster, keine Ursache.",
"homeIllnessAdvice": "Behalte es im Blick, falls es länger als ein paar Tage anhält.",
"homeHeartRate": "Herzfrequenz",
"homeRestingSub": "In Ruhe",
Expand Down Expand Up @@ -3312,7 +3384,7 @@
"homeFirstWeekRecovery": "Erholung: ab Nacht {night}, sobald dein Normalwert bekannt ist",
"homeFirstWeekSoFar": "{count, plural, =1{Bisher 1 Tag aufgezeichnet} other{Bisher {count} Tage aufgezeichnet}}",
"homeFirstWeekDone": "Erledigt: {step}",
"homeCoachSetUpChip": "Stell Fragen zu deinen Daten: Coach einrichten",
"homeCoachSetUpChip": "Coach einrichten",
"profileSetupCycleSub": "Trag deine Periode unter „Gesundheit“ ein. Das lässt sich später ändern.",
"homeRecoverySleeping": "Schläft…",
"homeRecoveryAfterWake": "Die Erholung wird nach dem Aufwachen bewertet.",
Expand Down
166 changes: 125 additions & 41 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -7391,7 +7391,7 @@
"@homeDriverTemp": {
"description": "Readiness driver name: skin temperature, shown in the Why? row on Home."
},
"homeDbRebuiltTitle": "Your database was rebuilt to start the app",
"homeDbRebuiltTitle": "Your database was rebuilt",
"@homeDbRebuiltTitle": {
"description": "Title of the card shown when the local database had to be rebuilt to start the app."
},
Expand Down Expand Up @@ -7433,15 +7433,15 @@
"@homeWorkoutHoldTitle": {
"description": "Title of the card shown on Home while a workout session is live and derivation is paused."
},
"homeWorkoutHoldBody": "Today is paused while a workout runs. The band keeps recording; finish the workout from the bar below and today fills in.",
"homeWorkoutHoldBody": "Today fills in when you finish the workout.",
"@homeWorkoutHoldBody": {
"description": "Body of the card shown on Home while a workout session is live and derivation is paused."
},
"homeInsightsRebuildingTitle": "Your cross-day insights are being rebuilt",
"homeInsightsRebuildingTitle": "Updating your trends",
"@homeInsightsRebuildingTitle": {
"description": "Title of the card shown when the cross-day insights rollup was withheld rather than shown."
},
"homeInsightsRebuildingAlgoVersion": "How these are computed changed with the last update.",
"homeInsightsRebuildingAlgoVersion": "Updating after the latest app update.",
"@homeInsightsRebuildingAlgoVersion": {
"description": "Reason the cross-day rollup is being rebuilt: the algorithm version changed."
},
Expand All @@ -7467,10 +7467,6 @@
"@homeSyncBand": {
"description": "Call-to-action button label: sync the band."
},
"homeWhyLabel": "Why?",
"@homeWhyLabel": {
"description": "Short label introducing the readiness driver list on Home."
},
"homeCalibrating": "Learning your usual",
"@homeCalibrating": {
"description": "Ring value shown while a metric is still building its baseline."
Expand Down Expand Up @@ -7499,7 +7495,7 @@
}
}
},
"homeGapNoReason": "Nothing recorded says why this is missing.",
"homeGapNoReason": "No reason recorded.",
"@homeGapNoReason": {
"description": "Fallback reason shown when a ring is empty and nothing explains why."
},
Expand Down Expand Up @@ -7527,24 +7523,124 @@
"@homeSleepGapFallback": {
"description": "Fallback reason the sleep ring is empty: no night long enough to score."
},
"homeStrainOf21": "of 21",
"@homeStrainOf21": {
"description": "Strain ring subtitle: out of the fixed 21-point scale."
},
"homeSleepNoTarget": "No target yet",
"@homeSleepNoTarget": {
"description": "Sleep ring subtitle when no computed sleep-need target exists yet."
"homeSleepPctOf": "{pct}% of {target}",
"@homeSleepPctOf": {
"description": "Sleep ring subtitle once a night is scored: percent of the learned sleep need.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String",
"example": "8h 00m"
}
}
},
"homeOfSpan": "of {duration}",
"@homeOfSpan": {
"description": "Sleep ring subtitle: duration measured against a computed sleep-need target.",
"homeSleepPctOfDefault": "{pct}% of {target} (default)",
"@homeSleepPctOfDefault": {
"description": "Sleep ring subtitle once a night is scored, when no need has been learned yet: percent of the 8 h default target, labelled as a default.",
"placeholders": {
"duration": {
"pct": {
"type": "int"
},
"target": {
"type": "String",
"example": "7h 45m"
"example": "8h 00m"
}
}
},
"homeSleepPctCompact": "{pct}% of {target}",
"@homeSleepPctCompact": {
"description": "Short sleep caption against a learned target.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String"
}
}
},
"homeSleepPctDefaultCompact": "{pct}% of {target} · default target",
"@homeSleepPctDefaultCompact": {
"description": "Short sleep caption that keeps an explicit default-target qualifier.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String"
}
}
},
"homeSleepPctDefaultTight": "{pct}% of default {target}",
"@homeSleepPctDefaultTight": {
"description": "Tightest sleep caption when the target is the default: still names the target as the default.",
"placeholders": {
"pct": {
"type": "int"
},
"target": {
"type": "String"
}
}
},
"homeWhyRecoveryTitle": "Recovery is low",
"@homeWhyRecoveryTitle": {
"description": "Title of the Home card row that explains a low recovery score."
},
"homeWhyRecoveryPlain": "Recovery {score} of 100",
"@homeWhyRecoveryPlain": {
"description": "Body of the low-recovery row when no input is known to drag the score: just the score out of 100.",
"placeholders": {
"score": {
"type": "int"
}
}
},
"homeWhySleepTitle": "Sleep is short of need",
"@homeWhySleepTitle": {
"description": "Title of the Home card row shown when sleep is well short of the person's need."
},
"homeWhySleepBody": "Your scored sleep was below your need.",
"@homeWhySleepBody": {
"description": "Body of the short-sleep row when the time asleep or the need is not available to quote."
},
"homeWhySleepDetail": "{asleep} asleep, {gap} under your {need} need.",
"@homeWhySleepDetail": {
"description": "Body of the short-sleep row: time asleep and how far under the need it was.",
"placeholders": {
"asleep": {
"type": "String"
},
"gap": {
"type": "String"
},
"need": {
"type": "String"
}
}
},
"homeWhyStrainTitle": "Strain is above target",
"@homeWhyStrainTitle": {
"description": "Title of the Home card row shown when strain is above today's target range."
},
"homeWhyStrainBody": "Strain {strain}, above today’s target of {range}.",
"@homeWhyStrainBody": {
"description": "Body of the high-strain row: today's strain and the target range.",
"placeholders": {
"strain": {
"type": "String"
},
"range": {
"type": "String"
}
}
},
"homeStrainOf21": "of 21",
"@homeStrainOf21": {
"description": "Strain ring subtitle: out of the fixed 21-point scale."
},
"homeLoadFailedTitle": "Today could not be read",
"@homeLoadFailedTitle": {
"description": "Title of the card shown when today's data failed to load from the database."
Expand Down Expand Up @@ -7633,7 +7729,7 @@
"@homeNothingTodayTitle": {
"description": "Title shown when there is history but nothing recorded for today."
},
"homeNothingTodayBody": "The last night this app scored was {day}. Nothing has reached it since.",
"homeNothingTodayBody": "Last scored night: {day}.",
"@homeNothingTodayBody": {
"description": "Body shown when there is history but nothing recorded for today, naming the last scored night.",
"placeholders": {
Expand Down Expand Up @@ -7669,7 +7765,7 @@
}
}
},
"homeReadinessNoReason": "Nothing recorded says why.",
"homeReadinessNoReason": "No reason recorded.",
"@homeReadinessNoReason": {
"description": "Fallback body of the readiness-not-scored card when no reason is recorded."
},
Expand Down Expand Up @@ -7719,29 +7815,17 @@
}
}
},
"homeIllnessBodyNoZ": "Your resting heart rate has run above your usual over recent nights. This tracks one signal, so it shows a pattern, not a cause.",
"homeIllnessBodyNoZ": "Your resting heart rate has been above your usual over recent nights. A pattern, not a cause.",
"@homeIllnessBodyNoZ": {
"description": "Illness watch body text when no standardised-deviation figure is available."
},
"homeIllnessBodyAbove": "Recent nights put your resting heart rate above your usual. That night was {z}× your normal night-to-night swing above it. A pattern, not a cause.",
"homeIllnessBodyAbove": "Recent nights put your resting heart rate above your usual. That night was above it too. A pattern, not a cause.",
"@homeIllnessBodyAbove": {
"description": "Illness watch body text when the flagged night's heart rate sat above baseline, with the deviation amount.",
"placeholders": {
"z": {
"type": "String",
"example": "1.8"
}
}
"description": "Illness watch body text when the flagged night's heart rate sat above baseline."
},
"homeIllnessBodyBelow": "Recent nights together put your resting heart rate above your usual, even though that night on its own was {z}× your normal night-to-night swing below it. A pattern, not a cause.",
"homeIllnessBodyBelow": "Recent nights together put your resting heart rate above your usual, though that night alone was below it. A pattern, not a cause.",
"@homeIllnessBodyBelow": {
"description": "Illness watch body text when the flagged night's heart rate sat below baseline, with the deviation amount.",
"placeholders": {
"z": {
"type": "String",
"example": "1.8"
}
}
"description": "Illness watch body text when the flagged night's heart rate sat below baseline."
},
"homeIllnessAdvice": "Worth noting if it continues past a couple of days.",
"@homeIllnessAdvice": {
Expand Down Expand Up @@ -15727,7 +15811,7 @@
}
}
},
"homeCoachSetUpChip": "Ask questions about your data: set up the coach",
"homeCoachSetUpChip": "Set up the coach",
"@homeCoachSetUpChip": {
"description": "Today tab chip when no coach model is configured."
},
Expand Down
Loading
Loading