Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
dd051cd
sleep plan spun forever when one of its reads threw
abdulsaheel Oct 17, 2026
ceeef74
home stayed on yesterday after midnight once back to today was tapped
abdulsaheel Oct 17, 2026
e9d2e8a
past days on home showed english and called themselves today
abdulsaheel Oct 17, 2026
9761836
coach setup ignored a typed model while an old one was saved
abdulsaheel Oct 17, 2026
a7d53ee
sleep showed tonight's plan under past nights, and twice on the tab
abdulsaheel Oct 17, 2026
d2af089
sleep plan vanished from the landing night whenever a night was held …
abdulsaheel Oct 17, 2026
551ec92
activity tab drew its empty state as fact while the first load ran
abdulsaheel Oct 17, 2026
b0b81dd
onboarding import report vanished before it was drawn
abdulsaheel Oct 17, 2026
dd9ee06
journal save and load hung forever on a database error
abdulsaheel Oct 17, 2026
dd517c8
past-day home tiles for heart rate, steps and active energy opened to…
abdulsaheel Oct 17, 2026
13379e8
the home day switcher decoded the same stored day three times per arr…
abdulsaheel Oct 17, 2026
5989014
journal ai send button had no screen-reader name and 'add to journal'…
abdulsaheel Oct 17, 2026
ab1cdb5
height and weight could not take a decimal on iphone
abdulsaheel Oct 17, 2026
d325d60
the live heart rate card stayed in english on a translated screen
abdulsaheel Oct 17, 2026
cda2834
elevation stayed in metres for imperial users, right next to miles
abdulsaheel Oct 17, 2026
094c3eb
strain printed with a '.' on home, day strain, workouts and live whil…
abdulsaheel Oct 17, 2026
bc87afc
the session summary still printed strain with a '.', so in german the…
abdulsaheel Oct 17, 2026
bb5e4c5
cycle prediction said "in 1 days" and "1 days late"
abdulsaheel Oct 17, 2026
d502246
the health tab stress row printed the raw analytics level ('elevated'…
abdulsaheel Oct 17, 2026
530a745
rename band sheet no longer disposes its field while the dialog is cl…
abdulsaheel Oct 19, 2026
b65ce94
translate settings headers, report an issue and onboarding strings
abdulsaheel Oct 19, 2026
542cbc5
past-day recovery and strain rings opened today's screens
abdulsaheel Oct 19, 2026
7a2f397
sleep tab stayed on an old night after using the day stepper
abdulsaheel Oct 22, 2026
0e69ae3
home kept showing the old step goal after it was changed
abdulsaheel Oct 22, 2026
c7a5283
home said "no target yet" on past days for users with a sleep need
abdulsaheel Oct 22, 2026
be68db8
sleep screen dated a lone night with its raw yyyy-MM-dd key
abdulsaheel Oct 22, 2026
6a74ab0
profile setup said any of four numbers could be left blank
abdulsaheel Oct 22, 2026
30d70d2
home kept the old day's rings under a new day's stepper
abdulsaheel Oct 22, 2026
09c1b23
typed numbers rejected every decimal comma
abdulsaheel Oct 22, 2026
42bd7eb
home told an unpaired user to sync a band they don't have
abdulsaheel Oct 22, 2026
0840f10
rough-night causes were logged on the morning, so they explained the …
abdulsaheel Oct 28, 2026
f42742f
correcting last night from the sleep tab pinned the tab to that night
abdulsaheel Oct 28, 2026
1365cbf
a failed sleep read said there was no night, or kept the old one unde…
abdulsaheel Oct 28, 2026
43f8729
recovery's nerd stats opened today even for a past day
abdulsaheel Oct 28, 2026
61dcbeb
sleep plan and recovery detail said not enough nights while the rollu…
abdulsaheel Oct 28, 2026
0bfd239
sleep efficiency verdict said 'points' in english in every language
abdulsaheel Oct 28, 2026
12e4f78
naps screen spun forever when one of its reads threw
abdulsaheel Oct 28, 2026
321d6f1
a failed workout save showed under a green 'times updated' check
abdulsaheel Oct 28, 2026
e245b77
the sleep plan's debt link opened a second sleep screen
abdulsaheel Oct 28, 2026
caa357f
confirming a detected workout showed the raw exception text
abdulsaheel Oct 28, 2026
2b37d43
a failed cycle read showed the tab as if tracking were off
abdulsaheel Oct 28, 2026
630c129
the coach menu could switch or delete the chat while a reply was stil…
abdulsaheel Oct 28, 2026
2bff7ed
edit profile rewrote height and weight on every save for imperial users
abdulsaheel Oct 28, 2026
6e70272
a meal that failed to save or remove said nothing
abdulsaheel Oct 28, 2026
ad2fd77
changing a workout's type with a double tap popped the screen under t…
abdulsaheel Oct 28, 2026
cc4f1c0
the step goal editor closed as if it had saved when the goal could no…
abdulsaheel Oct 28, 2026
20f617a
a second X tap or back swipe while breathing was closing popped one s…
abdulsaheel Oct 28, 2026
08aec63
a throw while breathing was closing left the screen stuck
abdulsaheel Oct 28, 2026
00ef8b5
the day strain curve was an hour off on dst days
abdulsaheel Oct 28, 2026
f179031
sub-tab pills never told a screen reader which one was selected
abdulsaheel Oct 28, 2026
c3d695e
sleep scrub card showed skin temp as a bare 'Temp -12.40'
abdulsaheel Oct 28, 2026
595ac50
the journal's talk it through with ai link was english in every locale
abdulsaheel Oct 28, 2026
6194331
sleep screen printed bpm, ms and br/min untranslated with '.' decimals
abdulsaheel Oct 28, 2026
0635108
add the coach answer text and band rename dialog to the gallery
abdulsaheel Oct 28, 2026
150d297
russian arb was missing placeholder types for three messages
abdulsaheel Oct 28, 2026
af3e0c7
step goal test looked up buttons whose labels merge into the gauge card
abdulsaheel Oct 28, 2026
8f63f61
sleep scrub temp used a '.' decimal in every locale
abdulsaheel Oct 28, 2026
bac98e9
journal ai sheet test tapped the english link in russian
abdulsaheel Oct 28, 2026
eb68e0b
homeSwitcherDay is shared with the health tab now; sub-tab test off t…
abdulsaheel Oct 28, 2026
e84b430
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 28, 2026
bf29c4d
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 28, 2026
16c3ca5
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 28, 2026
0d292ec
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 28, 2026
b79a197
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 28, 2026
5587893
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
e77e116
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
82572af
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
b0d33e5
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
c78177e
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
fb00961
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
46726a6
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
94d7e76
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 29, 2026
f7aec1b
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
4a08226
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
1d0ddd8
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
3d376ea
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
e163a72
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
43946bd
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
38008c4
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
628ba7e
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
546d90c
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
da1907b
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
525bee7
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
4428655
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
081866c
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
600b8e1
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
1b80b6e
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
a68a172
Merge branch 'fix/notifications-alarm-and-widgets' into fix/ui-and-tr…
abdulsaheel Oct 30, 2026
3fe9dfe
Merge remote-tracking branch 'origin/main' into fix/ui-and-translations
abdulsaheel Oct 30, 2026
45646c3
say what the report encrypts, name percentage points, and word the co…
abdulsaheel Oct 31, 2026
7b1bb0d
translate the poster's elevation caption in feet too
abdulsaheel Oct 31, 2026
43013d7
keep a held import report through a cancelled retry, and continue onl…
abdulsaheel Oct 31, 2026
981cab3
lock the composer while a chat opens or deletes, and drop a model lis…
abdulsaheel Oct 31, 2026
f5134e4
drop the old day's vitals when a new day is picked
abdulsaheel Oct 31, 2026
fefc8b4
sleep screen: a failed read names the night asked for, shows no plan …
abdulsaheel Oct 31, 2026
615574f
a failed session-history read shows the retry card, not an empty history
abdulsaheel Oct 31, 2026
cf90e07
read the old step goal right before the merge, so overlapping updates…
abdulsaheel Oct 31, 2026
d11eeae
a cleared profile field in setup is saved as cleared
abdulsaheel Oct 31, 2026
a1a175a
give the russian feet caption its placeholder type
abdulsaheel Oct 31, 2026
67d1d9a
keep the vitals day stepper when a picked day fails to read
abdulsaheel Oct 31, 2026
9bdd26a
keep the sleep day stepper when a retry fails again
abdulsaheel Oct 31, 2026
d338370
only null a profile field in setup that opened filled and was cleared
abdulsaheel Oct 31, 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
6 changes: 6 additions & 0 deletions lib/data/local_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ bool rmssdFromSessionEstimator(Object? sessionEnvelope) =>
/// The local data contract for every insights screen + the AI Coach.
/// Return types mirror the cloud ApiClient exactly (defensive Map/List blobs).
abstract class LocalRepository {
/// Runs [body] with each stored day it reads fetched and decoded at most
/// once. For a caller that reads several per-day getters for the same day
/// back to back (the Home day switcher), each of which would otherwise
/// decode that day's whole bundle again. The reads inside must not write.
Future<T> sharingDayReads<T>(Future<T> Function() body) => body();

Future<int> pendingActivityCount() async => (await pendingActivities()).length;

Future<List<ActivitySuggestion>> pendingActivities() =>
Expand Down
32 changes: 31 additions & 1 deletion lib/data/local_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import 'dart:convert';
import 'dart:isolate';
import 'dart:math' as math;

import 'package:flutter/foundation.dart' show visibleForTesting;

import '../compute/derivation_engine.dart';
import '../compute/findings.dart' show servedReadiness;
import '../compute/hr_max.dart';
Expand Down Expand Up @@ -97,10 +99,38 @@ class LocalRepositoryImpl extends LocalRepository {

// ── helpers ────────────────────────────────────────────────────────────────

static const _dayBundleMemo = #localRepositoryDayBundleMemo;

/// Bundle decodes performed by [_bundle], for tests.
@visibleForTesting
static int bundleDecodes = 0;

@override
Future<T> sharingDayReads<T>(Future<T> Function() body) =>
Zone.current[_dayBundleMemo] != null
? body()
: runZoned(body, zoneValues: {
_dayBundleMemo: <String, Future<Map<String, dynamic>?>>{},
});

/// Decode a day_result row's payload bundle (latest algo_version), or null.
Future<Map<String, dynamic>?> _bundle(String date) async {
///
/// Inside [sharingDayReads] the decoded bundle is shared by every getter for
/// that day: a full decode expands every stored curve into per-sample maps,
/// and the day switcher used to pay for it three times per tap on the UI
/// isolate. Readers only ever read the bundle, which is what makes the
/// sharing safe.
Future<Map<String, dynamic>?> _bundle(String date) {
final memo = Zone.current[_dayBundleMemo]
as Map<String, Future<Map<String, dynamic>?>>?;
if (memo == null) return _loadBundle(date);
return memo[date] ??= _loadBundle(date);
}

Future<Map<String, dynamic>?> _loadBundle(String date) async {
final row = await LocalDb.dayResult(date);
if (row == null) return null;
bundleDecodes++;
final b = _decode(row['payload_json']);
return b == null ? null : withoutWearableEstimates(b);
}
Expand Down
110 changes: 106 additions & 4 deletions lib/l10n/app_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"pairingFailedAdviceTitle": "Band gefunden, aber Verbindung nicht abgeschlossen",
"pairingFailedAdviceBody": "Meist klappt es, wenn du aus etwa einem Meter Entfernung erneut suchst.",
"profileSetupTitle": "Über dich",
"profileSetupBody": "Vier Angaben beeinflussen, wie deine Daten ausgewertet werden. Lässt du eine leer, bleiben nur die Werte aus, die sie benötigen.",
"profileSetupBody": "Das Geschlecht ist die einzige Angabe, die zum Fortfahren nötig ist. Alter, Größe und Gewicht beeinflussen, wie deine Daten ausgewertet werden; lässt du eine davon leer, bleiben nur die Werte aus, die sie benötigen.",
"profileSetupSexHeader": "GESCHLECHT",
"profileSetupSexMale": "Männlich",
"profileSetupSexFemale": "Weiblich",
Expand Down Expand Up @@ -773,6 +773,8 @@
"journalComposeTodaySection": "Heute",
"journalComposeTrackSomethingElse": "Etwas anderes erfassen",
"journalComposeAnythingElseLabel": "Sonstiges",
"journalComposeTalkItThroughWithAi": "Mit KI durchsprechen",
"supplementTalkItThrough88a9d2": "Durchsprechen",
"journalComposeAnythingElseHint": "Ein paar Worte zum Tag.",
"journalComposeSavingLabel": "Wird gespeichert",
"journalComposeHowAreYouFeeling": "Wie fühlst du dich?",
Expand Down Expand Up @@ -854,6 +856,8 @@
"nutritionExpenditureSub": "HEUTE, AUS HERZFREQUENZ UND DEINEM PROFIL",
"nutritionRemoveTitle": "{label} entfernen?",
"nutritionRemoveBody": "Die Mahlzeit verschwindet aus dem Tag und aus allen Durchschnitten, in die sie eingeflossen ist. Das lässt sich nicht rückgängig machen.",
"nutritionSaveFailed": "Nicht gespeichert – die Mahlzeit ist noch da. Versuch es erneut.",
"nutritionRemoveFailed": "Nicht entfernt – die Mahlzeit ist noch da. Versuch es erneut.",
"nutritionNothingToMeasure": "Noch keine Daten, mit denen sich {label} vergleichen lässt",
"nutritionFloorAverageBody": "An jedem vollständigen Tag fehlte bei einer Mahlzeit die Angabe zu {nutrient}, daher wäre der Durchschnitt nur eine Untergrenze.",
"nutritionCountedNoFigureBody": "{count} der letzten {span} Tage wurden gezählt, aber keiner davon hatte eine Angabe zu {nutrient}.",
Expand Down Expand Up @@ -912,6 +916,7 @@
"coachLocalSub": "In diesem Netzwerk. Nichts verlässt deinen Rechner.",
"coachMenuSemantic": "Chats und KI-Einstellungen",
"coachModelHint": "Suchen oder ID eingeben",
"coachModelSelected": "Beim Speichern wird {model} verwendet",
"coachModelLabel": "Modell",
"coachModelsFound": "{n, plural, one{{n} Modell. Zum Auswählen antippen.} other{{n} Modelle. Zum Auswählen antippen.}}",
"coachNavTitle": "Coach",
Expand Down Expand Up @@ -1210,13 +1215,13 @@
"cycleNextPeriodBetween": "NÄCHSTE PERIODE, ERWARTET ZWISCHEN",
"cycleNextPeriodAround": "NÄCHSTE PERIODE, ERWARTET ETWA",
"cycleFromOneMeasuredGap": "basierend auf einem einzigen gemessenen Zyklus – daran lässt sich nicht erkennen, wie stark dein Zyklus schwankt",
"cyclePastEndOfIt": "{days} Tage nach Ende des Zeitraums · ",
"cyclePastEndOfIt": "{days, plural, one{1 Tag nach Ende des Zeitraums} other{{days} Tage nach Ende des Zeitraums}} · ",
"cycleInsideItNow": "du bist gerade in diesem Zeitraum · ",
"cycleInDaysRange": "in {lo}–{hi} Tagen · ",
"cycleHalfOfMeasuredGaps": "die Hälfte deiner {n} gemessenen Zyklen lag innerhalb einer so breiten Spanne",
"cycleLeadDaysLate": "{days} Tage überfällig · ",
"cycleLeadDaysLate": "{days, plural, one{1 Tag überfällig} other{{days} Tage überfällig}} · ",
"cycleLeadToday": "heute · ",
"cycleLeadInDays": "in {days} Tagen · ",
"cycleLeadInDays": "{days, plural, one{in 1 Tag} other{in {days} Tagen}} · ",
"cycleWhatYouUsuallyNotice": "Was dir normalerweise auffällt",
"cycleSymptomShapeSummary": "Vier Werte, einer pro Zykluswoche, zurückgerechnet ab deinen eingetragenen Periodenbeginnen. Du hast über {cycles} Zyklen an {daysByWeek} Tagen pro Woche etwas eingetragen – nur diese Tage fließen hier ein.",
"cycleRemoveLoggedDay": "{date} entfernen",
Expand Down Expand Up @@ -1278,6 +1283,7 @@
"healthTryAgain": "Erneut versuchen",
"healthWhatVitals": "Vitalwerte",
"healthWhatLabResults": "Laborergebnisse",
"cycleWhatCycleData": "Zyklusdaten",
"healthMeasuresUnit": "Messwerte",
"healthRowRestingHr": "Ruhepuls",
"healthRowHrv": "HRV",
Expand Down Expand Up @@ -1477,6 +1483,9 @@
"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",
"wellnessLoadFailedTitle": "Konnte nicht gelesen werden",
"wellnessLoadFailedBody": "Die gespeicherten Daten konnten nicht gelesen werden. Es wurde nichts gelöscht – das ist ein Ladefehler, es fehlen keine Daten.",
"homeTryAgain": "Erneut versuchen",
"homeNothingDerivedTitle": "Noch nichts ausgewertet",
"homeNothingDerivedBody": "Es wurden noch keine Daten vom Band verarbeitet.",
Expand All @@ -1492,6 +1501,9 @@
"homeProfileSettings": "Profil und Einstellungen",
"homeNothingTodayTitle": "Für heute nichts aufgezeichnet",
"homeNothingTodayBody": "Die zuletzt ausgewertete Nacht war {day}. Seitdem ist nichts Neues angekommen.",
"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.",
Expand Down Expand Up @@ -1723,6 +1735,7 @@
"sleepDetailHrv": "HRV",
"sleepDetailBreathing": "Atmung",
"sleepDetailTemp": "Temp.",
"sleepDetailTempRelative": "Temp. (rel.)",
"sleepDetailNotMeasuredCap": "Nicht gemessen",
"sleepDetailNoSignalAtMoment": "Zu diesem Zeitpunkt wurde kein Signal aufgezeichnet.",
"sleepDetailStageAwake": "Wach",
Expand All @@ -1742,6 +1755,7 @@
"sleepDetailAsleepWhileInBed": "Schlafanteil im Bett",
"sleepDetailLowerThanUsual": "niedriger als üblich",
"sleepDetailHigherThanUsual": "höher als üblich",
"sleepDetailPointsDelta": "{n} Prozentpunkte",
"sleepDetailFellAsleep": "Eingeschlafen",
"sleepDetailEarlierThanUsual": "früher als üblich",
"sleepDetailLaterThanUsual": "später als üblich",
Expand Down Expand Up @@ -2789,10 +2803,98 @@
"dataReanalyzeFailed": "Neuanalyse fehlgeschlagen: {error}",
"dataReanalyzeDaysFailed": "{n, plural, one{1 Tag konnte nicht analysiert werden. Wenn das wiederholt passiert, melde es bitte.} other{{n} Tage konnten nicht analysiert werden. Wenn das wiederholt passiert, melde es bitte.}}",
"napsInFuture": "Dieses Nickerchen ist noch nicht vorbei. Trage es ein, wenn du wach bist.",
"journalComposeEntrySaveFailed": "Nicht gespeichert – dein Eintrag ist noch da. Versuch es erneut.",
"journalComposeLoadFailed": "Das Journal für diesen Tag konnte nicht geöffnet werden.",
"journalComposeTryAgain": "Erneut versuchen",
"journalComposeAddToJournal": "Ins Journal übernehmen",
"workoutLoadFailedTitle": "Aktivität konnte nicht gelesen werden",
"workoutLoadFailedBody": "Deine Einheiten konnten nicht geladen werden. Nichts wurde gelöscht – das ist ein fehlgeschlagener Lesevorgang, keine fehlenden Daten.",
"activitySummaryClimbedFt": "+{ft} ft Anstieg",
"liveHrNoReadingTitle": "Kein Live-Wert",
"liveHrNotPairedWhy": "Es ist kein Band gekoppelt.",
"liveHrNotPairedFix": "Kopple eines im Profil, um Live-Herzschläge zu lesen.",
"liveHrNotConnectedWhy": "Dein Band ist nicht verbunden.",
"liveHrNotConnectedFix": "Live-Herzschläge brauchen eine offene Verbindung — die App verbindet sich, wenn du sie mit dem Band in Reichweite öffnest.",
"liveHrNoRecentBeatWhy": "Kein Herzschlag in den letzten {seconds} Sekunden.",
"liveHrStreamingFix": "Das Band sendet, solange es am Handgelenk ist und die App geöffnet ist.",
"liveHrTraceCaption": "Die letzten {count} Werte — {min}–{max} bpm. Nicht gespeichert; das ist der Live-Stream, keine Aufzeichnung deines Tages.",
"notifRecoveryReadyBody": "Erholung {score}.",
"notifRecoveryReadySleptBody": "Erholung {score}, geschlafen {hours} h {minutes} min.",
"notifStepGoalBody": "Du hast etwa {steps} Schritte erreicht – mindestens dein Ziel von {goal}.",
"notifLowBatteryBody": "Dein Band ist bei {percent} %. Lade es bald auf.",
"supplementUnreadableFields": "„{fields}“ sind keine Zahlen. Es wurde nichts gespeichert.",
"presentationHeightCm": "Größe (cm)",
"presentationHeightIn": "Größe (in)",
"presentationWeightLb": "Gewicht (lb)",
"supplementUnreadableField": "„{field}“ ist keine Zahl. Es wurde nichts gespeichert.",
"settingsGroupApp": "App",
"settingsGroupData": "Daten",
"settingsGroupAdvanced": "Erweitert",
"settingsCycleTrackingRowSubHealth": "Fügt „Zyklus“ unter „Gesundheit“ hinzu. Ausgeschaltet wird es ausgeblendet, bisherige Einträge bleiben erhalten",
"profileSetupCycleSub": "Trag deine Periode unter „Gesundheit“ ein. Das lässt sich später ändern.",
"settingsReportIssueRowTitle": "Problem melden",
"settingsReportIssueRowSub": "Sendet, was du auswählst, an die Entwickler; deine Daten werden verschlüsselt, die Angaben zur Meldung nicht",
"reportNavTitle": "Problem melden",
"reportCategoryGroup": "Worum es geht",
"reportCategorySync": "Synchronisierung",
"reportCategorySleep": "Schlaf",
"reportCategoryRecovery": "Erholung",
"reportCategoryWorkout": "Training",
"reportCategoryPairing": "Kopplung",
"reportCategoryOther": "Sonstiges",
"reportTitleLabel": "Titel",
"reportTitleHint": "Eine Zeile dazu, was schiefging",
"reportDescriptionLabel": "Was passiert ist",
"reportDescriptionHint": "Was du getan hast, was du erwartet hast, was du gesehen hast",
"reportAttachGroup": "Anhänge",
"reportScreenshotRow": "Screenshot hinzufügen",
"reportScreenshotRemove": "Screenshot entfernen",
"reportDatabaseRow": "Gesundheitsdaten der letzten 2 Wochen mitsenden",
"reportDatabaseWarning": "Deine Schlaf-, Herzfrequenz- und anderen Gesundheitsdaten der letzten 14 Tage (weniger Tage sekundengenauer Daten, falls das Ticket sonst zu groß wäre), dazu deine Tageswerte und Einstellungen. Sie werden nur gesendet, wenn dies aktiviert ist, und der Server löscht sie nach 14 Tagen. Ein Ticket mit Gesundheitsdaten kann bis zu 95 MB groß sein, nutze also nach Möglichkeit WLAN.",
"reportIncludedGroup": "Was enthalten ist",
"reportIncludedNote": "Kategorie, Titel, Beschreibung, App-Version, Plattform, Systemversion, Smartphone-Modell, Installations-ID und ob eine Datenbank oder ein Screenshot angehängt ist, werden unverschlüsselt übertragen, damit wir die Meldung zuordnen können, und 90 Tage aufbewahrt. Alles andere wird auf diesem Smartphone verschlüsselt, bevor es das Gerät verlässt, sodass nur die Entwickler es lesen können, und nach 30 Tagen gelöscht, oder nach 14 Tagen, wenn deine Datenbank angehängt ist. „Lokal teilen“ ist anders: Das ZIP, das an das Teilen-Menü übergeben wird, ist nicht verschlüsselt.",
"reportFileManifest": "Diese Dateiliste",
"reportFileMeta": "App-Version, Smartphone-Modell, Systemversion, Sprache, Zeitzone und eine zufällige Installations-ID",
"reportFileDevice": "Dein gekoppeltes Band und deine Sensoren: Typ, Verbindung, Akku und letzte Synchronisierung",
"reportFileState": "Synchronisierungs- und Auswertungsstatus sowie aktuelle Fehler",
"reportFileSyncLog": "Das aktuelle Synchronisierungsprotokoll der App",
"reportFileTelemetry": "Fehler und Ereignisse, die dieses Smartphone in den letzten 7 Tagen aufgezeichnet hat",
"reportFileUser": "Deine Kategorie, dein Titel und deine Beschreibung",
"reportFileScreenshot": "Der ausgewählte Screenshot",
"reportFileDatabase": "Deine vollständige Gesundheitsdatenbank, komprimiert",
"reportFileDatabaseSlice": "Gesundheitsdaten der letzten 14 Tage, dazu Tageswerte und Einstellungen, komprimiert",
"reportFullDatabaseRow": "Vollständige Gesundheitsdatenbank (nur lokal teilen)",
"reportFullDatabaseWarning": "Deine gesamten Gesundheitsdaten. Sie landen nur in der Datei, die „Lokal teilen“ erstellt, niemals auf unserem Server.",
"reportFullDatabaseNoUpload": "Die vollständige Datenbank ist zu groß zum Hochladen. Nutze „Lokal teilen“ und schick uns die Datei.",
"reportDatabaseCovered": "In der vollständigen Datenbank unten enthalten.",
"reportStageSlice": "Letzte 2 Wochen werden vorbereitet…",
"reportSend": "Ticket erstellen",
"reportSaveInstead": "Lokal teilen",
"reportNeedTitle": "Gib zuerst einen Titel ein.",
"reportSentTitle": "Ticket erstellt",
"reportSentBody": "Deine Ticket-ID ist {id}. Gib sie an, wenn du uns dazu kontaktierst.",
"reportCopyId": "ID kopieren",
"reportNotSentTitle": "Ticket nicht erstellt",
"reportTooLarge": "Dieses Ticket ist zu groß zum Hochladen. Nutze „Lokal teilen“ und schick uns die Datei, oder schalte die Gesundheitsdaten aus bzw. entferne den Screenshot.",
"reportRateLimited": "Du hast heute schon 3 Tickets erstellt. Versuch es morgen wieder oder teile dieses lokal.",
"reportStorageFull": "Der Meldeserver hat gerade keinen Platz für eine Datenbank. Du kannst das Ticket ohne sie erstellen.",
"reportSendWithoutDb": "Ticket ohne Datenbank erstellen",
"reportSendFailed": "Das Ticket konnte nicht erstellt werden. Prüfe deine Verbindung oder teile es stattdessen lokal.",
"reportMyReportsGroup": "Meine Meldungen",
"reportMyReportsSub": "Tippen, um sie jetzt zu löschen. Sonst wird sie am {date} gelöscht",
"reportDelete": "Löschen",
"reportDeleteFailed": "Löschen fehlgeschlagen. Versuch es später erneut.",
"reportSaveFailedTitle": "Meldung konnte nicht geteilt werden",
"reportSaveFailedBody": "Beim Erstellen oder Teilen der Datei ist etwas schiefgelaufen. Es wurde kein Ticket erstellt.",
"reportSaveRetry": "Erneut versuchen",
"reportStageCollecting": "App-Infos werden gesammelt…",
"reportStageLogs": "Protokolle werden gelesen…",
"reportStageDatabase": "Datenbank wird komprimiert…",
"reportStagePacking": "Dateien werden gepackt…",
"reportStageEncrypting": "Wird verschlüsselt…",
"reportStageUploading": "{size} MB werden hochgeladen…",
"reportStageSharing": "Teilen wird vorbereitet…",
"reportIdCopied": "{id} kopiert",
"reportDeleteConfirmTitle": "Bericht {id} löschen?",
"reportDeleteConfirmBody": "Er wird sofort vom Server entfernt und lässt sich danach nicht mehr über seine ID öffnen. Das lässt sich nicht rückgängig machen.",
"profileImplausibleFields": "Bitte {fields} prüfen: außerhalb des gültigen Bereichs, daher wurde nichts gespeichert.",
Expand Down
Loading
Loading