{ "@@locale": "en", "appTitle": "OpenStrap", "@appTitle": { "description": "App name shown in the OS task switcher / MaterialApp title." }, "profileTitle": "Profile", "@profileTitle": { "description": "Profile screen header." }, "profileMyDevices": "My devices", "@profileMyDevices": { "description": "Profile > Quick access row label." }, "profileLanguage": "Language", "@profileLanguage": { "description": "Profile > Quick access row label for the language picker." }, "languageSystemDefault": "System default", "@languageSystemDefault": { "description": "Option in the language picker that follows the OS locale." }, "actionCancel": "Cancel", "@actionCancel": { "description": "Generic Cancel button." }, "actionSave": "Save", "@actionSave": { "description": "Generic Save button." }, "actionContinue": "Continue", "@actionContinue": { "description": "Generic Continue button." }, "actionDone": "Done", "@actionDone": { "description": "Generic Done status label." }, "actionSettings": "Settings", "@actionSettings": { "description": "Settings icon semantic label." }, "actionUpdateApp": "Update the app", "@actionUpdateApp": { "description": "Fix action: the file needs a newer version of the app." }, "actionTryAnotherFile": "Try another file", "@actionTryAnotherFile": { "description": "Fix action: try another file." }, "stateOn": "On", "@stateOn": { "description": "On/off toggle state: on." }, "stateOff": "Off", "@stateOff": { "description": "On/off toggle state: off." }, "pillLocalNoCloud": "Local · no cloud", "@pillLocalNoCloud": { "description": "Pill badge: everything computed on-device." }, "pairingSkipForNow": "Skip for now", "@pairingSkipForNow": { "description": "Onboarding pairing screen: skip button." }, "pairingSkipNote": "The app opens without a band. Nothing is measured until one is paired.", "@pairingSkipNote": { "description": "Note under the skip button." }, "pairingIdleTitle": "Wake the band and hold it close", "@pairingIdleTitle": { "description": "Pairing state title: idle." }, "pairingIdleBody": "Take the band off the charger, put it on your wrist and keep the phone within arm’s reach.", "@pairingIdleBody": { "description": "Pairing state body: idle." }, "pairingScanningTitle": "Looking for your band", "@pairingScanningTitle": { "description": "Pairing state title: scanning." }, "pairingScanningBody": "A band that has just come off the charger can take up to half a minute to start advertising.", "@pairingScanningBody": { "description": "Pairing state body: scanning." }, "pairingNotFoundTitle": "No band in range", "@pairingNotFoundTitle": { "description": "Pairing state title: not found." }, "pairingNotFoundBody": "Nothing answered the scan. The band advertises only when it is awake and not already connected to another phone.", "@pairingNotFoundBody": { "description": "Pairing state body: not found." }, "pairingBondRefusedTitle": "The band refused the pairing", "@pairingBondRefusedTitle": { "description": "Pairing state title: bond refused." }, "pairingBondRefusedBody": "The band connected but refused the encryption key. That usually means an old pairing record on this phone, not a fault in the band.", "@pairingBondRefusedBody": { "description": "Pairing state body: bond refused." }, "pairingCancelledTitle": "Pairing was cancelled", "@pairingCancelledTitle": { "description": "Pairing state title: cancelled." }, "pairingCancelledBody": "The system picker was dismissed before a band was chosen.", "@pairingCancelledBody": { "description": "Pairing state body: cancelled." }, "pairingFailedTitle": "Pairing did not complete", "@pairingFailedTitle": { "description": "Pairing state title: failed." }, "pairingFailedBody": "The band was reachable but the session did not finish.", "@pairingFailedBody": { "description": "Pairing state body: failed." }, "pairingPairedTitle": "Paired", "@pairingPairedTitle": { "description": "Pairing state title: paired." }, "pairingPairedBody": "Setting up the first sync.", "@pairingPairedBody": { "description": "Pairing state body: paired." }, "pairingFindMyBand": "Find my band", "@pairingFindMyBand": { "description": "Pairing CTA: idle." }, "pairingSearching": "Searching…", "@pairingSearching": { "description": "Pairing CTA: scanning." }, "pairingOpenPickerAgain": "Open the picker again", "@pairingOpenPickerAgain": { "description": "Pairing CTA: cancelled." }, "pairingTryAgain": "Try again", "@pairingTryAgain": { "description": "Pairing CTA: default retry." }, "pairingNotFoundAdviceTitle": "Three things stop a band answering", "@pairingNotFoundAdviceTitle": { "description": "Advice card title: not found." }, "pairingNotFoundAdviceBody": "It is still on the charger; it is out of range; or it is still connected to another phone or to the vendor app.", "@pairingNotFoundAdviceBody": { "description": "Advice card body: not found." }, "pairingNotFoundAdviceFix": "Force-quit the other app, then scan again", "@pairingNotFoundAdviceFix": { "description": "Advice card fix: not found." }, "pairingBondRefusedAdviceTitle": "Forget the band in Bluetooth settings first", "@pairingBondRefusedAdviceTitle": { "description": "Advice card title: bond refused." }, "pairingBondRefusedAdviceBody": "In the phone’s Bluetooth settings, forget the band, then scan again here. Only the system can clear the old pairing record.", "@pairingBondRefusedAdviceBody": { "description": "Advice card body: bond refused." }, "pairingBondRefusedAdviceFix": "Then come back and tap Try again", "@pairingBondRefusedAdviceFix": { "description": "Advice card fix: bond refused." }, "pairingFailedAdviceTitle": "The band was found but the session did not finish", "@pairingFailedAdviceTitle": { "description": "Advice card title: failed." }, "pairingFailedAdviceBody": "Scanning again from a metre away normally works.", "@pairingFailedAdviceBody": { "description": "Advice card body: failed." }, "profileSetupTitle": "About you", "@profileSetupTitle": { "description": "Profile setup screen header." }, "profileSetupBody": "Sex is the one choice you need to make to continue. Age, height and weight change how your data is scored; leave any of them blank and only the metrics that need it stay unavailable.", "@profileSetupBody": { "description": "Profile setup intro body." }, "profileSetupSexHeader": "SEX", "@profileSetupSexHeader": { "description": "Sex field section header." }, "profileSetupSexMale": "Male", "@profileSetupSexMale": { "description": "Sex option: male." }, "profileSetupSexFemale": "Female", "@profileSetupSexFemale": { "description": "Sex option: female." }, "profileSetupSexPreferNotToSay": "Prefer not to say", "@profileSetupSexPreferNotToSay": { "description": "Sex option: prefer not to say." }, "profileSetupOtherSexNote": "Calories use the mean of the two published sets. Training load and strain have only two published constants and no third, so they use the male pair.", "@profileSetupOtherSexNote": { "description": "Note shown when 'prefer not to say' is picked." }, "profileSetupAgeLabel": "AGE", "@profileSetupAgeLabel": { "description": "Field label: age." }, "profileSetupAgeUnit": "years", "@profileSetupAgeUnit": { "description": "Unit hint: years." }, "profileSetupAgeConsequence": "Without it: heart-rate zones, calories, fitness age.", "@profileSetupAgeConsequence": { "description": "What is lost without age." }, "profileSetupHeightLabel": "HEIGHT", "@profileSetupHeightLabel": { "description": "Field label: height." }, "profileSetupHeightConsequence": "Without it: stride length, and distance from steps.", "@profileSetupHeightConsequence": { "description": "What is lost without height." }, "profileSetupWeightLabel": "WEIGHT", "@profileSetupWeightLabel": { "description": "Field label: weight." }, "profileSetupWeightConsequence": "Without it: calories and training load.", "@profileSetupWeightConsequence": { "description": "What is lost without weight." }, "profileSetupOptional": "OPTIONAL", "@profileSetupOptional": { "description": "Field tag: optional." }, "profileSetupPickOneToContinue": "Pick one option above to continue.", "@profileSetupPickOneToContinue": { "description": "Hint below the disabled Continue button." }, "alarmNavTitle": "Alarm", "@alarmNavTitle": { "description": "Alarm screen title." }, "alarmFiredAt": "Fired at {time}", "@alarmFiredAt": { "description": "Alarm screen pill after the band fired the alarm today.", "placeholders": { "time": { "type": "String" } } }, "alarmNavSub": "Wakes you on the band, not the phone", "@alarmNavSub": { "description": "Alarm screen subtitle." }, "alarmArmedFor": "ARMED FOR", "@alarmArmedFor": { "description": "Armed-for section label." }, "alarmNextLabel": "NEXT", "@alarmNextLabel": { "description": "Next-occurrence section label." }, "alarmScheduleGroup": "Weekly schedule", "@alarmScheduleGroup": { "description": "Settings group: the 7-day alarm schedule." }, "alarmWakeTimeRowTitle": "Wake time", "@alarmWakeTimeRowTitle": { "description": "Row: a weekday's configured wake time." }, "alarmNotConnectedTitle": "The band is not connected", "@alarmNotConnectedTitle": { "description": "Status card: band not connected." }, "alarmNotConnectedBody": "Changing, testing or cancelling the alarm needs a live connection. An alarm that is already set still works; it lives on the band.", "@alarmNotConnectedBody": { "description": "Status card body: band not connected." }, "alarmSetAnAlarm": "Set an alarm", "@alarmSetAnAlarm": { "description": "Button: set an alarm." }, "alarmChangeTheTime": "Change the time", "@alarmChangeTheTime": { "description": "Button: change the time." }, "alarmTestTheBuzz": "Test the buzz", "@alarmTestTheBuzz": { "description": "Button: test the buzz." }, "alarmCancelTheAlarm": "Cancel the alarm", "@alarmCancelTheAlarm": { "description": "Button: cancel the alarm." }, "alarmBuzzingTheBand": "Buzzing the band", "@alarmBuzzingTheBand": { "description": "Snackbar: testing the buzz." }, "alarmCancelled": "Alarm cancelled", "@alarmCancelled": { "description": "Snackbar: alarm cancelled." }, "alarmSentToBand": "Alarm sent to the band", "@alarmSentToBand": { "description": "Snackbar: alarm sent." }, "alarmInThePast": "In the past — it has already fired or been missed", "@alarmInThePast": { "description": "Which-day label: in the past." }, "alarmGlanceInThePast": "Fired or missed", "@alarmGlanceInThePast": { "description": "Short form of alarmInThePast for the Home 'At a glance' alarm tile, which is half the screen wide." }, "alarmLaterToday": "Later today", "@alarmLaterToday": { "description": "Which-day label: later today." }, "alarmTomorrow": "Tomorrow", "@alarmTomorrow": { "description": "Which-day label: tomorrow." }, "alarmInDays": "In {days} days", "@alarmInDays": { "description": "Which-day label: N days from now.", "placeholders": { "days": { "type": "int" } } }, "alarmStateConfirmed": "Confirmed", "@alarmStateConfirmed": { "description": "Arm state label: confirmed." }, "alarmStateWaiting": "Waiting", "@alarmStateWaiting": { "description": "Arm state label: waiting." }, "alarmStateNotConfirmed": "Not confirmed", "@alarmStateNotConfirmed": { "description": "Arm state label: unknown/not confirmed." }, "alarmStateNotSet": "Not set", "@alarmStateNotSet": { "description": "Arm state label: none." }, "alarmHeadlineConfirmed": "The band has this alarm", "@alarmHeadlineConfirmed": { "description": "Detail card headline: confirmed." }, "alarmHeadlinePending": "Sent — waiting for the band to confirm", "@alarmHeadlinePending": { "description": "Detail card headline: pending." }, "alarmHeadlineUnknown": "We cannot tell whether this will fire", "@alarmHeadlineUnknown": { "description": "Detail card headline: unknown." }, "alarmHeadlineNone": "No alarm is set", "@alarmHeadlineNone": { "description": "Detail card headline: none." }, "alarmDetailConfirmed": "The band reported that it latched the alarm.", "@alarmDetailConfirmed": { "description": "Detail card body: confirmed." }, "alarmDetailPending": "The write reached the band. Its confirmation usually arrives within a few seconds.", "@alarmDetailPending": { "description": "Detail card body: pending." }, "alarmDetailUnknown": "This is the time the app last sent, but the band never confirmed it. Set it again while connected if you need to be sure.", "@alarmDetailUnknown": { "description": "Detail card body: unknown." }, "bandNotifNavTitle": "Band notifications", "@bandNotifNavTitle": { "description": "Screen title." }, "bandNotifNavSub": "WHAT MAKES THE STRAP BUZZ", "@bandNotifNavSub": { "description": "Screen subtitle." }, "bandNotifUnsupportedTitle": "This phone cannot do it", "@bandNotifUnsupportedTitle": { "description": "Status card: unsupported platform." }, "bandNotifUnsupportedBody": "Reading which app posted a notification is an Android capability. iOS gives no app that access, including this one.", "@bandNotifUnsupportedBody": { "description": "Status card body: unsupported platform." }, "bandNotifRelayGroup": "Relay", "@bandNotifRelayGroup": { "description": "Settings group header." }, "bandNotifBuzzOnAppNotifs": "Buzz on app notifications", "@bandNotifBuzzOnAppNotifs": { "description": "Setting row title." }, "bandNotifBuzzSub": "The strap buzzes when an app below notifies you. Only the app’s name is kept, on this phone; what a notification says is never read", "@bandNotifBuzzSub": { "description": "Setting row sub." }, "bandNotifAppsArmed": "Apps armed", "@bandNotifAppsArmed": { "description": "Setting row title: count of armed apps." }, "bandNotifPermissionTitle": "Android needs to let us see notifications", "@bandNotifPermissionTitle": { "description": "Status card: needs permission." }, "bandNotifPermissionBody": "The permission says which app posted, and that is all this uses it for. The names stay on this phone and nothing leaves it.", "@bandNotifPermissionBody": { "description": "Status card body: needs permission." }, "bandNotifGrantAccess": "Grant notification access", "@bandNotifGrantAccess": { "description": "Fix button: grant access." }, "bandNotifEmptyTitle": "No app has notified you yet", "@bandNotifEmptyTitle": { "description": "Status card: no apps yet." }, "bandNotifEmptyBody": "Apps appear here the first time each one notifies you while the relay is on. From its second notification, an app can buzz.", "@bandNotifEmptyBody": { "description": "Status card body: no apps yet." }, "bandNotifAppsGroup": "Apps that notify you", "@bandNotifAppsGroup": { "description": "Settings group header: apps list." }, "bandNotifOneBuzzTitle": "One buzz, not a stream", "@bandNotifOneBuzzTitle": { "description": "Status card: rate limiting explained." }, "bandNotifOneBuzzBody": "Repeats from one app within four seconds are ignored. Ongoing notifications (music, downloads) never buzz, and nothing buzzes while disconnected.", "@bandNotifOneBuzzBody": { "description": "Status card body: rate limiting explained." }, "bandNotifBuzzesDescription": "buzzes", "@bandNotifBuzzesDescription": { "description": "Semantic label suffix: buzzes." }, "bandNotifDoesNotBuzzDescription": "does not buzz", "@bandNotifDoesNotBuzzDescription": { "description": "Semantic label suffix: does not buzz." }, "bandNotifBuzzes": "Buzzes", "@bandNotifBuzzes": { "description": "Row trailing label: buzzes." }, "dataNavTitle": "Your data", "@dataNavTitle": { "description": "Screen title." }, "dataExportGroup": "Export", "@dataExportGroup": { "description": "Group header." }, "dataExportSpreadsheets": "Export as spreadsheets", "@dataExportSpreadsheets": { "description": "Row title." }, "dataExportSpreadsheetsSub": "{count} CSV files: daily metrics, workouts, sleep, journal, labs and all you entered. Each day notes its source and scoring version", "@dataExportSpreadsheetsSub": { "description": "Row sub with file count.", "placeholders": { "count": { "type": "int" } } }, "dataExportDatabase": "Export the database", "@dataExportDatabase": { "description": "Row title." }, "dataExportDatabaseSub": "One .db file, lossless, and the only format that restores onto another phone. Any SQLite reader can open it, so keep it safe", "@dataExportDatabaseSub": { "description": "Row sub." }, "dataExportEncrypted": "Export an encrypted backup", "@dataExportEncrypted": { "description": "Row title." }, "dataExportEncryptedSub": "The same full copy, locked with a passphrase, for somewhere like iCloud. Forget the passphrase and no one can open the file", "@dataExportEncryptedSub": { "description": "Row sub." }, "dataAutoBackupGroup": "Automatic backup", "@dataAutoBackupGroup": { "description": "Group header." }, "dataHowOften": "How often", "@dataHowOften": { "description": "Row title." }, "dataHowOftenSub": "Writes a compressed, unencrypted copy to {dir}, keeping the last {kept}", "@dataHowOftenSub": { "description": "Row sub.", "placeholders": { "dir": { "type": "String" }, "kept": { "type": "int" } } }, "dataLastBackup": "Last backup", "@dataLastBackup": { "description": "Row title." }, "dataNever": "Never", "@dataNever": { "description": "Row value: never." }, "dataBackUpNow": "Back up now", "@dataBackUpNow": { "description": "Row title." }, "dataBringDataInGroup": "Bring data in", "@dataBringDataInGroup": { "description": "Group header." }, "dataImportFile": "Import a file", "@dataImportFile": { "description": "Row title." }, "dataImportFileSub": "An OpenStrap backup, a journal CSV, a raw sensor export or a vendor CSV. Days the band already measured are never overwritten", "@dataImportFileSub": { "description": "Row sub." }, "dataFromYourPhone": "From your phone", "@dataFromYourPhone": { "description": "Row title." }, "dataFromYourPhoneSub": "Resting heart rate, blood pressure, glucose and body temperature", "@dataFromYourPhoneSub": { "description": "Row sub." }, "dataRebuildGroup": "Rebuild", "@dataRebuildGroup": { "description": "Group header." }, "dataReanalyzeEverything": "Re-analyze everything", "@dataReanalyzeEverything": { "description": "Row title." }, "dataReanalyzeEverythingSub": "Scores every day again from what is stored. Needed after a long-haul flight, and after an import that landed days out of order", "@dataReanalyzeEverythingSub": { "description": "Row sub." }, "dataThatDidNotWork": "That did not work", "@dataThatDidNotWork": { "description": "Status card title: failure." }, "dataFailed": "Failed: {error}", "@dataFailed": { "description": "Generic failure message with error text.", "placeholders": { "error": { "type": "String" } } }, "dataNothingExportedFailed": "Nothing exported ({failed} failed).", "@dataNothingExportedFailed": { "description": "Export result: nothing exported, some sets failed.", "placeholders": { "failed": { "type": "String" } } }, "dataNothingToExportYet": "Nothing to export yet.", "@dataNothingToExportYet": { "description": "Export result: nothing to export." }, "dataFilesShared": "{n, plural, one{1 file shared.} other{{n} files shared.}}", "@dataFilesShared": { "description": "Export result: N files shared.", "placeholders": { "n": { "type": "int" } } }, "dataSetsFailed": "{count} set(s) failed: {list}.", "@dataSetsFailed": { "description": "N export sets failed, with names.", "placeholders": { "count": { "type": "int" }, "list": { "type": "String" } } }, "dataDatabaseShared": "Database shared. It is the complete copy.", "@dataDatabaseShared": { "description": "Export result: database shared." }, "dataEncryptedBackupShared": "Encrypted backup shared. Without that passphrase nobody can open it — including this app, and including us.", "@dataEncryptedBackupShared": { "description": "Export result: encrypted backup shared." }, "dataDaysReanalyzed": "{n, plural, one{1 day re-analyzed.} other{{n} days re-analyzed.}}", "@dataDaysReanalyzed": { "description": "Re-analyze result: N days.", "placeholders": { "n": { "type": "int" } } }, "dataBackupFailed": "Backup failed: {error}", "@dataBackupFailed": { "description": "Backup result: failed.", "placeholders": { "error": { "type": "String" } } }, "dataBackupSkipped": "Backup skipped.", "@dataBackupSkipped": { "description": "Backup result: skipped." }, "dataBackedUpTo": "Backed up to {path}", "@dataBackedUpTo": { "description": "Backup result: succeeded, with path.", "placeholders": { "path": { "type": "String" } } }, "dataCouldNotOpenPicker": "Could not open the file picker: {error}", "@dataCouldNotOpenPicker": { "description": "Import: could not open picker.", "placeholders": { "error": { "type": "String" } } }, "dataSummariesDidNotBodyShort": "Every imported row is saved, but updating your trends failed ({error}). Trends and insights still show the data you had before.", "@dataSummariesDidNotBodyShort": { "description": "Rollup error body (shorter, no re-analyze CTA copy).", "placeholders": { "error": { "type": "String" } } }, "devicesAddASensor": "Add a sensor", "@devicesAddASensor": { "description": "Row/sheet title: add a sensor." }, "devicesAddASensorSub": "A heart-rate strap or a ring, alongside the band", "@devicesAddASensorSub": { "description": "Row sub." }, "devicesWhichSourceWins": "Which source wins", "@devicesWhichSourceWins": { "description": "Row title: opens the per-signal priority editor." }, "devicesWhichSourceWinsSub": "When two of your devices measure the same thing", "@devicesWhichSourceWinsSub": { "description": "Row sub for the priority-editor entry." }, "devicesResetToDefault": "Back to the default order", "@devicesResetToDefault": { "description": "Per-signal reset-to-physics-ladder action in the priority editor." }, "devicesMySources": "My sources", "@devicesMySources": { "description": "Screen title." }, "devicesNoBandPaired": "No band is paired", "@devicesNoBandPaired": { "description": "Status card title." }, "devicesNothingMeasuringYet": "Nothing is measuring yet", "@devicesNothingMeasuringYet": { "description": "Status card title." }, "devicesPhoneCountingBody": "The phone counts steps and nothing else. Heart rate, sleep, recovery and temperature all abstain until a band is paired.", "@devicesPhoneCountingBody": { "description": "Status card body: phone only." }, "devicesNothingMeasuringBody": "No band is paired and no phone steps are arriving, so every metric in the app will abstain rather than estimate.", "@devicesNothingMeasuringBody": { "description": "Status card body: nothing measuring." }, "devicesPairABand": "Pair a band", "@devicesPairABand": { "description": "Fix button." }, "devicesLive": "LIVE", "@devicesLive": { "description": "Section header." }, "devicesQualityLadder": "THE QUALITY LADDER", "@devicesQualityLadder": { "description": "Section header." }, "devicesNothingHereYet": "Nothing here yet", "@devicesNothingHereYet": { "description": "Empty tier row note." }, "devicesExperimental": "Experimental", "@devicesExperimental": { "description": "Tag: experimental support." }, "devicesStreamingBeats": "Streaming beats", "@devicesStreamingBeats": { "description": "Source state: streaming." }, "devicesStoringWhatItSends": "Paired · storing what it sends", "@devicesStoringWhatItSends": { "description": "Source state: paired, unranked." }, "devicesWaitingForWorkout": "Waiting for a workout", "@devicesWaitingForWorkout": { "description": "Source state: paired sensor, idle." }, "devicesReportingSteps": "Reporting steps", "@devicesReportingSteps": { "description": "Source state: phone reporting." }, "devicesNoStepsArriving": "No steps arriving", "@devicesNoStepsArriving": { "description": "Source state: phone not reporting." }, "devicesSyncing": "Syncing", "@devicesSyncing": { "description": "Source state: syncing." }, "devicesConnected": "Connected", "@devicesConnected": { "description": "Source state: connected." }, "devicesNotConnected": "Not connected", "@devicesNotConnected": { "description": "Source state: not connected." }, "devicesTierRank": "Tier {rank}", "@devicesTierRank": { "description": "Tier pill: rank only.", "placeholders": { "rank": { "type": "int" } } }, "devicesTierRankLabel": "Tier {rank} · {label}", "@devicesTierRankLabel": { "description": "Tier row title: rank and label.", "placeholders": { "rank": { "type": "int" }, "label": { "type": "String" } } }, "devicesOuraKeyRefused": "The ring rejected the key. Re-pair it to install a key it accepts.", "@devicesOuraKeyRefused": { "description": "Snackbar: Oura sync failed — the ring explicitly refused the pairing key." }, "devicesBandKeyRefused": "The band rejected the key. Re-pair it to install a key it accepts.", "@devicesBandKeyRefused": { "description": "Snackbar: Mi Band sync failed — the band explicitly refused the pairing key." }, "devicesOuraStorageFailed": "The sync could not be saved completely. Please try syncing again.", "@devicesOuraStorageFailed": { "description": "Snackbar: Oura sync failed — the durable storage commit failed." }, "devicesOuraProtocolTimeout": "The ring stopped answering mid-sync. Please try syncing again.", "@devicesOuraProtocolTimeout": { "description": "Snackbar: Oura sync failed — protocol timeout / incomplete answer." }, "devicesOuraWriteRefused": "Could not send a command to the ring. Please try syncing again.", "@devicesOuraWriteRefused": { "description": "Snackbar: Oura sync failed — the link refused a command write." }, "devicesOuraCheckpointUnconfirmed": "The sync could not be completed. Please try syncing again.", "@devicesOuraCheckpointUnconfirmed": { "description": "Snackbar: Oura sync failed — a batch checkpoint was not confirmed in time." }, "devicesSyncingTheRing": "Syncing the ring…", "@devicesSyncingTheRing": { "description": "Snackbar: syncing ring." }, "devicesSynced": "Synced.", "@devicesSynced": { "description": "Snackbar: sync succeeded." }, "devicesCouldNotReachRing": "Could not reach the ring. It has to be nearby, and not connected to another app.", "@devicesCouldNotReachRing": { "description": "Snackbar: sync failed." }, "devicesCouldNotReachCorosWatch": "Could not reach it. It has to be nearby, and not connected to another app.", "@devicesCouldNotReachCorosWatch": { "description": "Snackbar: sync failed, for a paired Coros or Pebble watch (device-neutral text)." }, "devicesSyncingTheSensor": "Syncing the sensor…", "@devicesSyncingTheSensor": { "description": "Snackbar: syncing a paired non-ring sensor (e.g. a thermometer)." }, "devicesCouldNotReachSensor": "Could not reach the sensor. It has to be nearby, and not connected to another app.", "@devicesCouldNotReachSensor": { "description": "Snackbar: sensor sync failed." }, "deviceFilterAllDevices": "All devices", "@deviceFilterAllDevices": { "description": "First pill in a metric screen's per-device filter — the merged view." }, "devicesForgetSensor": "Forget {name}?", "@devicesForgetSensor": { "description": "Dialog title: forget a paired sensor.", "placeholders": { "name": { "type": "String" } } }, "devicesForgetSensorBody": "It stops being used in workouts and has to be paired again. Everything already saved on this phone stays.", "@devicesForgetSensorBody": { "description": "Dialog body: forget a sensor." }, "devicesKeepItPaired": "Keep it paired", "@devicesKeepItPaired": { "description": "Dialog action: cancel forget." }, "devicesForgetIt": "Forget it", "@devicesForgetIt": { "description": "Dialog action: confirm forget." }, "devicesNameThisBand": "Name this band", "@devicesNameThisBand": { "description": "Dialog title: rename." }, "devicesYourBand": "Your band", "@devicesYourBand": { "description": "Rename field hint." }, "devicesNameCharset": "Letters, numbers, space, and ' . _ -", "@devicesNameCharset": { "description": "Rename field helper text." }, "devicesGiveItAName": "Give it a name", "@devicesGiveItAName": { "description": "Rename validation error: empty." }, "devicesNameCharsetError": "Only letters, numbers, space, and ' . _ -", "@devicesNameCharsetError": { "description": "Rename validation error: bad charset." }, "devicesRenamedTo": "Renamed to {name}", "@devicesRenamedTo": { "description": "Snackbar: renamed.", "placeholders": { "name": { "type": "String" } } }, "devicesCouldNotRename": "Could not rename the band: {error}", "@devicesCouldNotRename": { "description": "Snackbar: rename failed.", "placeholders": { "error": { "type": "String" } } }, "devicesForgetBand": "Forget {name}?", "@devicesForgetBand": { "description": "Dialog title: forget band.", "placeholders": { "name": { "type": "String" } } }, "devicesForgetBandBody": "The band stops syncing until you pair it again. Everything already saved on this phone stays.", "@devicesForgetBandBody": { "description": "Dialog body: forget band." }, "devicesSupport": "Support", "@devicesSupport": { "description": "Row title: support status." }, "devicesSensorExperimentalSub": "Decoded from the protocol, never checked against the hardware — nobody here owns one.", "@devicesSensorExperimentalSub": { "description": "Row sub: sensor experimental." }, "devicesWhatItDoes": "What it does", "@devicesWhatItDoes": { "description": "Row title." }, "devicesLastData": "Last data", "@devicesLastData": { "description": "Row title." }, "devicesNothingBankedYet": "Nothing banked yet", "@devicesNothingBankedYet": { "description": "Row sub: no data yet." }, "devicesSyncNow": "Sync now", "@devicesSyncNow": { "description": "Row title: manual sync." }, "devicesSyncNowSub": "Fetch whatever it has been holding", "@devicesSyncNowSub": { "description": "Row sub: manual sync, for a sensor that fetches held history off a cursor (e.g. Oura)." }, "devicesSyncNowSubListen": "Listen for whatever it sends right now", "@devicesSyncNowSubListen": { "description": "Row sub: manual sync, for a sensor that only opens a bounded listen window with no history fetch." }, "devicesName": "Name", "@devicesName": { "description": "Row title: device name." }, "devicesConnectToRename": "Connect to the band to change it", "@devicesConnectToRename": { "description": "Row sub: rename disabled." }, "devicesBattery": "Battery", "@devicesBattery": { "description": "Row title." }, "devicesBatteryNotReported": "Not reported since the last connection", "@devicesBatteryNotReported": { "description": "Row sub: battery unknown." }, "devicesBatteryPack": "Battery pack", "@devicesBatteryPack": { "description": "Row title: the charge left in the external battery pack sitting on the band." }, "devicesBatteryPackSub": "Reported by the band about every 10 minutes", "@devicesBatteryPackSub": { "description": "Row sub under the battery-pack charge: where the number comes from and how often it updates." }, "devicesCharging": "Charging", "@devicesCharging": { "description": "Battery sub tag: charging." }, "devicesHeartRate": "Heart rate", "@devicesHeartRate": { "description": "Row title: live heart rate." }, "devicesRightNow": "Right now", "@devicesRightNow": { "description": "Row sub: live value." }, "devicesCalibration": "Calibration", "@devicesCalibration": { "description": "Row title." }, "devicesBandExperimentalSub": "This band is decoded but nobody here has worn one. Its numbers have not been checked against the hardware, only against the protocol.", "@devicesBandExperimentalSub": { "description": "Row sub: band experimental." }, "devicesBuzzTheBand": "Buzz the band", "@devicesBuzzTheBand": { "description": "Row title." }, "devicesFindItByFeel": "Find it by feel", "@devicesFindItByFeel": { "description": "Row sub." }, "devicesForgetThisBand": "Forget this band", "@devicesForgetThisBand": { "description": "Row title: danger action." }, "pairSensorAddASensor": "Add a sensor", "@pairSensorAddASensor": { "description": "Screen nav title." }, "pairSensorWhatThisAdds": "What this adds", "@pairSensorWhatThisAdds": { "description": "Section header: no paired sensor." }, "pairSensorPairAnother": "Pair another", "@pairSensorPairAnother": { "description": "Section header: has a paired sensor." }, "pairSensorSearchWouldHideSheet": "Searching would hide the system pairing sheet", "@pairSensorSearchWouldHideSheet": { "description": "iOS-gate status card title." }, "pairSensorKeyTitle": "Already set up elsewhere?", "@pairSensorKeyTitle": { "description": "Section title for pairing with an existing device key." }, "pairSensorKeyBody": "Have this device’s key? Paste it to pair without a factory reset. Several keys, one per line, are tried in turn. Leave it empty to pair normally.", "@pairSensorKeyBody": { "description": "Explainer under the existing-key section title." }, "pairSensorKeyHint": "32 hex digits or base64 — one key per line", "@pairSensorKeyHint": { "description": "Hint text in the existing-key field." }, "pairSensorSearchAnyway": "Search anyway", "@pairSensorSearchAnyway": { "description": "iOS-gate status card fix." }, "devicePickerTitle": "Connect your devices", "@devicePickerTitle": { "description": "Unified pairing screen title." }, "devicePickerSubtitle": "Bring whatever you use. You can add more anytime.", "@devicePickerSubtitle": { "description": "Unified pairing screen subtitle." }, "devicePickerBrowseByCategory": "Browse by category", "@devicePickerBrowseByCategory": { "description": "Section header over the device category list." }, "devicePickerPrivacyNote": "Everything stays on this phone. Nothing is sent anywhere unless you choose to export it.", "@devicePickerPrivacyNote": { "description": "Footer privacy note on the device picker." }, "devicePickerSearchLabel": "Search devices or types", "@devicePickerSearchLabel": { "description": "Accessibility label for the device picker's search field." }, "devicePickerSearchHint": "Search devices or types", "@devicePickerSearchHint": { "description": "Placeholder text in the device picker's search field." }, "devicePickerNothingNearbyTitle": "Nothing found yet", "@devicePickerNothingNearbyTitle": { "description": "Status card title when the live scan has found nothing." }, "devicePickerNothingNearbyBody": "A device answers only while it is awake, worn, and not already connected to another phone or app.", "@devicePickerNothingNearbyBody": { "description": "Status card body when the live scan has found nothing." }, "devicePickerNearby": "Nearby", "@devicePickerNearby": { "description": "Section header over live scan results." }, "devicePickerScanning": "Scanning for devices nearby…", "@devicePickerScanning": { "description": "Row shown while the live scan is running." }, "devicePickerBlurbBand": "The strap this app is built around. WHOOP 4 or 5.", "@devicePickerBlurbBand": { "description": "Category row subtitle for the WHOOP band." }, "devicePickerBlurbRing": "Reads the ring directly — no Oura account or subscription.", "@devicePickerBlurbRing": { "description": "Category row subtitle for the Oura ring." }, "devicePickerBlurbPolarPmd": "A Polar Verity Sense or OH1. Beat timing measured optically, streamed during a workout, same as a chest strap.", "@devicePickerBlurbPolarPmd": { "description": "Category row subtitle for a Polar PMD optical sensor." }, "devicePickerBlurbSensor": "A chest strap or armband, for beat timing during a workout.", "@devicePickerBlurbSensor": { "description": "Category row subtitle for a standard Bluetooth heart-rate sensor." }, "devicePickerBlurbCoros": "A sports watch. Reads battery and live heart rate — recorded activities stay on the watch.", "@devicePickerBlurbCoros": { "description": "Category row subtitle for a Coros sports watch." }, "devicePickerBlurbMiband234": "Mi Band 2 or 3: heart rate, steps and sleep. Unpair it from Mi Fit or Zepp first, or reset it. Tap the band if it buzzes. Mi Band 4 isn’t supported.", "@devicePickerBlurbMiband234": { "description": "Category row subtitle for a Mi Band 2/3." }, "devicePickerBlurbColmi": "A Colmi ring. Syncs heart rate, sleep stages, steps, SpO2, HRV and stress; values the ring computes itself are labelled as Colmi's. Experimental.", "@devicePickerBlurbColmi": { "description": "Category row subtitle for a Colmi smart ring." }, "devicePickerCannotPairFromHere": "That device cannot be paired from this screen.", "@devicePickerCannotPairFromHere": { "description": "Shown when a tapped category has no pairing step behind it." }, "pairSensorSearching": "Searching…", "@pairSensorSearching": { "description": "Button label: scanning." }, "pairSensorSearchForSensors": "Search for sensors", "@pairSensorSearchForSensors": { "description": "Button label: idle." }, "pairSensorThatDidNotWork": "That did not work", "@pairSensorThatDidNotWork": { "description": "Status card title: failure." }, "pairSensorInRange": "In range", "@pairSensorInRange": { "description": "Section header: candidates list." }, "pairSensorListeningForSensors": "Listening for sensors…", "@pairSensorListeningForSensors": { "description": "Empty state while scanning." }, "pairSensorNothingFoundYet": "Nothing found yet", "@pairSensorNothingFoundYet": { "description": "Status card title: empty result." }, "pairSensorNothingFoundBody": "A sensor answers a search only while it is awake, worn or damp, and not already connected to another phone or app.", "@pairSensorNothingFoundBody": { "description": "Status card body: empty result." }, "pairSensorPaired": "Paired", "@pairSensorPaired": { "description": "Section header: already paired." }, "pairSensorUsedDuringWorkouts": "Used during workouts", "@pairSensorUsedDuringWorkouts": { "description": "Row sub: paired sensor." }, "pairSensorForgetThisSensor": "Forget this sensor", "@pairSensorForgetThisSensor": { "description": "Row title: danger action." }, "pairSensorForgetThisSensorSub": "Removes the source. The readings it already took stay.", "@pairSensorForgetThisSensorSub": { "description": "Row sub: forget sensor." }, "pairSensorPairing": "Pairing…", "@pairSensorPairing": { "description": "Row sub: pairing in progress." }, "pairSensorScanDidNotRun": "The scan did not run: {error}", "@pairSensorScanDidNotRun": { "description": "Error: scan failed to run.", "placeholders": { "error": { "type": "String" } } }, "pairSensorCouldNotPair": "Could not pair that device: {error}", "@pairSensorCouldNotPair": { "description": "Error: pairing failed.", "placeholders": { "error": { "type": "String" } } }, "phoneImportSystolic": "Blood pressure, systolic", "@phoneImportSystolic": { "description": "Imported measurement kind label." }, "phoneImportDiastolic": "Blood pressure, diastolic", "@phoneImportDiastolic": { "description": "Imported measurement kind label." }, "phoneImportGlucose": "Blood glucose", "@phoneImportGlucose": { "description": "Imported measurement kind label." }, "phoneImportBodyTemp": "Body temperature", "@phoneImportBodyTemp": { "description": "Imported measurement kind label." }, "phoneImportNavTitle": "From your phone", "@phoneImportNavTitle": { "description": "Screen title." }, "phoneImportRhrSection": "Resting heart rate", "@phoneImportRhrSection": { "description": "Section header." }, "phoneImportRhrExplainer": "Reads your resting heart rate from {store}, so the app has a rough idea of your normal before the band has measured one.", "@phoneImportRhrExplainer": { "description": "Explanatory body.", "placeholders": { "store": { "type": "String" } } }, "phoneImportRhrLimit": "Not used yet. Once the band has 14 nights of its own, it is compared with them below. It never becomes a reading of its own.", "@phoneImportRhrLimit": { "description": "Promise-limit body." }, "phoneImportReadRhr": "Read resting heart rate", "@phoneImportReadRhr": { "description": "Button label." }, "phoneImportWhatPhoneSays": "What your phone says", "@phoneImportWhatPhoneSays": { "description": "Metric row title." }, "phoneImportUsuallyRange": "usually {low}–{high} bpm, over {days} days from {store}", "@phoneImportUsuallyRange": { "description": "Metric row sub: baseline range.", "placeholders": { "low": { "type": "int" }, "high": { "type": "int" }, "days": { "type": "int" }, "store": { "type": "String" } } }, "phoneImportDisagreeTitle": "The phone and the band disagree", "@phoneImportDisagreeTitle": { "description": "Status card title: disagreement." }, "phoneImportAgreeTitle": "The phone and the band agree", "@phoneImportAgreeTitle": { "description": "Status card title: agreement." }, "phoneImportHigher": "higher", "@phoneImportHigher": { "description": "Comparison word: higher." }, "phoneImportLower": "lower", "@phoneImportLower": { "description": "Comparison word: lower." }, "phoneImportDisagreeBody": "{store} puts your resting heart rate {delta} bpm {dir} than this band over {nights} nights. They measure different things, so it stays unused.", "@phoneImportDisagreeBody": { "description": "Status card body: disagreement.", "placeholders": { "store": { "type": "String" }, "delta": { "type": "String" }, "dir": { "type": "String" }, "nights": { "type": "int" } } }, "phoneImportAgreeBody": "Over {nights} nights the band lands within {delta} bpm of what {store} said. It still is not used for anything.", "@phoneImportAgreeBody": { "description": "Status card body: agreement.", "placeholders": { "nights": { "type": "int" }, "delta": { "type": "String" }, "store": { "type": "String" } } }, "phoneImportMeasuredElsewhere": "Measured by something else", "@phoneImportMeasuredElsewhere": { "description": "Section header." }, "phoneImportMeasuredElsewhereBody": "A cuff, a glucose meter, a thermometer. The band can’t measure these, so each reading shows the app that recorded it.", "@phoneImportMeasuredElsewhereBody": { "description": "Explanatory body." }, "phoneImportNeverAveraged": "Shown as they arrived. Never averaged into one of this app’s own numbers, never used to teach it to guess one from the wrist.", "@phoneImportNeverAveraged": { "description": "Note: never blended." }, "phoneImportReadFrom": "Read from {store}", "@phoneImportReadFrom": { "description": "Button label.", "placeholders": { "store": { "type": "String" } } }, "phoneImportMovedTitle": "Height, weight and workouts moved", "@phoneImportMovedTitle": { "description": "Status card title: moved features." }, "phoneImportMovedBody": "Height and weight are on Edit profile now, and workouts this phone recorded are on Workout, under History. Each one sits on the screen it fills.", "@phoneImportMovedBody": { "description": "Status card body: moved features." }, "phoneImportRhrDenied": "{store} did not grant resting heart rate. Nothing was read.", "@phoneImportRhrDenied": { "description": "Permission denied message.", "placeholders": { "store": { "type": "String" } } }, "phoneImportRhrNothingUsable": "Nothing usable came back. It needs resting heart rate over enough days to show your usual range.", "@phoneImportRhrNothingUsable": { "description": "Nothing usable came back." }, "phoneImportRhrSeeded": "{n, plural, one{1 day added to your usual range. No day was added to any chart.} other{{n} days added to your usual range. No day was added to any chart.}}", "@phoneImportRhrSeeded": { "description": "Result: N days seeded.", "placeholders": { "n": { "type": "int" } } }, "phoneImportMeasurementsDenied": "{store} did not grant those readings. Nothing was read.", "@phoneImportMeasurementsDenied": { "description": "Permission denied message.", "placeholders": { "store": { "type": "String" } } }, "phoneImportNothingCameBack": "Nothing came back. {store} holds no readings of these kinds, or none inside the window it will share.", "@phoneImportNothingCameBack": { "description": "Nothing came back.", "placeholders": { "store": { "type": "String" } } }, "phoneImportReadingsStored": "{n, plural, one{1 reading stored, each with the app that recorded it.} other{{n} readings stored, each with the app that recorded it.}}", "@phoneImportReadingsStored": { "description": "Result: N readings stored.", "placeholders": { "n": { "type": "int" } } }, "profileDefaultName": "You", "@profileDefaultName": { "description": "Default display name." }, "profileQuickAccessGroup": "Quick access", "@profileQuickAccessGroup": { "description": "Group header." }, "profileSourcesCount": "{n, plural, one{1 source} other{{n} sources}}", "@profileSourcesCount": { "description": "Row sub: N sources.", "placeholders": { "n": { "type": "int" } } }, "profileEditProfile": "Edit profile", "@profileEditProfile": { "description": "Row title." }, "profileEditProfileSub": "Sex, age, height, weight", "@profileEditProfileSub": { "description": "Row sub." }, "profileAiCoach": "AI coach", "@profileAiCoach": { "description": "Row title." }, "profileNotSetUp": "Not set up", "@profileNotSetUp": { "description": "Row sub: not configured." }, "profileYourDataGroup": "Your data", "@profileYourDataGroup": { "description": "Group header." }, "profileStorage": "Storage", "@profileStorage": { "description": "Row title." }, "profileMoreSettings": "More settings", "@profileMoreSettings": { "description": "Row title." }, "profileMoreSettingsSub": "Import from {store}, export, backup, units, privacy, reset", "@profileMoreSettingsSub": { "description": "Row sub with health-store name.", "placeholders": { "store": { "type": "String" } } }, "welcomeHeadline": "Your band, decoded here", "@welcomeHeadline": { "description": "Welcome screen headline." }, "welcomeSubhead": "Every number is computed on this phone from the raw signal.", "@welcomeSubhead": { "description": "Welcome screen subhead." }, "welcomeSetUpMyBand": "Set up my band", "@welcomeSetUpMyBand": { "description": "Button label." }, "welcomeImporting": "Importing…", "@welcomeImporting": { "description": "Button label: busy." }, "welcomeBringMyHistoryFirst": "Bring my history first", "@welcomeBringMyHistoryFirst": { "description": "Button label: idle." }, "welcomeImportFooterNote": "A sensor export, an OpenStrap backup or a vendor CSV. Imported days count toward your usual range, and never overwrite a day the band measured.", "@welcomeImportFooterNote": { "description": "Footer note about imports." }, "welcomeChoosePassphrase": "Choose a passphrase", "@welcomeChoosePassphrase": { "description": "Dialog title: create." }, "welcomePassphrase": "Passphrase", "@welcomePassphrase": { "description": "Dialog title / field label." }, "welcomePassphraseCreateNote": "The file can’t be opened without it. There is no account or server holding a copy, so a forgotten passphrase means the backup is lost.", "@welcomePassphraseCreateNote": { "description": "Dialog body: creating." }, "welcomePassphraseOpenNote": "The one you chose when this backup was written.", "@welcomePassphraseOpenNote": { "description": "Dialog body: opening." }, "welcomeRepeatIt": "Repeat it", "@welcomeRepeatIt": { "description": "Dialog field label: confirm passphrase." }, "welcomeEncrypt": "Encrypt", "@welcomeEncrypt": { "description": "Dialog action: encrypt." }, "welcomeUnlock": "Unlock", "@welcomeUnlock": { "description": "Dialog action: unlock." }, "welcomePassphraseTooShort": "At least {n} characters.", "@welcomePassphraseTooShort": { "description": "Validation: too short.", "placeholders": { "n": { "type": "int" } } }, "welcomePassphraseMismatch": "The two do not match.", "@welcomePassphraseMismatch": { "description": "Validation: mismatch." }, "welcomePassphraseEmpty": "Enter the passphrase.", "@welcomePassphraseEmpty": { "description": "Validation: empty." }, "welcomeSourceCouldNotBeRead": "{source} could not be read", "@welcomeSourceCouldNotBeRead": { "description": "Error card title: unreadable file.", "placeholders": { "source": { "type": "String" } } }, "welcomeNothingWasImported": "Nothing was imported", "@welcomeNothingWasImported": { "description": "Status card title: nothing imported." }, "welcomeEveryRowRefused": "Every row was refused: {rejects}", "@welcomeEveryRowRefused": { "description": "Status card body: all rows refused.", "placeholders": { "rejects": { "type": "String" } } }, "welcomeNothingUsableInFile": "The file was read but there was nothing in it this app could use, or every day in it was one this band had already measured.", "@welcomeNothingUsableInFile": { "description": "Status card body: nothing usable." }, "welcomeWorkoutsCount": "{n, plural, one{1 workout} other{{n} workouts}}", "@welcomeWorkoutsCount": { "description": "N workouts, in a comma-list.", "placeholders": { "n": { "type": "int" } } }, "welcomeDaysAlreadyMeasured": "{n, plural, one{1 day already measured here and left alone} other{{n} days already measured here and left alone}}", "@welcomeDaysAlreadyMeasured": { "description": "N days already measured, in a comma-list.", "placeholders": { "n": { "type": "int" } } }, "welcomeDaysImported": "{n, plural, one{1 day imported} other{{n} days imported}}", "@welcomeDaysImported": { "description": "Import result headline: N days.", "placeholders": { "n": { "type": "int" } } }, "welcomeJournalDaysWritten": "{n, plural, one{1 journal day written} other{{n} journal days written}}", "@welcomeJournalDaysWritten": { "description": "Import result headline: N journal days.", "placeholders": { "n": { "type": "int" } } }, "welcomeJournalDaysReplaced": "{n, plural, one{1 journal day replaced} other{{n} journal days replaced}}", "@welcomeJournalDaysReplaced": { "description": "Import result sub: N journal days replaced.", "placeholders": { "n": { "type": "int" } } }, "welcomeLabResultsWritten": "{n, plural, one{1 lab result written} other{{n} lab results written}}", "@welcomeLabResultsWritten": { "description": "Import result headline/sub: N lab results.", "placeholders": { "n": { "type": "int" } } }, "welcomeRowsRefused": "{n, plural, one{1 row was refused} other{{n} rows were refused}}", "@welcomeRowsRefused": { "description": "Status card title: N rows refused.", "placeholders": { "n": { "type": "int" } } }, "welcomeRejectedDetail": "{rejects} Nothing was trimmed to fit — fix those lines and import again.", "@welcomeRejectedDetail": { "description": "Status card body: rejected rows detail + advice.", "placeholders": { "rejects": { "type": "String" } } }, "welcomeOneFileCouldNotBeRead": "One of those files could not be read", "@welcomeOneFileCouldNotBeRead": { "description": "Status card title: partial read failure." }, "welcomeRestImported": "The rest imported. {error}", "@welcomeRestImported": { "description": "Status card body: partial read failure.", "placeholders": { "error": { "type": "String" } } }, "welcomeSummariesDidNotTitle": "The days landed, the summaries did not", "@welcomeSummariesDidNotTitle": { "description": "Status card title: rollup error." }, "welcomeSummariesDidNotBody": "Every imported row is saved, but updating your trends failed ({error}). To fix it, open Your data and tap Re-analyze everything.", "@welcomeSummariesDidNotBody": { "description": "Status card body: rollup error.", "placeholders": { "error": { "type": "String" } } }, "welcomePartOfFileNotUsedTitle": "Part of that file could not be used", "@welcomePartOfFileNotUsedTitle": { "description": "Status card title: partial data loss." }, "welcomeStrandedDays": "{n, plural, one{1 day arrived out of order and was only used as context for the day that followed.} other{{n} days arrived out of order and were only used as context for the day that followed.}}", "@welcomeStrandedDays": { "description": "N stranded days.", "placeholders": { "n": { "type": "int" } } }, "welcomeArchiveSkipped": "{n, plural, one{1 day of saved sensor history is in a format this version can’t read. Update the app, then import the backup again.} other{{n} days of saved sensor history are in a format this version can’t read. Update the app, then import the backup again.}}", "@welcomeArchiveSkipped": { "description": "Backup import: N days of archived raw sensor history were in a storage format this version cannot read (in the backup or on the phone) and were not merged.", "placeholders": { "n": { "type": "int" } } }, "welcomeArchiveRestored": "{n, plural, one{Raw sensor history restored or extended for 1 day} other{Raw sensor history restored or extended for {n} days}}", "@welcomeArchiveRestored": { "description": "Backup import: N days of archived raw sensor history were restored. Short; shown as a headline or a secondary line.", "placeholders": { "n": { "type": "int" } } }, "welcomeLateRows": "{n, plural, one{1 row arrived after its day had already been scored and closed.} other{{n} rows arrived after their day had already been scored and closed.}}", "@welcomeLateRows": { "description": "N late rows.", "placeholders": { "n": { "type": "int" } } }, "welcomeExportAgainInDateOrder": "Export again in date order", "@welcomeExportAgainInDateOrder": { "description": "Fix button: partial data loss." }, "scanBarcodeTitle": "Scan the barcode", "@scanBarcodeTitle": { "description": "Title at the top of the barcode-scanner sheet" }, "scanBarcodeClose": "Close", "@scanBarcodeClose": { "description": "Semantic label for the close (X) button on the barcode-scanner sheet" }, "scanBarcodeInstructions": "Hold the barcode inside the frame. Nothing is recorded — the digits are all this reads.", "@scanBarcodeInstructions": { "description": "Instructional caption under the camera preview in the barcode scanner" }, "scanBarcodeNoAccessTitle": "No camera access", "@scanBarcodeNoAccessTitle": { "description": "Title shown when camera permission was denied for barcode scanning" }, "scanBarcodeCameraFailedTitle": "The camera did not start", "@scanBarcodeCameraFailedTitle": { "description": "Title shown when the camera failed to start for barcode scanning" }, "scanBarcodeNoAccessBody": "Scanning needs the camera, and this app has not been given it.", "@scanBarcodeNoAccessBody": { "description": "Body text explaining camera permission was refused, in the barcode scanner" }, "scanBarcodeCameraFailedBody": "This device would not open its camera for the scanner.", "@scanBarcodeCameraFailedBody": { "description": "Body text explaining the device could not open its camera for the barcode scanner" }, "scanBarcodeTypeInstead": "Type the numbers instead", "@scanBarcodeTypeInstead": { "description": "Fallback action label offering manual entry instead of camera scanning" }, "findingsLogTitle": "Observations", "@findingsLogTitle": { "description": "Page title of the Observations (findings log) screen" }, "findingsLogEmptyTitle": "Nothing has stood out", "@findingsLogEmptyTitle": { "description": "Title of the empty-state card on the Observations screen when no findings exist" }, "findingsLogEmptyBody": "Nothing to report. The checks for illness, unusual nights, skin temperature and a resting heart rate shift have all been quiet.", "@findingsLogEmptyBody": { "description": "Body text of the empty-state card on the Observations screen listing the four quiet watches" }, "findingsLogDerivedNote": "Worked out from your own days each time this opens, not written down when it happened — so if a day is re-analysed, what it says here changes with it.", "@findingsLogDerivedNote": { "description": "Footnote on the Observations screen explaining findings are recomputed each time the screen opens" }, "startCardDefaultSub": "Pick one and go", "@startCardDefaultSub": { "description": "Default subline shown under the count on the Workout/Wellness start card, e.g. 'Pick one and go'" }, "monthGridCoverage": "{have} of {total} days", "@monthGridCoverage": { "description": "Month grid: coverage count above a metric strip, e.g. '23 of 30 days'.", "placeholders": { "have": { "type": "int" }, "total": { "type": "int" } } }, "monthGridDaysAgo": "{days} days ago", "@monthGridDaysAgo": { "description": "Month grid: left-edge axis label, e.g. '30 days ago'.", "placeholders": { "days": { "type": "int" } } }, "monthGridToday": "Today", "@monthGridToday": { "description": "Month grid: right-edge axis label for the most recent day." }, "whatChangedTitle": "What changed", "@whatChangedTitle": { "description": "What Changed screen: nav bar title." }, "whatChangedSub": "AGAINST YOUR OWN HISTORY", "@whatChangedSub": { "description": "What Changed screen: nav bar subtitle, all caps." }, "whatChangedNoDataTitle": "Nothing has landed for this day yet", "@whatChangedNoDataTitle": { "description": "What Changed screen: status card title when the selected day has no data at all." }, "whatChangedNoDataBody": "This day has no values to compare with the days before it, so nothing can stand out.", "@whatChangedNoDataBody": { "description": "What Changed screen: status card body explaining why a dataless day has no findings." }, "whatChangedLearningTitle": "Still learning your usual", "@whatChangedLearningTitle": { "description": "What Changed screen: status card title shown while there isn't yet enough history for the sweep to judge anything." }, "whatChangedLearningBody": "Spotting the unusual needs a range first. There {days, plural, one{is {days} day} other{are {days} days}} of history so far; checks start at {min}.", "@whatChangedLearningBody": { "description": "What Changed screen: status card body stating how many days of history exist and the minimum needed for the sweep to start.", "placeholders": { "days": { "type": "int" }, "min": { "type": "int" } } }, "whatChangedNothingTitle": "Nothing stood out", "@whatChangedNothingTitle": { "description": "What Changed screen: status card title when the sweep ran but found nothing unusual." }, "whatChangedNothingBody": "Every metric with enough history sat inside the range your own days have set. That is the normal answer, and it is a complete one.", "@whatChangedNothingBody": { "description": "What Changed screen: status card body explaining that every metric sat within its normal range." }, "whatChangedMethodologyNote": "Compared with your own recent days, in your own units, with the window shown. Nothing here is a cause or a diagnosis.", "@whatChangedMethodologyNote": { "description": "What Changed screen: footnote under the findings list explaining the methodology and its limits." }, "whatChangedDayLinkTitle": "What happened that day", "@whatChangedDayLinkTitle": { "description": "What Changed screen: link row title to the day's timeline." }, "whatChangedDayLinkSub": "Sleep, sessions, meals and logs in time order", "@whatChangedDayLinkSub": { "description": "What Changed screen: link row subtitle describing what the timeline shows." }, "whatChangedMonthSection": "The month behind it", "@whatChangedMonthSection": { "description": "What Changed screen: section heading above the embedded month grid." }, "journalFieldErrorNoName": "Give it a name", "@journalFieldErrorNoName": { "description": "Custom journal field sheet: validation error when the name field is left empty." }, "journalFieldErrorInvalidName": "Use at least one letter or number", "@journalFieldErrorInvalidName": { "description": "Custom journal field sheet: validation error when the name has no letters or digits to build a key from." }, "journalFieldErrorNoUnit": "Say what it is counted in (mg, ml, cups…)", "@journalFieldErrorNoUnit": { "description": "Custom journal field sheet: validation error when an amount-kind field has no unit entered." }, "journalFieldErrorDuplicate": "You already track something by that name", "@journalFieldErrorDuplicate": { "description": "Custom journal field sheet: validation error when the entered name collides with an existing field." }, "journalFieldTitle": "Track something else", "@journalFieldTitle": { "description": "Custom journal field sheet: sheet title." }, "journalFieldNameLabel": "What do you want to track?", "@journalFieldNameLabel": { "description": "Custom journal field sheet: text field label asking what to track." }, "journalFieldNameHint": "Magnesium, screen time, headache…", "@journalFieldNameHint": { "description": "Custom journal field sheet: text field placeholder with example things to track." }, "journalFieldKindQuestion": "What kind of number is it?", "@journalFieldKindQuestion": { "description": "Custom journal field sheet: label above the kind-selector chips." }, "journalFieldKindRating": "A 1–5 rating", "@journalFieldKindRating": { "description": "Custom journal field sheet: chip label for a 1-5 rating kind field." }, "journalFieldKindAmount": "An amount", "@journalFieldKindAmount": { "description": "Custom journal field sheet: chip label for an amount/dose kind field." }, "journalFieldKindMinutes": "Minutes", "@journalFieldKindMinutes": { "description": "Custom journal field sheet: chip label for a duration-in-minutes kind field." }, "journalFieldUnitLabel": "Unit", "@journalFieldUnitLabel": { "description": "Custom journal field sheet: text field label for the unit of an amount field." }, "journalFieldUnitHint": "mg, ml, cups…", "@journalFieldUnitHint": { "description": "Custom journal field sheet: text field placeholder with example units." }, "journalFieldStepSize": "Step size", "@journalFieldStepSize": { "description": "Custom journal field sheet: label above the step-size chips." }, "journalFieldMaxPerDay": "Most you would log in a day", "@journalFieldMaxPerDay": { "description": "Custom journal field sheet: label above the daily-ceiling chips." }, "journalFieldAskLastTime": "Ask when the last one was", "@journalFieldAskLastTime": { "description": "Custom journal field sheet: toggle pill asking whether to also record time of last occurrence." }, "journalFieldStartTracking": "Start tracking it", "@journalFieldStartTracking": { "description": "Custom journal field sheet: primary save button label." }, "aiBriefingForDay": "FOR {day}", "@aiBriefingForDay": { "description": "AI briefing screen subtitle naming the day the briefing covers.", "placeholders": { "day": { "type": "String" } } }, "aiBriefingNoModelTitle": "No model is set up", "@aiBriefingNoModelTitle": { "description": "Status card title when no coach model is configured." }, "aiBriefingNoModelBody": "A briefing is written by a model you choose. Until you pick one there is nothing to generate and nothing has been sent anywhere.", "@aiBriefingNoModelBody": { "description": "Status card body when no coach model is configured." }, "aiBriefingChooseModel": "Choose a model", "@aiBriefingChooseModel": { "description": "Fix button label to go to model setup." }, "aiBriefingNothingTitle": "Nothing written for today", "@aiBriefingNothingTitle": { "description": "Status card title when no briefing exists for today." }, "aiBriefingNothingBody": "Briefings are generated on a schedule, or on demand here.", "@aiBriefingNothingBody": { "description": "Status card body when no briefing exists for today." }, "aiBriefingWriting": "Writing…", "@aiBriefingWriting": { "description": "Busy-state button/fix label while a briefing is being generated." }, "aiBriefingWriteNow": "Write one now", "@aiBriefingWriteNow": { "description": "Fix button label to generate a briefing on demand." }, "aiBriefingWriteAgain": "Write it again", "@aiBriefingWriteAgain": { "description": "Button label to regenerate an existing briefing." }, "aiBriefingFailedTitle": "That did not go through", "@aiBriefingFailedTitle": { "description": "Status card title when briefing generation failed." }, "aiBriefingFailedGeneric": "It failed: {error}", "@aiBriefingFailedGeneric": { "description": "Fallback error message shown when briefing generation throws a non-coach exception.", "placeholders": { "error": { "type": "String" } } }, "aiBriefingSentSection": "What was sent", "@aiBriefingSentSection": { "description": "Section header: payload was sent off-device." }, "aiBriefingReadSection": "What was read", "@aiBriefingReadSection": { "description": "Section header: payload was only read on-device (local endpoint)." }, "aiBriefingNoneBody": "Nothing. There was no request — the note above was written on this phone.", "@aiBriefingNoneBody": { "description": "Banner text when no model request was made at all (nightly sweep found nothing)." }, "aiBriefingLocalBody": "These numbers went to {host}, on this machine. Nothing left it.", "@aiBriefingLocalBody": { "description": "Banner text when the model endpoint is on the same machine (nothing left the device).", "placeholders": { "host": { "type": "String" } } }, "aiBriefingCloudBody": "These numbers, and nothing else, were sent to {host} as {model}. No raw recordings, no name, no identifier.", "@aiBriefingCloudBody": { "description": "Banner text describing exactly what was sent to a remote model host.", "placeholders": { "host": { "type": "String" }, "model": { "type": "String" } } }, "aiBriefingNoneCardTitle": "Nothing stood out, so nothing was asked", "@aiBriefingNoneCardTitle": { "description": "Status card title when the nightly sweep found nothing worth asking a model about." }, "aiBriefingNoneCardBody": "The sweep runs on this phone. It only calls a model when it has a finding to hand it, and today it had none.", "@aiBriefingNoneCardBody": { "description": "Status card body explaining the sweep only calls a model when it has a finding." }, "aiBriefingEmptyCardTitle": "Nothing was available to send", "@aiBriefingEmptyCardTitle": { "description": "Status card title when the payload had no metric values to send." }, "aiBriefingEmptyCardBody": "No metric had a value when this was written, so the prompt carried none.", "@aiBriefingEmptyCardBody": { "description": "Status card body when the payload had no metric values to send." }, "napsFellAsleepHelp": "WHEN YOU FELL ASLEEP", "@napsFellAsleepHelp": { "description": "Time picker helper text for logging when a manual nap started." }, "napsWokeUpHelp": "WHEN YOU WOKE UP", "@napsWokeUpHelp": { "description": "Time picker helper text for logging when a manual nap ended." }, "napsInvalidWindow": "A nap is between 5 minutes and 6 hours. Anything longer is a sleep, and it belongs in the night where the stages can be read.", "@napsInvalidWindow": { "description": "Validation error when a manually logged nap window is outside 5 minutes to 6 hours." }, "napsOverlap": "That overlaps a nap already on this day. Remove that one first, rather than counting the same hour twice.", "@napsOverlap": { "description": "Validation error when a manually logged nap overlaps an existing one." }, "napsOverlapsSleep": "That overlaps your main sleep, which already counts that time. Log only the part after you got up, or correct the night instead.", "@napsOverlapsSleep": { "description": "Validation error when a manually logged nap overlaps the main sleep window." }, "napsNotReanalysed": "The day was not re-analysed — another analysis was already running. Your edit is saved and will apply next time.", "@napsNotReanalysed": { "description": "Fallback error when a nap edit saved but the day could not be re-derived because another analysis was already running." }, "napsTitle": "Naps", "@napsTitle": { "description": "Naps screen nav bar title." }, "napsNoReadingTitle": "No nap reading for this day", "@napsNoReadingTitle": { "description": "Status card title when a day has no nap detection result." }, "napsNoReadingBody": "Naps are worked out from the same 1 Hz recording the rest of the day is, and this day does not have enough of it.", "@napsNoReadingBody": { "description": "Fallback status card body explaining naps require enough 1Hz recording." }, "napsEmptyTitle": "No naps on this day", "@napsEmptyTitle": { "description": "Status card title when a judged day detected zero naps." }, "napsEmptyBody": "Nothing on this day was still enough, for long enough, with the heart-rate dip that goes with sleeping through it.", "@napsEmptyBody": { "description": "Status card body explaining why no naps were detected that day." }, "napsCountsToward": "{mins} of nap counts toward tonight’s sleep need.", "@napsCountsToward": { "description": "Footnote stating how many minutes of nap reduce tonight's sleep need.", "placeholders": { "mins": { "type": "String" } } }, "napsNotAppliedTitle": "That has not been applied", "@napsNotAppliedTitle": { "description": "Status card title when a nap edit failed to apply." }, "napsWorking": "Working…", "@napsWorking": { "description": "Busy-state label on the log-a-nap button while an edit is being written." }, "napsLogANap": "Log a nap", "@napsLogANap": { "description": "Button label to open the manual nap logging flow." }, "napsRemovedSection": "Removed", "@napsRemovedSection": { "description": "Section header listing naps the user has removed/rejected." }, "napsPutBackSemantic": "Put this nap back", "@napsPutBackSemantic": { "description": "Accessibility semantic label for the button that restores a removed nap." }, "napsPutBackLabel": "Put it back", "@napsPutBackLabel": { "description": "Visible button label to restore a removed nap." }, "napsRemovalKept": "A removal is kept as a window rather than an id, so it still applies after the detector’s edges move.", "@napsRemovalKept": { "description": "Footnote explaining removed naps are stored as a time window, not an id." }, "napsYouLoggedThis": "You logged this", "@napsYouLoggedThis": { "description": "Caption for a manually logged nap with no duration recorded." }, "napsDetected": "Detected", "@napsDetected": { "description": "Caption for a detector-found nap with no duration recorded." }, "napsLoggedWithMins": "{mins} · you logged this", "@napsLoggedWithMins": { "description": "Caption for a manually logged nap including its duration.", "placeholders": { "mins": { "type": "String" } } }, "napsDetectedWithMins": "{mins} asleep · detected", "@napsDetectedWithMins": { "description": "Caption for a detector-found nap including its duration.", "placeholders": { "mins": { "type": "String" } } }, "napsDeleteSemantic": "Delete this nap", "@napsDeleteSemantic": { "description": "Accessibility semantic label for deleting a manually logged nap." }, "napsNotANapSemantic": "This was not a nap", "@napsNotANapSemantic": { "description": "Accessibility semantic label for rejecting a detector-found nap." }, "napsDeleteLabel": "Delete", "@napsDeleteLabel": { "description": "Visible button label to delete a manually logged nap." }, "napsNotANapLabel": "Not a nap", "@napsNotANapLabel": { "description": "Visible button label to reject a detector-found nap." }, "readinessDetailTitle": "Recovery", "@readinessDetailTitle": { "description": "Readiness detail screen title, also used as the history chart title." }, "readinessDetailNotScoredTitle": "Recovery is not scored", "@readinessDetailNotScoredTitle": { "description": "Status card title when readiness has no score for today." }, "readinessDetailLastNightScored": "The last night scored was {day}.", "@readinessDetailLastNightScored": { "description": "Appended fact naming the last night that did produce a readiness score.", "placeholders": { "day": { "type": "String" } } }, "readinessDetailWhatWasMissing": "What was missing", "@readinessDetailWhatWasMissing": { "description": "Section header for the readiness absence diagnostic breakdown." }, "readinessDetailWhatWentIntoIt": "What went into it", "@readinessDetailWhatWentIntoIt": { "description": "Section header for the readiness input breakdown (scored or empty-state)." }, "readinessDetailInputsFooter": "{used}/{total} inputs. Each one is ranked against your own history — a parallel view of the same inputs, not slices of the number above.", "@readinessDetailInputsFooter": { "description": "Footnote below the breakdown stating how many inputs were used out of the total.", "placeholders": { "used": { "type": "int" }, "total": { "type": "int" } } }, "readinessDetailBreakdownNoScoreNote": "A looser view of the same four inputs. They don’t add up to today’s score, which is missing for the reason above.", "@readinessDetailBreakdownNoScoreNote": { "description": "Shown above the breakdown rows only when readiness itself is absent, clarifying that this glass-box percentile view is a different calculation than the headline composite and does not explain or contradict its absence." }, "readinessDetailNoBreakdownTitle": "No breakdown yet", "@readinessDetailNoBreakdownTitle": { "description": "Status card title when readiness scored but no breakdown exists yet." }, "readinessDetailNoBreakdownBody": "Ranking each input against your own history takes about two weeks of nights.", "@readinessDetailNoBreakdownBody": { "description": "Status card body explaining the breakdown needs about two weeks of history." }, "readinessDetailHistoryTitle": "History", "@readinessDetailHistoryTitle": { "description": "History section header when there are zero scored days." }, "readinessDetailLastNDays": "{n, plural, one{Last {n} day} other{Last {n} days}}", "@readinessDetailLastNDays": { "description": "History section header naming how many days of history are shown.", "placeholders": { "n": { "type": "int" } } }, "readinessDetailNoHistoryTitle": "No recovery history", "@readinessDetailNoHistoryTitle": { "description": "Status card title when there is no readiness history at all." }, "readinessDetailNoHistoryBody": "0 days scored.", "@readinessDetailNoHistoryBody": { "description": "Status card body stating 0 days scored." }, "readinessDetailWearOvernight": "Wear the band overnight", "@readinessDetailWearOvernight": { "description": "Fix button label suggesting the user wear the band overnight." }, "readinessDetailUnit": "/100", "@readinessDetailUnit": { "description": "Unit suffix shown on the readiness history chart (score out of 100)." }, "readinessDetailDaysAgo": "{n, plural, one{{n} day ago} other{{n} days ago}}", "@readinessDetailDaysAgo": { "description": "X-axis label on the readiness history chart naming how many days ago the first plotted point is.", "placeholders": { "n": { "type": "int" } } }, "readinessDetailToday": "Today", "@readinessDetailToday": { "description": "X-axis label on the readiness history chart for the most recent point." }, "readinessDetailMeasured": "Measured", "@readinessDetailMeasured": { "description": "Row value in the absence diagnostic: this input was measured." }, "readinessDetailNotMeasured": "Not measured", "@readinessDetailNotMeasured": { "description": "Row value in the absence diagnostic: this input was not measured." }, "readinessDetailNightsOfHistory": "{n, plural, one{{n} night of your own history} other{{n} nights of your own history}}", "@readinessDetailNightsOfHistory": { "description": "Row value in the absence diagnostic stating how many of the user's own nights back the baseline.", "placeholders": { "n": { "type": "int" } } }, "readinessDetailNightsOfTarget": "{have} of {need} nights", "@readinessDetailNightsOfTarget": { "description": "Row value in the absence diagnostic: how many of the user's own nights back this input against the floor every input needs before it can be used.", "placeholders": { "have": { "type": "int" }, "need": { "type": "int" } } }, "readinessDetailNeedSuffix": "{need}. Each input is ranked against your own nights, so the score cannot start before there are enough of them.", "@readinessDetailNeedSuffix": { "description": "Sentence appended after the pipeline's own 'need N more nights' message.", "placeholders": { "need": { "type": "String" } } }, "readinessDetailNoNoteFallback": "Everything above was present, and the comparison against your own history still could not be made.", "@readinessDetailNoNoteFallback": { "description": "Fallback sentence when readiness is absent but the pipeline left no specific note." }, "readinessDetailNotAvailable": "not available", "@readinessDetailNotAvailable": { "description": "Breakdown row tag: this input was not available/used." }, "readinessDetailContributionNotReported": "contribution not reported", "@readinessDetailContributionNotReported": { "description": "Breakdown row tag: input was used but its numeric contribution was not reported." }, "readinessDetailRelativeUncalibrated": "relative, uncalibrated", "@readinessDetailRelativeUncalibrated": { "description": "Breakdown row tag on the temperature input: it is a relative, uncalibrated sensor deviation." }, "readinessDetailWithinSpread": "yes, within your usual range", "@readinessDetailWithinSpread": { "description": "Breakdown row tag: the input's change was within the user's usual spread (below the smallest-worthwhile-change threshold)." }, "readinessDetailOutsideRange": "no, outside your usual range", "@readinessDetailOutsideRange": { "description": "Recovery breakdown row answer: the input moved past the smallest change that counts." }, "readinessDetailLiftingScore": "lifting your score", "@readinessDetailLiftingScore": { "description": "Recovery breakdown row: this input raised the score." }, "readinessDetailLoweringScore": "pulling your score down", "@readinessDetailLoweringScore": { "description": "Recovery breakdown row: this input lowered the score." }, "readinessDetailWeightPercent": "{pct}% weight", "@readinessDetailWeightPercent": { "description": "Breakdown row tag showing the percentage weight this input actually carried.", "placeholders": { "pct": { "type": "int" } } }, "readinessDetailAskHrv": "Is your HRV in its usual range?", "@readinessDetailAskHrv": { "description": "Recovery breakdown row, phrased as a plain question: the HRV input." }, "readinessDetailAskRhr": "Is your resting heart rate in its usual range?", "@readinessDetailAskRhr": { "description": "Recovery breakdown row, phrased as a plain question: the resting heart rate input." }, "readinessDetailAskResp": "Is your breathing rate in its usual range?", "@readinessDetailAskResp": { "description": "Recovery breakdown row, phrased as a plain question: the breathing rate input." }, "readinessDetailAskTemp": "Is your skin temperature in its usual range?", "@readinessDetailAskTemp": { "description": "Recovery breakdown row, phrased as a plain question: the skin temperature input." }, "dayStepsTitle": "Steps", "@dayStepsTitle": { "description": "Screen title on the Day Steps detail screen." }, "dayStepsThroughDay": "Through the day", "@dayStepsThroughDay": { "description": "Section header above the list of step spans through the day." }, "dayStepsToday": "today", "@dayStepsToday": { "description": "Fragment meaning 'today', substituted into other Day Steps sentences as {when}." }, "dayStepsOnDay": "on {day}", "@dayStepsOnDay": { "description": "Fragment naming a specific past day, substituted into other Day Steps sentences as {when}.", "placeholders": { "day": { "type": "String" } } }, "dayStepsNoTimesTitle": "No times behind the count {when}", "@dayStepsNoTimesTitle": { "description": "Empty-state title: the day has a step total but no timed spans behind it.", "placeholders": { "when": { "type": "String" } } }, "dayStepsNoStepsTitle": "No steps counted {when}", "@dayStepsNoStepsTitle": { "description": "Empty-state title: nothing counted steps this day.", "placeholders": { "when": { "type": "String" } } }, "dayStepsStrapCounterBody": "The {count} steps {when} came from the strap’s own counter, which didn’t keep times for this day, so they can’t go on a clock.", "@dayStepsStrapCounterBody": { "description": "Empty-state body explaining the strap's own running counter has no times.", "placeholders": { "count": { "type": "String" }, "when": { "type": "String" } } }, "dayStepsNothingCounted": "Nothing that can count steps recorded {when}.", "@dayStepsNothingCounted": { "description": "Empty-state body when no sensor recorded steps this day.", "placeholders": { "when": { "type": "String" } } }, "dayStepsChartTitle": "When they were counted", "@dayStepsChartTitle": { "description": "Title of the hourly steps chart, shown in caps." }, "dayStepsUnit": "steps", "@dayStepsUnit": { "description": "Unit label for the steps chart." }, "dayStepsYourPhone": "Your phone", "@dayStepsYourPhone": { "description": "Label for the phone as a step source, used in legend, metrics and row labels." }, "dayStepsYourBand": "Your band", "@dayStepsYourBand": { "description": "Fallback label for the wearable band when no paired-device name is known." }, "dayStepsCounted": "Counted", "@dayStepsCounted": { "description": "Label for the combined total in the inline metrics row." }, "dayStepsHonestyMixed": "Counted by your wrist and your phone. A wrist can read a walk low and hand work as walking; a phone only counts steps while you carry it.", "@dayStepsHonestyMixed": { "description": "Footnote explaining wrist vs phone step-counting error when both sources contributed." }, "dayStepsHonestyStrap": "Counted at your wrist, where a real walk tends to read low and rhythmic hand work can read as walking.", "@dayStepsHonestyStrap": { "description": "Footnote explaining wrist step-counting error when only the strap contributed." }, "dayStepsHonestyPhone": "Counted by your phone, so only the steps you had it on you for are here.", "@dayStepsHonestyPhone": { "description": "Footnote explaining phone step-counting coverage when only the phone contributed." }, "roughNightSignRhr": "your resting heart rate ran higher", "@roughNightSignRhr": { "description": "Rough Night: one of the moved-measurement clauses, resting heart rate ran higher." }, "roughNightSignHrv": "your HRV ran lower", "@roughNightSignHrv": { "description": "Rough Night: one of the moved-measurement clauses, HRV ran lower." }, "roughNightSignDip": "your heart rate dropped less overnight than it usually does", "@roughNightSignDip": { "description": "Rough Night: one of the moved-measurement clauses, overnight heart rate dip was blunted." }, "roughNightSignTemp": "your skin ran warmer", "@roughNightSignTemp": { "description": "Rough Night: one of the moved-measurement clauses, skin temperature ran warmer." }, "roughNightLateTraining": "You trained until {at}, which often does this on its own.", "@roughNightLateTraining": { "description": "Rough Night card: stated fact about a late training session that night.", "placeholders": { "at": { "type": "String" } } }, "roughNightIllness": "Your resting heart rate flagged this night too: recent nights add up to a rise above your usual. Not a diagnosis.", "@roughNightIllness": { "description": "Rough Night card: stated fact when the resting-heart-rate watch also flagged the same night (an accumulated rise, never an illness claim)." }, "roughNightLuteal": "You are in the luteal phase, which lifts resting heart rate and skin temperature by itself.", "@roughNightLuteal": { "description": "Rough Night card: stated fact when the user is in the luteal phase." }, "roughNightWarmRoom": "Your skin ran warmer than your usual — a warm room does this too.", "@roughNightWarmRoom": { "description": "Rough Night card: stated fact when the skin-temperature sign fired." }, "roughNightDismiss": "Dismiss", "@roughNightDismiss": { "description": "Semantic label for the dismiss (X) button on the Rough Night card." }, "roughNightDefaultHeadline": "A rougher night than usual", "@roughNightDefaultHeadline": { "description": "Fallback headline for the Rough Night card when the analytics descriptor has no leading clause." }, "roughNightSummary": "{sentence}, against your own nights. This is a measurement of the night, not a verdict on you.", "@roughNightSummary": { "description": "Rough Night card body sentence, combining the moved-measurements clause with the closing disclaimer.", "placeholders": { "sentence": { "type": "String" } } }, "roughNightTellWhatHappened": "Tell it what happened", "@roughNightTellWhatHappened": { "description": "Button inviting the user to open the optional attribution question on the Rough Night card." }, "roughNightNothingToAnswer": "Nothing to answer — this card only reports the night.", "@roughNightNothingToAnswer": { "description": "Rough Night card note shown after the user has permanently declined the attribution question." }, "roughNightWhatElse": "What else was going on?", "@roughNightWhatElse": { "description": "Rough Night attribution question heading when nothing else is already known about the night." }, "roughNightAnythingElse": "Anything else?", "@roughNightAnythingElse": { "description": "Rough Night attribution question heading when something is already known about the night." }, "roughNightSaving": "Saving", "@roughNightSaving": { "description": "Button label while the Rough Night attribution answer is being saved." }, "roughNightLogIt": "Log it for that night", "@roughNightLogIt": { "description": "Button label to save the picked attribution tags for that night." }, "roughNightAddHowMuch": "Add how much", "@roughNightAddHowMuch": { "description": "Link to the journal editor for entering amounts, from the Rough Night card." }, "roughNightDoNotAskAgain": "Do not ask again", "@roughNightDoNotAskAgain": { "description": "Link to permanently decline the Rough Night attribution question." }, "roughNightSeveralMoved": "Several overnight measurements moved together", "@roughNightSeveralMoved": { "description": "Fallback clause when the Rough Night card has no named moved measurements." }, "driverBreakdownHigherThanUsual": "Higher than your usual", "@driverBreakdownHigherThanUsual": { "description": "Driver breakdown: non-numeric input (e.g. skin temp) moved up vs usual." }, "driverBreakdownLowerThanUsual": "Lower than your usual", "@driverBreakdownLowerThanUsual": { "description": "Driver breakdown: non-numeric input (e.g. skin temp) moved down vs usual." }, "driverBreakdownRightOnUsual": "{now} · right on your usual", "@driverBreakdownRightOnUsual": { "description": "Driver value line when the reading equals the user's usual.", "placeholders": { "now": { "type": "String" } } }, "driverBreakdownAboveUsual": "{now} · {delta} above your usual {usual}", "@driverBreakdownAboveUsual": { "description": "Driver value line: reading is above usual, with reading/delta/usual formatted values.", "placeholders": { "now": { "type": "String" }, "delta": { "type": "String" }, "usual": { "type": "String" } } }, "driverBreakdownBelowUsual": "{now} · {delta} below your usual {usual}", "@driverBreakdownBelowUsual": { "description": "Driver value line: reading is below usual, with reading/delta/usual formatted values.", "placeholders": { "now": { "type": "String" }, "delta": { "type": "String" }, "usual": { "type": "String" } } }, "driverBreakdownWeightPct": "{pct}% weight", "@driverBreakdownWeightPct": { "description": "Driver qualifier chip: the renormalised weight share as a rounded percent.", "placeholders": { "pct": { "type": "int" } } }, "driverBreakdownNotAvailable": "not available", "@driverBreakdownNotAvailable": { "description": "Driver qualifier: the input was not usable." }, "driverBreakdownContributionNotReported": "contribution not reported", "@driverBreakdownContributionNotReported": { "description": "Driver qualifier: used but no contribution number was reported." }, "driverBreakdownRelativeUncalibrated": "relative, uncalibrated", "@driverBreakdownRelativeUncalibrated": { "description": "Driver qualifier: raw uncalibrated sensor deviation (e.g. skin temp)." }, "driverBreakdownWithinUsualSpread": "within your usual spread", "@driverBreakdownWithinUsualSpread": { "description": "Driver qualifier: change did not clear the smallest-worthwhile-change gate." }, "driverBreakdownBiggerThanNoise": "bigger than measurement noise", "@driverBreakdownBiggerThanNoise": { "description": "Driver qualifier: change is outside usual spread and bigger than measurement noise." }, "driverBreakdownSmallerThanNoise": "outside your usual spread, but small enough to be measurement noise", "@driverBreakdownSmallerThanNoise": { "description": "Driver qualifier: change is outside usual spread but still within measurement noise." }, "driverBreakdownWhatHelped": "What helped", "@driverBreakdownWhatHelped": { "description": "Driver breakdown group header: drivers that raised the score." }, "driverBreakdownWhatHeldYouBack": "What held you back", "@driverBreakdownWhatHeldYouBack": { "description": "Driver breakdown group header: drivers that lowered the score." }, "driverBreakdownNeither": "Neither", "@driverBreakdownNeither": { "description": "Driver breakdown group header: drivers unavailable or with zero net effect." }, "driverBreakdownFooter": "Each input is compared with your own history, beside the score rather than part of it. \"Measurement noise\" is how far a reading moves on its own.", "@driverBreakdownFooter": { "description": "Driver breakdown screen footer explaining what the list means." }, "driverBreakdownHideHistory": "{label}, hide its history", "@driverBreakdownHideHistory": { "description": "Accessibility label for tapping an open driver row to collapse its chart.", "placeholders": { "label": { "type": "String" } } }, "driverBreakdownShowHistory": "{label}, show its history", "@driverBreakdownShowHistory": { "description": "Accessibility label for tapping a closed driver row to expand its chart.", "placeholders": { "label": { "type": "String" } } }, "driverBreakdownDaysAgo": "{n, plural, one{{n} day ago} other{{n} days ago}}", "@driverBreakdownDaysAgo": { "description": "X-axis start label on a driver's history chart, N days before today.", "placeholders": { "n": { "type": "int" } } }, "driverBreakdownToday": "Today", "@driverBreakdownToday": { "description": "X-axis end label on a driver's history chart." }, "driverBreakdownAbsenceTitle": "No breakdown to show", "@driverBreakdownAbsenceTitle": { "description": "Title of the card shown when there is no readiness breakdown for the night." }, "driverBreakdownAbsenceAlgoVersion": "The way recovery is worked out changed in the last update. Your days are being recalculated.", "@driverBreakdownAbsenceAlgoVersion": { "description": "Absence card body when the breakdown is missing because the algorithm version changed and is rebuilding." }, "driverBreakdownAbsenceStale": "Your trends are out of date. Sync the band to update them.", "@driverBreakdownAbsenceStale": { "description": "Absence card body when the last stored rollup is too old to show." }, "driverBreakdownAbsenceNoVersion": "Your trends are being updated. This takes a minute after a sync.", "@driverBreakdownAbsenceNoVersion": { "description": "Absence card body when the stored rollup has no version stamp." }, "driverBreakdownSyncTheBand": "Sync the band", "@driverBreakdownSyncTheBand": { "description": "Absence card action button: sync the band to refresh the rollup." }, "driverBreakdownAbsenceNoReason": "Nothing recorded says why last night has no breakdown.", "@driverBreakdownAbsenceNoReason": { "description": "Absence card body when nothing recorded explains the missing breakdown." }, "coachFiguresCouldNotBeDrawn": "A figure could not be drawn", "@coachFiguresCouldNotBeDrawn": { "description": "Fallback title when a coach-sent chart figure has an unrecognized type." }, "coachFiguresNoType": "The coach sent a figure with no type.", "@coachFiguresNoType": { "description": "Body text when the coach sent a figure spec with no 'type' field." }, "coachFiguresUnsupportedType": "The coach asked for a \"{type}\" figure, which this app does not draw.", "@coachFiguresUnsupportedType": { "description": "Body text when the coach sent a figure of a type this app cannot render.", "placeholders": { "type": { "type": "String" } } }, "coachFiguresFigure": "Figure", "@coachFiguresFigure": { "description": "Fallback chart title when the coach's figure spec has no title." }, "coachFiguresSeriesN": "Series {n}", "@coachFiguresSeriesN": { "description": "Fallback legend name for an unnamed line/area series, numbered.", "placeholders": { "n": { "type": "int" } } }, "coachFiguresLaneN": "Lane {n}", "@coachFiguresLaneN": { "description": "Fallback legend name for an unnamed dual-axis lane, numbered.", "placeholders": { "n": { "type": "int" } } }, "coachFiguresNoSleepSegments": "No sleep segments", "@coachFiguresNoSleepSegments": { "description": "Empty-state message for a hypnogram figure with no sleep segments." }, "coachFiguresNoTimeInZone": "No time in zone", "@coachFiguresNoTimeInZone": { "description": "Empty-state message for a heart-rate-zone bar figure with no data." }, "coachFiguresMinTotal": "{n} min total", "@coachFiguresMinTotal": { "description": "Footnote under a zone bar figure stating total minutes across zones.", "placeholders": { "n": { "type": "int" } } }, "coachFiguresGauge": "Gauge", "@coachFiguresGauge": { "description": "Fallback title/label for a gauge figure with no title or label." }, "coachFiguresGaugeNoValue": "The coach sent a gauge with no value.", "@coachFiguresGaugeNoValue": { "description": "Error card body when the coach sent a gauge figure with no value." }, "coachFiguresSummary": "Summary", "@coachFiguresSummary": { "description": "Fallback title for a KPI-grid figure with no title." }, "coachFiguresEmptySummary": "The coach sent an empty summary.", "@coachFiguresEmptySummary": { "description": "Error card body when the coach sent a KPI-grid figure with no cards." }, "coachFiguresTable": "Table", "@coachFiguresTable": { "description": "Fallback title for a table figure with no title." }, "coachFiguresTableNoRows": "The coach sent a table with no rows.", "@coachFiguresTableNoRows": { "description": "Error card body when the coach sent a table figure with no rows." }, "circadianDetailTitle": "Body clock", "@circadianDetailTitle": { "description": "Nav title of the body-clock (circadian) detail screen" }, "circadianDetailNoNightsTitle": "No nights to plot yet", "@circadianDetailNoNightsTitle": { "description": "Empty-state title when no nights have been scored yet" }, "circadianDetailNoNightsBody": "0 nights scored.", "@circadianDetailNoNightsBody": { "description": "Empty-state body under circadianDetailNoNightsTitle" }, "circadianDetailNoNightsFix": "Wear the band overnight", "@circadianDetailNoNightsFix": { "description": "Empty-state suggested fix action" }, "circadianDetailSleepTitle": "Sleep, night by night", "@circadianDetailSleepTitle": { "description": "Chart title for the per-night sleep actogram" }, "circadianDetailAsleep": "Asleep", "@circadianDetailAsleep": { "description": "Legend label for the actogram's asleep series" }, "circadianDetailSleepFootnote": "{count, plural, one{{count} night, one column each, darker where more of that hour was asleep.} other{{count} nights, one column each, darker where more of that hour was asleep.}}", "@circadianDetailSleepFootnote": { "description": "Footnote under the actogram stating how many nights are drawn", "placeholders": { "count": { "type": "int" } } }, "circadianDetailYourRhythm": "Your rhythm", "@circadianDetailYourRhythm": { "description": "Section title for the chronotype/jetlag/regularity table" }, "circadianDetailWhichNights": "Which nights", "@circadianDetailWhichNights": { "description": "Section action link to reveal the least-alike night pair" }, "circadianDetailHide": "Hide", "@circadianDetailHide": { "description": "Toggle action label to collapse an expanded section" }, "circadianDetailShow": "Show", "@circadianDetailShow": { "description": "Toggle action label to expand the rhythm-strength section" }, "circadianDetailTodayPredicted": "Today, predicted", "@circadianDetailTodayPredicted": { "description": "Section title for the alertness forecast card" }, "circadianDetailRhythmStrength": "Rhythm strength", "@circadianDetailRhythmStrength": { "description": "Section title for the non-parametric rhythm battery" }, "circadianDetailWhenStill": "When you are still", "@circadianDetailWhenStill": { "description": "Section title for the daytime HRV-while-still card" }, "circadianDetailNoStillTitle": "No still moments to read yet", "@circadianDetailNoStillTitle": { "description": "Empty-state title when no still-moment HRV data exists" }, "circadianDetailNoStillBody": "This needs seconds when you were still, and the last {days, plural, one{{days} day} other{{days} days}} had too few to fill an hour.", "@circadianDetailNoStillBody": { "description": "Empty-state body explaining too few quiet stretches were found", "placeholders": { "days": { "type": "int" } } }, "circadianDetailStillnessTitle": "Beat-to-beat variability while still", "@circadianDetailStillnessTitle": { "description": "Chart title for the hourly HRV-while-still chart" }, "circadianDetailStillnessFootnote": "Each hour is the middle of {lo}–{hi} still five-minute stretches over {days, plural, one{{days} day} other{{days} days}}, and {drawn} of 24 hours had enough, so read it as stillness, not stress.", "@circadianDetailStillnessFootnote": { "description": "Footnote explaining the HRV-while-still chart's methodology and coverage", "placeholders": { "lo": { "type": "int" }, "hi": { "type": "int" }, "days": { "type": "int" }, "drawn": { "type": "int" } } }, "circadianDetailForecastTitle": "How today is likely to run", "@circadianDetailForecastTitle": { "description": "Chart title for the alertness-shape forecast" }, "circadianDetailForecastFootnote": "No scale — the shape is the whole output.", "@circadianDetailForecastFootnote": { "description": "Footnote noting the forecast chart has no numeric scale" }, "circadianDetailTroughText": "The flattest stretch lands in {troughLabel}, around {start}–{end}.", "@circadianDetailTroughText": { "description": "Sentence naming the predicted flattest/lowest-alertness window of the day", "placeholders": { "troughLabel": { "type": "String" }, "start": { "type": "String" }, "end": { "type": "String" } } }, "circadianDetailPredictionDisclaimer": "A prediction, not a reading. It only knows last night; a nap, coffee or anything else today won’t change it.", "@circadianDetailPredictionDisclaimer": { "description": "Disclaimer that the alertness forecast is a prediction, not a measurement" }, "circadianDetailAssumedPhaseNote": "Your own clock peak is not worked out yet, so this uses an average one.", "@circadianDetailAssumedPhaseNote": { "description": "Appended note when the user's own circadian acrophase is not yet known and an average is used" }, "circadianDetailNotADrivingCheck": "It is not a fitness-to-drive check and not a shift-safety tool, and it does not say you are impaired.", "@circadianDetailNotADrivingCheck": { "description": "Safety disclaimer that the forecast is not a fitness-to-drive or shift-safety tool" }, "circadianDetailChronotype": "Natural bedtime", "@circadianDetailChronotype": { "description": "Row label: chronotype classification" }, "circadianDetailMidSleepFree": "Mid-sleep, free days", "@circadianDetailMidSleepFree": { "description": "Row label: mid-sleep time on free days" }, "circadianDetailMidSleepWork": "Mid-sleep, working days", "@circadianDetailMidSleepWork": { "description": "Row label: mid-sleep time on working days" }, "circadianDetailSocialJetlag": "Weekend shift", "@circadianDetailSocialJetlag": { "description": "Row label: social jetlag magnitude" }, "circadianDetailLater": "later", "@circadianDetailLater": { "description": "Suffix word appended to the social jetlag value when the free-day clock runs later" }, "circadianDetailEarlier": "earlier", "@circadianDetailEarlier": { "description": "Suffix word appended to the social jetlag value when the free-day clock runs earlier" }, "circadianDetailNightsCompared": "Free / working nights compared", "@circadianDetailNightsCompared": { "description": "Row label: count of free vs working nights compared" }, "circadianDetailRegularityIndex": "Schedule consistency", "@circadianDetailRegularityIndex": { "description": "Row label: sleep regularity index score" }, "circadianDetailNightsLeastAlike": "Nights least alike", "@circadianDetailNightsLeastAlike": { "description": "Row label: the pair of nights with lowest regularity agreement" }, "circadianDetailSamePairScale": "That pair, same scale", "@circadianDetailSamePairScale": { "description": "Row label: that least-alike pair's score on the same 0-100 scale" }, "circadianDetailRhythmNotEstablished": "Your rhythm is not established yet", "@circadianDetailRhythmNotEstablished": { "description": "Empty-state title when the rhythm table has no rows yet" }, "circadianDetailPairFootnote": "The least alike pair, out of {count}. A late weekend is a different schedule, not a worse night. Days with too little recording are left out.", "@circadianDetailPairFootnote": { "description": "Footnote explaining the least-alike night pair table, out of how many pairs total", "placeholders": { "count": { "type": "int" } } }, "circadianDetailStability": "Day-to-day stability", "@circadianDetailStability": { "description": "Row label: interdaily stability (IS)" }, "circadianDetailFragmentation": "Hour-to-hour fragmentation", "@circadianDetailFragmentation": { "description": "Row label: intradaily variability (IV)" }, "circadianDetailAmplitude": "Relative amplitude", "@circadianDetailAmplitude": { "description": "Row label: relative amplitude (RA)" }, "circadianDetailM10Start": "Highest-HR 10 hours start", "@circadianDetailM10Start": { "description": "Row label: start time of the highest-HR 10-hour window (M10)" }, "circadianDetailL5Start": "Lowest-HR 5 hours start", "@circadianDetailL5Start": { "description": "Row label: start time of the lowest-HR 5-hour window (L5)" }, "circadianDetailRhythmPeak": "Rhythm peak", "@circadianDetailRhythmPeak": { "description": "Row label: cosinor-fit rhythm peak time (acrophase)" }, "circadianDetailPeakSwing": "Peak-to-mean swing", "@circadianDetailPeakSwing": { "description": "Row label: cosinor amplitude, peak-to-mean swing" }, "circadianDetailFitCurve": "Fit to a 24 h curve", "@circadianDetailFitCurve": { "description": "Row label: adjusted R² of the 24h cosinor fit" }, "circadianDetailStrengthNotMeasured": "Rhythm strength is not measured yet", "@circadianDetailStrengthNotMeasured": { "description": "Empty-state title when the rhythm-strength battery has no rows yet" }, "circadianDetailStrengthWhy": "Needs consecutive days with all 24 hours recorded.", "@circadianDetailStrengthWhy": { "description": "Empty-state reason: needs consecutive fully-recorded days" }, "circadianDetailStrengthFootnoteKnown": "From {used, plural, one{{used} fully recorded day} other{{used} fully recorded days}}. Your highest and lowest heart-rate hours, not your busiest.", "@circadianDetailStrengthFootnoteKnown": { "description": "Footnote citing how many fully-recorded days the rhythm-strength battery used", "placeholders": { "used": { "type": "int" } } }, "circadianDetailStrengthFootnoteUnknown": "From a run of fully-recorded days of heart rate. These are your highest and lowest heart-rate hours, not your busiest.", "@circadianDetailStrengthFootnoteUnknown": { "description": "Footnote for the rhythm-strength battery when the exact day count is unavailable" }, "beatsTitle": "Beats", "@beatsTitle": { "description": "Nav title of the Beats (RR-interval) detail screen" }, "beatsNoNightTitle": "No night to draw yet", "@beatsNoNightTitle": { "description": "Empty-state title when no derived night exists yet" }, "beatsNoNightBody": "No night has been scored on this phone yet, so there are no heartbeats to plot.", "@beatsNoNightBody": { "description": "Empty-state body explaining there are no beat intervals to plot" }, "beatsNoNightFix": "Wear the band overnight, then sync", "@beatsNoNightFix": { "description": "Empty-state suggested fix action" }, "beatsNightOf": "Night of {date}", "@beatsNightOf": { "description": "Subtitle stating which night's date all panels describe", "placeholders": { "date": { "type": "String" } } }, "beatsPoincareSection": "Every beat against the one before it", "@beatsPoincareSection": { "description": "Section title for the Poincaré scatter plot" }, "beatsBeatsGoneTitle": "The beats for this night are no longer on this phone", "@beatsBeatsGoneTitle": { "description": "Empty-state title when raw beat intervals have been pruned from the phone" }, "beatsBeatsGoneBody": "Individual beat intervals are kept for a few days after the night is scored, then deleted. The numbers taken from them are kept for good", "@beatsBeatsGoneBody": { "description": "Empty-state body explaining beat intervals are pruned after a few days but derived numbers persist" }, "beatsBeatsGoneMeasured": " — this night measured SD1 {sd1} ms, SD2 {sd2} ms", "@beatsBeatsGoneMeasured": { "description": "Appended clause reporting the SD1/SD2 values still available even though raw beats are gone", "placeholders": { "sd1": { "type": "String" }, "sd2": { "type": "String" } } }, "beatsScatterTitle": "Each interval, plotted against the previous one", "@beatsScatterTitle": { "description": "Chart title for the Poincaré (beat vs previous beat) scatter" }, "beatsScatterFootnote": "A point on the diagonal is a beat the same length as the one before it, and the wider the cloud across that line, the more your beats vary.", "@beatsScatterFootnote": { "description": "Footnote explaining how to read the Poincaré scatter's SD1/SD2 axes" }, "beatsSd1Label": "SD1", "@beatsSd1Label": { "description": "Inline metric label: SD1 (short-term Poincaré axis)" }, "beatsSd2Label": "SD2", "@beatsSd2Label": { "description": "Inline metric label: SD2 (long-term Poincaré axis)" }, "beatsIntervalsLabel": "Intervals", "@beatsIntervalsLabel": { "description": "Inline metric label: count of intervals plotted" }, "beatsIntervalsSurvived": "{count, plural, one{{count} interval survived correction} other{{count} intervals survived correction}}", "@beatsIntervalsSurvived": { "description": "Note fragment: how many beat intervals survived artifact correction", "placeholders": { "count": { "type": "int" } } }, "beatsDroppedArtifact": " — {count, plural, one{{count} was} other{{count} were}} rejected as artifact and {count, plural, one{is} other{are}} not in the cloud", "@beatsDroppedArtifact": { "description": "Note fragment appended when some beats were rejected as artifact", "placeholders": { "count": { "type": "int" } } }, "beatsPulseNotEcg": "Pulse, not ECG — real and yours, but not the picture an ECG draws.", "@beatsPulseNotEcg": { "description": "Disclaimer that this is pulse-derived data, not an ECG reading" }, "beatsMeasuredOn": "Measured on {device}; straps do not read the same numbers as each other.", "@beatsMeasuredOn": { "description": "Note fragment naming which strap/device family measured this night", "placeholders": { "device": { "type": "String" } } }, "beatsVariabilitySection": "Variability across the night", "@beatsVariabilitySection": { "description": "Section title for the night HRV curve panel" }, "beatsUnitNights": "nights", "@beatsUnitNights": { "description": "Unit label on the night-variability status card" }, "beatsUnitScreenedNotScreened": "screened / not screened", "@beatsUnitScreenedNotScreened": { "description": "Unit label on the rhythm-screen chart (legend describes the two per-day states)" }, "beatsVariabilityWhy": "No half-hour block of this night had enough clean beats to show HRV.", "@beatsVariabilityWhy": { "description": "Empty-state reason: no half-hour bin had enough clean beats" }, "beatsNoBinsStored": "No bins were stored for this night.", "@beatsNoBinsStored": { "description": "Empty-state body when literally no bins were stored for the night" }, "beatsRmssdTitle": "HRV in half-hour blocks", "@beatsRmssdTitle": { "description": "Chart title for the half-hour RMSSD band chart" }, "beatsStart": "Start", "@beatsStart": { "description": "X-axis label for the start of the night when no wall-clock origin is known" }, "beatsBandFootnote": "Each bar is how sure we are of that block and the mark inside it is the value, with a blank where too few clean beats were left.", "@beatsBandFootnote": { "description": "Footnote explaining the RMSSD band chart's bar-vs-mark meaning" }, "beatsFirstThird": "First third", "@beatsFirstThird": { "description": "Inline metric label: RMSSD in the first third of the night" }, "beatsLastThird": "Last third", "@beatsLastThird": { "description": "Inline metric label: RMSSD in the last third of the night" }, "beatsDcSection": "Deceleration capacity", "@beatsDcSection": { "description": "Section title for the deceleration-capacity (PRSA DC) panel" }, "beatsDcWhy": "No stored night has produced one yet.", "@beatsDcWhy": { "description": "Empty-state reason: no stored night has produced a DC value" }, "beatsDcNoData": "No night has produced one yet.", "@beatsDcNoData": { "description": "Empty-state body fallback for deceleration capacity" }, "beatsDcChartTitle": "Your own nights, in order", "@beatsDcChartTitle": { "description": "Chart title for the deceleration-capacity trend chart" }, "beatsDaysAgo": "{count} days ago", "@beatsDaysAgo": { "description": "X-axis label for the oldest day shown in a rolling-window chart", "placeholders": { "count": { "type": "int" } } }, "beatsTodayLabel": "Today", "@beatsTodayLabel": { "description": "X-axis label for the most recent day in a rolling-window chart" }, "beatsAnchorsLastNight": "Anchors last night", "@beatsAnchorsLastNight": { "description": "Inline metric label: PRSA anchor count for the most recent night" }, "beatsCleanBeats": "Clean beats", "@beatsCleanBeats": { "description": "Inline metric label: percentage of beats that were clean" }, "beatsDcNote": "Compare it only with your own nights, because a cleaner signal can raise it as much as a change in you.", "@beatsDcNote": { "description": "Explanatory note under the deceleration-capacity chart about how to interpret it" }, "beatsRhythmSection": "Rhythm screen", "@beatsRhythmSection": { "description": "Section title for the irregular-rhythm screening panel" }, "beatsRhythmChartTitle": "One cell per day", "@beatsRhythmChartTitle": { "description": "Chart title for the per-day rhythm-screen strip" }, "beatsScreenNotFired": "Screen did not fire", "@beatsScreenNotFired": { "description": "Legend label: the rhythm screen ran and did not flag anything" }, "beatsScreenFired": "Screen fired", "@beatsScreenFired": { "description": "Legend label: the rhythm screen ran and flagged the day" }, "beatsNotScreened": "Not screened", "@beatsNotScreened": { "description": "Legend label: the rhythm screen did not run that day" }, "beatsNoDayScreened": "No day in this window was screened", "@beatsNoDayScreened": { "description": "Empty-state message when no day in the window was screened at all" }, "beatsScreenNote": "A screen, not a test.\n\nA day the screen did not fire is not a day you were cleared — it cannot rule anything out, and it never could. Outlined days were not screened at all: too few clean beats, or too much movement.\n\nWrist pulse is not an ECG. If symptoms are what brought you here, a clinician can test that properly.", "@beatsScreenNote": { "description": "Multi-paragraph disclaimer that the rhythm strip is a screen, not a diagnosis, and to see a clinician for symptoms" }, "beatsScreenedSummary": "{screened} of the last {win} days were screened", "@beatsScreenedSummary": { "description": "Summary sentence: how many of the last N days were screened", "placeholders": { "screened": { "type": "int" }, "win": { "type": "int" } } }, "beatsFiredSummary": "; the screen fired on {fired}", "@beatsFiredSummary": { "description": "Appended clause: how many days the screen fired on", "placeholders": { "fired": { "type": "int" } } }, "beatsNotScreenedNote": " Last night was not screened: {note}", "@beatsNotScreenedNote": { "description": "Appended clause giving the reason last night specifically was not screened", "placeholders": { "note": { "type": "String" } } }, "logWorkoutCouldNotLog": "Could not log this one — try again.", "@logWorkoutCouldNotLog": { "description": "Error snack bar when confirming a detected workout suggestion fails to save" }, "logWorkoutCouldNotDismiss": "Could not dismiss this one — try again.", "@logWorkoutCouldNotDismiss": { "description": "Error snack bar when dismissing a detected workout suggestion fails" }, "logWorkoutAdjustTimes": "Adjust the times", "@logWorkoutAdjustTimes": { "description": "Button/screen-title for widening the times on a detected workout before logging it" }, "logWorkoutDetectedActivityTitle": "Detected activity", "@logWorkoutDetectedActivityTitle": { "description": "Nav bar title on the detected-workout review screen" }, "logWorkoutYoursToConfirmSub": "YOURS TO CONFIRM", "@logWorkoutYoursToConfirmSub": { "description": "Nav bar subtitle (all caps) on the detected-workout review screen" }, "logWorkoutReadFailedTitle": "Could not read your detected activity", "@logWorkoutReadFailedTitle": { "description": "Status card title when reading detected workout suggestions fails" }, "logWorkoutReadFailedBody": "The store did not answer. Nothing has been logged or dismissed.", "@logWorkoutReadFailedBody": { "description": "Status card body when reading detected workout suggestions fails" }, "logWorkoutTryAgain": "Try again", "@logWorkoutTryAgain": { "description": "Retry action label on the failed-read status card" }, "logWorkoutReadingSpotted": "Reading what the band spotted…", "@logWorkoutReadingSpotted": { "description": "Loading message while detected workout suggestions are being read" }, "logWorkoutNothingToReviewTitle": "Nothing to review", "@logWorkoutNothingToReviewTitle": { "description": "Status card title when there are no detected workouts left to review" }, "logWorkoutNothingToReviewBody": "This one may already have been logged or dismissed.", "@logWorkoutNothingToReviewBody": { "description": "Status card body when there are no detected workouts left to review" }, "logWorkoutHardMinutesTitle": "These are the hard minutes, not the whole session", "@logWorkoutHardMinutesTitle": { "description": "Status card title explaining that detection only reports the hard-effort core of a session" }, "logWorkoutHardMinutesBody": "Detection catches only the sustained effort, so a warm-up and rests between sets fall outside it. Widen the times before logging if needed.", "@logWorkoutHardMinutesBody": { "description": "Status card body explaining that detection only reports the hard-effort core of a session" }, "logWorkoutMinutesOfEffort": "{mins} min of effort", "@logWorkoutMinutesOfEffort": { "description": "Duration line on a detected-workout card, e.g. '25 min of effort'", "placeholders": { "mins": { "type": "int" } } }, "logWorkoutAvgHr": "Avg HR", "@logWorkoutAvgHr": { "description": "Metric label: average heart rate over a detected bout" }, "logWorkoutPeakHr": "Peak HR", "@logWorkoutPeakHr": { "description": "Metric label: peak heart rate over a detected bout" }, "logWorkoutLooksLike": "Looks like", "@logWorkoutLooksLike": { "description": "Metric label naming the guessed activity type of a detected bout" }, "logWorkoutLogIt": "Log it", "@logWorkoutLogIt": { "description": "Primary button to confirm/log a workout" }, "logWorkoutNotAWorkout": "Not a workout", "@logWorkoutNotAWorkout": { "description": "Button to dismiss a detected bout as not a workout" }, "logWorkoutToday": "Today", "@logWorkoutToday": { "description": "Relative day label for the current calendar day" }, "logWorkoutYesterday": "Yesterday", "@logWorkoutYesterday": { "description": "Relative day label for the previous calendar day" }, "logWorkoutDefaultTitle": "Log a past workout", "@logWorkoutDefaultTitle": { "description": "Default screen title for the manual workout log form when no title is supplied" }, "logWorkoutWindowRescoredSub": "THE WINDOW, RE-SCORED", "@logWorkoutWindowRescoredSub": { "description": "Nav bar subtitle (all caps) when retiming an existing logged workout" }, "logWorkoutYourOwnTimesSub": "YOUR OWN TIMES", "@logWorkoutYourOwnTimesSub": { "description": "Nav bar subtitle (all caps) when logging a brand-new manual workout" }, "logWorkoutWhenGroup": "When", "@logWorkoutWhenGroup": { "description": "Settings group heading over the date/start/end/length rows on the workout form" }, "logWorkoutActivityLabel": "Activity", "@logWorkoutActivityLabel": { "description": "Form row label for the workout activity/type picker" }, "logWorkoutDateLabel": "Date", "@logWorkoutDateLabel": { "description": "Form row label for the workout date picker" }, "logWorkoutStartedLabel": "Started", "@logWorkoutStartedLabel": { "description": "Form row label for the workout start time picker" }, "logWorkoutEndedLabel": "Ended", "@logWorkoutEndedLabel": { "description": "Form row label for the workout end time picker" }, "logWorkoutLengthLabel": "Length", "@logWorkoutLengthLabel": { "description": "Form row label showing the computed workout duration" }, "logWorkoutNextMorningSub": "the next morning", "@logWorkoutNextMorningSub": { "description": "Small note under the end-time row when the end falls on the next calendar day" }, "logWorkoutWindowInvalidTitle": "That window will not save", "@logWorkoutWindowInvalidTitle": { "description": "Status card title when the chosen time window fails validation" }, "logWorkoutTimesUpdatedTitle": "Times updated", "@logWorkoutTimesUpdatedTitle": { "description": "Status card title after successfully retiming an existing workout" }, "logWorkoutLoggedTitle": "Workout logged", "@logWorkoutLoggedTitle": { "description": "Status card title after successfully logging a new workout" }, "logWorkoutScoreWithBand": "Score with band heart rate", "@logWorkoutScoreWithBand": { "description": "Title of the log form when scoring an imported workout from the band's own heart rate." }, "logWorkoutImportedHrGone": "Heart rate for this workout is no longer stored, so the band cannot score it.", "@logWorkoutImportedHrGone": { "description": "Shown when an imported workout's window has no stored band heart rate left to score." }, "logWorkoutUnscoredSaved": "Saved. No heart rate was recorded over that window, so it has no strain and no calorie figure — the times are all this one carries.", "@logWorkoutUnscoredSaved": { "description": "Status card body when a saved workout has no heart-rate data so it could not be scored" }, "logWorkoutCouldNotSave": "Could not save that — try again.", "@logWorkoutCouldNotSave": { "description": "Status card body when saving the workout form fails" }, "logWorkoutScoredTitle": "Scored from what the band recorded", "@logWorkoutScoredTitle": { "description": "Status card title explaining that strain/calories are computed from recorded heart rate" }, "logWorkoutScoredBody": "Strain and calories come from your heart rate within these times, the same way the day is scored. Nothing is guessed from duration.", "@logWorkoutScoredBody": { "description": "Status card body explaining that strain/calories are computed from recorded heart rate, not estimated" }, "logWorkoutSaving": "Saving…", "@logWorkoutSaving": { "description": "Save button label while the workout form is submitting" }, "logWorkoutSaveNewTimes": "Save the new times", "@logWorkoutSaveNewTimes": { "description": "Save button label when retiming an existing workout" }, "logWorkoutSearchActivities": "Search activities", "@logWorkoutSearchActivities": { "description": "Search field hint text in the activity-type picker sheet" }, "logWorkoutNoActivityByName": "No activity by that name", "@logWorkoutNoActivityByName": { "description": "Empty-state message when the activity search finds no matches" }, "logFoodTitle": "Log an eating occasion", "@logFoodTitle": { "description": "Heading of the log-food bottom sheet" }, "logFoodClose": "Close", "@logFoodClose": { "description": "Accessibility label for the close button on the log-food sheet" }, "logFoodIAte": "I ate {meal}", "@logFoodIAte": { "description": "Primary button to log a bare eating occasion, e.g. 'I ate breakfast'", "placeholders": { "meal": { "type": "String" } } }, "logFoodAgain": "Again", "@logFoodAgain": { "description": "Section heading listing recently logged foods for one-tap re-logging" }, "logFoodAddNumbers": "Add the numbers", "@logFoodAddNumbers": { "description": "Expandable row label to reveal the macro-detail fields" }, "logFoodScanBarcode": "Scan a barcode", "@logFoodScanBarcode": { "description": "Row label to scan a product barcode" }, "logFoodScanSubOn": "Asks openfoodfacts.org about the barcode, and fills in what it can stand behind", "@logFoodScanSubOn": { "description": "Subtitle under the scan-barcode row when online lookups are already allowed" }, "logFoodScanSubOff": "Looks the pack up online. Asks first", "@logFoodScanSubOff": { "description": "Subtitle under the scan-barcode row when online lookups are off and will be asked about first" }, "logFoodLookingUpTitle": "Looking it up", "@logFoodLookingUpTitle": { "description": "Status card title while a barcode lookup is in progress" }, "logFoodLookingUpBody": "The boxes fill as soon as the answer is here.", "@logFoodLookingUpBody": { "description": "Status card body while a barcode lookup is in progress" }, "logFoodWhatLabel": "What", "@logFoodWhatLabel": { "description": "Text field label for the food description" }, "logFoodWhatHint": "Chicken and rice", "@logFoodWhatHint": { "description": "Text field placeholder example for the food description" }, "logFoodPortionLabel": "Portion", "@logFoodPortionLabel": { "description": "Number field label for the eaten portion size in grams" }, "logFoodUnknownHint": "unknown", "@logFoodUnknownHint": { "description": "Placeholder text in a macro number field when no value is known" }, "logFoodEnergyLabel": "Energy", "@logFoodEnergyLabel": { "description": "Number field label for energy/calories" }, "logFoodProteinLabel": "Protein", "@logFoodProteinLabel": { "description": "Number field label for protein" }, "logFoodCarbsLabel": "Carbs", "@logFoodCarbsLabel": { "description": "Number field label for carbohydrates" }, "logFoodFatLabel": "Fat", "@logFoodFatLabel": { "description": "Number field label for fat" }, "logFoodFibreLabel": "Fibre", "@logFoodFibreLabel": { "description": "Number field label for fibre" }, "logFoodBlankHint": "A blank number stays blank. Only \"What\" is needed.", "@logFoodBlankHint": { "description": "Helper text under the macro fields explaining blank values are fine" }, "logFoodSayWhatFirst": "Say what it was first.", "@logFoodSayWhatFirst": { "description": "Snack bar shown when trying to save a food entry with no description" }, "logFoodConsentTitle": "Look barcodes up online?", "@logFoodConsentTitle": { "description": "Heading of the barcode-lookup consent sheet" }, "logFoodConsentBody1": "A scan sends the barcode to openfoodfacts.org, a free, open food database. They see the barcode and your IP address. Nothing about you, your meals or your health leaves this phone, and a barcode you have scanned before is answered from your own copy without asking them again.", "@logFoodConsentBody1": { "description": "First paragraph of the barcode-lookup consent sheet, explaining what data leaves the phone" }, "logFoodConsentBody2": "Their numbers are typed in by the public and a fair few of them are wrong, so anything that fails a sanity check is left blank rather than filled in. Everything it does fill in is yours to edit before you save.", "@logFoodConsentBody2": { "description": "Second paragraph of the barcode-lookup consent sheet, explaining data quality and editability" }, "logFoodConsentBody3": "You can turn this back off in Settings › Privacy. Typing the numbers off the pack works either way.", "@logFoodConsentBody3": { "description": "Third paragraph of the barcode-lookup consent sheet, explaining how to revoke consent" }, "logFoodAllowLookups": "Allow lookups", "@logFoodAllowLookups": { "description": "Consent sheet button to allow online barcode lookups" }, "logFoodNotNow": "Not now", "@logFoodNotNow": { "description": "Consent sheet button to decline online barcode lookups" }, "logFoodBreakfast": "Breakfast", "@logFoodBreakfast": { "description": "Meal-type label: breakfast" }, "logFoodLunch": "Lunch", "@logFoodLunch": { "description": "Meal-type label: lunch" }, "logFoodDinner": "Dinner", "@logFoodDinner": { "description": "Meal-type label: dinner" }, "logFoodSnack": "Snack", "@logFoodSnack": { "description": "Meal-type label: snack (also the default/fallback meal type)" }, "logFoodNoNumbersTitle": "No numbers for this one", "@logFoodNoNumbersTitle": { "description": "Status card title when a barcode lookup found the product but no usable nutrition numbers" }, "logFoodNoNumbersBody": "Open Food Facts has the product but nothing usable on its nutrition — or what it had did not survive a sanity check.", "@logFoodNoNumbersBody": { "description": "Status card body when a barcode lookup found the product but no usable nutrition numbers" }, "logFoodNotFoundTitle": "Not in Open Food Facts", "@logFoodNotFoundTitle": { "description": "Status card title when a scanned barcode is not in the product database" }, "logFoodNotFoundBody": "Nobody has added this barcode yet.", "@logFoodNotFoundBody": { "description": "Status card body when a scanned barcode is not in the product database" }, "logFoodFlaggedTitle": "This record is flagged as wrong", "@logFoodFlaggedTitle": { "description": "Status card title when Open Food Facts flags the scanned product record as wrong" }, "logFoodFlaggedBody": "Open Food Facts marks this product as containing errors, so none of its numbers were filled in.", "@logFoodFlaggedBody": { "description": "Status card body when Open Food Facts flags the scanned product record as wrong" }, "logFoodUnreachableTitle": "No answer from Open Food Facts", "@logFoodUnreachableTitle": { "description": "Status card title when the barcode lookup service could not be reached" }, "logFoodUnreachableBody": "The lookup could not reach openfoodfacts.org.", "@logFoodUnreachableBody": { "description": "Status card body when the barcode lookup service could not be reached" }, "logFoodRefusedTitle": "Barcode lookup is off", "@logFoodRefusedTitle": { "description": "Status card title when barcode lookup is turned off in privacy settings" }, "logFoodRefusedBody": "Nothing was sent. You can turn it on in Settings › Privacy.", "@logFoodRefusedBody": { "description": "Status card body when barcode lookup is turned off in privacy settings" }, "logFoodPortionNoteBase": "Open Food Facts lists this per 100 g. Change the portion and the numbers follow.", "@logFoodPortionNoteBase": { "description": "Note under the portion field explaining nutrition numbers are per 100g and rescale with portion, used when the product has no stated serving size" }, "logFoodPortionNoteServing": "Open Food Facts lists this per 100 g. Change the portion and the numbers follow. The pack’s own serving is {serving}.", "@logFoodPortionNoteServing": { "description": "Note under the portion field explaining nutrition numbers are per 100g and rescale with portion, including the pack's own stated serving size", "placeholders": { "serving": { "type": "String" } } }, "logFoodPillOpenFoodFacts": "Open Food Facts", "@logFoodPillOpenFoodFacts": { "description": "Provenance pill on a food row: number came from an Open Food Facts barcode scan" }, "logFoodPillYours": "Yours", "@logFoodPillYours": { "description": "Provenance pill on a food row: numbers were typed in by the user" }, "logFoodBareOccasion": "LOGGED · ENERGY NOT RECORDED", "@logFoodBareOccasion": { "description": "Detail line on a food row that was logged with no energy/macro numbers, all caps" }, "logFoodOpensInBrowser": "{label}, opens in your browser", "@logFoodOpensInBrowser": { "description": "Accessibility label appended to an external link, e.g. an Open Food Facts credit link", "placeholders": { "label": { "type": "String" } } }, "dayTimelineChargerOn": "On the charger", "@dayTimelineChargerOn": { "description": "Timeline event: the band was placed on the charger." }, "dayTimelineChargerOff": "Off the charger", "@dayTimelineChargerOff": { "description": "Timeline event: the band was taken off the charger." }, "dayTimelineDoubleTap": "You double-tapped the band", "@dayTimelineDoubleTap": { "description": "Timeline event: user double-tapped the band." }, "dayTimelineRestarted": "The band restarted", "@dayTimelineRestarted": { "description": "Timeline event: the band restarted itself." }, "dayTimelineBatteryPackAttached": "Battery pack attached", "@dayTimelineBatteryPackAttached": { "description": "Timeline event: an external battery pack was attached to the band." }, "dayTimelineBatteryPackRemoved": "Battery pack removed", "@dayTimelineBatteryPackRemoved": { "description": "Timeline event: an external battery pack was removed from the band." }, "dayTimelineAlarmWentOff": "Alarm went off", "@dayTimelineAlarmWentOff": { "description": "Timeline event: the band's alarm fired." }, "dayTimelineAsleep": "Asleep", "@dayTimelineAsleep": { "description": "Timeline/legend title for a night's sleep span." }, "dayTimelineNap": "Nap", "@dayTimelineNap": { "description": "Timeline title for a nap span." }, "dayTimelineWorkout": "Workout", "@dayTimelineWorkout": { "description": "Fallback timeline/legend title for a workout session with no known type." }, "dayTimelineBandOffWrist": "Band off your wrist", "@dayTimelineBandOffWrist": { "description": "Timeline title for a stretch the band was off the wrist." }, "dayTimelineHighestHr": "Highest heart rate", "@dayTimelineHighestHr": { "description": "Timeline title for the day's highest heart-rate reading." }, "dayTimelineLowestHr": "Lowest heart rate", "@dayTimelineLowestHr": { "description": "Timeline title for the day's lowest heart-rate reading." }, "dayTimelineBpmAt": "{bpm} bpm at {time}", "@dayTimelineBpmAt": { "description": "Timeline detail line for a heart-rate extreme, e.g. '142 bpm at 3:14 PM'.", "placeholders": { "bpm": { "type": "int" }, "time": { "type": "String" } } }, "dayTimelineTakenAt": "Taken at {time}", "@dayTimelineTakenAt": { "description": "Timeline detail line for a medication dose taken at a given time.", "placeholders": { "time": { "type": "String" } } }, "dayTimelineLastAt": "last at {time}", "@dayTimelineLastAt": { "description": "Timeline detail suffix for the last occurrence of a timed journal field, e.g. 'last at 9:30 PM'.", "placeholders": { "time": { "type": "String" } } }, "dayTimelineTaggedTitle": "Tagged", "@dayTimelineTaggedTitle": { "description": "Fallback day-note title when a journal entry has tags but no written note." }, "dayTimelineDeviceBounded": "Per-device detail is kept for recent days only. Before {oldest} we know which device recorded, not what it said.", "@dayTimelineDeviceBounded": { "description": "Copy shown instead of a per-device curve when the day is outside decoded_onehz retention.", "placeholders": { "oldest": { "type": "String" } } }, "dayTimelineTitle": "Breakdown of your day", "@dayTimelineTitle": { "description": "Day timeline screen title." }, "dayTimelineSub": "MIDNIGHT TO MIDNIGHT", "@dayTimelineSub": { "description": "Day timeline screen subtitle, all-caps." }, "dayTimelineHeartRateTitle": "Heart rate", "@dayTimelineHeartRateTitle": { "description": "Title of the day's heart-rate chart." }, "dayTimelineMidnight": "Midnight", "@dayTimelineMidnight": { "description": "X-axis label for midnight on the day chart." }, "dayTimelineNoon": "Noon", "@dayTimelineNoon": { "description": "X-axis label for noon on the day chart." }, "dayTimelineMoving": "Moving", "@dayTimelineMoving": { "description": "Legend label for the movement lane on the day chart." }, "dayTimelineNotRecorded": "Not recorded", "@dayTimelineNotRecorded": { "description": "Legend label for unmeasured stretches on the day chart." }, "dayTimelineNothingRecordedTitle": "Nothing was recorded on this day", "@dayTimelineNothingRecordedTitle": { "description": "Empty-state title when a day has no chart and no timeline entries at all." }, "dayTimelineNothingRecordedBody": "No sleep, no session, no log and no band event carrying a time. A day with nothing on it is usually a day the band was off.", "@dayTimelineNothingRecordedBody": { "description": "Empty-state body explaining a day with nothing recorded." }, "dayTimelineNoTimeTitle": "Nothing on this day carries a time", "@dayTimelineNoTimeTitle": { "description": "Empty-state title when a day has notes but nothing with a time attached." }, "dayTimelineNoTimeBody": "What was logged for it is below.", "@dayTimelineNoTimeBody": { "description": "Empty-state body pointing to the notes section below." }, "dayTimelineWhatHappenedSection": "What happened", "@dayTimelineWhatHappenedSection": { "description": "Section heading over the day's timed events list; also reused as a section heading on the journal compose screen for the day's tags." }, "dayTimelineAlsoLoggedSection": "Also logged on this day", "@dayTimelineAlsoLoggedSection": { "description": "Section heading over the day's untimed notes." }, "dayTimelineNoTimeNote": "These were recorded against the day and carry no time of day, so they are not placed on it.", "@dayTimelineNoTimeNote": { "description": "Footnote explaining why untimed notes are not placed on the timeline." }, "dayTimelinePatternsNote": "Patterns in your own logs, not causes. Two things next to each other here happened near each other, which is all this page claims.", "@dayTimelinePatternsNote": { "description": "Footnote reminding the user the timeline shows adjacency, not causation." }, "journalComposeNotReady": "Not ready yet — open the app first.", "@journalComposeNotReady": { "description": "Snackbar shown when trying to add a custom journal field before the app has a repository ready." }, "journalComposeSaveFailed": "Could not save it — check storage and retry.", "@journalComposeSaveFailed": { "description": "Snackbar shown when saving a new custom journal field fails." }, "journalComposeWhenWasLastOne": "When was the last one?", "@journalComposeWhenWasLastOne": { "description": "Time picker help text when logging the time of the last dose of a journal field." }, "journalComposeTitle": "Journal", "@journalComposeTitle": { "description": "Journal compose screen title." }, "journalComposeTodaySection": "Today", "@journalComposeTodaySection": { "description": "Section heading over today's journal field steppers." }, "journalComposeTrackSomethingElse": "Track something else", "@journalComposeTrackSomethingElse": { "description": "Button to define a new custom journal field." }, "journalComposeAnythingElseLabel": "Anything else", "@journalComposeAnythingElseLabel": { "description": "Label for the free-text journal note field." }, "journalComposeTalkItThroughWithAi": "Talk it through with AI", "@journalComposeTalkItThroughWithAi": { "description": "Link above the journal note field that opens an AI chat about the day. Shown only when an AI key is configured." }, "journalComposeAnythingElseHint": "A line about the day.", "@journalComposeAnythingElseHint": { "description": "Placeholder hint for the free-text journal note field." }, "journalComposeSavingLabel": "Saving", "@journalComposeSavingLabel": { "description": "Save button label while the journal entry is being saved." }, "journalComposeHowAreYouFeeling": "How are you feeling?", "@journalComposeHowAreYouFeeling": { "description": "Mood picker heading." }, "journalComposeNotAnsweredYet": "Not answered yet", "@journalComposeNotAnsweredYet": { "description": "Mood picker subtitle when no mood has been picked yet." }, "journalComposeMoodOfFive": "Mood {value} of 5 · tap it again to clear", "@journalComposeMoodOfFive": { "description": "Mood picker subtitle once a mood is picked, e.g. 'Mood 3 of 5 · tap it again to clear'.", "placeholders": { "value": { "type": "int" } } }, "journalComposeMoodOfFiveSelected": "Mood {n} of 5, selected. Activate to clear.", "@journalComposeMoodOfFiveSelected": { "description": "Accessibility label for the currently selected mood face, which can be tapped again to clear it.", "placeholders": { "n": { "type": "int" } } }, "journalComposeMoodOfFiveLabel": "Mood {n} of 5", "@journalComposeMoodOfFiveLabel": { "description": "Accessibility label for an unselected mood face.", "placeholders": { "n": { "type": "int" } } }, "journalComposeNotLogged": "Not logged", "@journalComposeNotLogged": { "description": "Field stepper value shown when a journal field has no value logged." }, "journalComposeWhenWasLastField": "When was the last {field}", "@journalComposeWhenWasLastField": { "description": "Accessibility label for the button that opens a time picker for a journal field's last dose, e.g. 'When was the last Caffeine'.", "placeholders": { "field": { "type": "String" } } }, "journalComposeAddTimeOfLastOne": "Add the time of the last one", "@journalComposeAddTimeOfLastOne": { "description": "Button prompting the user to add the time of the last dose of a field." }, "journalComposeLastAt": "Last at {time}", "@journalComposeLastAt": { "description": "Button label showing the recorded time of the last dose, e.g. 'Last at 9:30 PM'.", "placeholders": { "time": { "type": "String" } } }, "journalComposeIncrease": "Increase", "@journalComposeIncrease": { "description": "Accessibility label for the stepper's increase button." }, "journalComposeDecrease": "Decrease", "@journalComposeDecrease": { "description": "Accessibility label for the stepper's decrease button." }, "journalComposeWeightLabel": "Weight", "@journalComposeWeightLabel": { "description": "Label for the weight row in the journal, and fallback name for the weight field used in error messages." }, "journalComposeNotEntered": "Not entered", "@journalComposeNotEntered": { "description": "Weight row subtitle when no weight has been entered for the day." }, "journalComposeEnteredNotMeasured": "{value} · entered, not measured", "@journalComposeEnteredNotMeasured": { "description": "Weight row subtitle showing the entered value with a note that it is self-reported, e.g. '70.0 kg · entered, not measured'.", "placeholders": { "value": { "type": "String" } } }, "journalComposeEnterWeight": "Enter weight", "@journalComposeEnterWeight": { "description": "Accessibility label for the button opening the weight-entry dialog." }, "journalComposeEnter": "Enter", "@journalComposeEnter": { "description": "Weight row button label when no weight is entered yet." }, "journalComposeChange": "Change", "@journalComposeChange": { "description": "Weight row button label when a weight is already entered." }, "journalComposeSeeWeightTrend": "See the weight trend", "@journalComposeSeeWeightTrend": { "description": "Accessibility label for the link to the weight trend screen." }, "journalComposeSeeTheTrend": "See the trend", "@journalComposeSeeTheTrend": { "description": "Link text to the weight trend screen." }, "journalComposeWeightToday": "Weight today", "@journalComposeWeightToday": { "description": "Title of the dialog for entering today's weight." }, "journalComposeWeightKgLabel": "Weight (kg)", "@journalComposeWeightKgLabel": { "description": "Fallback text-field label for weight in kilograms when no units controller is available." }, "journalComposeWeightScaleNote": "What you or your scale read. The band does not measure this.", "@journalComposeWeightScaleNote": { "description": "Note in the weight-entry dialog clarifying the band does not measure weight." }, "journalComposeClear": "Clear", "@journalComposeClear": { "description": "Button to clear today's weight entry." }, "journalComposeNotEnoughEntriesTitle": "Not enough entries for a trend", "@journalComposeNotEnoughEntriesTitle": { "description": "Empty-state title on the weight trend screen when fewer than two entries exist." }, "journalComposeNotEnoughEntriesBody": "The line is a seven-day average through what you entered, so it needs at least two days. Nothing is filled in between them.", "@journalComposeNotEnoughEntriesBody": { "description": "Empty-state body explaining the weight trend needs at least two entries." }, "journalComposeSevenDayTrend": "Seven-day trend", "@journalComposeSevenDayTrend": { "description": "Title of the weight trend chart." }, "journalComposeTrendFootnote": "Entered by you. Days with no entry are left empty.", "@journalComposeTrendFootnote": { "description": "Footnote under the weight trend chart." }, "journalComposeWeightTrendExplainer": "From you or your scale; the band doesn’t measure weight. The line is a 7-day average, because water and food alone move a scale 1–2 kg. {count, plural, one{{count} day entered.} other{{count} days entered.}}", "@journalComposeWeightTrendExplainer": { "description": "Closing explainer under the weight trend chart, ending in a count of days entered.", "placeholders": { "count": { "type": "int" } } }, "nutritionTabToday": "Today", "@nutritionTabToday": { "description": "Nutrition screen: sub-tab label for today's log" }, "nutritionTabWeek": "Week", "@nutritionTabWeek": { "description": "Nutrition screen: sub-tab label for the weekly view" }, "nutritionTabGoals": "Goals", "@nutritionTabGoals": { "description": "Nutrition screen: sub-tab label for nutrition goals" }, "nutritionLogFood": "Log food", "@nutritionLogFood": { "description": "Nutrition screen: semantic label on the add-food button in the title row" }, "nutritionTitle": "Nutrition", "@nutritionTitle": { "description": "Nutrition screen title" }, "nutritionEmptyTodayTitle": "Nothing logged today", "@nutritionEmptyTodayTitle": { "description": "Nutrition Today tab: title when nothing has been logged today" }, "nutritionEmptyTodayBody": "One tap is a complete log.", "@nutritionEmptyTodayBody": { "description": "Nutrition Today tab: body text under the empty-today title" }, "nutritionLogOccasionFix": "Log an eating occasion", "@nutritionLogOccasionFix": { "description": "Nutrition screen: call-to-action button text to log an eating occasion (used in two empty/low-data states)" }, "nutritionOccasionsSection": "Occasions", "@nutritionOccasionsSection": { "description": "Nutrition Today tab: section header above the meal rows" }, "nutritionAddAction": "Add", "@nutritionAddAction": { "description": "Nutrition Today tab: 'Add' action link on the Occasions section header" }, "nutritionFloorTitle": "Today's energy is a floor, not a total", "@nutritionFloorTitle": { "description": "Nutrition Today tab: title warning that today's energy total is a lower bound" }, "nutritionFloorBody": "{unknown} of {total} occasions were logged without an energy figure, so the number above is the least you ate rather than what you ate.", "@nutritionFloorBody": { "description": "Nutrition Today tab: body explaining how many occasions lack an energy figure", "placeholders": { "unknown": { "type": "int" }, "total": { "type": "int" } } }, "nutritionAddNumbersFix": "Add the numbers to an occasion", "@nutritionAddNumbersFix": { "description": "Nutrition screen: call-to-action to add missing energy numbers to an occasion (used in two places)" }, "nutritionDaysNotCounted": "{excluded} of the last {span} days could not be counted", "@nutritionDaysNotCounted": { "description": "Nutrition Today tab: observation noting how many of the last N days could not be counted in averages", "placeholders": { "excluded": { "type": "int" }, "span": { "type": "int" } } }, "nutritionDayCountsRule": "A day counts once every occasion carries an energy figure.", "@nutritionDayCountsRule": { "description": "Nutrition Today tab: short rule explaining what makes a day count for averages" }, "nutritionDaysLoggedLabel": "Days with something logged", "@nutritionDaysLoggedLabel": { "description": "Nutrition Week tab: consistency-card label when there are no partial days" }, "nutritionPartialExcluded": "{partial} logged but partial, so excluded from every average below", "@nutritionPartialExcluded": { "description": "Nutrition Week tab: consistency-card label naming how many days were partial and excluded from averages", "placeholders": { "partial": { "type": "int" } } }, "nutritionEnergyByDay": "Energy, day by day", "@nutritionEnergyByDay": { "description": "Nutrition Week tab: section header above the daily energy bar chart" }, "nutritionSevenDayAvg": "Seven-day average", "@nutritionSevenDayAvg": { "description": "Nutrition Week tab: section header above the seven-day nutrient means" }, "nutritionNoCompleteDayTitle": "No complete day to average yet", "@nutritionNoCompleteDayTitle": { "description": "Nutrition Week tab: title shown when there is no complete day yet to average" }, "nutritionNoCompleteDayBody": "You have none.", "@nutritionNoCompleteDayBody": { "description": "Nutrition Week tab: body text under the no-complete-day title" }, "nutritionLabelEnergy": "Energy", "@nutritionLabelEnergy": { "description": "Nutrition Week tab: row label for the energy mean" }, "nutritionLabelProtein": "Protein", "@nutritionLabelProtein": { "description": "Nutrition Week tab: row label for the protein mean" }, "nutritionLabelCarbs": "Carbs", "@nutritionLabelCarbs": { "description": "Nutrition Week tab: row label for the carbs mean" }, "nutritionLabelFat": "Fat", "@nutritionLabelFat": { "description": "Nutrition Week tab: row label for the fat mean" }, "nutritionLabelFibre": "Fibre", "@nutritionLabelFibre": { "description": "Nutrition Week tab: row label for the fibre mean" }, "nutritionEnergyBalance": "Energy balance", "@nutritionEnergyBalance": { "description": "Nutrition Week tab: section header above the eaten/burned/balance metrics" }, "nutritionLabelEaten": "EATEN", "@nutritionLabelEaten": { "description": "Nutrition Week tab: all-caps inline metric label for energy eaten" }, "nutritionLabelBurned": "BURNED", "@nutritionLabelBurned": { "description": "Nutrition screen: all-caps inline metric label for energy burned (used in Week tab and Today card)" }, "nutritionLabelBalance": "BALANCE", "@nutritionLabelBalance": { "description": "Nutrition Week tab: all-caps inline metric label for the eaten-minus-burned balance" }, "nutritionEatenMeanNote": "Eaten and burned are both means over the same {days} complete days.", "@nutritionEatenMeanNote": { "description": "Nutrition Week tab: footnote explaining eaten and burned are both means over the same N complete days", "placeholders": { "days": { "type": "int" } } }, "nutritionEnergyLoggedTitle": "Energy logged", "@nutritionEnergyLoggedTitle": { "description": "Nutrition Week tab: chart title above the daily energy bars" }, "nutritionPartialFootnote": "{n} partial, left out of the averages below.", "@nutritionPartialFootnote": { "description": "Nutrition Week tab: chart footnote naming how many partial days were left out of averages", "placeholders": { "n": { "type": "int" } } }, "nutritionNothingLoggedYet": "Nothing logged yet", "@nutritionNothingLoggedYet": { "description": "Nutrition Week tab: chart empty-state message when no days have been logged at all" }, "nutritionNoEnergyFiguresYet": "No energy figures yet", "@nutritionNoEnergyFiguresYet": { "description": "Nutrition Week tab: chart empty-state message when days are logged but none carry energy figures" }, "nutritionDailyEnergy": "Daily energy", "@nutritionDailyEnergy": { "description": "Nutrition Goals tab: name of the daily energy target" }, "nutritionDailyProtein": "Daily protein", "@nutritionDailyProtein": { "description": "Nutrition Goals tab: name of the daily protein target" }, "nutritionEnergyWord": "energy", "@nutritionEnergyWord": { "description": "Nutrition Goals tab: bare noun for energy, used inside sentences (distinct from the 'Daily energy' label so word order/gender in other languages doesn't leak the label's adjective into the noun slot)" }, "nutritionProteinWord": "protein", "@nutritionProteinWord": { "description": "Nutrition Goals tab: bare noun for protein, used inside sentences (see nutritionEnergyWord)" }, "nutritionYourTargetsSection": "Your targets", "@nutritionYourTargetsSection": { "description": "Nutrition Goals tab: section header for the user's set targets, also the edit-targets sheet title" }, "nutritionHintNone": "none", "@nutritionHintNone": { "description": "Nutrition Goals tab: placeholder hint text in the empty target number field" }, "nutritionNoTargetsTitle": "No targets set", "@nutritionNoTargetsTitle": { "description": "Nutrition Goals tab: title shown when the user has set no targets" }, "nutritionNoTargetsBody": "A target here is one you type.", "@nutritionNoTargetsBody": { "description": "Nutrition Goals tab: body text under the no-targets title" }, "nutritionSetTargetFix": "Set a target", "@nutritionSetTargetFix": { "description": "Nutrition Goals tab: call-to-action button to set a target" }, "nutritionEditAction": "Edit", "@nutritionEditAction": { "description": "Nutrition Goals tab: 'Edit' action link on the Your Targets section header" }, "nutritionBodySpentToday": "What your body spent today", "@nutritionBodySpentToday": { "description": "Nutrition Goals tab: heading over the estimated-expenditure card" }, "nutritionEstimatedExpenditure": "Estimated expenditure", "@nutritionEstimatedExpenditure": { "description": "Nutrition Goals tab: metric row label for estimated calories burned" }, "nutritionNotMeasured": "Not measured", "@nutritionNotMeasured": { "description": "Nutrition Goals tab: value shown when estimated expenditure has no data" }, "nutritionExpenditureSub": "TODAY, FROM HEART RATE AND YOUR PROFILE", "@nutritionExpenditureSub": { "description": "Nutrition Goals tab: all-caps subtext explaining the expenditure figure's source" }, "nutritionRemoveTitle": "Remove {label}?", "@nutritionRemoveTitle": { "description": "Nutrition screen: confirmation sheet title when removing a logged food entry", "placeholders": { "label": { "type": "String" } } }, "nutritionRemoveBody": "It leaves the day and every average that counted it. There is no undo.", "@nutritionRemoveBody": { "description": "Nutrition screen: confirmation sheet body warning the removal cannot be undone" }, "nutritionSaveFailed": "Not saved — the meal is still here. Try again.", "@nutritionSaveFailed": { "description": "Log food sheet: snackbar when saving a meal fails; the sheet stays open with the input intact" }, "nutritionRemoveFailed": "Not removed — the meal is still there. Try again.", "@nutritionRemoveFailed": { "description": "Log food sheet: snackbar when removing a meal fails after the user confirmed" }, "nutritionNothingToMeasure": "Nothing to measure {label} against yet", "@nutritionNothingToMeasure": { "description": "Nutrition Goals tab: title shown when a target has no mean to compare against yet", "placeholders": { "label": { "type": "String" } } }, "nutritionFloorAverageBody": "Every complete day had an occasion logged without a {nutrient} figure, so the average would only be a lower bound.", "@nutritionFloorAverageBody": { "description": "Nutrition Goals tab: explanation that every complete day lacked this nutrient's figure", "placeholders": { "nutrient": { "type": "String" } } }, "nutritionCountedNoFigureBody": "{count} of the last {span} days counted, but none of them carried a {nutrient} figure.", "@nutritionCountedNoFigureBody": { "description": "Nutrition Goals tab: explanation that counted days carried no figure for this nutrient", "placeholders": { "count": { "type": "int" }, "span": { "type": "int" }, "nutrient": { "type": "String" } } }, "nutritionDayCountsRuleFull": "A day counts once every occasion carries a figure and the log reaches the evening. None of the last {span} days has.", "@nutritionDayCountsRuleFull": { "description": "Nutrition Goals tab: full rule explaining what makes a day count, when none of the recent days qualify", "placeholders": { "span": { "type": "int" } } }, "nutritionOnTarget": "On target", "@nutritionOnTarget": { "description": "Nutrition Goals tab: goal-trajectory status text when the mean is within 1 unit of target" }, "nutritionRateAbove": "{amount} {unit}/day above", "@nutritionRateAbove": { "description": "Nutrition Goals tab: goal-trajectory rate text when the mean is above target", "placeholders": { "amount": { "type": "int" }, "unit": { "type": "String" } } }, "nutritionRateBelow": "{amount} {unit}/day below", "@nutritionRateBelow": { "description": "Nutrition Goals tab: goal-trajectory rate text when the mean is below target", "placeholders": { "amount": { "type": "int" }, "unit": { "type": "String" } } }, "nutritionMeanOfDays": "{n, plural, one{mean of {n} complete day} other{mean of {n} complete days}}", "@nutritionMeanOfDays": { "description": "Nutrition Goals tab: goal-trajectory footnote naming how many complete days the mean covers", "placeholders": { "n": { "type": "int" } } }, "nutritionLoggedToday": "LOGGED TODAY", "@nutritionLoggedToday": { "description": "Nutrition Today card: all-caps header when no energy figure exists, only an occasion count" }, "nutritionEatenToday": "EATEN TODAY", "@nutritionEatenToday": { "description": "Nutrition Today card: all-caps header when an energy figure exists" }, "nutritionAtLeast": "At least", "@nutritionAtLeast": { "description": "Nutrition Today card: pill label shown when the energy total is a floor, not an exact total" }, "nutritionOccasionsUnit": "{n, plural, one{occasion} other{occasions}}", "@nutritionOccasionsUnit": { "description": "Nutrition Today card: unit word next to the raw occasion count when no energy figure exists", "placeholders": { "n": { "type": "int" } } }, "nutritionOccasionsCount": "{n, plural, one{{n} occasion} other{{n} occasions}}", "@nutritionOccasionsCount": { "description": "Nutrition Today card: '· N occasions' note shown alongside the energy total", "placeholders": { "n": { "type": "int" } } }, "nutritionLabelBalanceAtLeast": "BALANCE AT LEAST", "@nutritionLabelBalanceAtLeast": { "description": "Nutrition Today card: all-caps inline metric label for the balance when eaten is only a floor" }, "nutritionNotLogged": "Not logged", "@nutritionNotLogged": { "description": "Nutrition screen: 'Not logged' status text (used for a meal row and for the water row)" }, "nutritionLoggedNoEnergy": "{n} logged · energy not recorded", "@nutritionLoggedNoEnergy": { "description": "Nutrition meal row: status text when entries exist but none carry an energy figure", "placeholders": { "n": { "type": "int" } } }, "nutritionAtLeastPrefix": "at least ", "@nutritionAtLeastPrefix": { "description": "Nutrition meal row: lowercase prefix shown before a kcal total that is a floor, not exact (includes trailing space)" }, "nutritionMealBreakfast": "Breakfast", "@nutritionMealBreakfast": { "description": "Nutrition screen: meal occasion name, breakfast" }, "nutritionMealLunch": "Lunch", "@nutritionMealLunch": { "description": "Nutrition screen: meal occasion name, lunch" }, "nutritionMealDinner": "Dinner", "@nutritionMealDinner": { "description": "Nutrition screen: meal occasion name, dinner" }, "nutritionMealSnacks": "Snacks", "@nutritionMealSnacks": { "description": "Nutrition screen: meal occasion name, snacks (catch-all bucket)" }, "nutritionNotCounted": "Not counted", "@nutritionNotCounted": { "description": "Nutrition Week tab: nutrient mean value when the mean could not be counted at all" }, "nutritionNotRecorded": "Not recorded", "@nutritionNotRecorded": { "description": "Nutrition Week tab: nutrient mean value when no complete day recorded this nutrient" }, "nutritionEveryDayNoFigure": "EVERY COMPLETE DAY HAD AN OCCASION WITH NO {label} FIGURE", "@nutritionEveryDayNoFigure": { "description": "Nutrition Week tab: all-caps subtext when every complete day lacked this nutrient's figure", "placeholders": { "label": { "type": "String" } } }, "nutritionNoDayRecorded": "NO COMPLETE DAY RECORDED {label}", "@nutritionNoDayRecorded": { "description": "Nutrition Week tab: all-caps subtext when no complete day recorded this nutrient", "placeholders": { "label": { "type": "String" } } }, "nutritionMeanOfCompleteDaysCaps": "{n, plural, one{MEAN OF {n} COMPLETE DAY} other{MEAN OF {n} COMPLETE DAYS}}", "@nutritionMeanOfCompleteDaysCaps": { "description": "Nutrition Week tab: all-caps subtext naming how many complete days the nutrient mean covers", "placeholders": { "n": { "type": "int" } } }, "nutritionLeftOutAsFloor": " · {n} LEFT OUT AS A FLOOR", "@nutritionLeftOutAsFloor": { "description": "Nutrition Week tab: all-caps suffix appended to the mean subtext naming how many days were left out as floors (includes leading ' · ')", "placeholders": { "n": { "type": "int" } } }, "nutritionWaterLabel": "Water", "@nutritionWaterLabel": { "description": "Nutrition Today tab: label on the water tracking row" }, "nutritionTapToChange": "Tap − or + to change", "@nutritionTapToChange": { "description": "Nutrition Today tab: hint under the water label once a value is logged" }, "nutritionNoneYet": "None yet", "@nutritionNoneYet": { "description": "Nutrition Today tab: water amount text when nothing is logged yet" }, "nutritionAddWater": "Add water", "@nutritionAddWater": { "description": "Nutrition Today tab: semantic label on the water plus-step button" }, "nutritionRemoveWater": "Remove water", "@nutritionRemoveWater": { "description": "Nutrition Today tab: semantic label on the water minus-step button" }, "coachApiFormatHelp": "Choose the API your endpoint supports. Responses supports OpenAI reasoning with tools.", "@coachApiFormatHelp": { "description": "Coach AI settings: helper text under the provider API format dropdown (Responses / Chat Completions are API names, keep untranslated)" }, "coachApiFormatLabel": "API", "@coachApiFormatLabel": { "description": "Coach AI settings: label for the provider API format dropdown" }, "coachApiKeyLabel": "API key", "@coachApiKeyLabel": { "description": "Coach AI settings: text field label for a cloud provider's API key" }, "coachApiKeyLocalLabel": "API key (not needed locally)", "@coachApiKeyLocalLabel": { "description": "Coach AI settings: text field label for the API key field when a local provider is selected" }, "coachAsking": "Asking…", "@coachAsking": { "description": "Coach AI settings: button label while models are being fetched" }, "coachAskLabel": "Ask the coach", "@coachAskLabel": { "description": "Coach screen: semantic label on the chat input text field" }, "coachBaseUrlLabel": "Base URL", "@coachBaseUrlLabel": { "description": "Coach AI settings: text field label for the provider base URL" }, "coachBriefingMenuSub": "The exact snapshot that left this device", "@coachBriefingMenuSub": { "description": "Coach screen: subtitle on the menu row that opens the AI briefing detail" }, "coachBriefingMenuTitle": "Briefing, and what was sent", "@coachBriefingMenuTitle": { "description": "Coach screen: menu row title that opens the briefing and what-was-sent detail" }, "coachChooseModelFix": "Choose a model", "@coachChooseModelFix": { "description": "Coach screen: call-to-action button to open AI setup when no model is configured" }, "coachCloudDataNote": "Your questions and the rows the coach reads are sent to this endpoint. See exactly what that is on \"What was sent\".", "@coachCloudDataNote": { "description": "Coach AI settings: privacy note shown when a cloud provider is selected" }, "coachDeleteChat": "Delete {title}", "@coachDeleteChat": { "description": "Coach screen: semantic label on the delete-chat icon in the past-chats menu list", "placeholders": { "title": { "type": "String" } } }, "coachDeleteIt": "Delete it", "@coachDeleteIt": { "description": "Coach screen: confirm-dialog button text for a destructive write action" }, "coachDestructiveWarning": "This removes data from this device and cannot be undone.", "@coachDestructiveWarning": { "description": "Coach screen: confirm-dialog warning text for a destructive write action" }, "coachEndpointUnreachable": "Could not reach that endpoint: {error}", "@coachEndpointUnreachable": { "description": "Coach AI settings: error message when fetching models from the endpoint fails", "placeholders": { "error": { "type": "String" } } }, "coachErrorTitle": "That did not go through", "@coachErrorTitle": { "description": "Coach screen: title on a chat bubble reporting that a tool call failed" }, "coachInputHint": "Ask about your health…", "@coachInputHint": { "description": "Coach screen: placeholder text in the empty chat input field" }, "coachIntroBody": "Ask about anything the app measures, and it can log food, water, workouts, doses and how you felt — always asking first.", "@coachIntroBody": { "description": "Coach screen: intro paragraph shown in the empty-chat welcome card" }, "coachKeychainRefused": "The keychain refused the key: {error}", "@coachKeychainRefused": { "description": "Coach AI settings: error message when the keychain refuses to save the API key", "placeholders": { "error": { "type": "String" } } }, "coachKeyStillSavedBody": "It could not be read from the keychain this time, which happens when the app is woken while the phone is locked.", "@coachKeyStillSavedBody": { "description": "Coach screen: body text explaining why the saved API key could not be read this time" }, "coachKeyStillSavedTitle": "Your key is still saved", "@coachKeyStillSavedTitle": { "description": "Coach screen: title shown when the API key exists but could not be read from the keychain" }, "coachListModels": "List models", "@coachListModels": { "description": "Coach AI settings: button label to fetch the list of available models" }, "coachLocalDataNote": "Your questions and the rows the coach reads stay on your own machine.", "@coachLocalDataNote": { "description": "Coach AI settings: privacy note shown when a local provider is selected" }, "coachLocalSub": "On this network. Nothing leaves your machine.", "@coachLocalSub": { "description": "Coach AI settings: subtitle shown under local provider presets (Ollama, LM Studio)" }, "coachMenuSemantic": "Chats and AI settings", "@coachMenuSemantic": { "description": "Coach screen: semantic label on the top-right menu button (chats and AI settings)" }, "coachModelHint": "search, or type an id", "@coachModelHint": { "description": "Coach AI settings: placeholder hint in the model search field" }, "coachModelSelected": "Saving model: {model}", "@coachModelSelected": { "description": "Coach AI settings: line under the model field naming the model Save will store when nothing is typed", "placeholders": { "model": { "type": "String" } } }, "coachModelLabel": "Model", "@coachModelLabel": { "description": "Coach AI settings: text field label for searching or typing a model id" }, "coachModelsFound": "{n, plural, one{{n} model. Tap one.} other{{n} models. Tap one.}}", "@coachModelsFound": { "description": "Coach AI settings: status message after fetching the model list, showing how many were found", "placeholders": { "n": { "type": "int" } } }, "coachNavTitle": "Coach", "@coachNavTitle": { "description": "Coach screen: nav bar title" }, "coachNewChat": "New chat", "@coachNewChat": { "description": "Coach screen: menu row to start a new chat" }, "coachNoChatsYet": "Nothing yet — this is your first conversation.", "@coachNoChatsYet": { "description": "Coach screen: message in the past-chats menu list when there is no chat history yet" }, "coachNoDataBody": "The coach answers from your scored days, and there are none on this phone yet. Wear the band overnight and sync in the morning.", "@coachNoDataBody": { "description": "Coach screen: body text explaining there is no derived data on this device yet" }, "coachNoDataTitle": "No data to read yet", "@coachNoDataTitle": { "description": "Coach screen: title shown when the coach is configured but there is no data to read yet" }, "coachNoModelsListed": "That endpoint listed no models. Type one below instead.", "@coachNoModelsListed": { "description": "Coach AI settings: status message when the endpoint returned zero models" }, "coachNotSetUp": "Not set up", "@coachNotSetUp": { "description": "Coach screen: subtitle shown wherever the coach has no model configured yet" }, "coachNotSetUpBody": "Pick a model on your own computer, or any OpenAI-compatible provider with your own key. Nothing goes through OpenStrap either way.", "@coachNotSetUpBody": { "description": "Coach screen: body text explaining how to set up the coach and its privacy stance" }, "coachNotSetUpTitle": "The coach is not set up", "@coachNotSetUpTitle": { "description": "Coach screen: title shown when the coach has not been set up" }, "coachPastChats": "PAST CHATS", "@coachPastChats": { "description": "Coach screen: all-caps section header above the list of past chat sessions" }, "coachPickModelFirst": "Pick or type a model first.", "@coachPickModelFirst": { "description": "Coach AI settings: validation message when saving without a chosen model" }, "coachSafeWarning": "Nothing is written until you tap below.", "@coachSafeWarning": { "description": "Coach screen: confirm-dialog reassurance text for a non-destructive write action" }, "coachSaveIt": "Save it", "@coachSaveIt": { "description": "Coach screen: confirm-dialog button text for a non-destructive write action" }, "coachSendLabel": "Send", "@coachSendLabel": { "description": "Coach screen: semantic label on the send-message button" }, "coachSetupNavSub": "Bring your own model", "@coachSetupNavSub": { "description": "Coach AI settings: nav bar subtitle" }, "coachSetupNavTitle": "AI settings", "@coachSetupNavTitle": { "description": "Coach AI settings: nav bar title" }, "coachSomethingWrong": "Something went wrong: {error}", "@coachSomethingWrong": { "description": "Coach screen: generic error message shown in a chat bubble for an unexpected exception", "placeholders": { "error": { "type": "String" } } }, "coachStarterAteYesterday": "What did I eat yesterday?", "@coachStarterAteYesterday": { "description": "Coach screen: example starter prompt about what was eaten yesterday" }, "coachStarterHrvChart": "Chart my HRV over the last month", "@coachStarterHrvChart": { "description": "Coach screen: example starter prompt to chart HRV over the last month" }, "coachStarterLogRun": "I ran for 40 minutes this morning — log it", "@coachStarterLogRun": { "description": "Coach screen: example starter prompt to log a run" }, "coachStarterLogWater": "Log 500 ml of water for today", "@coachStarterLogWater": { "description": "Coach screen: example starter prompt to log water intake" }, "coachStarterRecovery": "How recovered am I today, and why?", "@coachStarterRecovery": { "description": "Coach screen: example starter prompt about today's recovery" }, "coachStarterSleep": "How has my sleep been this week?", "@coachStarterSleep": { "description": "Coach screen: example starter prompt about this week's sleep" }, "coachTryAgainFix": "Try again", "@coachTryAgainFix": { "description": "Coach screen: retry button when the saved API key could not be read" }, "coachTryAsking": "Try asking", "@coachTryAsking": { "description": "Coach screen: section header above the list of example starter prompts" }, "coachUntitledChat": "Untitled chat", "@coachUntitledChat": { "description": "Coach screen: fallback title for a past chat session with no generated title" }, "coachWhereModelRuns": "Where the model runs", "@coachWhereModelRuns": { "description": "Coach AI settings: section header above the provider preset list" }, "coachYourDataYourModel": "YOUR DATA, YOUR MODEL", "@coachYourDataYourModel": { "description": "Coach screen: all-caps headline in the empty-chat welcome card" }, "investigateNerdStatsLabel": "NERD STATS", "@investigateNerdStatsLabel": { "description": "Subtitle on the Investigate (nerd stats) screen header" }, "investigateProvenanceLabel": "Provenance", "@investigateProvenanceLabel": { "description": "Table title: where this day's data came from" }, "investigateDayLabel": "Day", "@investigateDayLabel": { "description": "Provenance table row label: the derived day" }, "investigateCoverageLabel": "Coverage", "@investigateCoverageLabel": { "description": "Provenance table row label: wear coverage percent" }, "investigateSleepWindowLabel": "Sleep window", "@investigateSleepWindowLabel": { "description": "Provenance table row label: sleep window times" }, "investigateSourceLabel": "Source", "@investigateSourceLabel": { "description": "Provenance table row label: data source" }, "investigateSourceOnDevice": "Band records · derived on this phone", "@investigateSourceOnDevice": { "description": "Provenance value: data derived on-device from band records" }, "investigateSourceImported": "Imported · {source}", "@investigateSourceImported": { "description": "Provenance value: data imported from another source", "placeholders": { "source": { "type": "String" } } }, "investigateAlgoVersionLabel": "Algorithm version", "@investigateAlgoVersionLabel": { "description": "Provenance table row label: algorithm version" }, "investigateWhatHappenedTitle": "What happened that day", "@investigateWhatHappenedTitle": { "description": "Link row title to the day timeline screen" }, "investigateWhatHappenedSub": "Sleep, sessions, meals and logs in time order", "@investigateWhatHappenedSub": { "description": "Link row subtitle describing the day timeline" }, "investigateWhichSensorCounted": "Which sensor counted", "@investigateWhichSensorCounted": { "description": "Table title for step-source breakdown" }, "investigateStrapPedometer": "strap · 100 Hz pedometer", "@investigateStrapPedometer": { "description": "Step source row: strap's 100 Hz pedometer" }, "investigateStrapOnChipCounter": "strap · on-chip counter", "@investigateStrapOnChipCounter": { "description": "Step source row: strap's on-chip step counter" }, "investigateStrapCounterFactor": "on-chip counter · phone factor", "@investigateStrapCounterFactor": { "description": "Step source row: factor learned against the phone that scaled the on-chip counter" }, "investigatePhonePedometer": "phone · pedometer", "@investigatePhonePedometer": { "description": "Step source row: phone pedometer" }, "investigateDayTotal": "day total", "@investigateDayTotal": { "description": "Step source row: total steps for the day" }, "investigateStrapChipReported": "strap chip reported", "@investigateStrapChipReported": { "description": "Step source row: what the strap chip itself reported" }, "investigateTimeDomain": "Time domain", "@investigateTimeDomain": { "description": "HRV table title: time-domain metrics" }, "investigateRmssd": "RMSSD", "@investigateRmssd": { "description": "HRV metric label: RMSSD (kept as scientific abbreviation)" }, "investigateRmssdNightly": "RMSSD, nightly (mean of 5-min windows)", "@investigateRmssdNightly": { "description": "HRV metric label: the nightly headline RMSSD, the mean of the RMSSDs of the sleep session's 5-minute windows (RMSSD kept as scientific abbreviation)" }, "investigateRmssdStored": "RMSSD, nightly (earlier estimate)", "@investigateRmssdStored": { "description": "HRV metric label: a nightly RMSSD stored by an earlier version of the app, computed by a method other than the 5-minute-window mean (RMSSD kept as scientific abbreviation)" }, "investigateSdnn": "SDNN", "@investigateSdnn": { "description": "HRV metric label: SDNN (kept as scientific abbreviation)" }, "investigateSdann": "SDANN", "@investigateSdann": { "description": "HRV metric label: SDANN (kept as scientific abbreviation)" }, "investigateSdnnIndex": "SDNN index", "@investigateSdnnIndex": { "description": "HRV metric label: SDNN index" }, "investigatePnn50": "pNN50", "@investigatePnn50": { "description": "HRV metric label: pNN50 (kept as scientific abbreviation)" }, "investigateLnRmssd": "ln RMSSD", "@investigateLnRmssd": { "description": "HRV metric label: natural log of RMSSD" }, "investigateBaselineRmssd": "Your baseline RMSSD", "@investigateBaselineRmssd": { "description": "HRV metric label: the user's own baseline RMSSD" }, "investigateStabilityCv": "Stability (CV)", "@investigateStabilityCv": { "description": "HRV metric label: coefficient of variation stability" }, "investigateStressIndexTitle": "Stress index", "@investigateStressIndexTitle": { "description": "Stress Nerd Stats table title: the Baevsky index behind the score" }, "investigateStressIndexSi": "Index (SI)", "@investigateStressIndexSi": { "description": "Stress Nerd Stats row: the Baevsky stress index for the night" }, "investigateStressLevel": "Level", "@investigateStressLevel": { "description": "Stress Nerd Stats row: low / normal / elevated / high band of the index" }, "investigateStressScore": "Score (0–100)", "@investigateStressScore": { "description": "Stress Nerd Stats row: the 0-100 score derived from the index" }, "investigateFrequencyDomain": "Frequency domain", "@investigateFrequencyDomain": { "description": "HRV table title: frequency-domain metrics" }, "investigateUlfPower": "ULF power", "@investigateUlfPower": { "description": "HRV metric label: ultra-low-frequency power" }, "investigateVlfPower": "VLF power", "@investigateVlfPower": { "description": "HRV metric label: very-low-frequency power" }, "investigateLfPower": "LF power", "@investigateLfPower": { "description": "HRV metric label: low-frequency power" }, "investigateHfPower": "HF power", "@investigateHfPower": { "description": "HRV metric label: high-frequency power" }, "investigateTotalPower": "Total power", "@investigateTotalPower": { "description": "HRV metric label: total spectral power" }, "investigateLfHf": "LF / HF", "@investigateLfHf": { "description": "HRV metric label: LF/HF ratio" }, "investigateLfNormalised": "LF, normalised", "@investigateLfNormalised": { "description": "HRV metric label: normalised LF power" }, "investigateHfNormalised": "HF, normalised", "@investigateHfNormalised": { "description": "HRV metric label: normalised HF power" }, "investigateHfGated": "HF gated", "@investigateHfGated": { "description": "HRV metric label: whether HF power passed the artifact gate" }, "investigateYes": "yes", "@investigateYes": { "description": "Generic yes value for a nerd-stats table row" }, "investigateNo": "no", "@investigateNo": { "description": "Generic no value for a nerd-stats table row" }, "investigateNoFrequencySpectrum": "No frequency-domain spectrum for this night", "@investigateNoFrequencySpectrum": { "description": "Status card title: no frequency-domain spectrum available" }, "investigateRecordingTooShort": "The recording was too short to resolve the bands.", "@investigateRecordingTooShort": { "description": "Status card fallback body: recording too short for spectrum" }, "investigateNonLinear": "Non-linear", "@investigateNonLinear": { "description": "HRV table title: non-linear metrics" }, "investigateSd1Sleep": "SD1, sleep", "@investigateSd1Sleep": { "description": "HRV metric label: Poincare SD1 during sleep window" }, "investigateSd2Sleep": "SD2, sleep", "@investigateSd2Sleep": { "description": "HRV metric label: Poincare SD2 during sleep window" }, "investigateSd124h": "SD1, 24 h", "@investigateSd124h": { "description": "HRV metric label: Poincare SD1 over 24 hours" }, "investigateSd224h": "SD2, 24 h", "@investigateSd224h": { "description": "HRV metric label: Poincare SD2 over 24 hours" }, "investigateSd1Sd224h": "SD1 / SD2, 24 h", "@investigateSd1Sd224h": { "description": "HRV metric label: SD1/SD2 ratio over 24 hours" }, "investigateSuccessiveIntervalsOver70ms": "Successive intervals over 70 ms", "@investigateSuccessiveIntervalsOver70ms": { "description": "HRV metric label: percent of successive beat intervals differing by over 70 ms" }, "investigateIrregularRhythmFlagSleep": "Irregular-rhythm flag, sleep", "@investigateIrregularRhythmFlagSleep": { "description": "HRV metric label: irregular-rhythm flag during sleep" }, "investigateIrregularRhythmFlag24h": "Irregular-rhythm flag, 24 h", "@investigateIrregularRhythmFlag24h": { "description": "HRV metric label: irregular-rhythm flag over 24 hours" }, "investigateFlagRaised": "raised", "@investigateFlagRaised": { "description": "Value shown when the irregular-rhythm flag was raised" }, "investigateFlagClear": "clear", "@investigateFlagClear": { "description": "Value shown when the irregular-rhythm flag was clear" }, "investigateDecelerationCapacity": "Deceleration capacity", "@investigateDecelerationCapacity": { "description": "HRV metric label / chart title: deceleration capacity" }, "investigateAccelerationCapacity": "Acceleration capacity", "@investigateAccelerationCapacity": { "description": "HRV metric label: acceleration capacity" }, "investigateDcAnchors": "DC anchors", "@investigateDcAnchors": { "description": "HRV metric label: number of deceleration-capacity anchor points" }, "investigateSignalQuality": "Signal quality", "@investigateSignalQuality": { "description": "HRV table title: signal quality metrics" }, "investigateBeatsAnalysed": "Beats analysed", "@investigateBeatsAnalysed": { "description": "Signal quality row: beats analysed" }, "investigateBeatsAnalysed24h": "Beats analysed, 24 h", "@investigateBeatsAnalysed24h": { "description": "Signal quality row: beats analysed over 24 hours" }, "investigateNoShapeForNight": "No shape for this night", "@investigateNoShapeForNight": { "description": "Status card title: no night-shape data available" }, "investigateTooFewBeatsToBin": "The night carried too few clean beats to bin.", "@investigateTooFewBeatsToBin": { "description": "Status card fallback body: too few beats to bin the night" }, "investigateNightShape": "Night shape", "@investigateNightShape": { "description": "Table title: night-shape summary stats" }, "investigateBinWidth": "Bin width", "@investigateBinWidth": { "description": "Night-shape row: minutes per bin" }, "investigateBinsRead": "Bins read", "@investigateBinsRead": { "description": "Night-shape row: bins with readable data" }, "investigateFirstThird": "First third", "@investigateFirstThird": { "description": "Night-shape row: RMSSD in the first third of the night" }, "investigateLastThird": "Last third", "@investigateLastThird": { "description": "Night-shape row: RMSSD in the last third of the night" }, "investigateLastThirdOverFirst": "Last third ÷ first", "@investigateLastThirdOverFirst": { "description": "Night-shape row: ratio of last third to first third" }, "investigateIrregularRhythmScreen": "Irregular-rhythm screen", "@investigateIrregularRhythmScreen": { "description": "Chart title: irregular-rhythm screening heat map" }, "investigateOneSquarePerDay": "one square per day", "@investigateOneSquarePerDay": { "description": "Chart unit label: one square per day" }, "investigate12WeeksAgo": "12 weeks ago", "@investigate12WeeksAgo": { "description": "Chart x-axis label: 12 weeks before today" }, "investigateThisWeek": "This week", "@investigateThisWeek": { "description": "Chart x-axis label: this week" }, "investigateScreenRan": "Screen ran", "@investigateScreenRan": { "description": "Chart legend label: day the irregular-rhythm screen ran" }, "investigateRhythmStripFootnote": "Ran on {ran} {ran, plural, one{day} other{days}}, raised its flag on {raised}. An outlined square is a day it did not run. A clear strip is not a negative result: this is a screen on pulse timing, and it cannot tell an ectopic beat from a dropped beat from the band moving on your wrist.", "@investigateRhythmStripFootnote": { "description": "Footnote summarising how many days the irregular-rhythm screen ran and flagged", "placeholders": { "ran": { "type": "int" }, "raised": { "type": "int" } } }, "investigateNoRestingBreathingRate": "No resting breathing rate away from sleep", "@investigateNoRestingBreathingRate": { "description": "Status card title: no resting breathing rate outside sleep" }, "investigateNoRestingBreathingRateBody": "This reads breathing only from three-minute stretches where the band saw you almost completely still, outside the sleep window. Most days have none — a day with none is a day you were moving, not a day anything went wrong.", "@investigateNoRestingBreathingRateBody": { "description": "Status card body explaining resting breathing rate requires stillness" }, "investigateBreathingAtRestAwake": "Breathing at rest, awake", "@investigateBreathingAtRestAwake": { "description": "Table title: resting breathing rate while awake" }, "investigateStillStretchesOutsideSleep": "Still stretches outside sleep", "@investigateStillStretchesOutsideSleep": { "description": "Table row: count of still stretches found outside sleep" }, "investigateLowest": "Lowest", "@investigateLowest": { "description": "Table row: lowest resting breathing rate reading" }, "investigateNextLowest": "Next lowest", "@investigateNextLowest": { "description": "Table row: second-lowest resting breathing rate reading" }, "investigateHighestOfThem": "Highest of them", "@investigateHighestOfThem": { "description": "Table row: highest of the still-stretch readings" }, "investigateFloorNotRateBody": "A floor, not a rate for the day. Only stretches where you were almost completely still can be read at all, so these are the stillest few minutes the band saw outside your sleep — nothing here describes the rest of your day, and breathing while you move cannot be recovered from beat timing.", "@investigateFloorNotRateBody": { "description": "Explanatory paragraph: resting breathing rate is a floor, not a daily average" }, "investigateCycleScreenDidNotRun": "The cycle screen did not run for this night", "@investigateCycleScreenDidNotRun": { "description": "Status card title: the heart-rate-cycling screen abstained for the night" }, "investigateNotEnoughCleanBeats": "Not enough clean beats to run it.", "@investigateNotEnoughCleanBeats": { "description": "Status card fallback body: not enough clean beats to run the cycle screen" }, "investigateHeartRateCycles": "Heart-rate cycles", "@investigateHeartRateCycles": { "description": "Table title: heart-rate cycling stats for the night" }, "investigateCyclesCounted": "Cycles counted", "@investigateCyclesCounted": { "description": "Table row: number of heart-rate cycles counted" }, "investigateObservedHoursAnalysed": "Observed hours analysed", "@investigateObservedHoursAnalysed": { "description": "Table row: hours of data analysed for cycling" }, "investigateCyclesPerObservedHour": "Cycles per observed hour", "@investigateCyclesPerObservedHour": { "description": "Table row: cycles per observed hour" }, "investigateMeanCycleLength": "Mean cycle length", "@investigateMeanCycleLength": { "description": "Table row: mean length of a heart-rate cycle" }, "investigateMeanDipDepth": "Mean dip depth", "@investigateMeanDipDepth": { "description": "Table row: mean depth of the heart-rate dip per cycle" }, "investigateCycleLengthQuartiles": "Cycle length, quartiles", "@investigateCycleLengthQuartiles": { "description": "Table row: quartiles of cycle length" }, "investigateDipDepthQuartiles": "Dip depth, quartiles", "@investigateDipDepthQuartiles": { "description": "Table row: quartiles of dip depth" }, "investigateNotEnoughNightsAcross": "Not enough nights for the across-nights view", "@investigateNotEnoughNightsAcross": { "description": "Status card title: not enough nights for the multi-night distribution view" }, "investigateNeedsSeveralNights": "This needs several nights with a few observed hours each.", "@investigateNeedsSeveralNights": { "description": "Status card fallback body: needs several qualifying nights" }, "investigateDroppedIrregular": "{count, plural, one{# night left out because the irregular-rhythm screen flagged it} other{# nights left out because the irregular-rhythm screen flagged them}}", "@investigateDroppedIrregular": { "description": "Note listing nights excluded because the irregular-rhythm screen flagged them", "placeholders": { "count": { "type": "int" } } }, "investigateDroppedThin": "{count, plural, one{# night left out for too few observed hours} other{# nights left out for too few observed hours}}", "@investigateDroppedThin": { "description": "Note listing nights excluded for too few observed hours", "placeholders": { "count": { "type": "int" } } }, "investigateAcrossNOwnNights": "ACROSS {n} OF YOUR OWN NIGHTS", "@investigateAcrossNOwnNights": { "description": "Section header: summary across the user's own recent nights", "placeholders": { "n": { "type": "int" } } }, "investigateCvhrAboveUsual": "Over your most recent nights, the heart-rate cycling this screen counts has been running higher than across the {n} nights behind it.", "@investigateCvhrAboveUsual": { "description": "Sentence: recent heart-rate cycling is running above the user's own usual range", "placeholders": { "n": { "type": "int" } } }, "investigateCvhrNoComparisonYet": "There aren't enough older nights behind your recent ones yet to say whether the heart-rate cycling this screen counts is running higher than usual.", "@investigateCvhrNoComparisonYet": { "description": "Sentence: too few older nights exist yet to compare the recent heart-rate cycling against" }, "investigateCvhrInsideUsual": "Over your most recent nights, the heart-rate cycling this screen counts has stayed inside the range of the {n} nights behind it.", "@investigateCvhrInsideUsual": { "description": "Sentence: recent heart-rate cycling has stayed within the user's own usual range", "placeholders": { "n": { "type": "int" } } }, "investigateCvhrExplainer": "It is a pattern in your pulse, not a measurement of your breathing, and it is not a test for anything. The same cycling comes from an irregular rhythm, from being at altitude, and from any broken-up night — and beta-blockers, diabetes and nerve conditions flatten it, so genuinely disturbed breathing often leaves nothing here at all.", "@investigateCvhrExplainer": { "description": "Paragraph explaining what heart-rate cycling is and is not a measure of" }, "investigateCvhrNotNegativeResult": "So nothing here is a negative result and nothing here clears anything, and none of it says anything about any one night — a single night's count moves for a dozen reasons on its own.", "@investigateCvhrNotNegativeResult": { "description": "Paragraph clarifying this is not a negative clinical result" }, "investigateCvhrSeeClinicianIfSymptoms": "If you snore, wake unrefreshed, or someone has seen you stop breathing in your sleep, a clinician can test that properly.", "@investigateCvhrSeeClinicianIfSymptoms": { "description": "Paragraph advising the user to see a clinician if they have relevant symptoms" }, "investigateStageMinutesAsCounted": "Stage minutes, as counted", "@investigateStageMinutesAsCounted": { "description": "Table title: raw sleep-stage minute counts" }, "investigateLight": "Light", "@investigateLight": { "description": "Sleep stage label: light sleep" }, "investigateDeep": "Deep", "@investigateDeep": { "description": "Sleep stage label: deep sleep" }, "investigateRem": "REM", "@investigateRem": { "description": "Sleep stage label: REM sleep" }, "investigateAwake": "Awake", "@investigateAwake": { "description": "Sleep stage label: awake" }, "investigateTotalSleep": "Total sleep", "@investigateTotalSleep": { "description": "Table row: total sleep time" }, "investigateSegmentationConfidence": "Segmentation confidence", "@investigateSegmentationConfidence": { "description": "Table row: confidence of the sleep-stage segmentation" }, "investigateNotPublished": "not published", "@investigateNotPublished": { "description": "Value shown when segmentation confidence is not published" }, "investigateNothingComputedForKey": "Nothing computed for this key", "@investigateNothingComputedForKey": { "description": "Status card title: nothing computed for this metric key" }, "investigateNoStoredSeries": "No stored series", "@investigateNoStoredSeries": { "description": "Status card title: no stored data series for this metric" }, "investigateNothingStoredYet": "Nothing stored for {metric} yet.", "@investigateNothingStoredYet": { "description": "Status card body: nothing stored yet for this metric", "placeholders": { "metric": { "type": "String" } } }, "investigateSeries": "Series", "@investigateSeries": { "description": "Table title: generic stored-series summary stats" }, "investigateDaysDerived": "Days derived", "@investigateDaysDerived": { "description": "Table row: number of derived days in the series" }, "investigateLatest": "Latest", "@investigateLatest": { "description": "Table row: latest value in the series" }, "investigateMean": "Mean", "@investigateMean": { "description": "Table row: mean value of the series" }, "investigateMedian": "Median", "@investigateMedian": { "description": "Table row: median value of the series" }, "investigateSd": "SD", "@investigateSd": { "description": "Table row: standard deviation of the series" }, "investigateMin": "Min", "@investigateMin": { "description": "Table row: minimum value of the series" }, "investigateMax": "Max", "@investigateMax": { "description": "Table row: maximum value of the series" }, "investigateUnit": "Unit", "@investigateUnit": { "description": "Table row: unit of the series" }, "investigateUnitless": "unitless", "@investigateUnitless": { "description": "Value shown when the series has no unit" }, "investigateStorage": "Storage", "@investigateStorage": { "description": "Table row: how the series is stored" }, "investigateOneValuePerDerivedDay": "one value per derived day", "@investigateOneValuePerDerivedDay": { "description": "Value: one stored value per derived day" }, "investigateMethodLabel": "METHOD", "@investigateMethodLabel": { "description": "Section header for the method/citation panel" }, "investigateNotDocumented": "Not documented.", "@investigateNotDocumented": { "description": "Fallback text when the method is not documented" }, "calmBreathingResonanceLabel": "Resonance", "@calmBreathingResonanceLabel": { "description": "Pattern name for a custom-paced resonance breathing exercise" }, "calmBreathingResonanceDescription": "Even in and out at about {rate} breaths a minute. The one with a coherence score.", "@calmBreathingResonanceDescription": { "description": "Description of a custom-paced resonance breathing exercise", "placeholders": { "rate": { "type": "String" } } }, "calmBreathingCloseBreathing": "Close breathing", "@calmBreathingCloseBreathing": { "description": "Semantic label for the close button on the breathing screen" }, "calmBreathingFinishNow": "Finish now", "@calmBreathingFinishNow": { "description": "Button label to finish the post-session quiet window immediately" }, "calmBreathingStop": "Stop", "@calmBreathingStop": { "description": "Button label to stop a breathing session or pre-window" }, "calmBreathingEndSession": "End session", "@calmBreathingEndSession": { "description": "Button label to end an ordinary (non-sweep) breathing session" }, "calmBreathingBegin": "Begin", "@calmBreathingBegin": { "description": "Button label to begin a breathing session" }, "calmBreathingTakeABreath": "Take a breath.", "@calmBreathingTakeABreath": { "description": "Headline on the breathing setup screen" }, "calmBreathingRingLeads": "The ring leads. Put the phone down.", "@calmBreathingRingLeads": { "description": "Subtitle instructing the user to follow the breathing ring" }, "calmBreathingScoredPill": "Scored", "@calmBreathingScoredPill": { "description": "Pill label marking a pattern as coherence-scored" }, "calmBreathingHowLong": "How long", "@calmBreathingHowLong": { "description": "Section title for choosing session length" }, "calmBreathingMinutesSemantic": "{m, plural, one{# minute} other{# minutes}}", "@calmBreathingMinutesSemantic": { "description": "Semantic label for a minute-duration option button", "placeholders": { "m": { "type": "int" } } }, "calmBreathingMinutesAbbrev": "{m} min", "@calmBreathingMinutesAbbrev": { "description": "Abbreviated minute label on a duration option button", "placeholders": { "m": { "type": "int" } } }, "calmBreathingYourOwnPace": "Your own pace", "@calmBreathingYourOwnPace": { "description": "Section title for the personal-pace sweep feature" }, "calmBreathingWindowRowSemantic": "Measure before and after, adds four minutes", "@calmBreathingWindowRowSemantic": { "description": "Semantic label for the before/after quiet-window toggle row" }, "calmBreathingMeasureBeforeAfter": "Measure before and after · adds 4 min", "@calmBreathingMeasureBeforeAfter": { "description": "Row title for the before/after quiet-window toggle" }, "calmBreathingNeedsBandBeatTiming": "Needs the band on — the comparison is made from beat timing.", "@calmBreathingNeedsBandBeatTiming": { "description": "Body text explaining a feature needs the band connected for beat timing" }, "calmBreathingFindYourPace": "Find the pace your heart follows", "@calmBreathingFindYourPace": { "description": "Row title inviting the user to run the personal-pace sweep" }, "calmBreathingSweepIntro": "Six minutes: {rates} breaths a minute, two minutes each. It takes two sittings that agree before anything changes.", "@calmBreathingSweepIntro": { "description": "Body text describing the personal-pace sweep before it has ever run", "placeholders": { "rates": { "type": "String" } } }, "calmBreathingSweepAgreed": "Two sittings agreed on {rate} breaths a minute, and Resonance is paced there. Run it again to check.", "@calmBreathingSweepAgreed": { "description": "Body text describing the pace two sittings agreed on", "placeholders": { "rate": { "type": "String" } } }, "calmBreathingPaceOfRate": "PACE {block} OF {total} · {rate} BREATHS A MINUTE", "@calmBreathingPaceOfRate": { "description": "Header shown during a sweep block naming its position and pace", "placeholders": { "block": { "type": "int" }, "total": { "type": "int" }, "rate": { "type": "String" } } }, "calmBreathingOfClock": "of {clock}", "@calmBreathingOfClock": { "description": "Label showing the target duration next to the elapsed clock", "placeholders": { "clock": { "type": "String" } } }, "calmBreathingNoScoreForSession": "No coherence score for this session", "@calmBreathingNoScoreForSession": { "description": "Status card / title: no coherence score for this session" }, "calmBreathingScoringNeedsBand": "Scoring needs beat timing from the band. Not connected, so this one paces you but is not saved.", "@calmBreathingScoringNeedsBand": { "description": "Status card body: scoring needs the band connected" }, "calmBreathingBeforeLabel": "BEFORE", "@calmBreathingBeforeLabel": { "description": "Header shown during the pre-session quiet window" }, "calmBreathingAfterLabel": "AFTER", "@calmBreathingAfterLabel": { "description": "Header shown during the post-session quiet window" }, "calmBreathingSitStill": "Sit still for a moment.", "@calmBreathingSitStill": { "description": "Instruction during the pre-session quiet window" }, "calmBreathingStaySitting": "Stay sitting.", "@calmBreathingStaySitting": { "description": "Instruction during the post-session quiet window" }, "calmBreathingNothingPacingScored": "Breathe however you normally would. Nothing is pacing you and nothing is being scored.", "@calmBreathingNothingPacingScored": { "description": "Body text reassuring the quiet window is unpaced and unscored" }, "calmBreathingPatternNotScored": "{pattern} is not scored. Resonance is the one paced at the rate the score is built for.", "@calmBreathingPatternNotScored": { "description": "Explanation that the current breathing pattern is not coherence-scored", "placeholders": { "pattern": { "type": "String" } } }, "calmBreathingTooFewBeatTimings": "Too few clean beat timings across the session to score it.", "@calmBreathingTooFewBeatTimings": { "description": "Fallback reason: too few clean beat timings to score the session" }, "calmBreathingThatIsDone": "That is done.", "@calmBreathingThatIsDone": { "description": "Headline shown when a session finishes normally" }, "calmBreathingCardiacCoherence": "Cardiac coherence", "@calmBreathingCardiacCoherence": { "description": "Result card title for the coherence score" }, "calmBreathingHowStronglyFollowedPace": "HOW STRONGLY YOUR HEART RATE FOLLOWED THE PACE", "@calmBreathingHowStronglyFollowedPace": { "description": "Result card subtitle explaining what the coherence score measures" }, "calmBreathingStoppedThere": "Stopped there.", "@calmBreathingStoppedThere": { "description": "Headline shown when a sweep was aborted early" }, "calmBreathingHowStronglyEachPace": "HOW STRONGLY YOUR HEART RATE FOLLOWED EACH PACE", "@calmBreathingHowStronglyEachPace": { "description": "Header for the sweep results table" }, "calmBreathingBreathsAMinute": "{rate} breaths a minute", "@calmBreathingBreathsAMinute": { "description": "A pace expressed in breaths per minute", "placeholders": { "rate": { "type": "String" } } }, "calmBreathingNotReached": "not reached", "@calmBreathingNotReached": { "description": "Sweep result row value: this block was never reached" }, "calmBreathingTooFewCleanBeats": "too few clean beats", "@calmBreathingTooFewCleanBeats": { "description": "Sweep result row value: this block ran but could not be scored" }, "calmBreathingRankingExplainer": "A ranking of three paces from one sitting. Each pace starts while you settle from the last, so it only says which one your heart followed most.", "@calmBreathingRankingExplainer": { "description": "Footnote explaining the sweep is a ranking with real limits, not a diagnosis" }, "calmBreathingVerdictAborted": "You stopped part way, so there was nothing to compare. Nothing has changed.", "@calmBreathingVerdictAborted": { "description": "Verdict text when the sweep was stopped before comparing any paces" }, "calmBreathingVerdictCouldNotScore": "At least one pace could not be scored, so there is nothing to rank. Nothing has changed.", "@calmBreathingVerdictCouldNotScore": { "description": "Verdict text when at least one pace could not be scored" }, "calmBreathingVerdictTied": "Two of the paces scored the same, so this sitting cannot separate them. Nothing has changed.", "@calmBreathingVerdictTied": { "description": "Verdict text when two paces scored the same and cannot be separated" }, "calmBreathingVerdictConfirmed": "Of the paces tested, {w} gave your strongest response — and that is now two sittings in a row. Resonance is paced there.", "@calmBreathingVerdictConfirmed": { "description": "Verdict text when the winning pace matches the prior agreed pace", "placeholders": { "w": { "type": "String" } } }, "calmBreathingVerdictFirstWin": "Of the paces tested, {w} gave your strongest response. Nothing is set yet: the pace only changes when two sittings pick the same one.", "@calmBreathingVerdictFirstWin": { "description": "Verdict text when a pace won but has not yet been confirmed by a second sitting", "placeholders": { "w": { "type": "String" } } }, "breathPatternBoxName": "Box", "@breathPatternBoxName": { "description": "Pattern name for box breathing (4-4-4-4 count)" }, "breathPatternBoxDesc": "Four counts each way, holds included. Steadying when your head is racing.", "@breathPatternBoxDesc": { "description": "Description of box breathing on the pattern picker" }, "breathPattern478Name": "4-7-8", "@breathPattern478Name": { "description": "Pattern name for the 4-7-8 breathing exercise" }, "breathPattern478Desc": "A long hold and a longer exhale. Usually used to get to sleep.", "@breathPattern478Desc": { "description": "Description of the 4-7-8 pattern on the pattern picker" }, "breathPatternExtendedExhaleName": "Long exhale", "@breathPatternExtendedExhaleName": { "description": "Pattern name for the extended-exhale breathing exercise" }, "breathPatternExtendedExhaleDesc": "Out for twice as long as in. No holds, so it is easy to keep up for a while.", "@breathPatternExtendedExhaleDesc": { "description": "Description of the extended-exhale pattern on the pattern picker" }, "breathPhaseInhale": "Inhale", "@breathPhaseInhale": { "description": "Instruction shown on the breathing ring during the inhale phase" }, "breathPhaseHold": "Hold", "@breathPhaseHold": { "description": "Instruction shown on the breathing ring during a hold phase" }, "breathPhaseExhale": "Exhale", "@breathPhaseExhale": { "description": "Instruction shown on the breathing ring during the exhale phase" }, "breathPhaseWork": "Work", "@breathPhaseWork": { "description": "Instruction shown on the breathing ring during an interval-timer work phase" }, "breathPhaseRest": "Rest", "@breathPhaseRest": { "description": "Instruction shown on the breathing ring during an interval-timer rest phase" }, "metricDetailToday": "Today", "@metricDetailToday": { "description": "Range picker chip and headline label for the current day, on the shared metric trend/detail screen." }, "metricDetailRange7Days": "7 days", "@metricDetailRange7Days": { "description": "Range picker chip: 7-day window, on the metric detail screen." }, "metricDetailRange30Days": "30 days", "@metricDetailRange30Days": { "description": "Range picker chip: 30-day window, on the metric detail screen." }, "metricDetailRange6Months": "6 months", "@metricDetailRange6Months": { "description": "Range picker chip: 6-month window, on the metric detail screen." }, "metricDetailRangeYear": "Year", "@metricDetailRangeYear": { "description": "Range picker chip: 1-year window, on the metric detail screen." }, "metricDetailLockedNote": "{label} needs {needed} days of history. You have {have}.", "@metricDetailLockedNote": { "description": "Note under the range picker explaining why a wider range is not yet unlocked.", "placeholders": { "label": { "type": "String" }, "needed": { "type": "int" }, "have": { "type": "int" } } }, "metricDetailNotShownTitle": "Not shown as a trend", "@metricDetailNotShownTitle": { "description": "StatusCard title for a metric that cannot be charted as a trend (e.g. skin temperature)." }, "metricDetailNothingRecordedToday": "Nothing recorded today", "@metricDetailNothingRecordedToday": { "description": "Empty-state title when Today's window has no value for this metric." }, "metricDetailNoHistoryYet": "No history for {metric} yet", "@metricDetailNoHistoryYet": { "description": "Empty-state title when a wider window has no value for this metric yet.", "placeholders": { "metric": { "type": "String" } } }, "metricDetailNoValueYet": "Today has not produced a value yet.", "@metricDetailNoValueYet": { "description": "Empty-state body: today has not produced a value and the install has no data at all yet." }, "metricDetailNoValueYetWiderRanges": "Today has not produced a value yet. The wider ranges above hold the days that did.", "@metricDetailNoValueYetWiderRanges": { "description": "Empty-state body: today has not produced a value but wider ranges above have data." }, "metricDetailNoValueInWindow": "No day in this window produced a value.", "@metricDetailNoValueInWindow": { "description": "Empty-state body for a multi-day window with no value in it." }, "metricDetailWearBandFix": "Wear the band overnight to start the series", "@metricDetailWearBandFix": { "description": "Empty-state fix suggestion telling the user to wear the band overnight." }, "metricDetailBreakdownLinkTitle": "Breakdown", "@metricDetailBreakdownLinkTitle": { "description": "Title of the doorway row from the Steps metric screen (Today only) into the day's step breakdown." }, "metricDetailBreakdownLinkSub": "Each stretch of today, and what counted it", "@metricDetailBreakdownLinkSub": { "description": "Subtitle of the doorway row into the step breakdown screen." }, "metricDetailNerdStatsTitle": "Nerd stats", "@metricDetailNerdStatsTitle": { "description": "Title of the doorway row into the Nerd stats (Investigate) screen, shown on every metric detail screen." }, "metricDetailNerdStatsSub": "The figures behind the picture", "@metricDetailNerdStatsSub": { "description": "Subtitle of the doorway row into Nerd stats." }, "metricDetailDailyAverage": "Daily average · {count} of {win} days", "@metricDetailDailyAverage": { "description": "Caption under the hero number on a multi-day window, showing how many of the window's days had data.", "placeholders": { "count": { "type": "int" }, "win": { "type": "int" } } }, "metricDetailLatestReading": "Latest {value} {unit} · {asOf}", "@metricDetailLatestReading": { "description": "Caption showing the most recent reading and the day it is from, under the daily-average headline.", "placeholders": { "value": { "type": "String" }, "unit": { "type": "String" }, "asOf": { "type": "String" } } }, "metricDetailAlgoBreakFootnote": "{n, plural, one{The dotted line is a change in how these days were computed. Readings either side of it came from different versions.} other{The dotted lines are changes in how these days were computed. Readings either side of one came from different versions.}}", "@metricDetailAlgoBreakFootnote": { "description": "Chart footnote explaining the dotted vertical line(s) marking an algorithm-version change.", "placeholders": { "n": { "type": "int" } } }, "metricDetailDaysAgoLabel": "{n, plural, one{{n} day ago} other{{n} days ago}}", "@metricDetailDaysAgoLabel": { "description": "Left x-axis label on the trend chart, naming how many days ago the leftmost point is.", "placeholders": { "n": { "type": "int" } } }, "metricDetailWornChartTitle": "Worn", "@metricDetailWornChartTitle": { "description": "Title of the small wear-time bar chart shown under a long trend." }, "metricDetailHoursADayUnit": "h a day", "@metricDetailHoursADayUnit": { "description": "Unit label on the wear-time bar chart (hours per day)." }, "metricDetailWearFootnote": "{have} of these {win} days have a wear record. The rest are gaps in both charts — the line above is not carried across one.", "@metricDetailWearFootnote": { "description": "Footnote under the wear-time chart explaining coverage gaps.", "placeholders": { "have": { "type": "int" }, "win": { "type": "int" } } }, "metricDetailSlotNoRecord": "{day}, no record", "@metricDetailSlotNoRecord": { "description": "Screen-reader readout for a chart slot with no data, when scrubbing the trend line.", "placeholders": { "day": { "type": "String" } } }, "metricDetailSlotWithValue": "{day}, {value} {unit}", "@metricDetailSlotWithValue": { "description": "Screen-reader readout for a chart slot with a value, when scrubbing the trend line.", "placeholders": { "day": { "type": "String" }, "value": { "type": "String" }, "unit": { "type": "String" } } }, "metricDetailUsingForX": "Using {device} for {metric}.", "@metricDetailUsingForX": { "description": "Which device currently feeds one metric, under the device filter row.", "placeholders": { "device": { "type": "String" }, "metric": { "type": "String" } } }, "metricDetailPreferX": "Prefer {device}", "@metricDetailPreferX": { "description": "Button: make the selected device win this metric's signal(s).", "placeholders": { "device": { "type": "String" } } }, "metricDetailHistoryKeepsSource": "Days already finished keep the source they were calculated with.", "@metricDetailHistoryKeepsSource": { "description": "Copy under the device-preference control explaining a priority change is not retroactive." }, "metricDetailDimmedCaption": "These are the days {device} was involved. The line is your merged reading.", "@metricDetailDimmedCaption": { "description": "Caption under a metric-detail chart when a device pill is selected and dims non-contributing days.", "placeholders": { "device": { "type": "String" } } }, "metricDetailSlotNoValueRecording": "{day}, no value · {who}", "@metricDetailSlotNoValueRecording": { "description": "Screen-reader readout for a chart slot with no value but something was recording (multi-device only).", "placeholders": { "day": { "type": "String" }, "who": { "type": "String" } } }, "metricDetailSlotNothingRecording": "{day}, nothing was recording", "@metricDetailSlotNothingRecording": { "description": "Screen-reader readout for a chart slot with no value and nothing recording (multi-device only).", "placeholders": { "day": { "type": "String" } } }, "metricDetailOpenDay": "Open {day}", "@metricDetailOpenDay": { "description": "Semantic label for the tappable row that opens a touched day's detail screen.", "placeholders": { "day": { "type": "String" } } }, "metricDetailNoRecordLabel": "No record", "@metricDetailNoRecordLabel": { "description": "Value text shown in the touched-day row when that day has no record." }, "metricDetailLowest": "Lowest", "@metricDetailLowest": { "description": "Label under the lowest value in the 'your normal range' 3-stat row." }, "metricDetailTypical": "Typical", "@metricDetailTypical": { "description": "Label under the median value in the 'your normal range' 3-stat row." }, "metricDetailHighest": "Highest", "@metricDetailHighest": { "description": "Label under the highest value in the 'your normal range' 3-stat row." }, "metricDetailFromDaysCount": "From {n} of your own days.", "@metricDetailFromDaysCount": { "description": "Fallback sentence under the 3-stat row when no percentile rank is available.", "placeholders": { "n": { "type": "int" } } }, "metricDetailRankToday": "Today is higher than {pct}% of your own days.", "@metricDetailRankToday": { "description": "Where today sits in the user's own history, as the share of their days it is higher than.", "placeholders": { "pct": { "type": "int" } } }, "metricDetailRankTodayBand": "Today is higher than {pct}% of your own days — {band}.", "@metricDetailRankTodayBand": { "description": "As metricDetailRankToday, plus a qualitative band label.", "placeholders": { "pct": { "type": "int" }, "band": { "type": "String" } } }, "metricDetailRankFrom": "Your reading from {date} is higher than {pct}% of your own days.", "@metricDetailRankFrom": { "description": "As metricDetailRankToday, for an older reading on a given date.", "placeholders": { "date": { "type": "String" }, "pct": { "type": "int" } } }, "metricDetailRankFromBand": "Your reading from {date} is higher than {pct}% of your own days — {band}.", "@metricDetailRankFromBand": { "description": "As metricDetailRankFrom, plus a qualitative band label.", "placeholders": { "date": { "type": "String" }, "pct": { "type": "int" }, "band": { "type": "String" } } }, "metricDetailDaysWithWithout": "{withCount} days with · {withoutCount} without", "@metricDetailDaysWithWithout": { "description": "Row subtitle in the 'what moves it' list: how many logged days had vs. lacked a journal tag.", "placeholders": { "withCount": { "type": "int" }, "withoutCount": { "type": "int" } } }, "metricDetailPatternsNotCauses": "Patterns in your own logs, not causes.", "@metricDetailPatternsNotCauses": { "description": "Disclaimer under the 'what moves it' journal-correlation list." }, "metricDetailChooseDayHelp": "Choose a day", "@metricDetailChooseDayHelp": { "description": "Help text on the native date picker used to jump to a specific derived day." }, "metricDetailPreviousDay": "Previous day", "@metricDetailPreviousDay": { "description": "Semantic label for the back arrow on the day-stepper control." }, "metricDetailNextDay": "Next day", "@metricDetailNextDay": { "description": "Semantic label for the forward arrow on the day-stepper control." }, "metricDetailChooseDayShowing": "Choose a day. Showing {day}", "@metricDetailChooseDayShowing": { "description": "Semantic label for the day-stepper's centre label, announcing the day currently shown.", "placeholders": { "day": { "type": "String" } } }, "metricDetailNormalRangeSection": "Your normal range", "@metricDetailNormalRangeSection": { "description": "Section heading above the lowest/typical/highest 3-stat card." }, "metricDetailWhatMovesItSection": "What moves it", "@metricDetailWhatMovesItSection": { "description": "Section heading above the journal-correlation 'movers' list." }, "cycleRemoveLogTitle": "Remove {date}?", "@cycleRemoveLogTitle": { "description": "Confirmation dialog title when deleting a logged cycle day.", "placeholders": { "date": { "type": "String" } } }, "cycleRemoveLogBody": "Cycle day, phase and the predicted next date are all counted from the days you log. Only today can be logged, so this one cannot be put back.", "@cycleRemoveLogBody": { "description": "Confirmation dialog body when deleting a logged cycle day." }, "cycleWhatAppliesToYou": "What applies to you", "@cycleWhatAppliesToYou": { "description": "Title of the reproductive-state picker sheet, and label of the settings row that opens it." }, "cyclePreferNotToSay": "Prefer not to say", "@cyclePreferNotToSay": { "description": "Reproductive-state option: decline to answer." }, "cyclePreferNotToSayWhy": "The app keeps the phase off.", "@cyclePreferNotToSayWhy": { "description": "Explanation shown under 'Prefer not to say' in the reproductive-state picker." }, "cycleReproCyclingLabel": "I have natural cycles", "@cycleReproCyclingLabel": { "description": "Reproductive-state option: has natural menstrual cycles." }, "cycleReproCyclingWhy": "Counts a phase from your logged starts.", "@cycleReproCyclingWhy": { "description": "Explanation shown under the 'natural cycles' reproductive-state option." }, "cycleReproContraceptionLabel": "Hormonal contraception", "@cycleReproContraceptionLabel": { "description": "Reproductive-state option: uses hormonal contraception." }, "cycleReproContraceptionWhy": "No ovulation to count from, so no phase. Bleeds are still logged.", "@cycleReproContraceptionWhy": { "description": "Explanation shown under the 'hormonal contraception' reproductive-state option." }, "cycleReproNoneLabel": "Pregnant, postpartum, or not cycling", "@cycleReproNoneLabel": { "description": "Reproductive-state option: pregnant, postpartum, or not cycling." }, "cycleReproNoneWhy": "No phase and no predicted next. Your biometrics still show.", "@cycleReproNoneWhy": { "description": "Explanation shown under the 'pregnant/postpartum/not cycling' reproductive-state option." }, "cycleReproNotSet": "Not set", "@cycleReproNotSet": { "description": "Fallback label when no reproductive state has been chosen." }, "cycleTrackingOffTitle": "Cycle tracking is off", "@cycleTrackingOffTitle": { "description": "Status card title when cycle tracking is disabled." }, "cycleTrackingOffBody": "It stays on this phone.", "@cycleTrackingOffBody": { "description": "Status card body when cycle tracking is disabled." }, "cycleTurnOnTracking": "Turn on cycle tracking", "@cycleTurnOnTracking": { "description": "Button label to enable cycle tracking." }, "cycleNoPeriodTitle": "No period logged yet", "@cycleNoPeriodTitle": { "description": "Status card title when no period has ever been logged." }, "cycleNoPeriodBody": "Counted from the days you log.", "@cycleNoPeriodBody": { "description": "Status card body when no period has ever been logged." }, "cycleLogPeriodButton": "Log a period start today", "@cycleLogPeriodButton": { "description": "Button label to log a period start today (used both as a status-card fix action and the main button)." }, "cycleLogKindStart": "START", "@cycleLogKindStart": { "description": "Recent-logs row: this entry is a period start (shown uppercased already, so translate as-is)" }, "cycleLogKindEnd": "END", "@cycleLogKindEnd": { "description": "Recent-logs row: this entry is a period end (shown uppercased already, so translate as-is)" }, "cycleAcrossCyclesTitle": "Across your cycles", "@cycleAcrossCyclesTitle": { "description": "Title for the cycle-history deep-dive card and its detail screen." }, "cycleUnitCompleteCycle": "complete cycle", "@cycleUnitCompleteCycle": { "description": "Unit label under the completed-cycle count, singular." }, "cycleUnitCompleteCycles": "complete cycles", "@cycleUnitCompleteCycles": { "description": "Unit label under the completed-cycle count, plural." }, "cycleOpenAction": "Open", "@cycleOpenAction": { "description": "Action label on the 'Across your cycles' deep-dive card." }, "cycleWhatYouNoticedToday": "What you noticed today", "@cycleWhatYouNoticedToday": { "description": "Section title above today's symptom chips." }, "cycleLoggedDays": "Logged days", "@cycleLoggedDays": { "description": "Section title above the list of recently logged cycle days." }, "cycleReproOptionalHint": "Optional. Until you say, the app leaves the phase off.", "@cycleReproOptionalHint": { "description": "Subtitle shown when no reproductive state has been set." }, "cycleReproPrivateHint": "Only you and this phone. Never exported.", "@cycleReproPrivateHint": { "description": "Subtitle shown once a reproductive state has been set, noting privacy." }, "cycleTurnOffTracking": "Turn off cycle tracking", "@cycleTurnOffTracking": { "description": "Text button to disable cycle tracking." }, "cycleDayInThisCycle": "DAY IN THIS CYCLE", "@cycleDayInThisCycle": { "description": "Overline label above the current cycle-day number." }, "cycleCountedFromLastStart": "counted from your last logged start", "@cycleCountedFromLastStart": { "description": "Caption shown next to the cycle-day number when no median cycle length is known yet." }, "cycleOfAboutDays": "of about {days}", "@cycleOfAboutDays": { "description": "Caption shown next to the cycle-day number, giving the typical cycle length.", "placeholders": { "days": { "type": "int" } } }, "cyclePhaseMenstrual": "Menstrual", "@cyclePhaseMenstrual": { "description": "Cycle phase pill label: menstrual." }, "cyclePhaseFollicular": "Follicular", "@cyclePhaseFollicular": { "description": "Cycle phase pill label: follicular." }, "cyclePhaseOvulation": "Ovulation window", "@cyclePhaseOvulation": { "description": "Cycle phase pill label: ovulation window." }, "cyclePhaseLuteal": "Luteal", "@cyclePhaseLuteal": { "description": "Cycle phase pill label: luteal." }, "cycleNextPeriodBetween": "NEXT PERIOD, EXPECTED BETWEEN", "@cycleNextPeriodBetween": { "description": "Overline label when the next-period prediction is a date range." }, "cycleNextPeriodAround": "NEXT PERIOD, EXPECTED AROUND", "@cycleNextPeriodAround": { "description": "Overline label when the next-period prediction is a single point date." }, "cycleFromOneMeasuredGap": "from your one measured gap, which cannot show how much your own cycle varies", "@cycleFromOneMeasuredGap": { "description": "Trailing clause of the prediction footnote when only one cycle gap has been measured." }, "cyclePastEndOfIt": "{days, plural, one{1 day past the end of it} other{{days} days past the end of it}} · ", "@cyclePastEndOfIt": { "description": "Leading clause of the prediction footnote: the predicted window has already passed.", "placeholders": { "days": { "type": "int" } } }, "cycleInsideItNow": "you are inside it now · ", "@cycleInsideItNow": { "description": "Leading clause of the prediction footnote: today falls inside the predicted window." }, "cycleInDaysRange": "in {lo}–{hi} days · ", "@cycleInDaysRange": { "description": "Leading clause of the prediction footnote: the predicted window is still ahead, given as a day range.", "placeholders": { "lo": { "type": "int" }, "hi": { "type": "int" } } }, "cycleHalfOfMeasuredGaps": "half of your {n} measured gaps landed inside a range this wide", "@cycleHalfOfMeasuredGaps": { "description": "Trailing clause of the prediction footnote, stating how many measured gaps back the range.", "placeholders": { "n": { "type": "int" } } }, "cycleLeadDaysLate": "{days, plural, one{1 day late} other{{days} days late}} · ", "@cycleLeadDaysLate": { "description": "Leading clause used when the single measured-gap prediction is overdue.", "placeholders": { "days": { "type": "int" } } }, "cycleLeadToday": "today · ", "@cycleLeadToday": { "description": "Leading clause used when the single measured-gap prediction is due today." }, "cycleLeadInDays": "{days, plural, one{in 1 day} other{in {days} days}} · ", "@cycleLeadInDays": { "description": "Leading clause used when the single measured-gap prediction is still ahead.", "placeholders": { "days": { "type": "int" } } }, "cycleWhatYouUsuallyNotice": "What you usually notice", "@cycleWhatYouUsuallyNotice": { "description": "Expandable row label/semantic label for the symptom-shape look-back." }, "cycleSymptomShapeSummary": "One number per week of the cycle, counted from the starts you logged. Only the {daysByWeek} logged days per week across {cycles} cycles count.", "@cycleSymptomShapeSummary": { "description": "Explanatory footer under the symptom-shape breakdown.", "placeholders": { "daysByWeek": { "type": "String" }, "cycles": { "type": "int" } } }, "cycleRemoveLoggedDay": "Remove {date}", "@cycleRemoveLoggedDay": { "description": "Semantic label on the remove (X) button next to a logged cycle day.", "placeholders": { "date": { "type": "String" } } }, "cycleSymptomCramps": "cramps", "@cycleSymptomCramps": { "description": "Symptom chip: cramps." }, "cycleSymptomHeadache": "headache", "@cycleSymptomHeadache": { "description": "Symptom chip: headache." }, "cycleSymptomBloating": "bloating", "@cycleSymptomBloating": { "description": "Symptom chip: bloating." }, "cycleSymptomFatigue": "fatigue", "@cycleSymptomFatigue": { "description": "Symptom chip: fatigue." }, "cycleSymptomLowMood": "low mood", "@cycleSymptomLowMood": { "description": "Symptom chip: low mood." }, "cycleSymptomAcne": "acne", "@cycleSymptomAcne": { "description": "Symptom chip: acne." }, "cycleSymptomTenderBreasts": "tender breasts", "@cycleSymptomTenderBreasts": { "description": "Symptom chip: tender breasts." }, "cycleSymptomNausea": "nausea", "@cycleSymptomNausea": { "description": "Symptom chip: nausea." }, "cycleThisCycle": "This cycle", "@cycleThisCycle": { "description": "Section title for the current-cycle chart on the cycle-history screen." }, "cycleByDayOfYourCycle": "By day of your cycle", "@cycleByDayOfYourCycle": { "description": "Section title for the by-cycle-day comparison charts." }, "cycleHowLongCyclesBeen": "How long your cycles have been", "@cycleHowLongCyclesBeen": { "description": "Section title for the cycle-lengths-over-time chart." }, "cycleRestingHeartRate": "Resting heart rate", "@cycleRestingHeartRate": { "description": "Chart title: resting heart rate." }, "cycleUnitBpm": "bpm", "@cycleUnitBpm": { "description": "Unit abbreviation for beats per minute." }, "cycleHrvRmssdTitle": "HRV", "@cycleHrvRmssdTitle": { "description": "Chart title: heart-rate variability (RMSSD)." }, "cycleUnitMs": "ms", "@cycleUnitMs": { "description": "Unit abbreviation for milliseconds." }, "cycleNotEnoughDescribeDayTitle": "Not enough cycles to describe a cycle day yet", "@cycleNotEnoughDescribeDayTitle": { "description": "Status card title when not enough cycles exist to chart cycle-day medians." }, "cycleNotEnoughDescribeDayBody": "Every point here is the middle of the same day across two or more of your own cycles. Nothing has two behind it yet.", "@cycleNotEnoughDescribeDayBody": { "description": "Status card body when not enough cycles exist to chart cycle-day medians." }, "cycleOwnPastCyclesDescribed": "Your past cycles, described. Days only one cycle reached are left empty. It shows what happened, not what will.", "@cycleOwnPastCyclesDescribed": { "description": "Explanatory footer under the by-cycle-day charts." }, "cycleDayOneLabel": "Day 1", "@cycleDayOneLabel": { "description": "X-axis label: day 1 of the cycle." }, "cycleDayNLabel": "Day {n}", "@cycleDayNLabel": { "description": "X-axis label: the last drawn day of the cycle.", "placeholders": { "n": { "type": "int" } } }, "cycleMiddleOfNCycles": "Middle of {n} cycles at each day.", "@cycleMiddleOfNCycles": { "description": "Chart footnote stating how many cycles each median point is drawn from, when the count is the same for every point.", "placeholders": { "n": { "type": "int" } } }, "cycleMiddleOfRangeCycles": "Middle of between {lo} and {hi} cycles at each day.", "@cycleMiddleOfRangeCycles": { "description": "Chart footnote stating the range of cycles each median point is drawn from, when the count varies.", "placeholders": { "lo": { "type": "int" }, "hi": { "type": "int" } } }, "cycleNotEnoughCompareTitle": "Not enough cycles to compare a day against itself", "@cycleNotEnoughCompareTitle": { "description": "Status card title when there aren't enough previous cycles to compare today against." }, "cycleCompareBodyGeneric": "This puts today next to the same day of your own previous cycles. It needs three of them that got that far.", "@cycleCompareBodyGeneric": { "description": "Status card body for the day-against-itself comparison when today's cycle day is unknown." }, "cycleCompareBodyWithDay": "This puts today next to the same day of your own previous cycles. It needs three of them that reached day {day}.", "@cycleCompareBodyWithDay": { "description": "Status card body for the day-against-itself comparison, naming today's cycle day.", "placeholders": { "day": { "type": "int" } } }, "cycleNightOfLabel": "NIGHT OF {date}", "@cycleNightOfLabel": { "description": "Overline label naming the night the day-against-itself comparison is about.", "placeholders": { "date": { "type": "String" } } }, "cycleComparisonNotCorrection": "A comparison, not a correction. Your recovery score is not adjusted by this, and nothing here is a training instruction.", "@cycleComparisonNotCorrection": { "description": "Disclaimer under the day-against-itself comparison." }, "cycleCompareHrvLabel": "HRV", "@cycleCompareHrvLabel": { "description": "Short label for HRV used in the day-against-itself comparison line." }, "cycleCompareLine": "{label} {z1} vs your last 3 weeks, {z2} vs your last {n} day-{cycleDay}s.", "@cycleCompareLine": { "description": "One line of the day-against-itself comparison, e.g. 'HRV +1.2 vs your last 3 weeks, -0.3 vs your last 4 day-22s.'", "placeholders": { "label": { "type": "String" }, "z1": { "type": "String" }, "z2": { "type": "String" }, "n": { "type": "int" }, "cycleDay": { "type": "int" } } }, "cycleLengthsTitle": "Your cycle lengths against a published range", "@cycleLengthsTitle": { "description": "Status card title offering to show cycle-length-vs-published-range chart (opt-in)." }, "cycleLengthsBody": "Off unless you turn it on. It shows the days between your logged starts next to the published adult range, and nothing more.", "@cycleLengthsBody": { "description": "Status card body explaining the cycle-length review is opt-in." }, "cycleShowIt": "Show it", "@cycleShowIt": { "description": "Button label to opt in and show the cycle-lengths chart." }, "cycleNotEnoughLoggedTitle": "Not enough logged cycles yet", "@cycleNotEnoughLoggedTitle": { "description": "Status card title when too few cycle-length gaps have been logged." }, "cycleNotEnoughLoggedBody": "This needs a long run: {n} of {total} gaps so far, which is about a year of logging every start.", "@cycleNotEnoughLoggedBody": { "description": "Status card body when too few cycle-length gaps have been logged.", "placeholders": { "n": { "type": "int" }, "total": { "type": "int" } } }, "cycleGapTitle": "There is a gap in your logged starts", "@cycleGapTitle": { "description": "Status card title when a suspiciously long gap breaks the cycle-length chart." }, "cycleGapBody": "One start is more than {days} days after the one before. A missed log and a long cycle look the same, so nothing is drawn.", "@cycleGapBody": { "description": "Status card body when a suspiciously long gap breaks the cycle-length chart.", "placeholders": { "days": { "type": "int" } } }, "cycleDaysBetweenStarts": "Days between your logged starts", "@cycleDaysBetweenStarts": { "description": "Chart title: days between logged period starts." }, "cycleUnitDays": "days", "@cycleUnitDays": { "description": "Unit label for days." }, "cycleLegendYourCycles": "Your cycles", "@cycleLegendYourCycles": { "description": "Chart legend entry for the user's own cycle-length bars." }, "cycleLegendPublishedRange": "Published range", "@cycleLegendPublishedRange": { "description": "Chart legend entry for the published cycle-length reference range." }, "cycleTwoLinesFootnote": "The two lines are {low} and {high} days.", "@cycleTwoLinesFootnote": { "description": "Chart footnote naming the two published reference-range boundary days.", "placeholders": { "low": { "type": "int" }, "high": { "type": "int" } } }, "cycleLengthChangesReasons": "Cycle length changes for many reasons, such as thyroid, stress, weight, contraception or PCOS. A reason to ask a clinician, not an answer.", "@cycleLengthChangesReasons": { "description": "Disclaimer under the cycle-length chart about medical causes of variation." }, "cycleHideLengths": "Hide cycle lengths", "@cycleHideLengths": { "description": "Button label to opt back out of the cycle-lengths chart." }, "cycleDescriptiveOnly": "Descriptive only.", "@cycleDescriptiveOnly": { "description": "Footnote on the current-cycle resting-heart-rate chart." }, "cycleNotEnoughDerivedNights": "Not enough scored nights this cycle yet", "@cycleNotEnoughDerivedNights": { "description": "Empty-state message on the current-cycle chart when too few nights have derived data." }, "cycleMdcNoteInsideSpread": " Every day here is within your normal night-to-night swing: the biggest gap is {s}, and {n} is the smallest real change. A shape, not a shift.", "@cycleMdcNoteInsideSpread": { "description": "Chart footnote addendum when the drawn swing is smaller than the user's own night-to-night noise.", "placeholders": { "s": { "type": "String" }, "n": { "type": "String" } } }, "cycleMdcNoteVaries": " Your nights vary by {n} on their own, so days closer together than that are not separated. The biggest gap here is {s}.", "@cycleMdcNoteVaries": { "description": "Chart footnote addendum when the drawn swing exceeds the user's own night-to-night noise.", "placeholders": { "n": { "type": "String" }, "s": { "type": "String" } } }, "healthTabOverview": "Overview", "@healthTabOverview": { "description": "Health screen sub-tab label: Overview" }, "healthTabExplore": "Explore", "@healthTabExplore": { "description": "Health screen sub-tab label: Explore" }, "healthTabTrends": "Trends", "@healthTabTrends": { "description": "Health screen sub-tab label: Trends" }, "healthTabVitals": "Vitals", "@healthTabVitals": { "description": "Health screen sub-tab label: Vitals" }, "healthTabLabs": "Labs", "@healthTabLabs": { "description": "Health screen sub-tab label: Labs" }, "healthTitle": "Health", "@healthTitle": { "description": "Health screen page title" }, "healthCouldNotRead": "Could not read your {what}", "@healthCouldNotRead": { "description": "Read-failure card title, e.g. Could not read your vitals", "placeholders": { "what": { "type": "String" } } }, "healthReadFailedBody": "The stored rows failed to load. Nothing was deleted — this is a read that went wrong.", "@healthReadFailedBody": { "description": "Read-failure card body" }, "healthTryAgain": "Try again", "@healthTryAgain": { "description": "Read-failure card retry button" }, "healthWhatVitals": "vitals", "@healthWhatVitals": { "description": "Noun 'vitals' plugged into the read-failure title" }, "healthWhatLabResults": "lab results", "@healthWhatLabResults": { "description": "Noun 'lab results' plugged into the read-failure title" }, "cycleWhatCycleData": "cycle data", "@cycleWhatCycleData": { "description": "Noun 'cycle data' plugged into the read-failure title on the Cycle tab" }, "healthMeasuresUnit": "measures", "@healthMeasuresUnit": { "description": "Noun 'measures' — used both as the read-failure title noun and as the Explore consistency-tile unit" }, "healthRowRestingHr": "Resting heart rate", "@healthRowRestingHr": { "description": "Overview/Trends/Vitals row label: resting heart rate" }, "healthRowHrv": "HRV", "@healthRowHrv": { "description": "Overview/Trends row label: HRV" }, "healthRowSleep": "Sleep", "@healthRowSleep": { "description": "Overview row label and Explore catalogue category title: Sleep" }, "healthRowStress": "Stress", "@healthRowStress": { "description": "Overview row label and sub-label fallback: Stress" }, "healthRowRespRate": "Respiratory rate", "@healthRowRespRate": { "description": "Overview/Vitals row label: respiratory rate" }, "healthSubOvernight": "Overnight", "@healthSubOvernight": { "description": "Overview row sub-label: overnight reading" }, "healthSubRmssdAsleep": "HRV, asleep", "@healthSubRmssdAsleep": { "description": "Overview HRV row sub-label" }, "healthSubLastNight": "Last night", "@healthSubLastNight": { "description": "Sub-label / chart axis label meaning last night" }, "healthSubAsleep": "Asleep", "@healthSubAsleep": { "description": "Overview/Vitals row sub-label: asleep reading" }, "healthNoMetric": "No {name}", "@healthNoMetric": { "description": "Empty-state card title for a metric with no value, e.g. 'No resting heart rate'", "placeholders": { "name": { "type": "String" } } }, "healthWhyReadFromSleep": "Read from sleep, and no night was scored.", "@healthWhyReadFromSleep": { "description": "Why-absent reason: resting HR is read from sleep and no night was scored" }, "healthWhyReadOnlyFromSleep": "Read only from sleep, and no night was scored.", "@healthWhyReadOnlyFromSleep": { "description": "Why-absent reason: HRV/respiratory rate read only from sleep and no night was scored" }, "healthWhySleepNotLongEnough": "No sleep period long enough to score was recorded.", "@healthWhySleepNotLongEnough": { "description": "Why-absent reason: no sleep period long enough to score" }, "healthWhyReadFromNight": "Read from the night, and no night was scored.", "@healthWhyReadFromNight": { "description": "Why-absent reason: stress read from the night and no night was scored" }, "healthWhyNoReadingLastNight": "No reading from last night.", "@healthWhyNoReadingLastNight": { "description": "Why-absent reason: no respiratory reading from last night" }, "healthIllnessRedTitle": "Recent nights add up to a raised resting heart rate", "@healthIllnessRedTitle": { "description": "Illness observation card title, red/severe state" }, "healthIllnessLastNightTitle": "Last night sat outside your normal range", "@healthIllnessLastNightTitle": { "description": "Illness observation card title when the flagged night is last night" }, "healthIllnessDayTitle": "{day} sat outside your normal range", "@healthIllnessDayTitle": { "description": "Illness observation card title when the flagged night is an earlier day", "placeholders": { "day": { "type": "String" } } }, "healthIllnessBodyNoZ": "Your resting heart rate has run above your usual over recent nights. This tracks one signal, so it shows a pattern, not a cause.", "@healthIllnessBodyNoZ": { "description": "Illness observation card body when no z-score is available" }, "healthIllnessBodyWithZ": "Recent nights together put your resting heart rate above your usual. On its own, that night was {z}× your normal night-to-night swing {direction} it. A pattern, not a cause.", "@healthIllnessBodyWithZ": { "description": "Illness observation card body including the standard-deviation figure and direction", "placeholders": { "z": { "type": "String" }, "direction": { "type": "String" } } }, "healthDirectionAbove": "above", "@healthDirectionAbove": { "description": "Direction word: above (baseline)" }, "healthDirectionBelow": "below", "@healthDirectionBelow": { "description": "Direction word: below (baseline)" }, "healthIllnessAdvice": "Worth noting if it continues past a couple of days.", "@healthIllnessAdvice": { "description": "Illness observation card advice line" }, "healthObservationsTitle": "Observations", "@healthObservationsTitle": { "description": "Section title over the illness/findings observation card" }, "healthSeeAll": "See all", "@healthSeeAll": { "description": "Section action button: open the full findings log" }, "healthNapsTitle": "Naps", "@healthNapsTitle": { "description": "Section title: Naps" }, "healthNoNapReading": "No nap reading", "@healthNoNapReading": { "description": "Empty-state title when there is no nap day to name" }, "healthNoNapReadingFor": "No nap reading for {day}", "@healthNoNapReadingFor": { "description": "Empty-state title when there is no nap reading for a named day", "placeholders": { "day": { "type": "String" } } }, "healthNapsBody": "Naps come off the same second-by-second recording as the rest of the day, and this day does not have enough of it.", "@healthNapsBody": { "description": "Empty-state body explaining why naps may be missing" }, "healthDaytimeSleep": "Daytime sleep", "@healthDaytimeSleep": { "description": "Nap row label" }, "healthValueNone": "None", "@healthValueNone": { "description": "Value shown when zero naps were measured (a measured zero, not absence)" }, "healthNoneDetectedOn": "None detected · {day}", "@healthNoneDetectedOn": { "description": "Nap row sub-label when zero naps were detected on a day", "placeholders": { "day": { "type": "String" } } }, "healthNapCountLabel": "{n, plural, one{{n} nap} other{{n} naps}}", "@healthNapCountLabel": { "description": "Nap row sub-label: N naps counted, ICU plural", "placeholders": { "n": { "type": "int" } } }, "healthAddOrCorrect": "Add or correct", "@healthAddOrCorrect": { "description": "Naps section action button" }, "healthNoTrendYet": "No {label} trend yet", "@healthNoTrendYet": { "description": "Trend card empty-state title", "placeholders": { "label": { "type": "String" } } }, "healthZeroDaysStored": "0 days stored.", "@healthZeroDaysStored": { "description": "Trend card empty-state body" }, "healthAsOf": " · as of {date}", "@healthAsOf": { "description": "Trend card suffix noting the hero number's date when it is not today", "placeholders": { "date": { "type": "String" } } }, "healthNoBaseline": "no usual range yet", "@healthNoBaseline": { "description": "Trend card delta label when there is no baseline to compare to" }, "healthTimeAsleep": "Time asleep", "@healthTimeAsleep": { "description": "Trends tab sleep trend card label" }, "healthVsNeed": "vs your {need} need", "@healthVsNeed": { "description": "Trend card comparison label against the computed sleep need", "placeholders": { "need": { "type": "String" } } }, "healthBodyClockTitle": "Body clock", "@healthBodyClockTitle": { "description": "Section title: Body clock" }, "healthChronotypeJetlagRegularity": "Natural bedtime, weekend shift and schedule consistency", "@healthChronotypeJetlagRegularity": { "description": "Body clock card subtitle" }, "healthChronotypeLabel": "NATURAL BEDTIME", "@healthChronotypeLabel": { "description": "Body clock inline-metric label: CHRONOTYPE" }, "healthSocialJetlagLabel": "WEEKEND SHIFT", "@healthSocialJetlagLabel": { "description": "Body clock inline-metric label: SOCIAL JETLAG" }, "healthRegularityLabel": "CONSISTENCY", "@healthRegularityLabel": { "description": "Body clock inline-metric label: REGULARITY" }, "healthConsistencyTitle": "Consistency", "@healthConsistencyTitle": { "description": "Section title: Consistency" }, "healthDaysWithRecord": "Days with a score in the last 30 days", "@healthDaysWithRecord": { "description": "Consistency tile caption" }, "healthToday": "Today", "@healthToday": { "description": "Word 'Today' used as a day label" }, "healthRowHeartRate": "Heart rate", "@healthRowHeartRate": { "description": "Vitals row label: heart rate range" }, "healthRowSkinTemp": "Skin temperature", "@healthRowSkinTemp": { "description": "Vitals row label: skin temperature" }, "healthVsOwnNights": "vs your own nights", "@healthVsOwnNights": { "description": "Skin temperature row sub-label, no dated night" }, "healthVsOwnNightsOn": "vs your own nights · {day}", "@healthVsOwnNightsOn": { "description": "Skin temperature row sub-label with a dated night", "placeholders": { "day": { "type": "String" } } }, "healthRowWearTime": "Wear time", "@healthRowWearTime": { "description": "Vitals row label: wear time" }, "healthTheDay": "the day", "@healthTheDay": { "description": "Phrase 'the day' used in the wear-time coverage sentence when today" }, "healthCoverageOf": "{pct}% of {day}", "@healthCoverageOf": { "description": "Wear-time coverage sentence: N% of the day / of a named day", "placeholders": { "pct": { "type": "int" }, "day": { "type": "String" } } }, "healthNothingMeasuredDay": "Nothing measured for this day", "@healthNothingMeasuredDay": { "description": "Vitals empty-state title: nothing measured this day" }, "healthNoBandRecordings": "No band recordings reached this day.", "@healthNoBandRecordings": { "description": "Vitals empty-state body" }, "healthSyncTheBand": "Sync the band", "@healthSyncTheBand": { "description": "Vitals empty-state fix button: sync the band" }, "healthDeepDivesTitle": "Deep dives", "@healthDeepDivesTitle": { "description": "Section title: Deep dives" }, "healthHeartRateVariability": "Heart rate variability", "@healthHeartRateVariability": { "description": "Deep-dive card title: heart rate variability" }, "healthTimeFrequencyNonLinear": "Time, frequency and non-linear", "@healthTimeFrequencyNonLinear": { "description": "Deep-dive card subtitle" }, "healthRmssdOfLastNights": "HRV, {have} of the last {days} nights", "@healthRmssdOfLastNights": { "description": "HRV preview chart title: RMSSD, N of the last M nights", "placeholders": { "have": { "type": "int" }, "days": { "type": "int" } } }, "healthNightsAgo": "{n} nights ago", "@healthNightsAgo": { "description": "HRV preview chart x-axis label: N nights ago", "placeholders": { "n": { "type": "int" } } }, "healthOneNightNotTrend": "One night is not a trend yet", "@healthOneNightNotTrend": { "description": "HRV preview chart empty message when fewer than two nights are stored" }, "healthMeasuresWithHistory": "Measures with stored history on this device", "@healthMeasuresWithHistory": { "description": "Explore tab consistency tile caption" }, "healthEachOneOpens": "Each one opens its chart, your own range, and how it is worked out.", "@healthEachOneOpens": { "description": "Explore tab intro line explaining what a tap gets you" }, "healthCatHeartRhythm": "Heart & rhythm", "@healthCatHeartRhythm": { "description": "Explore catalogue category title: Heart & rhythm" }, "healthCatBreathing": "Breathing", "@healthCatBreathing": { "description": "Explore catalogue category title: Breathing" }, "healthCatMovementLoad": "Movement & load", "@healthCatMovementLoad": { "description": "Explore catalogue category title: Movement & load" }, "healthCatBodyWear": "Body & wear", "@healthCatBodyWear": { "description": "Explore catalogue category title: Body & wear" }, "healthBlurbRestingHr": "The lowest sustained rate of the night", "@healthBlurbRestingHr": { "description": "Explore catalogue one-line description for resting heart rate" }, "healthBlurbHrv": "How much your heartbeat timing varies while you sleep", "@healthBlurbHrv": { "description": "Explore catalogue one-line description for HRV: the nightly mean of the RMSSDs of the sleep session's 5-minute windows" }, "healthBlurbHrvCv": "How steady your HRV was within one night", "@healthBlurbHrvCv": { "description": "Explore catalogue one-line description for HRV stability: within-night SDNN as a percentage of the mean beat interval (not a night-to-night variability)" }, "healthBlurbLfHf": "Where beat-timing power sits across frequencies", "@healthBlurbLfHf": { "description": "Explore catalogue one-line description for LF/HF" }, "healthBlurbDip": "How far your heart rate falls while you sleep", "@healthBlurbDip": { "description": "Explore catalogue one-line description for heart-rate dip" }, "healthBlurbHrr": "How fast it falls in the minute after a bout", "@healthBlurbHrr": { "description": "Explore catalogue one-line description for heart-rate recovery" }, "healthBlurbSleep": "Time asleep, from motion and beat timing", "@healthBlurbSleep": { "description": "Explore catalogue one-line description for sleep duration" }, "healthBlurbEfficiency": "Asleep as a share of time in bed", "@healthBlurbEfficiency": { "description": "Explore catalogue one-line description for sleep efficiency" }, "healthBlurbDeep": "Heart-rate flatness inside NREM", "@healthBlurbDeep": { "description": "Explore catalogue one-line description for deep sleep" }, "healthBlurbRem": "Staged from beat variability and movement", "@healthBlurbRem": { "description": "Explore catalogue one-line description for REM sleep" }, "healthBlurbNapMin": "Sleep detected outside the main night", "@healthBlurbNapMin": { "description": "Explore catalogue one-line description for nap minutes" }, "healthBlurbRespRate": "Breaths per minute, recovered from beat timing", "@healthBlurbRespRate": { "description": "Explore catalogue one-line description for respiratory rate" }, "healthBlurbBrv": "How much that rate varies across the night", "@healthBlurbBrv": { "description": "Explore catalogue one-line description for breathing rate variability" }, "healthBlurbSpo2": "WHOOP's own value, brought in from an import", "@healthBlurbSpo2": { "description": "Explore catalogue one-line description for imported blood oxygen" }, "healthBlurbSteps": "Counted by a pedometer, never modelled", "@healthBlurbSteps": { "description": "Explore catalogue one-line description for steps" }, "healthBlurbActiveMin": "Minutes of movement volume, not locomotion", "@healthBlurbActiveMin": { "description": "Explore catalogue one-line description for active minutes" }, "healthBlurbCalories": "Active energy from heart rate and your profile", "@healthBlurbCalories": { "description": "Explore catalogue one-line description for calories" }, "healthBlurbStrain": "Cardiovascular load over the day, on 0–21", "@healthBlurbStrain": { "description": "Explore catalogue one-line description for strain" }, "healthBlurbTrimp": "Heart points with no cap; Strain is the 0–21 view", "@healthBlurbTrimp": { "description": "Explore catalogue one-line description for TRIMP" }, "healthBlurbSkinTemp": "Distance from your own recent nights", "@healthBlurbSkinTemp": { "description": "Explore catalogue one-line description for skin temperature" }, "healthBlurbWear": "Minutes with a band record present", "@healthBlurbWear": { "description": "Explore catalogue one-line description for wear time" }, "healthNothingMeasuredHere": "Nothing measured here yet", "@healthNothingMeasuredHere": { "description": "Explore family empty-state title when no row in the family has history" }, "healthNotMeasuredYet": "Not measured yet", "@healthNotMeasuredYet": { "description": "Explore family empty-state title when some rows in the family have history" }, "healthNoDayProduced": "No day on this device has produced one yet.", "@healthNoDayProduced": { "description": "Explore family empty-state trailing sentence" }, "healthNoLabResults": "No lab results", "@healthNoLabResults": { "description": "Labs tab empty-state title" }, "healthNoLabResultsBody": "Nothing logged. Anything you add here stays on this device, and anything you remove is gone from it.", "@healthNoLabResultsBody": { "description": "Labs tab empty-state body" }, "healthLastPanel": "Last panel {date} · logged by hand", "@healthLastPanel": { "description": "Labs tab footer: date of the last logged panel", "placeholders": { "date": { "type": "String" } } }, "healthMarkersYouNamed": "Markers you named", "@healthMarkersYouNamed": { "description": "Section title over the user's custom lab markers" }, "healthAddAResult": "Add a result", "@healthAddAResult": { "description": "Button/dialog title: add a lab result" }, "healthRangesDifferByLab": "Ranges differ by lab. Use the one on your report.", "@healthRangesDifferByLab": { "description": "Labs tab footer caveat about reference ranges" }, "healthRemoveMarkerFrom": "Remove {marker} from {date}", "@healthRemoveMarkerFrom": { "description": "Accessibility label for a lab-result row's remove action", "placeholders": { "marker": { "type": "String" }, "date": { "type": "String" } } }, "healthNoReferenceInterval": "No reference interval · {date}", "@healthNoReferenceInterval": { "description": "Lab result row sub-label when the marker has no reference range", "placeholders": { "date": { "type": "String" } } }, "healthTypicalRange": "Typical {low}–{high} · {date}", "@healthTypicalRange": { "description": "Lab result row sub-label showing the typical reference range", "placeholders": { "low": { "type": "String" }, "high": { "type": "String" }, "date": { "type": "String" } } }, "healthRemoveLabelFrom": "Remove {label} from {date}?", "@healthRemoveLabelFrom": { "description": "Confirm-remove dialog title for a lab result", "placeholders": { "label": { "type": "String" }, "date": { "type": "String" } } }, "healthRemoveLabBody": "The {value} {unit} you logged for that draw. It leaves this device and there is no undo.", "@healthRemoveLabBody": { "description": "Confirm-remove dialog body for a lab result, first sentence", "placeholders": { "value": { "type": "String" }, "unit": { "type": "String" } } }, "healthRemoveLabOlderNote": " Your {date} draw stays, and shows here instead.", "@healthRemoveLabOlderNote": { "description": "Confirm-remove dialog body addendum noting an older draw remains", "placeholders": { "date": { "type": "String" } } }, "healthRemovedNoneLeft": "Removed {label} from {date}. No {label} results left.", "@healthRemovedNoneLeft": { "description": "Snackbar after removing a lab result when none remain for that marker", "placeholders": { "label": { "type": "String" }, "date": { "type": "String" } } }, "healthRemovedShowingOlder": "Removed {label} from {date}. Showing your {older} draw now.", "@healthRemovedShowingOlder": { "description": "Snackbar after removing a lab result when an older draw now shows instead", "placeholders": { "label": { "type": "String" }, "date": { "type": "String" }, "older": { "type": "String" } } }, "healthRemoveTheMarker": "Remove the {label} marker", "@healthRemoveTheMarker": { "description": "Accessibility label for removing a custom marker definition", "placeholders": { "label": { "type": "String" } } }, "healthNothingLoggedUnderIt": "Nothing logged under it", "@healthNothingLoggedUnderIt": { "description": "Custom marker row sub-label when it holds zero results" }, "healthResultsCount": "{n, plural, one{{n} result · {unit}} other{{n} results · {unit}}}", "@healthResultsCount": { "description": "Custom marker row sub-label: N results, ICU plural", "placeholders": { "n": { "type": "int" }, "unit": { "type": "String" } } }, "healthStillHoldsResults": "{count, plural, one{{label} still holds {count} result. Remove those first — the marker is what labels them.} other{{label} still holds {count} results. Remove those first — the marker is what labels them.}}", "@healthStillHoldsResults": { "description": "Snackbar refusing to remove a marker definition that still holds results, ICU plural", "placeholders": { "count": { "type": "int" }, "label": { "type": "String" } } }, "healthRemoveMarkerQ": "Remove {label}?", "@healthRemoveMarkerQ": { "description": "Confirm-remove dialog title for a custom marker definition", "placeholders": { "label": { "type": "String" } } }, "healthRemoveMarkerBody": "It leaves the marker list, so you can no longer log it. Nothing measured goes with it — you have no results under it.", "@healthRemoveMarkerBody": { "description": "Confirm-remove dialog body for a custom marker definition" }, "healthMarkerLabel": "Marker", "@healthMarkerLabel": { "description": "Add-result dialog: accessibility label for the marker dropdown" }, "healthValueUnit": "Value ({unit})", "@healthValueUnit": { "description": "Add-result dialog: value field label with unit", "placeholders": { "unit": { "type": "String" } } }, "healthDateDrawn": "Date drawn (YYYY-MM-DD)", "@healthDateDrawn": { "description": "Add-result dialog: date field label" }, "healthValueMustBeNumber": "The value needs to be a number on its own, without the unit. Nothing was saved.", "@healthValueMustBeNumber": { "description": "Add-result dialog validation error: value must be a plain number" }, "healthDateFormatError": "The date needs to be YYYY-MM-DD. Nothing was saved.", "@healthDateFormatError": { "description": "Add-result dialog validation error: date format" }, "healthDateInFuture": "That date is after today. Nothing was saved.", "@healthDateInFuture": { "description": "Add-result dialog validation error: draw date after today" }, "healthCouldNotSaveIt": "Could not save it: {error}", "@healthCouldNotSaveIt": { "description": "Add-result dialog snackbar on save failure", "placeholders": { "error": { "type": "String" } } }, "homeStepSensorStrapPhone": "Strap + phone", "@homeStepSensorStrapPhone": { "description": "Step count sensor label: both the strap and phone counted." }, "homeStepSensorStrap": "Strap", "@homeStepSensorStrap": { "description": "Step count sensor label: the strap counted." }, "homeStepSensorPhone": "Phone", "@homeStepSensorPhone": { "description": "Step count sensor label: the phone counted." }, "homeOvernightBuilding": "Last night is still being worked out.", "@homeOvernightBuilding": { "description": "Home ring gap reason: last night's data is still being derived." }, "homeOvernightNothingYet": "Nothing from last night has reached the app yet.", "@homeOvernightNothingYet": { "description": "Home ring gap reason: nothing from last night has synced yet." }, "homeMonthJanuary": "January", "@homeMonthJanuary": { "description": "Full month name: January, used in the Home date line." }, "homeMonthFebruary": "February", "@homeMonthFebruary": { "description": "Full month name: February, used in the Home date line." }, "homeMonthMarch": "March", "@homeMonthMarch": { "description": "Full month name: March, used in the Home date line." }, "homeMonthApril": "April", "@homeMonthApril": { "description": "Full month name: April, used in the Home date line." }, "homeMonthMay": "May", "@homeMonthMay": { "description": "Full month name: May, used in the Home date line." }, "homeMonthJune": "June", "@homeMonthJune": { "description": "Full month name: June, used in the Home date line." }, "homeMonthJuly": "July", "@homeMonthJuly": { "description": "Full month name: July, used in the Home date line." }, "homeMonthAugust": "August", "@homeMonthAugust": { "description": "Full month name: August, used in the Home date line." }, "homeMonthSeptember": "September", "@homeMonthSeptember": { "description": "Full month name: September, used in the Home date line." }, "homeMonthOctober": "October", "@homeMonthOctober": { "description": "Full month name: October, used in the Home date line." }, "homeMonthNovember": "November", "@homeMonthNovember": { "description": "Full month name: November, used in the Home date line." }, "homeMonthDecember": "December", "@homeMonthDecember": { "description": "Full month name: December, used in the Home date line." }, "homeMonthJanuaryShort": "Jan", "@homeMonthJanuaryShort": { "description": "Abbreviated month name: January, for compact date chips (e.g. \"Tue 11 Jan\")." }, "homeMonthFebruaryShort": "Feb", "@homeMonthFebruaryShort": { "description": "Abbreviated month name: February, for compact date chips." }, "homeMonthMarchShort": "Mar", "@homeMonthMarchShort": { "description": "Abbreviated month name: March, for compact date chips." }, "homeMonthAprilShort": "Apr", "@homeMonthAprilShort": { "description": "Abbreviated month name: April, for compact date chips." }, "homeMonthMayShort": "May", "@homeMonthMayShort": { "description": "Abbreviated month name: May, for compact date chips." }, "homeMonthJuneShort": "Jun", "@homeMonthJuneShort": { "description": "Abbreviated month name: June, for compact date chips." }, "homeMonthJulyShort": "Jul", "@homeMonthJulyShort": { "description": "Abbreviated month name: July, for compact date chips." }, "homeMonthAugustShort": "Aug", "@homeMonthAugustShort": { "description": "Abbreviated month name: August, for compact date chips." }, "homeMonthSeptemberShort": "Sep", "@homeMonthSeptemberShort": { "description": "Abbreviated month name: September, for compact date chips." }, "homeMonthOctoberShort": "Oct", "@homeMonthOctoberShort": { "description": "Abbreviated month name: October, for compact date chips." }, "homeMonthNovemberShort": "Nov", "@homeMonthNovemberShort": { "description": "Abbreviated month name: November, for compact date chips." }, "homeMonthDecemberShort": "Dec", "@homeMonthDecemberShort": { "description": "Abbreviated month name: December, for compact date chips." }, "homeWeekdayMonday": "Monday", "@homeWeekdayMonday": { "description": "Full weekday name: Monday, used in the Home date line." }, "homeWeekdayTuesday": "Tuesday", "@homeWeekdayTuesday": { "description": "Full weekday name: Tuesday, used in the Home date line." }, "homeWeekdayWednesday": "Wednesday", "@homeWeekdayWednesday": { "description": "Full weekday name: Wednesday, used in the Home date line." }, "homeWeekdayThursday": "Thursday", "@homeWeekdayThursday": { "description": "Full weekday name: Thursday, used in the Home date line." }, "homeWeekdayFriday": "Friday", "@homeWeekdayFriday": { "description": "Full weekday name: Friday, used in the Home date line." }, "homeWeekdaySaturday": "Saturday", "@homeWeekdaySaturday": { "description": "Full weekday name: Saturday, used in the Home date line." }, "homeWeekdaySunday": "Sunday", "@homeWeekdaySunday": { "description": "Full weekday name: Sunday, used in the Home date line." }, "homeReadinessNotScored": "Not scored", "@homeReadinessNotScored": { "description": "Readiness band label when there is no score." }, "homeReadinessGoodToGo": "Good to go", "@homeReadinessGoodToGo": { "description": "Readiness band label, top tier." }, "homeReadinessSteady": "Steady", "@homeReadinessSteady": { "description": "Readiness band label, second-highest tier." }, "homeReadinessTakeItEasy": "Take it easy", "@homeReadinessTakeItEasy": { "description": "Readiness band label, second-lowest tier." }, "homeReadinessRestToday": "Rest today", "@homeReadinessRestToday": { "description": "Readiness band label, lowest tier." }, "homeDriverHrv": "HRV", "@homeDriverHrv": { "description": "Readiness driver name: heart rate variability, shown in the Why? row on Home." }, "homeDriverRhr": "Resting heart rate", "@homeDriverRhr": { "description": "Readiness driver name: resting heart rate, shown in the Why? row on Home." }, "homeDriverResp": "Breathing rate", "@homeDriverResp": { "description": "Readiness driver name: breathing rate, shown in the Why? row on Home." }, "homeDriverTemp": "Skin temperature", "@homeDriverTemp": { "description": "Readiness driver name: skin temperature, shown in the Why? row on Home." }, "homeDbRebuiltTitle": "Your database was rebuilt to start the app", "@homeDbRebuiltTitle": { "description": "Title of the card shown when the local database had to be rebuilt to start the app." }, "homeDbRebuiltNothingRecovered": "Nothing could be read back.", "@homeDbRebuiltNothingRecovered": { "description": "Database-rebuilt card: nothing could be salvaged from the old file." }, "homeDbRebuiltRecovered": "Recovered: {list}.", "@homeDbRebuiltRecovered": { "description": "Database-rebuilt card: list of tables and row counts that were recovered.", "placeholders": { "list": { "type": "String", "example": "sleep 42 · workouts 3" } } }, "homeDbRebuiltEmpty": "Empty: {list}.", "@homeDbRebuiltEmpty": { "description": "Database-rebuilt card: list of tables that came back empty.", "placeholders": { "list": { "type": "String", "example": "nutrition" } } }, "homeDbRebuiltKept": "The original file is kept at {path} — nothing was deleted.", "@homeDbRebuiltKept": { "description": "Database-rebuilt card: reassurance that the original file was kept, with its path.", "placeholders": { "path": { "type": "String", "example": "/data/quarantine/old.db" } } }, "homeWorkoutHoldTitle": "A workout is still running", "@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": { "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": { "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": { "description": "Reason the cross-day rollup is being rebuilt: the algorithm version changed." }, "homeInsightsStaleOverWeek": "Your trends were last updated over a week ago. Sync the band to bring them up to date.", "@homeInsightsStaleOverWeek": { "description": "Reason the cross-day rollup is being rebuilt: the last rollup is more than a week old." }, "homeInsightsStaleOnDay": "Your trends were last updated on {day}. Sync the band to bring them up to date.", "@homeInsightsStaleOnDay": { "description": "Reason the cross-day rollup is being rebuilt: names the day the last rollup was built.", "placeholders": { "day": { "type": "String", "example": "Saturday, 20 May" } } }, "homeInsightsNoVersionStamp": "Your trends are being updated. This takes a minute after a sync.", "@homeInsightsNoVersionStamp": { "description": "Reason the cross-day rollup is being rebuilt: the stored rollup has no version stamp." }, "homeSyncBand": "Sync the band", "@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." }, "homeCalibratingNights": "{have} of {need} nights", "@homeCalibratingNights": { "description": "Calibration progress caption under a ring, counted in nights.", "placeholders": { "have": { "type": "int" }, "need": { "type": "int" } } }, "homeCalibratingDays": "{have} of {need} days", "@homeCalibratingDays": { "description": "Calibration progress caption under a ring, counted in days.", "placeholders": { "have": { "type": "int" }, "need": { "type": "int" } } }, "homeGapNoReason": "Nothing recorded says why this is missing.", "@homeGapNoReason": { "description": "Fallback reason shown when a ring is empty and nothing explains why." }, "homeRingRecovery": "Recovery", "@homeRingRecovery": { "description": "Home ring label: Recovery (readiness)." }, "homeRingStrain": "Strain", "@homeRingStrain": { "description": "Home ring label: Strain." }, "homeRingSleep": "Sleep", "@homeRingSleep": { "description": "Home ring label: Sleep." }, "homeRingNoStrain": "No strain", "@homeRingNoStrain": { "description": "Strain ring value when there is no strain reading." }, "homeRingNoSleep": "No sleep", "@homeRingNoSleep": { "description": "Sleep ring value when there is no sleep reading." }, "homeSleepGapFallback": "No night long enough to score was recorded.", "@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." }, "homeOfSpan": "of {duration}", "@homeOfSpan": { "description": "Sleep ring subtitle: duration measured against a computed sleep-need target.", "placeholders": { "duration": { "type": "String", "example": "7h 45m" } } }, "homeLoadFailedTitle": "Today could not be read", "@homeLoadFailedTitle": { "description": "Title of the card shown when today's data failed to load from the database." }, "homeLoadFailedBody": "The stored day failed to load. Nothing was deleted — this is a read that went wrong, not missing data.", "@homeLoadFailedBody": { "description": "Body of the card shown when today's data failed to load from the database." }, "homeDayLoadFailedTitle": "{day} could not be read", "@homeDayLoadFailedTitle": { "description": "Title of the card shown on Home when a past day picked with the day switcher failed to load from the database.", "placeholders": { "day": { "type": "String", "example": "Wednesday, 15 October" } } }, "wellnessLoadFailedTitle": "This could not be read", "@wellnessLoadFailedTitle": { "description": "Title of the card shown when the Wellness screen or the sleep plan failed to load from the database." }, "wellnessLoadFailedBody": "Reading your stored data failed. Nothing was deleted — this is a read that went wrong, not missing data.", "@wellnessLoadFailedBody": { "description": "Body of the card shown when the Wellness screen or the sleep plan failed to load from the database." }, "homeTryAgain": "Try again", "@homeTryAgain": { "description": "Button label to retry loading today's data." }, "homeNothingDerivedTitle": "No nights scored yet", "@homeNothingDerivedTitle": { "description": "Title shown on a first-run day with nothing derived yet." }, "homeNothingDerivedBody": "Wear the band tonight and open the app in the morning.", "@homeNothingDerivedBody": { "description": "Body shown on a first-run day with nothing derived yet." }, "homeSyncedThrough": "Synced through {when}", "@homeSyncedThrough": { "description": "Home header line: how far the data we hold reaches, on the band's own clock. {when} is a bare HH:mm when the record is from the day already on screen, or a full day + time otherwise.", "placeholders": { "when": { "type": "String", "example": "11:06" } } }, "homeSyncedNever": "No band data yet", "@homeSyncedNever": { "description": "Home header line when no record has ever been banked from a band." }, "homeSyncingTitle": "Syncing with your band", "@homeSyncingTitle": { "description": "Title shown on a bare day while records are actively arriving from the band." }, "homeSyncingBody": "Pulling data now — this can take a few minutes on a full backlog.", "@homeSyncingBody": { "description": "Body shown on a bare day while records are actively arriving from the band." }, "homeAnalyzingTitle": "Crunching last night's numbers", "@homeAnalyzingTitle": { "description": "Title shown on a bare day once the backlog has landed and a derive job is computing today's numbers." }, "homeAnalyzingBody": "The data is in — sleep, recovery and strain are next.", "@homeAnalyzingBody": { "description": "Body shown on a bare day once the backlog has landed and a derive job is computing today's numbers." }, "homeConnectingTitle": "Connecting to your band", "@homeConnectingTitle": { "description": "Title shown right after tapping Sync the band, before any record has arrived yet." }, "homeConnectingBody": "Hang on — this usually takes a few seconds.", "@homeConnectingBody": { "description": "Body shown right after tapping Sync the band, before any record has arrived yet." }, "homeAskCoach": "Ask the coach", "@homeAskCoach": { "description": "Semantic label for the button that opens the AI coach on Home." }, "homeProfileSettings": "Profile and settings", "@homeProfileSettings": { "description": "Semantic label for the avatar button that opens Profile and settings." }, "homeNothingTodayTitle": "Nothing recorded for today", "@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": { "description": "Body shown when there is history but nothing recorded for today, naming the last scored night.", "placeholders": { "day": { "type": "String", "example": "Saturday, 20 May" } } }, "homeNoDataThisDayTitle": "No data for this day", "@homeNoDataThisDayTitle": { "description": "Today tab, stepped back to a past day: title shown when that day has nothing recorded." }, "homeNoDataThisDayBody": "Nothing was recorded on this day.", "@homeNoDataThisDayBody": { "description": "Today tab, stepped back to a past day: body shown when that day has nothing recorded." }, "homeSomeDayDataMissingTitle": "Some of this day's data is missing", "@homeSomeDayDataMissingTitle": { "description": "Today tab, stepped back to a past day: one card listing every missing reading and why." }, "homeReadinessNotScoredTitle": "Recovery is not scored today", "@homeReadinessNotScoredTitle": { "description": "Title of the card shown when readiness has no score today." }, "homeReadinessNeedBody": "{need} to know what normal looks like for you.", "@homeReadinessNeedBody": { "description": "Body of the readiness-not-scored card, naming what is still needed.", "placeholders": { "need": { "type": "String", "example": "Needs 2 more nights" } } }, "homeReadinessNoReason": "Nothing recorded says why.", "@homeReadinessNoReason": { "description": "Fallback body of the readiness-not-scored card when no reason is recorded." }, "homeSeeWhatWasMissing": "See what was missing", "@homeSeeWhatWasMissing": { "description": "Button label opening the readiness detail screen to see what was missing." }, "homeAtAGlance": "At a glance", "@homeAtAGlance": { "description": "Section title on Home for the row of signal cards (heart rate, steps, energy)." }, "homeTodaysPlan": "Today's plan", "@homeTodaysPlan": { "description": "Section title on Home for the day's remaining plan items." }, "homeBreakdownTitle": "Breakdown of your day", "@homeBreakdownTitle": { "description": "Link row title: opens the hour-by-hour breakdown of the day." }, "homeBreakdownSubtitle": "Hour by hour", "@homeBreakdownSubtitle": { "description": "Link row subtitle under the breakdown-of-your-day title." }, "homeBriefingTitle": "Briefing", "@homeBriefingTitle": { "description": "Link row title under Today's plan: opens the AI briefing screen. Constant regardless of morning/evening period." }, "homeBriefingSubtitleEmpty": "Tap to write today's summary", "@homeBriefingSubtitleEmpty": { "description": "Link row subtitle under the briefing title when nothing has been generated for today yet." }, "homeIllnessRedTitle": "Recent nights add up to a raised resting heart rate", "@homeIllnessRedTitle": { "description": "Illness watch headline in the red state: accumulated evidence of a raised resting heart rate, which one very high night can produce. Must not claim consecutive nights." }, "homeIllnessAmberSameNight": "Last night sat outside your normal range", "@homeIllnessAmberSameNight": { "description": "Illness watch headline when last night sat outside the normal range (amber state, same night)." }, "homeIllnessAmberOtherNight": "{day} sat outside your normal range", "@homeIllnessAmberOtherNight": { "description": "Illness watch headline naming a specific past night that sat outside the normal range.", "placeholders": { "day": { "type": "String", "example": "Saturday, 20 May" } } }, "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": { "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": { "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" } } }, "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": { "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" } } }, "homeIllnessAdvice": "Worth noting if it continues past a couple of days.", "@homeIllnessAdvice": { "description": "Illness watch advice line." }, "homeHeartRate": "Heart rate", "@homeHeartRate": { "description": "Signal card title: Heart rate." }, "homeRestingSub": "Resting", "@homeRestingSub": { "description": "Signal card subtitle: Resting, under the heart rate reading." }, "homeNoRestingHr": "No resting heart rate", "@homeNoRestingHr": { "description": "Title of the empty-state card when there is no resting heart rate." }, "homeNoRestingHrWhy": "Resting heart rate is read from sleep, and no sleep was recorded.", "@homeNoRestingHrWhy": { "description": "Reason shown when resting heart rate is absent because no sleep was recorded." }, "homeSteps": "Steps", "@homeSteps": { "description": "Signal card title: Steps." }, "homeStepsNone": "None", "@homeStepsNone": { "description": "Steps card value when no step count was recorded at all." }, "homeStepsNotRecorded": "NOT RECORDED", "@homeStepsNotRecorded": { "description": "Steps card subtitle when nothing counted steps at all." }, "homeStepsPercentGoal": "{pct}% of goal", "@homeStepsPercentGoal": { "description": "Steps card subtitle: percent of the daily step goal reached.", "placeholders": { "pct": { "type": "int" } } }, "homeActiveEnergy": "Active energy", "@homeActiveEnergy": { "description": "Signal card title: Active energy." }, "homeCaloriesEstimated": "Estimated", "@homeCaloriesEstimated": { "description": "Active energy card subtitle when the total is estimated." }, "homeCaloriesTotal": "{total} total", "@homeCaloriesTotal": { "description": "Active energy card subtitle showing the total calories for the day.", "placeholders": { "total": { "type": "String", "example": "2,340" } } }, "homeNoEnergyEstimate": "No energy estimate", "@homeNoEnergyEstimate": { "description": "Title of the empty-state card when there is no energy estimate." }, "homeStepsLeft": "{left} steps left", "@homeStepsLeft": { "description": "Plan row title: number of steps left to reach the goal.", "placeholders": { "left": { "type": "String", "example": "2,300" } } }, "homeMovement": "Movement", "@homeMovement": { "description": "Plan row category label: Movement." }, "homeGoalSteps": "Goal {goal}", "@homeGoalSteps": { "description": "Plan row meta text: the step goal total.", "placeholders": { "goal": { "type": "String", "example": "10,000" } } }, "homeStepGoalMet": "Step goal met", "@homeStepGoalMet": { "description": "Plan row title when the step goal has been met." }, "homeStrainTargetMet": "Strain target met", "@homeStrainTargetMet": { "description": "Plan row title when the strain target has been met." }, "homeAimForStrain": "Aim for {aim} strain", "@homeAimForStrain": { "description": "Plan row title: strain target to aim for.", "placeholders": { "aim": { "type": "String", "example": "11.4" } } }, "homeTraining": "Training", "@homeTraining": { "description": "Plan row category label: Training." }, "homeSleepNeedRow": "{duration} of sleep", "@homeSleepNeedRow": { "description": "Plan row title: computed sleep need for tonight.", "placeholders": { "duration": { "type": "String", "example": "7h 45m" } } }, "homeTonight": "Tonight", "@homeTonight": { "description": "Plan row category label: Tonight." }, "homeNeed": "Need", "@homeNeed": { "description": "Plan row meta text when no bedtime has been computed yet." }, "homeBedTime": "Bed {time}", "@homeBedTime": { "description": "Plan row meta text: the recommended bedtime.", "placeholders": { "time": { "type": "String", "example": "10:40 PM" } } }, "homeNoPlanTitle": "No plan for today yet", "@homeNoPlanTitle": { "description": "Title of the empty-state card when there is no plan for today yet." }, "homeNoPlanWhyStale": "Your trends are being updated. This takes a minute after a sync.", "@homeNoPlanWhyStale": { "description": "Reason there is no plan: the cross-day rollup they come from is being rebuilt." }, "homeNoPlanWhyNone": "None are established yet.", "@homeNoPlanWhyNone": { "description": "Reason there is no plan: no baselines are established yet." }, "homeGreetingStillUp": "Still up", "@homeGreetingStillUp": { "description": "Home greeting for very late night hours (before 5am)." }, "homeGreetingMorning": "Good morning", "@homeGreetingMorning": { "description": "Home greeting for morning hours." }, "homeGreetingAfternoon": "Good afternoon", "@homeGreetingAfternoon": { "description": "Home greeting for afternoon hours." }, "homeGreetingEvening": "Good evening", "@homeGreetingEvening": { "description": "Home greeting for evening hours." }, "wellnessTitle": "Wellness", "@wellnessTitle": { "description": "Wellness screen title" }, "wellnessTabMind": "Mind", "@wellnessTabMind": { "description": "Wellness sub-tab label: Mind" }, "wellnessTabRecovery": "Sleep plan", "@wellnessTabRecovery": { "description": "Wellness sub-tab label: Recovery" }, "wellnessTabHabits": "Habits", "@wellnessTabHabits": { "description": "Wellness sub-tab label: Habits" }, "wellnessTabMedication": "Medication", "@wellnessTabMedication": { "description": "Wellness sub-tab label: Medication" }, "wellnessTabCycle": "Cycle", "@wellnessTabCycle": { "description": "Wellness sub-tab label: Cycle" }, "wellnessStartASitting": "START A SITTING", "@wellnessStartASitting": { "description": "Hero card label to start a breathing sitting, all caps" }, "wellnessExercisesNoun": "exercises", "@wellnessExercisesNoun": { "description": "Noun for the count of breathing exercises on the start card" }, "wellnessPickOneAndGo": "Pick one and go", "@wellnessPickOneAndGo": { "description": "Start card subtitle when no breathing sitting has been done yet" }, "wellnessLastMinutes": "Last: {count} min", "@wellnessLastMinutes": { "description": "Start card subtitle showing minutes of the last breathing sitting", "placeholders": { "count": { "type": "int" } } }, "wellnessWriteTheDayDown": "Write the day down", "@wellnessWriteTheDayDown": { "description": "Action card title opening the journal compose screen" }, "wellnessOpen": "Open", "@wellnessOpen": { "description": "Generic 'Open' button/CTA label on action cards" }, "wellnessStressLastNight": "Stress last night", "@wellnessStressLastNight": { "description": "Section title for last night's stress reading" }, "wellnessNoStressTitle": "No stress reading last night", "@wellnessNoStressTitle": { "description": "Status card title when there is no stress reading for last night" }, "wellnessNoStressBody": "Stress is read from beat timing while you were resting overnight, and last night produced no reading.", "@wellnessNoStressBody": { "description": "Status card body explaining why there is no stress reading" }, "wellnessAutonomicTension": "Stress level", "@wellnessAutonomicTension": { "description": "Label on the stress signal card" }, "wellnessStressLevelLow": "low", "@wellnessStressLevelLow": { "description": "Stress card sub-label: the 'low' band (shown uppercased)" }, "wellnessStressLevelNormal": "normal", "@wellnessStressLevelNormal": { "description": "Stress card sub-label: the 'normal' band (shown uppercased)" }, "wellnessStressLevelElevated": "elevated", "@wellnessStressLevelElevated": { "description": "Stress card sub-label: the 'elevated' band (shown uppercased)" }, "wellnessStressLevelHigh": "high", "@wellnessStressLevelHigh": { "description": "Stress card sub-label: the 'high' band (shown uppercased)" }, "wellnessJournalDefaultSubtitle": "Anything you want to remember about today", "@wellnessJournalDefaultSubtitle": { "description": "Journal subtitle when no custom fields are configured" }, "wellnessJournalSubtitleShort": "{fields} and a note", "@wellnessJournalSubtitleShort": { "description": "Journal subtitle listing up to 4 field names before 'and a note'", "placeholders": { "fields": { "type": "String" } } }, "wellnessJournalSubtitleLong": "{fields} and {more} more, plus a note", "@wellnessJournalSubtitleLong": { "description": "Journal subtitle listing first 4 field names plus a count of more fields", "placeholders": { "fields": { "type": "String" }, "more": { "type": "int" } } }, "wellnessTurnInBy": "Turn in by {time}", "@wellnessTurnInBy": { "description": "Sleep recommendation headline naming a target bedtime", "placeholders": { "time": { "type": "String" } } }, "wellnessDebtBody": "You are {debt} down against your own need, and tonight's is {need}.", "@wellnessDebtBody": { "description": "Sleep recommendation body stating sleep debt and tonight's need", "placeholders": { "debt": { "type": "String" }, "need": { "type": "String" } } }, "wellnessSeeWhatLastNightCost": "See what last night cost you", "@wellnessSeeWhatLastNightCost": { "description": "Sleep recommendation call-to-action text" }, "wellnessWhatChargedAndDrained": "What charged and drained you", "@wellnessWhatChargedAndDrained": { "description": "Section title for readiness drivers" }, "wellnessNoDriversTitle": "No recovery breakdown yet", "@wellnessNoDriversTitle": { "description": "Status card title when no readiness drivers are available yet" }, "wellnessNoDriversBody": "Needs enough nights to know what normal looks like for you.", "@wellnessNoDriversBody": { "description": "Status card body explaining readiness drivers need more nights of data" }, "wellnessSleepNeedTonight": "Sleep need tonight", "@wellnessSleepNeedTonight": { "description": "Section title for tonight's sleep need" }, "wellnessNoSleepNeedTitle": "No sleep need yet", "@wellnessNoSleepNeedTitle": { "description": "Status card title when no sleep need estimate exists" }, "wellnessNoSleepNeedBody": "Nothing recorded says why there is no need for tonight.", "@wellnessNoSleepNeedBody": { "description": "Status card fallback body when there is no reason recorded for missing sleep need" }, "wellnessTonightsNeed": "Tonight's need", "@wellnessTonightsNeed": { "description": "Metric row label for tonight's sleep need duration" }, "wellnessSleepDebt": "Sleep debt", "@wellnessSleepDebt": { "description": "Metric row label for accumulated sleep debt" }, "wellnessAddedForStrain": "Added for strain", "@wellnessAddedForStrain": { "description": "Metric row label for minutes added to sleep need for strain" }, "wellnessCreditedFromNaps": "Credited from naps", "@wellnessCreditedFromNaps": { "description": "Metric row label for minutes credited from naps" }, "wellnessTargetBedtime": "Target bedtime", "@wellnessTargetBedtime": { "description": "Metric row label for the recommended bedtime" }, "wellnessTargetWake": "Target wake", "@wellnessTargetWake": { "description": "Metric row label for the recommended wake time" }, "wellnessRemoveHabitSemantic": "Remove {label}", "@wellnessRemoveHabitSemantic": { "description": "Accessibility label on the trash icon that removes a habit", "placeholders": { "label": { "type": "String" } } }, "wellnessDaysYouDidIt": "Days you did it", "@wellnessDaysYouDidIt": { "description": "Consistency widget label counting days a habit was done" }, "wellnessAddAHabit": "Add a habit", "@wellnessAddAHabit": { "description": "Button label to add a new habit, also used as the add-habit dialog title" }, "wellnessWhatYouLogTitle": "What you log, against your numbers", "@wellnessWhatYouLogTitle": { "description": "Action card title linking to journal findings analysis" }, "wellnessWhatYouLogSubtitle": "Dose, habit difference, and the day of the week", "@wellnessWhatYouLogSubtitle": { "description": "Action card subtitle describing what the journal findings screen covers" }, "wellnessRemoveHabitConfirmTitle": "Remove {label}?", "@wellnessRemoveHabitConfirmTitle": { "description": "Confirmation sheet title asking to remove a habit", "placeholders": { "label": { "type": "String" } } }, "wellnessRemoveHabitConfirmBody": "It stops being asked. The days you already recorded stay.", "@wellnessRemoveHabitConfirmBody": { "description": "Confirmation sheet body explaining removing a habit keeps recorded history" }, "wellnessHabitHint": "Walk after lunch", "@wellnessHabitHint": { "description": "Placeholder example text in the add-habit name field" }, "wellnessAlreadyTrack": "You already track \"{name}\".", "@wellnessAlreadyTrack": { "description": "Snackbar message shown when a duplicate habit/field name is entered", "placeholders": { "name": { "type": "String" } } }, "wellnessNothingScheduledTitle": "Nothing scheduled", "@wellnessNothingScheduledTitle": { "description": "Status card title when no medications are scheduled at all" }, "wellnessNothingScheduledBody": "Add what you take and when.", "@wellnessNothingScheduledBody": { "description": "Status card body prompting to add a medication" }, "wellnessAddAMedication": "Add a medication", "@wellnessAddAMedication": { "description": "Button/fix label to add a medication, also used as the add-medication dialog title" }, "wellnessNothingDueTodayTitle": "Nothing due today", "@wellnessNothingDueTodayTitle": { "description": "Status card title when medications exist but none are due today" }, "wellnessNothingDueTodayBody": "What you take is scheduled for other days or times.", "@wellnessNothingDueTodayBody": { "description": "Status card body explaining medications are scheduled for other days/times" }, "wellnessAdherence": "Adherence", "@wellnessAdherence": { "description": "Section title for medication adherence" }, "wellnessNothingToScoreTitle": "Nothing to score yet", "@wellnessNothingToScoreTitle": { "description": "Status card title when no doses have come due yet for adherence" }, "wellnessNothingToScoreBody": "No scheduled doses have come due yet.", "@wellnessNothingToScoreBody": { "description": "Status card body explaining adherence has nothing to score yet" }, "wellnessTakenOfScheduled": "Taken, of those scheduled in the last seven days.", "@wellnessTakenOfScheduled": { "description": "Consistency widget label describing doses taken vs scheduled in the last 7 days" }, "wellnessDosesUnit": "doses", "@wellnessDosesUnit": { "description": "Unit word for the adherence consistency bar, counting doses not days" }, "wellnessUndoSkipped": "Undo skipped", "@wellnessUndoSkipped": { "description": "Sheet action label to undo marking a dose as skipped" }, "wellnessSkippedOnPurpose": "Skipped on purpose", "@wellnessSkippedOnPurpose": { "description": "Sheet action label to mark a dose as deliberately skipped" }, "wellnessBackToNotTaken": "Back to not taken.", "@wellnessBackToNotTaken": { "description": "Sheet action subtitle when undoing a skipped dose" }, "wellnessRecordedAsDecision": "Recorded as a decision, not a miss.", "@wellnessRecordedAsDecision": { "description": "Sheet action subtitle when marking a dose as skipped on purpose" }, "wellnessWhichDaysDue": "Which days it is due", "@wellnessWhichDaysDue": { "description": "Sheet action label to view/edit which days a medication is due" }, "wellnessRemoveMedTitle": "Remove {label}", "@wellnessRemoveMedTitle": { "description": "Sheet action label to remove a medication", "placeholders": { "label": { "type": "String" } } }, "wellnessRemoveMedBody": "It stops being scheduled. Marked doses stay.", "@wellnessRemoveMedBody": { "description": "Sheet action subtitle explaining removing a medication keeps marked doses" }, "wellnessRemoveMedConfirmTitle": "Remove {label}?", "@wellnessRemoveMedConfirmTitle": { "description": "Confirmation sheet title asking to remove a medication", "placeholders": { "label": { "type": "String" } } }, "wellnessRemoveMedConfirmBody": "It stops being scheduled and stops counting towards adherence. The doses you already marked stay.", "@wellnessRemoveMedConfirmBody": { "description": "Confirmation sheet body explaining medication removal stops scheduling and adherence counting but keeps marked doses" }, "wellnessMedHint": "Vitamin D", "@wellnessMedHint": { "description": "Placeholder example text in the add-medication name field" }, "wellnessNameLabel": "Name", "@wellnessNameLabel": { "description": "Text field label for entering a habit or medication name" }, "wellnessAdd": "Add", "@wellnessAdd": { "description": "Confirm button label in the add-name dialog" }, "wellnessEveryDay": "Every day", "@wellnessEveryDay": { "description": "Days-due summary meaning every day of the week" }, "wellnessWeekdays": "Weekdays", "@wellnessWeekdays": { "description": "Days-due summary meaning Monday through Friday" }, "wellnessWeekends": "Weekends", "@wellnessWeekends": { "description": "Days-due summary meaning Saturday and Sunday" }, "wellnessMon": "Mon", "@wellnessMon": { "description": "Abbreviated weekday name: Monday" }, "wellnessTue": "Tue", "@wellnessTue": { "description": "Abbreviated weekday name: Tuesday" }, "wellnessWed": "Wed", "@wellnessWed": { "description": "Abbreviated weekday name: Wednesday" }, "wellnessThu": "Thu", "@wellnessThu": { "description": "Abbreviated weekday name: Thursday" }, "wellnessFri": "Fri", "@wellnessFri": { "description": "Abbreviated weekday name: Friday" }, "wellnessSat": "Sat", "@wellnessSat": { "description": "Abbreviated weekday name: Saturday" }, "wellnessSun": "Sun", "@wellnessSun": { "description": "Abbreviated weekday name: Sunday" }, "wellnessWhenYouTakeIt": "When you take it", "@wellnessWhenYouTakeIt": { "description": "Heading in the medication schedule picker sheet" }, "wellnessChangeTheTime": "Change the time", "@wellnessChangeTheTime": { "description": "Accessibility label for the time picker row in the schedule sheet" }, "wellnessWhichDays": "WHICH DAYS", "@wellnessWhichDays": { "description": "All-caps section label in the schedule picker for choosing weekdays" }, "wellnessPickAtLeastOneDay": "Pick at least one day.", "@wellnessPickAtLeastOneDay": { "description": "Validation hint when no weekday is selected in the schedule picker" }, "wellnessDueDays": "Due {days}.", "@wellnessDueDays": { "description": "Schedule picker summary of which days the dose is due", "placeholders": { "days": { "type": "String" } } }, "wellnessMoreForMed": "More for {label}", "@wellnessMoreForMed": { "description": "Accessibility label for the overflow/more menu button on a medication row", "placeholders": { "label": { "type": "String" } } }, "wellnessMedAtTime": "{label} at {time}", "@wellnessMedAtTime": { "description": "Accessibility label for a medication dose row: the medication name and its scheduled time", "placeholders": { "label": { "type": "String" }, "time": { "type": "String" } } }, "wellnessStateTaken": "taken", "@wellnessStateTaken": { "description": "Dose state word: taken" }, "wellnessStateSkipped": "skipped", "@wellnessStateSkipped": { "description": "Dose state word: skipped" }, "wellnessStateNotTaken": "not taken", "@wellnessStateNotTaken": { "description": "Dose state word: not taken (missed)" }, "wellnessStateDueLater": "due later", "@wellnessStateDueLater": { "description": "Dose state word: due later (upcoming)" }, "wellnessMarkDone": "Mark done", "@wellnessMarkDone": { "description": "Accessibility label on an unchecked dose/habit check control" }, "wellnessWhatYouLogScreenTitle": "What you log", "@wellnessWhatYouLogScreenTitle": { "description": "Screen title for the journal findings detail screen" }, "wellnessNothingSeparatedTitle": "Nothing separated itself yet", "@wellnessNothingSeparatedTitle": { "description": "Status card title when no journal findings cleared statistical significance" }, "wellnessNothingSeparatedBody": "Everything you log is tested against your recovery, HRV, resting heart rate and sleep efficiency. Nothing has cleared the bar yet.", "@wellnessNothingSeparatedBody": { "description": "Status card body explaining what journal findings are tested against" }, "wellnessTheDaysYouDidIt": "The days you did it", "@wellnessTheDaysYouDidIt": { "description": "Section title for binary habit findings in journal findings" }, "wellnessHowMuchAndWhatFollowed": "How much, and what followed", "@wellnessHowMuchAndWhatFollowed": { "description": "Section title for numeric dose-response findings in journal findings" }, "wellnessLinkNeverCause": "A link on your own days — never a cause. The days you do a thing are days you were already that kind of day.", "@wellnessLinkNeverCause": { "description": "Disclaimer text below journal findings emphasizing correlation not causation" }, "wellnessWhichDayOfWeek": "Which day of the week", "@wellnessWhichDayOfWeek": { "description": "Section title for the weekday effect card" }, "wellnessHigher": "higher", "@wellnessHigher": { "description": "Direction word: higher, used when composing a finding sentence" }, "wellnessLower": "lower", "@wellnessLower": { "description": "Direction word: lower, used when composing a finding sentence" }, "wellnessHeadlineBinary": "On the {n} days you logged {field}, {outcome} ran {amount} {direction}", "@wellnessHeadlineBinary": { "description": "Finding headline for a binary (habit) journal field, e.g. 'On the 5 days you logged X, Y ran 3 higher'", "placeholders": { "n": { "type": "String" }, "field": { "type": "String" }, "outcome": { "type": "String" }, "amount": { "type": "String" }, "direction": { "type": "String" } } }, "wellnessHeadlineNoSlope": "On the {n} days you logged {field}, more of it went with {direction} {outcome}", "@wellnessHeadlineNoSlope": { "description": "Finding headline for a numeric field with only a rank correlation (no slope)", "placeholders": { "n": { "type": "String" }, "field": { "type": "String" }, "direction": { "type": "String" }, "outcome": { "type": "String" } } }, "wellnessHeadlineSlope": "On the {n} days you logged {field}, {outcome} ran {amount} {direction} per {step}", "@wellnessHeadlineSlope": { "description": "Finding headline for a numeric field with a per-unit slope", "placeholders": { "n": { "type": "String" }, "field": { "type": "String" }, "outcome": { "type": "String" }, "amount": { "type": "String" }, "direction": { "type": "String" }, "step": { "type": "String" } } }, "wellnessMatchedSameDay": "Matched against the same day's numbers.", "@wellnessMatchedSameDay": { "description": "Finding detail: the field was matched against the same day's numbers" }, "wellnessMatchedNightFollowed": "Matched against the night that followed.", "@wellnessMatchedNightFollowed": { "description": "Finding detail: the field was matched against the following night" }, "wellnessMatchedNightEnded": "Matched against the night that ended that morning.", "@wellnessMatchedNightEnded": { "description": "Finding detail: the field was matched against the night that just ended" }, "wellnessAgainstDaysYouDidNot": "Against the {n} days you did not", "@wellnessAgainstDaysYouDidNot": { "description": "Finding detail prefix comparing against days a habit was not done", "placeholders": { "n": { "type": "String" } } }, "wellnessRangeTo": "{lo} to {hi}", "@wellnessRangeTo": { "description": "Confidence interval range phrase, e.g. '0.10 to 0.40'", "placeholders": { "lo": { "type": "String" }, "hi": { "type": "String" } } }, "wellnessRankCorrelation": "Rank correlation {rho}{ci}. ", "@wellnessRankCorrelation": { "description": "Finding detail stating the rank correlation coefficient and its confidence interval", "placeholders": { "rho": { "type": "String" }, "ci": { "type": "String" } } }, "wellnessCaffeineCaveat": "This counts only your last caffeine of the day, so two cups and five look the same. A long, stressful day can bring both late coffee and a poor night.", "@wellnessCaffeineCaveat": { "description": "Extra caveat paragraph shown for the last-caffeine-of-day finding" }, "wellnessHourLater": "hour later", "@wellnessHourLater": { "description": "Unit phrase for caffeine timing slope, e.g. 'per hour later'" }, "wellnessPointUnit": "point", "@wellnessPointUnit": { "description": "Fallback singular unit word when a journal field has no unit" }, "wellnessNotEnoughWeeksTitle": "Not enough weeks yet", "@wellnessNotEnoughWeeksTitle": { "description": "Status card title when there is not yet enough data for the weekday effect" }, "wellnessNotEnoughWeeksBody": "Comparing seven weekdays needs at least eight weeks of days, with five of every weekday in them.", "@wellnessNotEnoughWeeksBody": { "description": "Status card body explaining the weekday effect needs eight weeks of data" }, "wellnessNoDayStandsOutTitle": "No day of the week stands out", "@wellnessNoDayStandsOutTitle": { "description": "Status card title when no weekday stands out as significant" }, "wellnessNoDayStandsOutBody": "No day stands apart from the other six once we account for having checked all seven.", "@wellnessNoDayStandsOutBody": { "description": "Status card body explaining no weekday cleared the multiple-comparison bar" }, "wellnessWeekdayHeadline": "{weekday}: recovery runs {delta} {direction} than your usual", "@wellnessWeekdayHeadline": { "description": "Finding headline naming which weekday's readiness differs from the median", "placeholders": { "weekday": { "type": "String" }, "delta": { "type": "String" }, "direction": { "type": "String" } } }, "wellnessWeekdayDetail": "From {n} of them. A weekday is not a cause — it is a container for what you do on it. Nothing here is advice.", "@wellnessWeekdayDetail": { "description": "Finding detail giving the sample size and the correlation-not-causation caveat for the weekday effect", "placeholders": { "n": { "type": "String" } } }, "wellnessPluralMonday": "Mondays", "@wellnessPluralMonday": { "description": "Plural weekday name used in the weekday-effect headline: Mondays" }, "wellnessPluralTuesday": "Tuesdays", "@wellnessPluralTuesday": { "description": "Plural weekday name used in the weekday-effect headline: Tuesdays" }, "wellnessPluralWednesday": "Wednesdays", "@wellnessPluralWednesday": { "description": "Plural weekday name used in the weekday-effect headline: Wednesdays" }, "wellnessPluralThursday": "Thursdays", "@wellnessPluralThursday": { "description": "Plural weekday name used in the weekday-effect headline: Thursdays" }, "wellnessPluralFriday": "Fridays", "@wellnessPluralFriday": { "description": "Plural weekday name used in the weekday-effect headline: Fridays" }, "wellnessPluralSaturday": "Saturdays", "@wellnessPluralSaturday": { "description": "Plural weekday name used in the weekday-effect headline: Saturdays" }, "wellnessPluralSunday": "Sundays", "@wellnessPluralSunday": { "description": "Plural weekday name used in the weekday-effect headline: Sundays" }, "sleepDetailNavTitle": "Sleep", "@sleepDetailNavTitle": { "description": "Nav bar title of the Sleep detail screen." }, "sleepDetailNoNightTitle": "No night to show", "@sleepDetailNoNightTitle": { "description": "Status card title when the stepped-to day has no night recorded." }, "sleepDetailNoNightBody": "No stretch of band recordings long enough to score.", "@sleepDetailNoNightBody": { "description": "Status card body explaining why there is no night." }, "sleepDetailNoNightFix": "Wear the band overnight and sync in the morning", "@sleepDetailNoNightFix": { "description": "Suggested fix line on the no-night status card." }, "sleepDetailStagesSection": "Stages", "@sleepDetailStagesSection": { "description": "Section header for the sleep stage breakdown." }, "sleepDetailVersusUsualSection": "Against your usual", "@sleepDetailVersusUsualSection": { "description": "Section header comparing last night to the user's own recent nights." }, "sleepDetailUnusualLastNight": "Unusual last night", "@sleepDetailUnusualLastNight": { "description": "Section header when the unusual-findings section is about last night." }, "sleepDetailUnusualOnDay": "Unusual on {day}", "@sleepDetailUnusualOnDay": { "description": "Section header when the unusual-findings section is about a past day, not last night.", "placeholders": { "day": { "type": "String" } } }, "sleepDetailOvernightSection": "Overnight signals", "@sleepDetailOvernightSection": { "description": "Section header for the overnight signal charts (HR, HRV, breathing, temp)." }, "sleepDetailTonightSection": "Tonight", "@sleepDetailTonightSection": { "description": "Section header for the one-takeaway sleep coaching card." }, "sleepDetailTotalSleep": "Total sleep", "@sleepDetailTotalSleep": { "description": "Caption under the big total-sleep-duration number." }, "sleepDetailInBed": "IN BED", "@sleepDetailInBed": { "description": "Inline metric label: time spent in bed." }, "sleepDetailWatched": "WATCHED", "@sleepDetailWatched": { "description": "Inline metric label: time the band actually recorded." }, "sleepDetailAsleepOfThat": "ASLEEP OF THAT", "@sleepDetailAsleepOfThat": { "description": "Inline metric label for asleep percentage when a 'watched' window is also shown." }, "sleepDetailAsleep": "ASLEEP", "@sleepDetailAsleep": { "description": "Inline metric label for asleep percentage (efficiency)." }, "sleepDetailWatchedExplain": "We watched {watched} of your {inBed} in bed; the rest is not a measurement. Asleep, and the stage shares below, are out of the time we watched.", "@sleepDetailWatchedExplain": { "description": "Explanatory sentence under the total-sleep card about the watched vs. in-bed window.", "placeholders": { "watched": { "type": "String" }, "inBed": { "type": "String" } } }, "sleepDetailWindowMine": "You set this window", "@sleepDetailWindowMine": { "description": "Label when the user has set/confirmed the sleep window themselves." }, "sleepDetailWindowFallback": "This window was inferred from heart rate", "@sleepDetailWindowFallback": { "description": "Label when the sleep window was inferred from heart rate as a fallback." }, "sleepDetailStagedByRing": "Staged by your device", "@sleepDetailStagedByRing": { "description": "Chip on a night whose window and stages came from the user's ring rather than our own detection." }, "sleepDetailWindowAuto": "This window was staged from the signals", "@sleepDetailWindowAuto": { "description": "Label when the sleep window was auto-staged from the signals." }, "sleepDetailWindowFallbackBody": "Staging could not find the edges, so the times are a best guess.", "@sleepDetailWindowFallbackBody": { "description": "Explanation shown under the fallback window label." }, "sleepDetailWindowSol": "From the start of your window to asleep: {band}.", "@sleepDetailWindowSol": { "description": "Sentence stating sleep-onset latency for a user-confirmed window.", "placeholders": { "band": { "type": "String" } } }, "sleepDetailConfirmTimes": "These times are right", "@sleepDetailConfirmTimes": { "description": "Button: confirm the inferred sleep window times are correct." }, "sleepDetailChangeTimes": "Change the times", "@sleepDetailChangeTimes": { "description": "Button: change an already user-set sleep window." }, "sleepDetailSetTimesMyself": "Set the times myself", "@sleepDetailSetTimesMyself": { "description": "Button: set the sleep window times manually for the first time." }, "sleepDetailBackToAutomatic": "Back to automatic", "@sleepDetailBackToAutomatic": { "description": "Button: revert a manual sleep window override back to automatic staging." }, "sleepDetailNotSleep": "Not sleep", "@sleepDetailNotSleep": { "description": "Button: reject this window entirely — it was not sleep at all." }, "sleepDetailEditNaps": "Naps", "@sleepDetailEditNaps": { "description": "Button: go to the Naps screen for this day, to log or remove a nap." }, "sleepDetailRejectedTitle": "Marked as not sleep", "@sleepDetailRejectedTitle": { "description": "Status card title for a night the user rejected outright as not sleep." }, "sleepDetailRejectedBody": "You told us this stretch was not sleep, so nothing is scored for it.", "@sleepDetailRejectedBody": { "description": "Status card body for a night the user rejected outright as not sleep." }, "sleepDetailUndoRejection": "Undo — go back to automatic", "@sleepDetailUndoRejection": { "description": "Button: undo a not-sleep rejection and return the day to automatic staging." }, "sleepDetailIWasAsleep": "I was asleep", "@sleepDetailIWasAsleep": { "description": "Button on a night with no sleep found: enter the bed and wake times yourself." }, "sleepDetailReanalysing": "Re-analysing the night…", "@sleepDetailReanalysing": { "description": "Progress label shown while the night is being re-derived after a window edit." }, "sleepDetailCorrectionFailedTitle": "That correction has not been applied", "@sleepDetailCorrectionFailedTitle": { "description": "Status card title when a sleep window correction failed to apply." }, "sleepDetailBedTimeHelp": "WHEN YOU GOT INTO BED", "@sleepDetailBedTimeHelp": { "description": "Help text on the time picker for when the user got into bed." }, "sleepDetailWakeTimeHelp": "WHEN YOU GOT UP", "@sleepDetailWakeTimeHelp": { "description": "Help text on the time picker for when the user got up." }, "sleepDetailReanalyseFailed": "The night wasn’t re-analysed; another run was busy or it failed. Your times are saved: open Your data and tap Re-analyze everything.", "sleepDetailWindowUnrecorded": "Your times are saved, but the band wasn’t recording for most of those hours (off your wrist or charging), so there’s no night to score.", "sleepDetailWindowNoSleep": "Your times are saved, but the band’s recordings for those hours show no sleep to score.", "sleepDetailNightUnrecorded": "Your heart rate shows a night’s sleep, but the band recorded too little movement data for most of it, so there’s no night to score.", "@sleepDetailNightUnrecorded": { "description": "Shown on an automatically detected night with no sleep, when heart rate found a night but the band recorded too little movement data across it to stage one." }, "@sleepDetailWindowUnrecorded": { "description": "Shown after the user set their own sleep window (e.g. \"I was asleep\") and the band recorded too little of it to stage a night." }, "@sleepDetailWindowNoSleep": { "description": "Shown after the user set their own sleep window and the band recorded it, but staging found no sleep in it." }, "sleepDetailCorrectionUnavailable": "This night’s detailed recordings are no longer on the phone, so its sleep can’t be corrected now.", "sleepDetailCorrectionEveningPruned": "The evening before this night is no longer on the phone, so only a bedtime after midnight, or Not sleep, can be applied.", "@sleepDetailCorrectionEveningPruned": { "description": "Shown on the oldest night still kept, or after a correction there was refused: the evening part of the night has been pruned, so a bedtime before midnight, confirming the detected times, or reverting to automatic cannot be applied." }, "@sleepDetailCorrectionUnavailable": { "description": "Shown instead of the sleep correction buttons, or after one was refused, when the night's raw recordings have been pruned and it can no longer be re-analysed." }, "@sleepDetailReanalyseFailed": { "description": "Fallback error message when re-analysis after a window edit could not be confirmed." }, "sleepDetailNoHypnogramTitle": "No hypnogram for this night", "@sleepDetailNoHypnogramTitle": { "description": "Status card title when no hypnogram data exists for the night." }, "sleepDetailNoHypnogramBody": "Staging needs movement and beat timing. One was missing.", "@sleepDetailNoHypnogramBody": { "description": "Status card body explaining why no hypnogram is available." }, "sleepDetailThroughTheNight": "Through the night", "@sleepDetailThroughTheNight": { "description": "Chart title for the hypnogram and the overnight signals chart." }, "sleepDetailUnitStage": "stage", "@sleepDetailUnitStage": { "description": "Unit label on the hypnogram chart frame." }, "sleepDetailTapDragCycles": "{n, plural, one{Tap or drag the chart for any moment. {n} cycle.} other{Tap or drag the chart for any moment. {n} cycles.}}", "@sleepDetailTapDragCycles": { "description": "Hint sentence under the hypnogram, stating the sleep-cycle count with no average available.", "placeholders": { "n": { "type": "int" } } }, "sleepDetailTapDragCyclesAvg": "{n, plural, one{Tap or drag the chart for any moment. {n} cycle, {avg} on average.} other{Tap or drag the chart for any moment. {n} cycles, {avg} on average.}}", "@sleepDetailTapDragCyclesAvg": { "description": "Hint sentence under the hypnogram, stating the sleep-cycle count and its average length.", "placeholders": { "n": { "type": "int" }, "avg": { "type": "String" } } }, "sleepDetailTapDragNone": "Tap or drag the chart for any moment of the night.", "@sleepDetailTapDragNone": { "description": "Hint sentence under the hypnogram when there were no complete sleep cycles." }, "sleepDetailNoWakeups": "No wake-ups of 5 minutes or more; shorter ones are invisible to a wrist.", "@sleepDetailNoWakeups": { "description": "Sentence describing a night with zero qualifying wake-ups." }, "sleepDetailAtLeastWakeups": "{n, plural, one{At least {n} wake-up of 5 minutes or more; shorter ones are invisible to a wrist.} other{At least {n} wake-ups of 5 minutes or more; shorter ones are invisible to a wrist.}}", "@sleepDetailAtLeastWakeups": { "description": "Sentence stating a floor count of wake-ups of 5+ minutes.", "placeholders": { "n": { "type": "int" } } }, "sleepDetailLongestStretch": "Longest unbroken stretch {longest}.", "@sleepDetailLongestStretch": { "description": "Sentence stating the longest unbroken sleep stretch of the night.", "placeholders": { "longest": { "type": "String" } } }, "sleepDetailHypnogramLabel": "Hypnogram", "@sleepDetailHypnogramLabel": { "description": "Accessibility label for the hypnogram scrubber control." }, "sleepDetailPercentThroughNight": "{pct}% through the night", "@sleepDetailPercentThroughNight": { "description": "Screen-reader description of scrub position when the night's clock times are unknown.", "placeholders": { "pct": { "type": "int" } } }, "sleepDetailNotMeasured": "not measured", "@sleepDetailNotMeasured": { "description": "Lowercase, mid-sentence: describes an instant the band was not recording, used in the scrubber's spoken description." }, "sleepDetailScrubAt": "{at}, {stage}", "@sleepDetailScrubAt": { "description": "Combines the scrubbed time and the stage/measurement state into one spoken sentence.", "placeholders": { "at": { "type": "String" }, "stage": { "type": "String" } } }, "sleepDetailHeartRate": "Heart rate", "@sleepDetailHeartRate": { "description": "Label for the heart-rate signal, used as a metric label and as a chart lane legend." }, "sleepDetailHrv": "HRV", "@sleepDetailHrv": { "description": "Label for the heart-rate-variability signal." }, "sleepDetailBreathing": "Breathing", "@sleepDetailBreathing": { "description": "Label for the breathing-rate signal (title case)." }, "sleepDetailTemp": "Temp", "@sleepDetailTemp": { "description": "Short label for skin temperature in the scrub readout card." }, "sleepDetailTempRelative": "Temp (rel.)", "@sleepDetailTempRelative": { "description": "Short label for the scrub readout card's skin-temperature value, which is a relative sensor deviation from that day's median, not degrees. Keep the 'relative' meaning." }, "sleepDetailNotMeasuredCap": "Not measured", "@sleepDetailNotMeasuredCap": { "description": "Capitalized, standalone label shown in place of a stage pill when the instant was not recorded." }, "sleepDetailNoSignalAtMoment": "No signal recorded at this moment.", "@sleepDetailNoSignalAtMoment": { "description": "Message shown in the scrub card when no signal is available at the scrubbed instant." }, "sleepDetailStageAwake": "Awake", "@sleepDetailStageAwake": { "description": "Sleep stage name: Awake." }, "sleepDetailStageRem": "REM", "@sleepDetailStageRem": { "description": "Sleep stage name: REM." }, "sleepDetailStageLight": "Light sleep", "@sleepDetailStageLight": { "description": "Sleep stage name: Light sleep." }, "sleepDetailStageDeep": "Deep sleep", "@sleepDetailStageDeep": { "description": "Sleep stage name: Deep sleep." }, "sleepDetailDeep": "Deep", "@sleepDetailDeep": { "description": "Short row label for deep sleep in the stage breakdown table." }, "sleepDetailLight": "Light", "@sleepDetailLight": { "description": "Short row label for light sleep in the stage breakdown table." }, "sleepDetailNoStageSplitTitle": "No stage split for this night", "@sleepDetailNoStageSplitTitle": { "description": "Status card title when no stage breakdown could be computed." }, "sleepDetailNoStageSplitBody": "No beat timing across the whole window.", "@sleepDetailNoStageSplitBody": { "description": "Status card body explaining why no stage breakdown is available." }, "sleepDetailStageRangeExplain": "Each stage is a range, narrower the better we saw the night. Deep is the widest; awake is one figure. Nerd stats has exact counts.", "@sleepDetailStageRangeExplain": { "description": "Explanatory footnote under the stage breakdown table about ranges vs. counts." }, "sleepDetailTimeAsleep": "Time asleep", "@sleepDetailTimeAsleep": { "description": "Row label in the 'against your usual' comparison: total time asleep." }, "sleepDetailAskEnough": "Did you sleep enough?", "@sleepDetailAskEnough": { "description": "Against-your-usual row for time asleep, phrased as a plain question." }, "sleepDetailAskDeep": "Did you get your usual deep sleep?", "@sleepDetailAskDeep": { "description": "Against-your-usual row for deep sleep, phrased as a plain question." }, "sleepDetailAskSleptThrough": "Did you sleep through your time in bed?", "@sleepDetailAskSleptThrough": { "description": "Against-your-usual row for sleep efficiency (asleep while in bed), phrased as a plain question." }, "sleepDetailAskOnTime": "Did you fall asleep at your usual time?", "@sleepDetailAskOnTime": { "description": "Against-your-usual row for sleep onset time, phrased as a plain question." }, "sleepDetailShorterThanUsual": "shorter than usual", "@sleepDetailShorterThanUsual": { "description": "Verdict phrase: this night's sleep duration was shorter than usual." }, "sleepDetailLongerThanUsual": "longer than usual", "@sleepDetailLongerThanUsual": { "description": "Verdict phrase: this night's sleep duration was longer than usual." }, "sleepDetailLessThanUsual": "less than usual", "@sleepDetailLessThanUsual": { "description": "Verdict phrase: this night's deep sleep was less than usual." }, "sleepDetailMoreThanUsual": "more than usual", "@sleepDetailMoreThanUsual": { "description": "Verdict phrase: this night's deep sleep was more than usual." }, "sleepDetailAsleepWhileInBed": "Asleep while in bed", "@sleepDetailAsleepWhileInBed": { "description": "Row label in the 'against your usual' comparison: sleep efficiency." }, "sleepDetailLowerThanUsual": "lower than usual", "@sleepDetailLowerThanUsual": { "description": "Verdict phrase: sleep efficiency was lower than usual." }, "sleepDetailHigherThanUsual": "higher than usual", "@sleepDetailHigherThanUsual": { "description": "Verdict phrase: sleep efficiency was higher than usual." }, "sleepDetailPointsDelta": "{n} percentage points", "@sleepDetailPointsDelta": { "description": "Verdict prefix: how far sleep efficiency was from the usual median, in percentage points; followed by the lower/higher-than-usual phrase.", "placeholders": { "n": { "type": "String" } } }, "sleepDetailFellAsleep": "Fell asleep", "@sleepDetailFellAsleep": { "description": "Row label in the 'against your usual' comparison: sleep onset time." }, "sleepDetailEarlierThanUsual": "earlier than usual", "@sleepDetailEarlierThanUsual": { "description": "Verdict phrase: fell asleep earlier than usual." }, "sleepDetailLaterThanUsual": "later than usual", "@sleepDetailLaterThanUsual": { "description": "Verdict phrase: fell asleep later than usual." }, "sleepDetailNotEnoughNightsTitle": "Not enough nights to compare", "@sleepDetailNotEnoughNightsTitle": { "description": "Status card title when there is not yet enough history to compare against." }, "sleepDetailNightsSoFar": "{have} of {min} nights so far", "@sleepDetailNightsSoFar": { "description": "Progress line: how many nights of history exist versus the minimum needed.", "placeholders": { "have": { "type": "int" }, "min": { "type": "int" } } }, "sleepDetailBarExplain": "The bar is the middle half of your own nights.", "@sleepDetailBarExplain": { "description": "Footnote explaining that the comparison bar is the user's own middle-50% range." }, "sleepDetailLessThanAny": "{noun} {value} — less than any of your last {count} nights, the lowest of which was {lowest}.", "@sleepDetailLessThanAny": { "description": "Insight card body: a measure was the lowest across the recent-night history.", "placeholders": { "noun": { "type": "String" }, "value": { "type": "String" }, "count": { "type": "int" }, "lowest": { "type": "String" } } }, "sleepDetailMoreThanAny": "{noun} {value} — more than any of your last {count} nights, the highest of which was {highest}.", "@sleepDetailMoreThanAny": { "description": "Insight card body: a measure was the highest across the recent-night history.", "placeholders": { "noun": { "type": "String" }, "value": { "type": "String" }, "count": { "type": "int" }, "highest": { "type": "String" } } }, "sleepDetailYouSlept": "You slept", "@sleepDetailYouSlept": { "description": "Noun phrase used as the subject of the total-sleep-duration extreme sentence, e.g. 'You slept 5h 10m'." }, "sleepDetailShortestNightLately": "Your shortest night lately", "@sleepDetailShortestNightLately": { "description": "Insight card title: shortest night in the recent record." }, "sleepDetailLongestNightLately": "Your longest night lately", "@sleepDetailLongestNightLately": { "description": "Insight card title: longest night in the recent record." }, "sleepDetailSleepingHrHighTitle": "Sleeping heart rate ran high", "@sleepDetailSleepingHrHighTitle": { "description": "Insight card title: sleeping heart rate was elevated versus baseline." }, "sleepDetailSleepingHrHighBody": "{bpm} bpm above your usual. Common after alcohol, a late meal, a hard session or an infection starting. A measurement, not a diagnosis.", "@sleepDetailSleepingHrHighBody": { "description": "Insight card body explaining the elevated sleeping heart rate.", "placeholders": { "bpm": { "type": "String" } } }, "sleepDetailNothingStoodOut": "Nothing stood out.", "@sleepDetailNothingStoodOut": { "description": "Reassurance line shown when nothing unusual was found in the night." }, "sleepDetailSleepingHr": "SLEEPING HR", "@sleepDetailSleepingHr": { "description": "All-caps inline metric label: average sleeping heart rate." }, "sleepDetailLowest": "LOWEST", "@sleepDetailLowest": { "description": "All-caps inline metric label: lowest heart rate reached overnight." }, "sleepDetailBreathingCaps": "BREATHING", "@sleepDetailBreathingCaps": { "description": "All-caps inline metric label for breathing rate summary." }, "sleepDetailSkinTemp": "Skin temp", "@sleepDetailSkinTemp": { "description": "Chart lane legend label for skin temperature." }, "sleepDetailSleepNeedNotEstablished": "Sleep need not established", "@sleepDetailSleepNeedNotEstablished": { "description": "Status card title when sleep need has not yet been established." }, "sleepDetailYourNeedIs": "Your need is {need}", "@sleepDetailYourNeedIs": { "description": "Reason fragment stating the user's computed sleep need.", "placeholders": { "need": { "type": "String" } } }, "sleepDetailYouAreDown": "you are {debt} down", "@sleepDetailYouAreDown": { "description": "Reason fragment stating how far behind the user's sleep debt is.", "placeholders": { "debt": { "type": "String" } } }, "sleepDetailLightsOut": "lights out", "@sleepDetailLightsOut": { "description": "Small caption under the recommended bedtime clock time." }, "sleepDetailToAimFor": "to aim for", "@sleepDetailToAimFor": { "description": "Small caption under the sleep-need duration when no bedtime is recommended." }, "sleepDetailNoPersonalRangeYet": "No personal range yet — {count} of {min} nights.", "@sleepDetailNoPersonalRangeYet": { "description": "Message shown on a comparison row before enough personal history exists.", "placeholders": { "count": { "type": "int" }, "min": { "type": "int" } } }, "sleepDetailNotFarEnoughToCall": "Not far enough from usual to call", "@sleepDetailNotFarEnoughToCall": { "description": "Verdict phrase when a fuzzy measurement's interval overlaps the usual band." }, "sleepDetailTypicalForYou": "Typical for you", "@sleepDetailTypicalForYou": { "description": "Verdict phrase when a measured value falls within the user's usual range." }, "sleepDetailVerdictSummary": "{verdict} · usual {lo}–{hi} over {n} nights", "@sleepDetailVerdictSummary": { "description": "Footnote combining the verdict phrase with the usual range and night count.", "placeholders": { "verdict": { "type": "String" }, "lo": { "type": "String" }, "hi": { "type": "String" }, "n": { "type": "int" } } }, "sleepDetailNoOvernightTitle": "No overnight signal lines", "@sleepDetailNoOvernightTitle": { "description": "Status card title when no overnight signal lines were recorded." }, "sleepDetailNoOvernightBody": "No overnight recordings reached this day.", "@sleepDetailNoOvernightBody": { "description": "Status card body explaining why no overnight signals exist." }, "sleepDetailSolUnder15": "under 15 minutes", "@sleepDetailSolUnder15": { "description": "Sleep-onset-latency band label for under 15 minutes." }, "sleepDetailSolOverHour": "over an hour", "@sleepDetailSolOverHour": { "description": "Sleep-onset-latency band label for over an hour." }, "sleepDetailSolRange": "{lo}–{hi} minutes", "@sleepDetailSolRange": { "description": "15-minute sleep-onset-latency band label, e.g. '15–30 minutes'.", "placeholders": { "lo": { "type": "int" }, "hi": { "type": "int" } } }, "workoutTabForYou": "For you", "@workoutTabForYou": { "description": "Workout screen sub-tab label" }, "workoutTabActivities": "Activities", "@workoutTabActivities": { "description": "Workout screen sub-tab label" }, "workoutTabHistory": "History", "@workoutTabHistory": { "description": "Workout screen sub-tab label" }, "workoutScreenTitle": "Workout", "@workoutScreenTitle": { "description": "Workout screen title" }, "workoutStartSessionLabel": "START A SESSION", "@workoutStartSessionLabel": { "description": "Hero start card label on For You tab" }, "workoutActivitiesNoun": "activities", "@workoutActivitiesNoun": { "description": "Noun used beside the activity count on the start card" }, "workoutThisWeek": "This week", "@workoutThisWeek": { "description": "Section header and stat label for the current week" }, "workoutTrainingLoad": "Training load", "@workoutTrainingLoad": { "description": "Section header over the fitness/fatigue card" }, "metricHeartEffortTitle": "Heart effort", "@metricHeartEffortTitle": { "description": "Title of the per-day heart-rate effort chart (time in each zone, harder zones weighted more). Daily, so not called training load." }, "workoutTodaysStrainAction": "Today's strain", "@workoutTodaysStrainAction": { "description": "Link action under Training load section, opens day strain detail" }, "workoutMechanicalLoadTitle": "Mechanical load", "@workoutMechanicalLoadTitle": { "description": "Chart title for weekly strength tonnage" }, "workoutKgLiftedUnit": "kg lifted", "@workoutKgLiftedUnit": { "description": "Unit label on the tonnage chart" }, "workoutTonnageFootnoteIntro": "Reps × load over the sets you logged with a weight. ", "@workoutTonnageFootnoteIntro": { "description": "First sentence of the tonnage chart footnote" }, "workoutTonnageFootnotePartial": "Sets logged without one are not in it, so this is a floor rather than a total. ", "@workoutTonnageFootnotePartial": { "description": "Conditional clause inserted into the tonnage footnote when some sets had no weight" }, "workoutTonnageFootnoteOutro": "Exact for what you typed and worthless across exercises — kept out of strain and recovery for that reason.", "@workoutTonnageFootnoteOutro": { "description": "Closing sentence of the tonnage chart footnote" }, "workoutOverreachHeadline": "Your last 7 days of load are {ratio}× your usual six weeks, and resting heart rate ran high on {nightsElevated} of {nightsConsidered} nights.", "@workoutOverreachHeadline": { "description": "Overreach coincidence card headline, ratio is a formatted decimal string", "placeholders": { "ratio": { "type": "String" }, "nightsElevated": { "type": "int" }, "nightsConsidered": { "type": "int" } } }, "workoutOverreachBody": "Two measurements pointing the same way. Illness, travel, altitude, alcohol or poor sleep can all cause this, and nothing here tells them apart.", "@workoutOverreachBody": { "description": "Overreach coincidence card body text" }, "workoutNoLoadTitle": "No training load yet", "@workoutNoLoadTitle": { "description": "StatusCard title when fitness/fatigue has not computed yet" }, "workoutNoLoadBody": "Fitness and fatigue are 42-day and 7-day averages. They need about two weeks of sessions.", "@workoutNoLoadBody": { "description": "Default StatusCard body when fitness/fatigue has not computed yet" }, "workoutFitnessLabel": "fitness", "@workoutFitnessLabel": { "description": "Small caption under the CTL number on the load card" }, "workoutDailyLoadTitle": "Heart effort by day", "@workoutDailyLoadTitle": { "description": "Chart title for daily TRIMP" }, "workoutTrimpUnit": "points", "@workoutTrimpUnit": { "description": "Chart unit label, training-impulse acronym" }, "workoutDailyLoadFootnoteIntro": "Heart points with no cap: minutes in each heart-rate zone, harder zones counting more. Strain reads the same heart rate on a 0–21 scale. ", "@workoutDailyLoadFootnoteIntro": { "description": "First sentence of the daily load chart footnote" }, "workoutDailyLoadAllDays": "Last seven days.", "@workoutDailyLoadAllDays": { "description": "Daily load footnote when all seven days have data" }, "workoutDailyLoadPartialDays": "{days} of the last seven days produced a figure.", "@workoutDailyLoadPartialDays": { "description": "Daily load footnote when only some of the last seven days have data", "placeholders": { "days": { "type": "int" } } }, "workoutFatigueLabel": "Fatigue", "@workoutFatigueLabel": { "description": "Inline metric label on the load card" }, "workoutFormLabel": "Form", "@workoutFormLabel": { "description": "Inline metric label on the load card" }, "workoutNotYet": "Not yet", "@workoutNotYet": { "description": "Placeholder value when fatigue/form has not computed" }, "workoutFormFresh": "Fresh", "@workoutFormFresh": { "description": "Coggan form band name" }, "workoutFormSteady": "Steady", "@workoutFormSteady": { "description": "Coggan form band name" }, "workoutFormBuilding": "Building", "@workoutFormBuilding": { "description": "Coggan form band name" }, "workoutFormOverreaching": "Overreaching", "@workoutFormOverreaching": { "description": "Coggan form band name" }, "workoutSearchActivitiesLabel": "Search activities", "@workoutSearchActivitiesLabel": { "description": "Semantic label on the activity search bar" }, "workoutSearchActivitiesCount": "{count, plural, one{Search {count} activity} other{Search {count} activities}}", "@workoutSearchActivitiesCount": { "description": "Search bar placeholder text showing the catalogue size", "placeholders": { "count": { "type": "int" } } }, "workoutQuickStartHeader": "QUICK START", "@workoutQuickStartHeader": { "description": "Section header over the quick-start activity tiles" }, "workoutCalorieNeedWeightTitle": "Calorie estimates need your weight", "@workoutCalorieNeedWeightTitle": { "description": "StatusCard title shown when profile has no weight set" }, "workoutAddWeightFix": "Add weight in profile", "@workoutAddWeightFix": { "description": "Fix action label on the missing-weight card" }, "workoutCalorieEstimatesTitle": "Calorie figures are estimates", "@workoutCalorieEstimatesTitle": { "description": "StatusCard title reminding calories are estimated" }, "workoutSuggestionsTitle": "{n, plural, one{{n} effort we spotted but did not log} other{{n} efforts we spotted but did not log}}", "@workoutSuggestionsTitle": { "description": "Title of the detected-but-unlogged effort card on History", "placeholders": { "n": { "type": "int" } } }, "workoutSuggestionsBody": "The band saw sustained work and nothing was started for it. Nothing is logged until you say so.", "@workoutSuggestionsBody": { "description": "Body text on the detected-but-unlogged effort card" }, "workoutReviewFix": "{n, plural, one{Review it} other{Review them}}", "@workoutReviewFix": { "description": "Fix action label on the detected-but-unlogged effort card", "placeholders": { "n": { "type": "int" } } }, "workoutLogPastTitle": "Did something the band missed?", "@workoutLogPastTitle": { "description": "Title of the log-a-past-workout card" }, "workoutLogPastBody": "Enter the times yourself and it is scored from the heart rate recorded across them, like any other session.", "@workoutLogPastBody": { "description": "Body text of the log-a-past-workout card" }, "workoutLogPastFix": "Log a past workout", "@workoutLogPastFix": { "description": "Fix action label on the log-a-past-workout card" }, "workoutNoSessionsTitle": "No sessions recorded yet", "@workoutNoSessionsTitle": { "description": "Empty-state title on History tab" }, "workoutNoSessionsBody": "Sessions appear here once you start one.", "@workoutNoSessionsBody": { "description": "Empty-state body on History tab" }, "workoutStartWorkoutFix": "Start a workout", "@workoutStartWorkoutFix": { "description": "Fix action label on the empty History state" }, "workoutTrackedLabel": "Tracked", "@workoutTrackedLabel": { "description": "Summary stat tile label, total sessions tracked" }, "workoutWeeklyLoadLabel": "Weekly load", "@workoutWeeklyLoadLabel": { "description": "Summary stat tile label, this week's strain load" }, "workoutNoneLabel": "None", "@workoutNoneLabel": { "description": "Summary stat tile value when weekly load is absent" }, "workoutImportedThisWeekNote": "{count} of this week’s sessions came from {storeName}. They count here, but not in weekly load: they arrived without heart rate.", "@workoutImportedThisWeekNote": { "description": "Explanatory note under the weekly summary row when some sessions were imported", "placeholders": { "count": { "type": "int" }, "storeName": { "type": "String" } } }, "workoutAutoImportOnLabel": "Auto-import on. Tap to turn off.", "@workoutAutoImportOnLabel": { "description": "Semantic label on the auto-import toggle when on" }, "workoutAutoImportOffLabel": "Auto-import off. Tap to turn on.", "@workoutAutoImportOffLabel": { "description": "Semantic label on the auto-import toggle when off" }, "workoutImportFromStore": "Import from {storeName}", "@workoutImportFromStore": { "description": "Import card row title naming the health store", "placeholders": { "storeName": { "type": "String" } } }, "workoutFetchNowLabel": "Fetch workouts now", "@workoutFetchNowLabel": { "description": "Semantic label on the manual refresh icon" }, "workoutImportDenied": "{storeName} did not grant workouts. Nothing was read.", "@workoutImportDenied": { "description": "Import status note when the health store denies permission", "placeholders": { "storeName": { "type": "String" } } }, "workoutImportEmpty": "Nothing came back. {storeName} holds no workouts inside the window it will share.", "@workoutImportEmpty": { "description": "Import status note when the health store has nothing to sync", "placeholders": { "storeName": { "type": "String" } } }, "workoutImportNoRoutes": " {storeName} will not share routes, so none have coordinates.", "@workoutImportNoRoutes": { "description": "Import result clause when the store cannot share GPS routes at all", "placeholders": { "storeName": { "type": "String" } } }, "workoutImportNoneWithRoute": " None of them had a route recorded.", "@workoutImportNoneWithRoute": { "description": "Import result clause when routes are supported but none of the imported workouts had one" }, "workoutImportSomeWithRoute": " {count} came with a route.", "@workoutImportSomeWithRoute": { "description": "Import result clause reporting how many imported workouts had a route", "placeholders": { "count": { "type": "int" } } }, "workoutImportBroughtIn": "{count, plural, one{{count} workout brought in.} other{{count} workouts brought in.}}", "@workoutImportBroughtIn": { "description": "Import result headline reporting how many workouts were imported", "placeholders": { "count": { "type": "int" } } }, "workoutImportFailed": "Failed: {error}", "@workoutImportFailed": { "description": "Import status note when the sync throws", "placeholders": { "error": { "type": "String" } } }, "workoutMorningAfterTitle": "The morning after", "@workoutMorningAfterTitle": { "description": "Section header over the session-cost history" }, "workoutMorningAfterBody": "Your own history, not a rule about the activity — these mornings also had whatever evening came with them. Nothing here is a reason to skip a session.", "@workoutMorningAfterBody": { "description": "Disclaimer under the morning-after rows" }, "workoutAfterActivity": "After {name}", "@workoutAfterActivity": { "description": "Morning-after row label naming the activity type", "placeholders": { "name": { "type": "String" } } }, "workoutUnchangedLabel": "Unchanged", "@workoutUnchangedLabel": { "description": "Morning-after row value when the effect is inside noise" }, "workoutRestingHeartRateLabel": "Resting heart rate", "@workoutRestingHeartRateLabel": { "description": "Morning-after row sub-label for the RHR metric" }, "workoutHrvLabel": "HRV", "@workoutHrvLabel": { "description": "Morning-after row sub-label for the HRV metric" }, "workoutMorningCount": "{n, plural, one{{n} morning} other{{n} mornings}}", "@workoutMorningCount": { "description": "Sample-size count in the morning-after row sub-label", "placeholders": { "n": { "type": "int" } } }, "workoutInsideRangeSuffix": " · inside your night-to-night range", "@workoutInsideRangeSuffix": { "description": "Suffix appended to a morning-after row when the effect does not exceed MDC" }, "workoutDeleteSessionLabel": "Delete this session", "@workoutDeleteSessionLabel": { "description": "Semantic label on the history row delete icon" }, "workoutStrainLabel": "strain", "@workoutStrainLabel": { "description": "Small caption beside the strain number on a history row" }, "workoutTimeInZonesTitle": "Time in zones", "@workoutTimeInZonesTitle": { "description": "Chart title on the history row zone bar" }, "workoutFixTimesOnSessionLabel": "Fix the times on this session", "@workoutFixTimesOnSessionLabel": { "description": "Semantic label on the retime control of a history row" }, "workoutFixTimes": "Fix the times", "@workoutFixTimes": { "description": "Retime button text on a history row, and title of the retime screen" }, "workoutTimeStatLabel": "Time", "@workoutTimeStatLabel": { "description": "Session stat row label for duration" }, "workoutDistanceStatLabel": "Distance", "@workoutDistanceStatLabel": { "description": "Session stat row label for distance" }, "workoutCaloriesStatLabel": "Calories", "@workoutCaloriesStatLabel": { "description": "Session stat row label for calories" }, "workoutNotCostedValue": "Not costed", "@workoutNotCostedValue": { "description": "Session stat row value when calories were not estimated" }, "workoutMaxHrStatLabel": "Max HR", "@workoutMaxHrStatLabel": { "description": "Session stat row label for peak heart rate" }, "workoutNoReadingValue": "No reading", "@workoutNoReadingValue": { "description": "Session stat row value when the band recorded nothing" }, "workoutConfirmDeleteTitle": "Delete this {activity}?", "@workoutConfirmDeleteTitle": { "description": "Confirm-delete dialog title naming the session's activity type", "placeholders": { "activity": { "type": "String" } } }, "workoutDeleteBodyOwn": "It disappears from OpenStrap. A copy in {storeName}, if there is one, stays where it is.", "@workoutDeleteBodyOwn": { "description": "Confirm-delete dialog body for a session this band recorded", "placeholders": { "storeName": { "type": "String" } } }, "workoutDeleteBodyImported": "It disappears from OpenStrap and will not be re-imported. The original in {storeName} stays.", "@workoutDeleteBodyImported": { "description": "Confirm-delete dialog body for an imported session", "placeholders": { "storeName": { "type": "String" } } }, "workoutWhenToday": "Today, {time}", "@workoutWhenToday": { "description": "History row timestamp for a session started today", "placeholders": { "time": { "type": "String" } } }, "workoutWhenYesterday": "Yesterday, {time}", "@workoutWhenYesterday": { "description": "History row timestamp for a session started yesterday", "placeholders": { "time": { "type": "String" } } }, "workoutWeekdayLetterMon": "M", "@workoutWeekdayLetterMon": { "description": "Single-letter weekday abbreviation (Mon) used in the This-week strip and small charts" }, "workoutWeekdayLetterTue": "T", "@workoutWeekdayLetterTue": { "description": "Single-letter weekday abbreviation (Tue) used in the This-week strip and small charts" }, "workoutWeekdayLetterWed": "W", "@workoutWeekdayLetterWed": { "description": "Single-letter weekday abbreviation (Wed) used in the This-week strip and small charts" }, "workoutWeekdayLetterThu": "T", "@workoutWeekdayLetterThu": { "description": "Single-letter weekday abbreviation (Thu) used in the This-week strip and small charts" }, "workoutWeekdayLetterFri": "F", "@workoutWeekdayLetterFri": { "description": "Single-letter weekday abbreviation (Fri) used in the This-week strip and small charts" }, "workoutWeekdayLetterSat": "S", "@workoutWeekdayLetterSat": { "description": "Single-letter weekday abbreviation (Sat) used in the This-week strip and small charts" }, "workoutWeekdayLetterSun": "S", "@workoutWeekdayLetterSun": { "description": "Single-letter weekday abbreviation (Sun) used in the This-week strip and small charts" }, "workoutWeekdayAbbrMon": "Mon", "@workoutWeekdayAbbrMon": { "description": "Three-letter weekday abbreviation (Mon) used in the History row date" }, "workoutWeekdayAbbrTue": "Tue", "@workoutWeekdayAbbrTue": { "description": "Three-letter weekday abbreviation (Tue) used in the History row date" }, "workoutWeekdayAbbrWed": "Wed", "@workoutWeekdayAbbrWed": { "description": "Three-letter weekday abbreviation (Wed) used in the History row date" }, "workoutWeekdayAbbrThu": "Thu", "@workoutWeekdayAbbrThu": { "description": "Three-letter weekday abbreviation (Thu) used in the History row date" }, "workoutWeekdayAbbrFri": "Fri", "@workoutWeekdayAbbrFri": { "description": "Three-letter weekday abbreviation (Fri) used in the History row date" }, "workoutWeekdayAbbrSat": "Sat", "@workoutWeekdayAbbrSat": { "description": "Three-letter weekday abbreviation (Sat) used in the History row date" }, "workoutWeekdayAbbrSun": "Sun", "@workoutWeekdayAbbrSun": { "description": "Three-letter weekday abbreviation (Sun) used in the History row date" }, "activitySetupRouteLabel": "Route", "@activitySetupRouteLabel": { "description": "Label for the GPS route row on the activity setup screen" }, "activitySetupRouteDetail": "Recorded if location is available, and kept on this phone", "@activitySetupRouteDetail": { "description": "Detail text under the route row on the activity setup screen" }, "activitySetupHeartRateLabel": "Heart rate", "@activitySetupHeartRateLabel": { "description": "Label for the heart rate row on the activity setup screen" }, "activitySetupBandConnected": "Band connected", "@activitySetupBandConnected": { "description": "Detail text when the band is connected, shown under the heart rate row" }, "activitySetupNoBandConnected": "No band connected", "@activitySetupNoBandConnected": { "description": "Detail text when no band is connected, shown under the heart rate row" }, "activitySetupPrivateLabel": "Private session", "@activitySetupPrivateLabel": { "description": "Label for the private-session toggle on the activity setup screen" }, "activitySetupWorkLabel": "Work", "@activitySetupWorkLabel": { "description": "Label for the work-interval stepper on the interval activity setup screen" }, "activitySetupRestLabel": "Rest", "@activitySetupRestLabel": { "description": "Label for the rest-interval stepper on the interval activity setup screen" }, "activitySetupRoundsLabel": "Rounds", "@activitySetupRoundsLabel": { "description": "Label for the round-count stepper on the interval activity setup screen" }, "activitySetupPrivateDetail": "Hidden from summaries and exports", "@activitySetupPrivateDetail": { "description": "Detail text under the private-session toggle" }, "activitySetupCaloriesNeedWeight": "Calories need your weight.", "@activitySetupCaloriesNeedWeight": { "description": "Shown instead of a calorie estimate when the user has no weight on file" }, "activitySetupNoMetEstimate": "No estimate up front: this activity has no published effort level. Calories come from heart rate once your profile and heart-rate range are known.", "@activitySetupNoMetEstimate": { "description": "Shown instead of a calorie estimate when the activity has no published MET (e.g. General workout, Padel)" }, "activitySummaryCalorieNoMet": "Estimated from your heart rate and weight. This activity has no published effort level, so none is used.", "@activitySummaryCalorieNoMet": { "description": "Calorie basis line on the summary screen for a session whose activity has no published MET (e.g. General workout, Padel)" }, "activitySetupCalorieEstimate": "About {est} kcal per {minutes} min, from the activity's effort level ({met}× resting) and your weight.", "@activitySetupCalorieEstimate": { "description": "Calorie estimate line on the activity setup screen, e.g. 'About 250 kcal per 30 min, from 8.0 MET and your weight.'", "placeholders": { "est": { "type": "int" }, "minutes": { "type": "int" }, "met": { "type": "String" } } }, "activitySetupTrackSets": "Sets, reps and load — logged by you", "@activitySetupTrackSets": { "description": "What this session type will record — strength training tracked by sets" }, "activitySetupTrackDistanceGps": "Distance, pace and heart rate", "@activitySetupTrackDistanceGps": { "description": "What this session type will record — distance-based activity with GPS" }, "activitySetupTrackTime": "Time and heart rate", "@activitySetupTrackTime": { "description": "What this session type will record — time-based activity" }, "activitySetupTrackInterval": "Rounds and heart rate", "@activitySetupTrackInterval": { "description": "What this session type will record — interval/rounds-based activity" }, "activitySetupTrackStillness": "Time, breathing and heart rate", "@activitySetupTrackStillness": { "description": "What this session type will record — stillness activity like yoga or breathwork" }, "activitySetupSessionRunningTitle": "A session is already running", "@activitySetupSessionRunningTitle": { "description": "Status card title when the user tries to start a session while one is already live" }, "activitySetupSessionRunningBody": "Only one can be live at a time.", "@activitySetupSessionRunningBody": { "description": "Status card body when the user tries to start a session while one is already live" }, "activitySetupOpenRunningSession": "Open the running session", "@activitySetupOpenRunningSession": { "description": "Status card action button to jump to the already-running session" }, "activitySetupStart": "Start", "@activitySetupStart": { "description": "Button label to start a new activity session" }, "activityPickerTitle": "Choose activity", "@activityPickerTitle": { "description": "Nav bar title on the activity picker screen" }, "activityPickerSearchLabel": "Search activities", "@activityPickerSearchLabel": { "description": "Accessibility label for the activity search field" }, "activityPickerSearchHint": "Search {count} activities", "@activityPickerSearchHint": { "description": "Placeholder hint in the activity search field, e.g. 'Search 73 activities'", "placeholders": { "count": { "type": "int" } } }, "activityPickerNoMatchTitle": "No activity matches that", "@activityPickerNoMatchTitle": { "description": "Status card title when a search finds no matching activity" }, "activityPickerNoMatchBody": "The catalogue covers about seventy activities with a published energy cost. Pick the closest one.", "@activityPickerNoMatchBody": { "description": "Status card body when a search finds no matching activity" }, "activityPickerQuickStart": "QUICK START", "@activityPickerQuickStart": { "description": "Section heading over the quick-start row when the user has no activity history" }, "activityPickerRecent": "RECENT", "@activityPickerRecent": { "description": "Section heading over the recent-activities row" }, "activityPickerCalorieEstimatesTitle": "Calorie figures are estimates", "@activityPickerCalorieEstimatesTitle": { "description": "Status card title explaining that calorie figures are estimates" }, "activityPickerMetValue": "{met}× resting", "@activityPickerMetValue": { "description": "MET value shown on an activity row when no calorie estimate is available, e.g. '8.0 MET'", "placeholders": { "met": { "type": "String" } } }, "activityPickerKcalPer30": "{kcal} kcal / 30 min", "@activityPickerKcalPer30": { "description": "Calorie estimate shown on an activity row, e.g. '250 kcal / 30 min'", "placeholders": { "kcal": { "type": "int" } } }, "dayStrainToday": "TODAY", "@dayStrainToday": { "description": "Day strain screen sub-header when the shown day is today" }, "dayStrainTitle": "Day strain", "@dayStrainTitle": { "description": "Day strain screen title, and the strain metric label shown inline" }, "dayStrainNoTraceTitle": "No strain trace for this day", "@dayStrainNoTraceTitle": { "description": "Status card title when a day has no strain score and no per-minute trace" }, "dayStrainNoMinuteTraceTitle": "No minute-by-minute trace for this day", "@dayStrainNoMinuteTraceTitle": { "description": "Status card title when a day has a strain score but no per-minute trace stored" }, "dayStrainNoReasonBody": "Nothing recorded says why this day produced no strain.", "@dayStrainNoReasonBody": { "description": "Fallback body text when no strain trace exists and no reason was given by the backend" }, "dayStrainScoredNoTraceBody": "The day strain is {strain}. The waking minutes it was built from are not stored for this day.", "@dayStrainScoredNoTraceBody": { "description": "Body text when a day has a strain score but no per-minute curve stored", "placeholders": { "strain": { "type": "String" } } }, "dayStrainWearBandFix": "Wear the band through the day", "@dayStrainWearBandFix": { "description": "Suggested fix action on the no-strain-trace card, shown when the band never saw the day" }, "dayStrainChartTitle": "Strain through the day", "@dayStrainChartTitle": { "description": "Chart title above the day's strain-over-time curve" }, "dayStrainChartFootnote": "Effort above your usual waking pace. It can ease later if you slow back toward that pace. From {drawn} recorded waking minutes.", "@dayStrainChartFootnote": { "description": "Footnote under the strain curve chart explaining it tracks effort above baseline pace, not a raw accumulator, so it can dip", "placeholders": { "drawn": { "type": "int" } } }, "dayStrainPeakHr": "Peak HR", "@dayStrainPeakHr": { "description": "Inline metric label for peak heart rate on the day strain screen" }, "dayStrainWorn": "Worn", "@dayStrainWorn": { "description": "Inline metric label for minutes the band was worn on the day strain screen" }, "dayStrainLowCoverageTitle": "The band saw {pct}% of this day", "@dayStrainLowCoverageTitle": { "description": "Status card title warning that band coverage was low for this day", "placeholders": { "pct": { "type": "int" } } }, "dayStrainLowCoverageBody": "Strain is a total over the minutes that were recorded, so a partly-worn day reads lower than a full one and the two are not comparable.", "@dayStrainLowCoverageBody": { "description": "Status card body explaining why a partly-worn day is not comparable to a full one" }, "dayStrainTimeInZonesSection": "Time in zones", "@dayStrainTimeInZonesSection": { "description": "Section header above the heart-rate zone bar for the day" }, "dayStrainZonesChartTitle": "Time in zones", "@dayStrainZonesChartTitle": { "description": "Chart title for the day's time-in-zones bar" }, "dayStrainZoneFootnoteKarvonen": "Zone edges span the gap between your measured resting heart rate and the highest we have seen ({maxHr} bpm). Both measured on you.", "@dayStrainZoneFootnoteKarvonen": { "description": "Footnote under the day's zone bar when both resting HR and ceiling are measured (karvonen)", "placeholders": { "maxHr": { "type": "int" } } }, "dayStrainZoneFootnoteObserved": "Zone edges are percentages of the highest heart rate we have seen ({maxHr} bpm) — measured, not estimated.", "@dayStrainZoneFootnoteObserved": { "description": "Footnote under the day's zone bar when only the ceiling is measured", "placeholders": { "maxHr": { "type": "int" } } }, "dayStrainHowSet": "How these are set", "@dayStrainHowSet": { "description": "Link/action label leading to the full zones detail screen" }, "dayStrainInputsSection": "What this is made of", "@dayStrainInputsSection": { "description": "Section header above the paragraph explaining what the strain score is built from" }, "dayStrainInputsBase": "How hard your heart worked while awake, by minutes in each heart-rate zone, on a 0–21 scale.", "@dayStrainInputsBase": { "description": "First sentence of the day strain 'what this is made of' explanation" }, "dayStrainInputsMaxHr": "It was integrated against an assumed maximum of {maxHr} bpm — estimated from your age and your strap, not measured.", "@dayStrainInputsMaxHr": { "description": "Sentence naming the assumed max heart rate the strain score was integrated against", "placeholders": { "maxHr": { "type": "int" } } }, "dayStrainInputsMeasuredCeilingNote": "The zone bar uses your measured maximum. Strain does not, so the strain scores you have already seen stay the same.", "@dayStrainInputsMeasuredCeilingNote": { "description": "Sentence noting the zone bar uses a different, measured ceiling than the strain score" }, "dayStrainInputsRhrAnchor": "The other anchor is your resting heart rate from the night before, so a night the band missed moves the whole day.", "@dayStrainInputsRhrAnchor": { "description": "Sentence naming resting heart rate as the strain score's other anchor" }, "activityZonesTitle": "Heart-rate zones", "@activityZonesTitle": { "description": "Heart-rate zones detail screen title" }, "activityZonesYourZonesSection": "Your zones", "@activityZonesYourZonesSection": { "description": "Section header above the list of zone rows" }, "activityZonesIntensitySection": "Where your intensity went", "@activityZonesIntensitySection": { "description": "Section header above the 28-day intensity distribution chart" }, "activityZonesNoCeilingTitle": "No measured ceiling yet", "@activityZonesNoCeilingTitle": { "description": "Status card title when no measured heart-rate ceiling exists yet" }, "activityZonesNoCeilingTanakaTail": " Until one is measured, the zones below come off your age.", "@activityZonesNoCeilingTanakaTail": { "description": "Trailing sentence fragment appended when age-estimated zones are shown below (note the leading space, appended directly after another sentence)" }, "activityZonesNoCeilingDefaultBody": "We only count a high reading the band held for 15 seconds while you were moving. A one-second spike is not a heart rate.", "@activityZonesNoCeilingDefaultBody": { "description": "Default explanation of the 15-second hold rule for a measured ceiling, shown when no other reason was given" }, "activityZonesWearBandFix": "Wear the band for your normal hard sessions", "@activityZonesWearBandFix": { "description": "Suggested fix action on the no-ceiling card" }, "activityZonesHighestSeenLabel": "HIGHEST WE HAVE SEEN", "@activityZonesHighestSeenLabel": { "description": "Label above the highest measured heart rate figure" }, "activityZonesBpmUnit": "bpm", "@activityZonesBpmUnit": { "description": "Unit label 'bpm' shown next to a heart-rate number" }, "activityZonesCeilingOnDate": "on {date}", "@activityZonesCeilingOnDate": { "description": "Fragment naming the date the heart-rate ceiling was recorded, e.g. 'on 3 Aug'", "placeholders": { "date": { "type": "String" } } }, "activityZonesCeilingDuringSession": "during {session}", "@activityZonesCeilingDuringSession": { "description": "Fragment naming the session type the ceiling was recorded during, e.g. 'during running'", "placeholders": { "session": { "type": "String" } } }, "activityZonesHighestSeenFootnote": "The highest we have measured, not a limit — it creeps up as the band sees harder efforts. Do not go and test it.", "@activityZonesHighestSeenFootnote": { "description": "Footnote clarifying the highest-seen heart rate is not a limit and should not be deliberately tested" }, "activityZonesNoZonesTitle": "No zones yet", "@activityZonesNoZonesTitle": { "description": "Status card title when there are no zone edges at all" }, "activityZonesNoAgeBody": "Zone edges are percentages of a maximum heart rate, and without your age there is nothing to take a percentage of.", "@activityZonesNoAgeBody": { "description": "Explanation shown when zone edges are missing because the user's age is not set" }, "catalogueZonesWhy": "Zone edges are percentages of a maximum heart rate estimated from your age — not one measured on you.", "@catalogueZonesWhy": { "description": "Shared footnote under the zone chart on the workout summary and day-strain screens, when the ceiling is a Tanaka age estimate rather than a measured one" }, "activityZonesNoZonesDefaultBody": "Nothing recorded says why there are no zone edges yet.", "@activityZonesNoZonesDefaultBody": { "description": "Fallback explanation when zone edges are missing and no reason was given" }, "activityZonesAddAgeFix": "Add your age in Profile", "@activityZonesAddAgeFix": { "description": "Suggested fix action to add age in Profile, shown only when age truly is missing" }, "activityZonesAnchorKarvonen": "From your resting rate ({restingHr}, middle of your last {restingDays} nights) and the highest we’ve seen ({maxHr}). Standard zones, not tested ones.", "@activityZonesAnchorKarvonen": { "description": "Explanation of how zone edges were built when both resting HR and ceiling are measured", "placeholders": { "restingHr": { "type": "int" }, "restingDays": { "type": "int" }, "maxHr": { "type": "int" } } }, "activityZonesAnchorObserved": "From the highest heart rate we’ve seen ({maxHr}). After {restingMinDays} nights of resting rate (you have {restingDays}), that joins in too.", "@activityZonesAnchorObserved": { "description": "Explanation of how zone edges were built when only the ceiling is measured and resting HR history is still short", "placeholders": { "maxHr": { "type": "int" }, "restingMinDays": { "type": "int" }, "restingDays": { "type": "int" } } }, "activityZonesAnchorTanaka": "From {maxHr} bpm, estimated from your age, so it can be 20 bpm out. The zones move once the band sees a hard enough session.", "@activityZonesAnchorTanaka": { "description": "Explanation of how zone edges were built from an age-estimated maximum heart rate", "placeholders": { "maxHr": { "type": "int" } } }, "activityZonesAnchorDefault": "Zone edges are percentages of a maximum heart rate.", "@activityZonesAnchorDefault": { "description": "Generic fallback explanation of what zone edges are" }, "activityZonesAnchorManual": "Set by you, not computed — these five thresholds override whatever your age or a measured ceiling would have given you.", "@activityZonesAnchorManual": { "description": "Explanation shown when the user's own manual zone boundaries are in effect" }, "activityZonesSetYourOwnLink": "Set your own zones", "@activityZonesSetYourOwnLink": { "description": "Link opening the manual zone-boundary editor, shown when no manual override is set" }, "activityZonesEditYourOwnLink": "Edit your own zones", "@activityZonesEditYourOwnLink": { "description": "Link opening the manual zone-boundary editor, shown when a manual override is already set" }, "activityZonesEditYourOwnTitle": "Set your own zones", "@activityZonesEditYourOwnTitle": { "description": "Title of the manual zone-boundary editor sheet" }, "activityZonesEditYourOwnBody": "Five bpm thresholds, lowest to highest — where each zone starts. Clear all five to go back to the zones we compute for you.", "@activityZonesEditYourOwnBody": { "description": "Explanation text in the manual zone-boundary editor sheet" }, "activityZonesNeedAllFive": "All five thresholds are needed, lowest to highest. Nothing was saved.", "@activityZonesNeedAllFive": { "description": "Error shown when only some of the five manual zone fields were filled in" }, "activityZonesMustAscend": "Each zone must start higher than the last. Nothing was saved.", "@activityZonesMustAscend": { "description": "Error shown when the five manual zone thresholds are not strictly ascending" }, "activityZonesNotShownTitle": "Not shown yet", "@activityZonesNotShownTitle": { "description": "Status card title when the 28-day intensity distribution is not yet shown" }, "activityZonesNeedsMonthBody": "Needs about a month of recorded sessions, each with a minute-by-minute heart rate.", "@activityZonesNeedsMonthBody": { "description": "Explanation of what is needed before the intensity distribution chart appears, when zones are measured" }, "activityZonesAgeEstimateBody": "The bars would be a picture of the age estimate, not of your training. They appear once the zone edges above are measured.", "@activityZonesAgeEstimateBody": { "description": "Explanation of why the intensity distribution is withheld when zones are only age-estimated" }, "activityZonesCurrentEdgesNote": "Ranges are your current zone edges; older sessions may have been counted with different ones.", "@activityZonesCurrentEdgesNote": { "description": "Footnote under the 28-day zone minutes: the printed bpm ranges are today's edges" }, "activityZonesSessionMinutesChartTitle": "Session minutes, last 28 days", "@activityZonesSessionMinutesChartTitle": { "description": "Chart title for the 28-day session-minutes-by-zone bar" }, "activityZonesShapePyramidal": "Most of your minutes are easy, fewer in the middle, fewest hard — a pyramid.", "@activityZonesShapePyramidal": { "description": "Description of a pyramidal training-intensity distribution shape" }, "activityZonesShapePolarised": "Most of your minutes are easy and the rest are hard, with little in between.", "@activityZonesShapePolarised": { "description": "Description of a polarised training-intensity distribution shape" }, "activityZonesShapeMiddleHeavy": "Most of your minutes sit in the middle rather than easy or hard.", "@activityZonesShapeMiddleHeavy": { "description": "Description of a middle-heavy training-intensity distribution shape" }, "activityZonesShapeSummary": "{easy} min easy, {moderate} moderate, {hard} hard, over {sessions} recorded sessions. A description, not a target.", "@activityZonesShapeSummary": { "description": "Sentence summarizing minutes spent easy/moderate/hard across recorded sessions", "placeholders": { "easy": { "type": "int" }, "moderate": { "type": "int" }, "hard": { "type": "int" }, "sessions": { "type": "int" } } }, "activityShareTitle": "Share", "@activityShareTitle": { "description": "Nav bar title on the share screen, and the label of its main share button" }, "activityShareOpenFailed": "Could not open the share sheet.", "@activityShareOpenFailed": { "description": "Snackbar shown when the OS share sheet fails to open" }, "activitySharePhotoHeader": "YOUR PHOTO", "@activitySharePhotoHeader": { "description": "Section eyebrow header above the photo picker row on the share screen" }, "activityShareAddPhoto": "Add a photo", "@activityShareAddPhoto": { "description": "Row label when no photo has been chosen yet for the share card" }, "activityShareChangePhoto": "Change photo", "@activityShareChangePhoto": { "description": "Row label when a photo has already been chosen, to pick a different one" }, "activitySharePhotoHint": "From this phone. Nothing is uploaded", "@activitySharePhotoHint": { "description": "Subtitle under the photo row explaining the photo stays on-device" }, "activityShareRemovePhoto": "Remove the photo", "@activityShareRemovePhoto": { "description": "Row label/button to remove the chosen photo from the share card" }, "activityShareBasemapHeader": "BASEMAP", "@activityShareBasemapHeader": { "description": "Section eyebrow header above the basemap toggle row on the share screen" }, "activityShareDrawMap": "Draw the real map", "@activityShareDrawMap": { "description": "Row label for the toggle that fetches real map tiles for the route" }, "activityShareMapHint": "Asks openstreetmap.org for the tiles covering this route. Off, the route draws on its own", "@activityShareMapHint": { "description": "Subtitle explaining the basemap toggle asks openstreetmap.org for tiles" }, "activityShareFetchingMapTitle": "Fetching the map", "@activityShareFetchingMapTitle": { "description": "Status card title while map tiles are being fetched" }, "activityShareFetchingMapBody": "The card draws as soon as every tile is here.", "@activityShareFetchingMapBody": { "description": "Status card body while map tiles are being fetched" }, "activityShareNoMapTitle": "No map for this card", "@activityShareNoMapTitle": { "description": "Status card title when the map tile fetch failed" }, "activityShareNoMapBody": "The map tiles could not be fetched, so the route is drawn on its own. Everything else on the card is unchanged.", "@activityShareNoMapBody": { "description": "Status card body explaining the map tile fetch failed and the route drew on its own" }, "activityShareStatusPrivateTitle": "This session is private", "@activityShareStatusPrivateTitle": { "description": "Status card title shown when the session being shared is marked private" }, "activityShareStatusPrivateBody": "Hidden from summaries and exports.", "@activityShareStatusPrivateBody": { "description": "Status card body explaining a private session is hidden from summaries and exports" }, "activityPosterFormatPost": "Post", "@activityPosterFormatPost": { "description": "Format switcher label for the 1:1 feed post crop of the share card" }, "activityPosterFormatStory": "Story", "@activityPosterFormatStory": { "description": "Format switcher label for the 9:16 portrait story crop of the share card" }, "activitySummaryRpeHeadline": "HOW HARD DID THAT FEEL?", "@activitySummaryRpeHeadline": { "description": "Header of the TS-09 post-session effort rating card" }, "activitySummaryRpeBody": "Your own rating of the effort. It is a feeling, not a measurement — which is the point, because it can disagree with the numbers above.", "@activitySummaryRpeBody": { "description": "Explanatory body text under the effort rating card header" }, "activitySummaryRateEffort": "Rate this effort {n} of 10", "@activitySummaryRateEffort": { "description": "Semantic label on each of the 10 effort-rating tap targets", "placeholders": { "n": { "type": "int" } } }, "activitySummaryRpeVeryEasy": "1 · very easy", "@activitySummaryRpeVeryEasy": { "description": "Left-hand caption under the 1-10 effort rating scale" }, "activitySummaryRpeMaximal": "10 · maximal", "@activitySummaryRpeMaximal": { "description": "Right-hand caption under the 1-10 effort rating scale" }, "activitySummaryNotNow": "Not now", "@activitySummaryNotNow": { "description": "Button to dismiss the effort rating card without answering" }, "activitySummaryShareThis": "Share this {name}", "@activitySummaryShareThis": { "description": "Semantic label on the share icon in the summary nav bar", "placeholders": { "name": { "type": "String" } } }, "activitySummaryChangeType": "Change activity type", "@activitySummaryChangeType": { "description": "Semantic label on the pencil icon that lets the user correct the activity type" }, "activitySummaryShareToStrava": "Share to Strava", "@activitySummaryShareToStrava": { "description": "Label on the button that exports the recorded route as a GPX file to the OS share sheet for manual upload to Strava (or anywhere else that reads GPX) — no Strava account or API call involved" }, "activitySummaryUnsavedTitle": "This session is not saved yet", "@activitySummaryUnsavedTitle": { "description": "Title of the status card shown when a finished session failed to save" }, "activitySummaryUnsavedBody": "Writing it to this phone failed.", "@activitySummaryUnsavedBody": { "description": "Body of the status card shown when a finished session failed to save" }, "activitySummarySaving": "Saving", "@activitySummarySaving": { "description": "Fix button label while a retried save is in flight" }, "activitySummaryTryAgain": "Try again", "@activitySummaryTryAgain": { "description": "Fix button label to retry saving an unsaved session" }, "activitySummaryPrivate": "Private", "@activitySummaryPrivate": { "description": "Pill label shown next to the hero stat when the session is marked private" }, "activitySummaryStepsBasis": "Steps came from the strap's own motion sensor, which only counts them on foot.", "@activitySummaryStepsBasis": { "description": "Sentence explaining where the step count came from, appended to the calorie basis note" }, "activitySummaryCaloriesNeedWeight": "Calories need your weight.", "@activitySummaryCaloriesNeedWeight": { "description": "Calorie basis note when the user has no weight on file" }, "activitySummaryNoCalorieNoStrain": "No calorie figure for this session. An energy estimate from heart rate needs your maximum and resting heart rates, and one of them is not set.", "@activitySummaryNoCalorieNoStrain": { "description": "Calorie basis note when there is no calorie figure and no strain figure either" }, "activitySummaryNoCalorieWithStrain": "No calories for this session: set your maximum and resting heart rates to get them. Strain above is the measured effort, on 0–21.", "@activitySummaryNoCalorieWithStrain": { "description": "Calorie basis note when there is no calorie figure but a strain figure exists" }, "activitySummaryCalorieNoHr": "Estimated from the activity's effort level ({met}× resting) and your weight. No heart rate reached this session.", "@activitySummaryCalorieNoHr": { "description": "Calorie basis note when calories were estimated from MET and weight with no heart rate", "placeholders": { "met": { "type": "String" } } }, "activitySummaryCalorieWithHr": "Estimated from the activity's effort level ({met}× resting), your weight and heart rate.", "@activitySummaryCalorieWithHr": { "description": "Calorie basis note when calories were estimated using heart rate too", "placeholders": { "met": { "type": "String" } } }, "activitySummaryNothingLoggedWithLoad": "Nothing was logged with a load", "@activitySummaryNothingLoggedWithLoad": { "description": "Hero caption for a strength session with sets logged but no load recorded" }, "activitySummarySetUnit": "{n, plural, one{set} other{sets}}", "@activitySummarySetUnit": { "description": "Unit word next to the hero set count on a strength session with no volume", "placeholders": { "n": { "type": "int" } } }, "activitySummaryVolumeLoadedSets": "Volume of the loaded sets", "@activitySummaryVolumeLoadedSets": { "description": "Hero caption for total volume when some sets had no recorded load" }, "activitySummaryTotalVolume": "Total volume", "@activitySummaryTotalVolume": { "description": "Hero caption for total volume when every set had a recorded load" }, "activitySummaryElapsedTime": "Elapsed time", "@activitySummaryElapsedTime": { "description": "Fallback hero caption showing plain elapsed time" }, "activitySummaryClimbed": "+{m} m climbed", "@activitySummaryClimbed": { "description": "Hero caption showing metres climbed on a journey/hike session", "placeholders": { "m": { "type": "int" } } }, "activitySummaryClimbedFt": "+{ft} ft climbed", "@activitySummaryClimbedFt": { "description": "Hero caption showing feet climbed on a journey/hike session, for imperial units", "placeholders": { "ft": { "type": "int" } } }, "activitySummaryLapsCaption": "{n, plural, one{{n} lap} other{{n} laps}}", "@activitySummaryLapsCaption": { "description": "Hero caption showing lap count on a swim/row session", "placeholders": { "n": { "type": "int" } } }, "activitySummaryNoRouteTitle": "No route for this session", "@activitySummaryNoRouteTitle": { "description": "Title of the status card when a route session recorded no GPS track" }, "activitySummaryNoRouteBody": "Location was off, or this activity was not recorded with GPS.", "@activitySummaryNoRouteBody": { "description": "Body of the status card when a route session recorded no GPS track" }, "activitySummaryRouteTitle": "Route", "@activitySummaryRouteTitle": { "description": "Chart title above the route map" }, "activitySummarySlower": "Slower", "@activitySummarySlower": { "description": "Route map legend entry for the slow end of the pace colour scale" }, "activitySummaryFaster": "Faster", "@activitySummaryFaster": { "description": "Route map legend entry for the fast end of the pace colour scale" }, "activitySummaryStartFinishPinned": "Start and finish are pinned.", "@activitySummaryStartFinishPinned": { "description": "Route map footnote when there is no distance to report" }, "activitySummaryRouteFootnote": "{distance} {unit}, start and finish pinned.", "@activitySummaryRouteFootnote": { "description": "Route map footnote reporting distance plus that start/finish are pinned", "placeholders": { "distance": { "type": "String" }, "unit": { "type": "String" } } }, "activitySummaryNoSetsTitle": "No sets logged", "@activitySummaryNoSetsTitle": { "description": "Title of the status card when a strength session has no sets logged" }, "activitySummaryNoSetsBody": "Nothing was entered for this session, so there is no load and no volume to total.", "@activitySummaryNoSetsBody": { "description": "Body of the status card on the overview tab when a strength session has no sets logged" }, "activitySummaryNoRoundsTitle": "No rounds recorded", "@activitySummaryNoRoundsTitle": { "description": "Title of the status card when an interval session has no rounds recorded" }, "activitySummaryNoRoundsBody": "0 rounds logged.", "@activitySummaryNoRoundsBody": { "description": "Body of the status card when an interval session has no rounds recorded" }, "activitySummaryIntervalLadderTitle": "Interval ladder", "@activitySummaryIntervalLadderTitle": { "description": "Chart title above the interval work/rest ladder" }, "activitySummaryWork": "Work", "@activitySummaryWork": { "description": "Interval ladder legend entry for work intervals" }, "activitySummaryRest": "Rest", "@activitySummaryRest": { "description": "Interval ladder legend entry for rest intervals" }, "activitySummaryRoundLabel": "Round {n}", "@activitySummaryRoundLabel": { "description": "X-axis label naming a round number on the interval ladder chart", "placeholders": { "n": { "type": "int" } } }, "activitySummaryLongestBlock": "Longest block {time}.", "@activitySummaryLongestBlock": { "description": "Interval ladder footnote naming the longest work or rest block", "placeholders": { "time": { "type": "String" } } }, "activitySummaryPosesCount": "{n, plural, one{{n} pose} other{{n} poses}}", "@activitySummaryPosesCount": { "description": "Caption on the flow session's defining-object card counting logged poses", "placeholders": { "n": { "type": "int" } } }, "activitySummaryNoLapsTitle": "No laps counted", "@activitySummaryNoLapsTitle": { "description": "Title of the status card when a laps session has no laps counted" }, "activitySummaryNoLapsBody": "0 laps tapped.", "@activitySummaryNoLapsBody": { "description": "Body of the status card when a laps session has no laps counted" }, "activitySummaryLapsTitle": "Laps", "@activitySummaryLapsTitle": { "description": "Chart title above the lap-time bar chart" }, "activitySummaryLapLabel": "Lap {n}", "@activitySummaryLapLabel": { "description": "Row label naming a lap number in the lap list", "placeholders": { "n": { "type": "int" } } }, "activitySummaryLapFastest": "{time}, fastest", "@activitySummaryLapFastest": { "description": "Screen-reader label for the fastest lap's time, since bold is not spoken", "placeholders": { "time": { "type": "String" } } }, "activitySummaryPoolLength": "{m} m pool", "@activitySummaryPoolLength": { "description": "Lap chart footnote fragment naming the pool length", "placeholders": { "m": { "type": "int" } } }, "activitySummaryFastest": "fastest {time}", "@activitySummaryFastest": { "description": "Lap chart footnote fragment naming the fastest lap time", "placeholders": { "time": { "type": "String" } } }, "activitySummarySlowest": "slowest {time}", "@activitySummarySlowest": { "description": "Lap chart footnote fragment naming the slowest lap time", "placeholders": { "time": { "type": "String" } } }, "activitySummaryNoElevationTitle": "No elevation profile", "@activitySummaryNoElevationTitle": { "description": "Title of the status card when a journey session has no elevation profile" }, "activitySummaryNoElevationBody": "No route, or the route carried no altitude.", "@activitySummaryNoElevationBody": { "description": "Body of the status card when a journey session has no elevation profile" }, "activitySummaryElevationTitle": "Elevation", "@activitySummaryElevationTitle": { "description": "Chart title above the elevation profile" }, "activitySummaryStart": "Start", "@activitySummaryStart": { "description": "X-axis / footnote label meaning the start of the session" }, "activitySummaryFinish": "Finish", "@activitySummaryFinish": { "description": "X-axis label meaning the finish of the session, paired with Start" }, "activitySummaryGain": "Gain", "@activitySummaryGain": { "description": "Inline metric label for elevation gained on a journey session" }, "activitySummaryLoss": "Loss", "@activitySummaryLoss": { "description": "Inline metric label for elevation lost on a journey session" }, "activitySummaryPeak": "Peak", "@activitySummaryPeak": { "description": "Inline metric label for peak elevation reached on a journey session" }, "activitySummaryColdPlungeWhy": "Cold closes the blood vessels the sensor reads through. Finding nothing here is expected, not a fault.", "@activitySummaryColdPlungeWhy": { "description": "Explanation shown on a cold plunge session for why the sensor found no pulse" }, "activitySummaryHeatWhy": "Heat, sweat and a strap that loosens as you warm up all stop the sensor seeing a pulse. Finding nothing here is ordinary, not a fault.", "@activitySummaryHeatWhy": { "description": "Explanation shown on a sauna/heat session for why the sensor found no pulse" }, "activitySummaryNoPulseTitle": "No pulse reading for this {activity}", "@activitySummaryNoPulseTitle": { "description": "Status card title when a heat/cold session found no pulse at all", "placeholders": { "activity": { "type": "String" } } }, "activitySummaryOneMinutePulse": "One minute of pulse, and no more", "@activitySummaryOneMinutePulse": { "description": "Status card title when a heat/cold session found only one minute of pulse" }, "activitySummaryPulseGapNote": "The band found a pulse in {have} of {total} minutes. The gaps are expected, so what is drawn is the part it could see.", "@activitySummaryPulseGapNote": { "description": "Footnote on the heart-rate chart of a heat/cold session noting partial pulse coverage", "placeholders": { "have": { "type": "int" }, "total": { "type": "int" } } }, "activitySummaryTooShortTitle": "Too short to chart", "@activitySummaryTooShortTitle": { "description": "Status card title when a session is too short to chart heart rate" }, "activitySummaryTooShortBody": "One minute of heart rate is a point, not a line.", "@activitySummaryTooShortBody": { "description": "Status card body when a session is too short to chart heart rate" }, "activitySummaryNoHrTitle": "No heart rate for this session", "@activitySummaryNoHrTitle": { "description": "Status card title when a non-thermal session recorded no heart rate at all" }, "activitySummaryNoHrBody": "The band reported nothing while this was running.", "@activitySummaryNoHrBody": { "description": "Status card body when a non-thermal session recorded no heart rate at all" }, "activitySummaryCheckBandConnection": "Check band connection", "@activitySummaryCheckBandConnection": { "description": "Fix button label pointing the user at the profile's sources list" }, "activitySummaryPartialTrace": "Partial trace — the band handed over {pct}% of these minutes.", "@activitySummaryPartialTrace": { "description": "Heart-rate chart footnote when the stored trace covers less than 90% of the session", "placeholders": { "pct": { "type": "int" } } }, "activitySummaryHeartRateTitle": "Heart rate", "@activitySummaryHeartRateTitle": { "description": "Chart title above the heart-rate trace" }, "activitySummaryHardMinutesNote": "{min} min above 80% of your maximum.", "@activitySummaryHardMinutesNote": { "description": "Heart-rate chart footnote naming minutes spent above 80% of max heart rate", "placeholders": { "min": { "type": "int" } } }, "activitySummaryTimeInZonesTitle": "Time in zones", "@activitySummaryTimeInZonesTitle": { "description": "Chart title above the heart-rate zone bar" }, "activitySummaryTopSet": "Top set", "@activitySummaryTopSet": { "description": "Section title above the heaviest logged set on a strength session" }, "activitySummaryOneRepMax": "1RM estimate {kg} kg", "@activitySummaryOneRepMax": { "description": "Estimated one-rep-max caption under the top set exercise name", "placeholders": { "kg": { "type": "int" } } }, "activitySummarySomeSetsNoLoadTitle": "Some sets had no load", "@activitySummarySomeSetsNoLoadTitle": { "description": "Status card title when some strength sets were logged with no load" }, "activitySummarySomeSetsNoLoadBody": "Counted in sets and reps, but left out of volume.", "@activitySummarySomeSetsNoLoadBody": { "description": "Status card body when some strength sets were logged with no load" }, "activitySummaryScore": "Score", "@activitySummaryScore": { "description": "Section title above the match game score table" }, "activitySummaryGameSetLabel": "Set {n}", "@activitySummaryGameSetLabel": { "description": "Row label naming a game set number in the match score table", "placeholders": { "n": { "type": "int" } } }, "activitySummaryNoSplitsTitle": "No splits for this session", "@activitySummaryNoSplitsTitle": { "description": "Status card title on the Splits tab when a route session has no splits" }, "activitySummaryNoSplitsBody": "Splits need a recorded distance.", "@activitySummaryNoSplitsBody": { "description": "Status card body on the Splits tab when a route session has no splits" }, "activitySummaryKm": "KM", "@activitySummaryKm": { "description": "Column header for kilometre number in the route splits table" }, "activitySummaryPace": "PACE", "@activitySummaryPace": { "description": "Column header for pace in the route splits table" }, "activitySummaryHr": "HR", "@activitySummaryHr": { "description": "Column header for average heart rate in the route splits table" }, "activitySummarySetsLoggedZero": "0 sets logged.", "@activitySummarySetsLoggedZero": { "description": "Status card body on the Splits tab when a strength session has no sets logged" }, "activitySummaryRoundHeader": "R", "@activitySummaryRoundHeader": { "description": "Column header for round number in the interval splits table" }, "activitySummaryWorkHeader": "WORK", "@activitySummaryWorkHeader": { "description": "Column header for work duration in the interval splits table" }, "activitySummaryRestHeader": "REST", "@activitySummaryRestHeader": { "description": "Column header for rest duration in the interval splits table" }, "activitySummaryAvgBpm": "AVG BPM", "@activitySummaryAvgBpm": { "description": "Column header for average heart rate in the interval splits table" }, "activitySummaryLapHeader": "LAP", "@activitySummaryLapHeader": { "description": "Column header for lap number in the laps splits table" }, "activitySummaryTimeHeader": "TIME", "@activitySummaryTimeHeader": { "description": "Column header for lap time in the laps splits table" }, "activitySummarySpeedVsFastest": "SPEED vs FASTEST", "@activitySummarySpeedVsFastest": { "description": "Column header for relative lap speed in the laps splits table" }, "activitySummaryBodyweightReps": "{n, plural, one{{n} rep · bodyweight} other{{n} reps · bodyweight}}", "@activitySummaryBodyweightReps": { "description": "Set row text for a logged set with no recorded load", "placeholders": { "n": { "type": "int" } } }, "activitySummaryRpeValue": "RPE {v}", "@activitySummaryRpeValue": { "description": "Set-level RPE value shown next to a logged set", "placeholders": { "v": { "type": "int" } } }, "activitySummaryNothingToPlot": "Nothing to plot for this {activity}", "@activitySummaryNothingToPlot": { "description": "Status card title on the Graphs tab for a heat/cold session with no trace to plot", "placeholders": { "activity": { "type": "String" } } }, "activitySummaryNoSeriesTitle": "No series to plot", "@activitySummaryNoSeriesTitle": { "description": "Status card title on the Graphs tab when a session recorded no per-minute series" }, "activitySummaryNoSeriesBody": "This session recorded no per-minute streams.", "@activitySummaryNoSeriesBody": { "description": "Status card body on the Graphs tab when a session recorded no per-minute series" }, "activitySummaryHeartRateZones": "Heart-rate zones", "@activitySummaryHeartRateZones": { "description": "Section title above the heart-rate zone breakdown chart" }, "activitySummaryTabOverview": "Overview", "@activitySummaryTabOverview": { "description": "Sub-tab label for the Overview tab on the activity summary screen" }, "activitySummaryTabSplits": "Splits", "@activitySummaryTabSplits": { "description": "Sub-tab label for the Splits tab on the activity summary screen" }, "activitySummaryTabGraphs": "Graphs", "@activitySummaryTabGraphs": { "description": "Sub-tab label for the Graphs tab on the activity summary screen" }, "activityExercisePickerChooseTitle": "Choose exercise", "@activityExercisePickerChooseTitle": { "description": "Title of the strength exercise picker when selecting a new exercise." }, "activityExercisePickerChangeTitle": "Change exercise", "@activityExercisePickerChangeTitle": { "description": "Title of the strength exercise picker when replacing or switching from the current exercise." }, "activityExercisePickerSearchLabel": "Search exercises", "@activityExercisePickerSearchLabel": { "description": "Accessibility label for the strength exercise search field." }, "activityExercisePickerSearchHint": "Search {count} exercises", "@activityExercisePickerSearchHint": { "description": "Placeholder in the strength exercise search field.", "placeholders": { "count": { "type": "int" } } }, "activityExercisePickerCommonFilter": "Common", "@activityExercisePickerCommonFilter": { "description": "Filter showing Edge's short common-exercise list." }, "activityExercisePickerAllFilter": "All", "@activityExercisePickerAllFilter": { "description": "Filter showing the whole strength exercise catalogue." }, "activityExercisePickerNoMatch": "No exercises match that", "@activityExercisePickerNoMatch": { "description": "Empty result shown for an exercise search or category filter." }, "activityExercisePickerWgerCredit": "Exercise catalogue from wger", "@activityExercisePickerWgerCredit": { "description": "Attribution under the strength exercise picker." }, "activityExercisePickerSourceLabel": "View source and credits for {exercise}", "@activityExercisePickerSourceLabel": { "description": "Accessibility label and tooltip for a wger exercise's exact source record.", "placeholders": { "exercise": { "type": "String" } } }, "activityLiveAddALap": "Add a lap", "@activityLiveAddALap": { "description": "Live swim screen: accessibility label for the tap-a-lap button." }, "activityLiveAddExerciseTitle": "Add exercise", "@activityLiveAddExerciseTitle": { "description": "Live strength screen: title of the sheet for adding another exercise." }, "activityLiveChooseExerciseBody": "Pick the first exercise before logging a set.", "@activityLiveChooseExerciseBody": { "description": "Empty live-strength state before an exercise has been selected." }, "activityLiveChangeExercise": "Change exercise", "@activityLiveChangeExercise": { "description": "Accessibility label for changing the current strength exercise." }, "activityExerciseCategory": "{category, select, Abs{Abs} Arms{Arms} Back{Back} Calves{Calves} Chest{Chest} Legs{Legs} Shoulders{Shoulders} other{{category}}}", "@activityExerciseCategory": { "description": "Strength exercise category name, used as a picker filter and row detail.", "placeholders": { "category": { "type": "String" } } }, "activityExerciseEquipment": "{key, select, Barbell{Barbell} Bench{Bench} Cablemachine{Cable machine} Dumbbell{Dumbbell} Gymmat{Gym mat} Inclinebench{Incline bench} Kettlebell{Kettlebell} nonebodyweightexercise{Bodyweight} Pullupbar{Pull-up bar} SZBar{SZ-Bar} other{{name}}}", "@activityExerciseEquipment": { "description": "Strength exercise equipment name in the picker row detail. key is the English name with non-letters removed; name is the English name, shown when there is no translation.", "placeholders": { "key": { "type": "String" }, "name": { "type": "String" } } }, "activityLiveAllowLocation": "Allow location", "@activityLiveAllowLocation": { "description": "Live measured session: fix action when location permission was denied." }, "activityLiveBestLabel": "Best", "@activityLiveBestLabel": { "description": "Live strength screen: header over the lifter's best-ever set for this exercise." }, "activityLiveBodyweightExcludedNote": "Bodyweight — left out of volume", "@activityLiveBodyweightExcludedNote": { "description": "Live strength screen: note shown when the set is logged as bodyweight-only." }, "activityLiveBodyweightOnly": "bodyweight only", "@activityLiveBodyweightOnly": { "description": "Live strength screen: unit label under the volume total when it is bodyweight-only." }, "activityLiveBpmUnit": "bpm", "@activityLiveBpmUnit": { "description": "Live heart-rate block: unit label next to the live beats-per-minute reading." }, "activityLiveBwAbbrev": "BW", "@activityLiveBwAbbrev": { "description": "Live strength screen: abbreviation for bodyweight, shown instead of a load in kg." }, "activityLiveChangeStroke": "Change stroke", "@activityLiveChangeStroke": { "description": "Live swim screen: accessibility label for the cycle-stroke button." }, "activityLiveDecrease": "{label} down", "@activityLiveDecrease": { "description": "Generic accessibility label for a decrease/minus control, e.g. 'Weight down'.", "placeholders": { "label": { "type": "String" } } }, "activityLiveDeniedForeverBody": "Location is denied for this app, which only Settings can change.", "@activityLiveDeniedForeverBody": { "description": "Live measured session: explanation when location is permanently denied for the app." }, "activityLiveDurationHeader": "DURATION", "@activityLiveDurationHeader": { "description": "Live measured session: section header above the elapsed-time display." }, "activityLiveEffortRpeHeader": "EFFORT (RPE)", "@activityLiveEffortRpeHeader": { "description": "Live strength screen: header above the RPE (rate of perceived exertion) picker." }, "activityLiveEndSet": "End set", "@activityLiveEndSet": { "description": "Live match screen: button that closes the current set and starts a new one." }, "activityLiveExerciseOf": "EXERCISE {index} OF {total}", "@activityLiveExerciseOf": { "description": "Live strength screen: 'EXERCISE {index} OF {total}' progress header.", "placeholders": { "index": { "type": "int" }, "total": { "type": "int" } } }, "activityLiveFinishSessionLabel": "Finish session", "@activityLiveFinishSessionLabel": { "description": "Live session shell: accessibility label for the stop/finish control." }, "activityLiveHoldTime": "Hold · {time}", "@activityLiveHoldTime": { "description": "Live flow (yoga) screen: 'Hold · {time}' countdown under the current pose.", "placeholders": { "time": { "type": "String" } } }, "activityLiveIncrease": "{label} up", "@activityLiveIncrease": { "description": "Generic accessibility label for an increase/plus control, e.g. 'Weight up'.", "placeholders": { "label": { "type": "String" } } }, "activityLiveIntervalSubtitle": "{workSec} S WORK · {restSec} S REST", "@activityLiveIntervalSubtitle": { "description": "Live interval screen: shell subtitle stating the work/rest split, e.g. '45 S WORK · 30 S REST'.", "placeholders": { "workSec": { "type": "int" }, "restSec": { "type": "int" } } }, "activityLiveKcalEstUnit": "kcal · est", "@activityLiveKcalEstUnit": { "description": "Common stats row: unit label for the estimated-calories figure." }, "activityLiveKgVolumeUnit": "kg volume", "@activityLiveKgVolumeUnit": { "description": "Live strength screen: unit label under the total training volume in kg." }, "activityLiveLapButtonLabel": "LAP", "@activityLiveLapButtonLabel": { "description": "Live swim screen: label on the big circular tap-a-lap button." }, "activityLiveLapsChartTitle": "Laps", "@activityLiveLapsChartTitle": { "description": "Live swim screen: chart title for the per-lap time bars." }, "activityLiveLapsCount": "{count, plural, one{{count} lap} other{{count} laps}} · {stroke}", "@activityLiveLapsCount": { "description": "Live swim screen: 'N laps · stroke' summary line under the distance figure.", "placeholders": { "count": { "type": "int" }, "stroke": { "type": "String" } } }, "activityLiveLapsFootnote": "Fastest {time}, in bold; bar length is speed against it.", "@activityLiveLapsFootnote": { "description": "Live swim screen: footnote naming the fastest lap under the laps chart.", "placeholders": { "time": { "type": "String" } } }, "activityLiveLogAsBodyweight": "Log as bodyweight", "@activityLiveLogAsBodyweight": { "description": "Live strength screen: toggle label to log the current set as bodyweight-only." }, "activityLiveMatchSetSubtitle": "SET {n}", "@activityLiveMatchSetSubtitle": { "description": "Live match screen: shell subtitle showing the set number in progress.", "placeholders": { "n": { "type": "int" } } }, "activityLiveMetrePoolLabel": "{len} metre pool", "@activityLiveMetrePoolLabel": { "description": "Live swim screen: accessibility label for a pool-length choice, e.g. '25 metre pool'.", "placeholders": { "len": { "type": "int" } } }, "activityLiveMinimiseLabel": "Minimise", "@activityLiveMinimiseLabel": { "description": "Live session shell: accessibility label for the minimise chevron." }, "activityLiveNextExercise": "Next exercise", "@activityLiveNextExercise": { "description": "Live strength screen: accessibility label for the next-exercise arrow." }, "activityLiveNextLabel": "NEXT", "@activityLiveNextLabel": { "description": "Live interval screen: 'NEXT' header before the upcoming work/rest phase." }, "activityLiveNextPose": "Next pose", "@activityLiveNextPose": { "description": "Live flow (yoga) screen: button to advance to the next pose." }, "activityLiveNextRest": "Rest · {time}", "@activityLiveNextRest": { "description": "Live interval screen: 'Rest · {time}' preview of the upcoming rest phase.", "placeholders": { "time": { "type": "String" } } }, "activityLiveNextWork": "Work · {time}", "@activityLiveNextWork": { "description": "Live interval screen: 'Work · {time}' preview of the upcoming work phase.", "placeholders": { "time": { "type": "String" } } }, "activityLiveNoHrBody": "The band is not connected, so nothing is arriving for this session.", "@activityLiveNoHrBody": { "description": "Live heart-rate block: explanation shown when the band is not connected at all." }, "activityLiveNoHrTitle": "No heart rate", "@activityLiveNoHrTitle": { "description": "Live heart-rate block: title shown when the band is not connected." }, "activityLiveNoHrYetBody": "The band is connected but has not reported a beat, so it needs to be snug, a finger-width above the wrist bone.", "@activityLiveNoHrYetBody": { "description": "Live heart-rate block: explanation shown when the band is connected but has no beat yet." }, "activityLiveNoHrYetTitle": "No heart rate yet", "@activityLiveNoHrYetTitle": { "description": "Live heart-rate block: title shown when the band is connected but has no beat yet." }, "activityLiveNoneYet": "None yet", "@activityLiveNoneYet": { "description": "Live strength screen: placeholder for a previous/best reference that has no data." }, "activityLiveNoRouteFailedBody": "The phone returned an error when asked for a fix.", "@activityLiveNoRouteFailedBody": { "description": "Live measured session: explanation when a GPS fix request errored out." }, "activityLiveNoRouteFailedTitle": "No route: location failed", "@activityLiveNoRouteFailedTitle": { "description": "Live measured session: title when a GPS fix request errored out." }, "activityLiveNoRouteNotAllowedTitle": "No route: location not allowed", "@activityLiveNoRouteNotAllowedTitle": { "description": "Live measured session: title when location permission is denied (once or forever)." }, "activityLiveNoRouteOffBody": "Location services are off on this phone, so no fixes are arriving.", "@activityLiveNoRouteOffBody": { "description": "Live measured session: explanation when the phone's location services are off." }, "activityLiveNoRouteOffTitle": "No route: location is off", "@activityLiveNoRouteOffTitle": { "description": "Live measured session: title when the phone's location services are off." }, "activityLiveOneLapFewer": "One lap fewer", "@activityLiveOneLapFewer": { "description": "Live swim screen: accessibility label for the undo-last-lap button." }, "activityLiveOpenSettings": "Open Settings", "@activityLiveOpenSettings": { "description": "Live measured session: fix action when location is permanently denied." }, "activityLiveOpponentLabel": "OPPONENT", "@activityLiveOpponentLabel": { "description": "Live match screen: label above the opponent's score." }, "activityLivePauseLabel": "Pause", "@activityLivePauseLabel": { "description": "Live session shell: accessibility label for the pause control." }, "activityLivePerLapUnit": "per lap", "@activityLivePerLapUnit": { "description": "Live swim screen: unit label for the per-lap pace stat." }, "activityLivePointLabel": "{side} point", "@activityLivePointLabel": { "description": "Live match screen: accessibility label for tapping to add a point, e.g. 'YOU point'.", "placeholders": { "side": { "type": "String" } } }, "activityLivePoolSubtitle": "{len}M POOL · {stroke}", "@activityLivePoolSubtitle": { "description": "Live swim screen: shell subtitle showing pool length and stroke.", "placeholders": { "len": { "type": "int" }, "stroke": { "type": "String" } } }, "activityLivePoseBridge": "Bridge", "@activityLivePoseBridge": { "description": "Live flow (yoga) screen: name of the Bridge pose." }, "activityLivePoseChair": "Chair", "@activityLivePoseChair": { "description": "Live flow (yoga) screen: name of the Chair pose." }, "activityLivePoseChildsPose": "Child's pose", "@activityLivePoseChildsPose": { "description": "Live flow (yoga) screen: name of Child's pose." }, "activityLivePoseForwardFold": "Forward fold", "@activityLivePoseForwardFold": { "description": "Live flow (yoga) screen: name of the Forward fold pose." }, "activityLivePoseMountain": "Mountain", "@activityLivePoseMountain": { "description": "Live flow (yoga) screen: name of the Mountain pose." }, "activityLivePoseOf": "POSE {index} OF {total}", "@activityLivePoseOf": { "description": "Live flow (yoga) screen: 'POSE {index} OF {total}' progress header.", "placeholders": { "index": { "type": "int" }, "total": { "type": "int" } } }, "activityLivePosePigeon": "Pigeon", "@activityLivePosePigeon": { "description": "Live flow (yoga) screen: name of the Pigeon pose." }, "activityLivePosePlank": "Plank", "@activityLivePosePlank": { "description": "Live flow (yoga) screen: name of the Plank pose." }, "activityLivePoseSavasana": "Savasana", "@activityLivePoseSavasana": { "description": "Live flow (yoga) screen: name of the Savasana pose." }, "activityLivePoseTriangle": "Triangle", "@activityLivePoseTriangle": { "description": "Live flow (yoga) screen: name of the Triangle pose." }, "activityLivePoseWarriorTwo": "Warrior II", "@activityLivePoseWarriorTwo": { "description": "Live flow (yoga) screen: name of the Warrior II pose." }, "activityLivePreviousExercise": "Previous exercise", "@activityLivePreviousExercise": { "description": "Live strength screen: accessibility label for the previous-exercise arrow." }, "activityLivePreviousLabel": "Previous", "@activityLivePreviousLabel": { "description": "Shared label for a 'Previous' reference or navigation button." }, "activityLivePrivateSession": "Private session", "@activityLivePrivateSession": { "description": "Live measured session: badge shown for a private session." }, "activityLiveRecordingRoute": "Recording route", "@activityLiveRecordingRoute": { "description": "Live measured session: pill shown while a GPS route is actively recording." }, "activityLiveRepsBodyweightRow": "{n, plural, one{{n} rep · bodyweight} other{{n} reps · bodyweight}}", "@activityLiveRepsBodyweightRow": { "description": "Live strength screen: 'N reps · bodyweight' row in the this-exercise set list.", "placeholders": { "n": { "type": "int" } } }, "activityLiveRepsLabel": "REPS", "@activityLiveRepsLabel": { "description": "Live strength screen: header above the reps stepper." }, "activityLiveRepsLoggedBodyweight": "{n, plural, one{{n} rep logged} other{{n} reps logged}}", "@activityLiveRepsLoggedBodyweight": { "description": "Live strength screen: 'N reps logged' shown during the rest countdown for a bodyweight set.", "placeholders": { "n": { "type": "int" } } }, "activityLiveRepsOnly": "{n, plural, one{{n} rep} other{{n} reps}}", "@activityLiveRepsOnly": { "description": "Live strength screen: 'N reps' reference figure with no load recorded.", "placeholders": { "n": { "type": "int" } } }, "activityLiveRepsUnit": "reps", "@activityLiveRepsUnit": { "description": "Live strength screen: unit label under the total reps figure." }, "activityLiveRestingHeader": "RESTING", "@activityLiveRestingHeader": { "description": "Live strength screen: header shown during the rest countdown between sets." }, "activityLiveRestWord": "Rest", "@activityLiveRestWord": { "description": "The word 'Rest', used standalone for interval announcements and labels." }, "activityLiveResumeLabel": "Resume", "@activityLiveResumeLabel": { "description": "Live session shell: accessibility label for the resume control." }, "activityLiveRoundLabel": "ROUND {n}", "@activityLiveRoundLabel": { "description": "Live interval screen: 'ROUND N' header.", "placeholders": { "n": { "type": "int" } } }, "activityLiveRouteFootnoteNoDistance": "Start pinned; distance appears once the fixes settle.", "@activityLiveRouteFootnoteNoDistance": { "description": "Live measured session: route-chart footnote before any distance has been computed." }, "activityLiveRouteFootnoteWithDistance": "{distance} from the fixes recorded so far.", "@activityLiveRouteFootnoteWithDistance": { "description": "Live measured session: route-chart footnote naming the distance recorded so far.", "placeholders": { "distance": { "type": "String" } } }, "activityLiveRouteSoFarTitle": "Route so far", "@activityLiveRouteSoFarTitle": { "description": "Live measured session: chart title for the in-progress GPS route." }, "activityLiveSetNumber": "Set {n}", "@activityLiveSetNumber": { "description": "Shared 'Set N' label used for the current set count and past-set rows.", "placeholders": { "n": { "type": "int" } } }, "activityLiveSetsCountSubtitle": "{n, plural, one{{n} SET} other{{n} SETS}}", "@activityLiveSetsCountSubtitle": { "description": "Live strength screen: shell subtitle showing the number of sets logged so far.", "placeholders": { "n": { "type": "int" } } }, "activityLiveSetsListHeader": "SETS", "@activityLiveSetsListHeader": { "description": "Live match screen: header above the list of finished sets." }, "activityLiveSetsUnit": "sets", "@activityLiveSetsUnit": { "description": "Live strength screen: unit label under the total sets figure." }, "activityLiveStepsUnit": "steps", "@activityLiveStepsUnit": { "description": "Common stats row: unit label for the live step count." }, "activityLiveStrainUnit": "strain", "@activityLiveStrainUnit": { "description": "Common stats row: unit label for the live strain figure." }, "activityLiveStrokeBack": "Back", "@activityLiveStrokeBack": { "description": "Live swim screen: name of the backstroke." }, "activityLiveStrokeBreast": "Breast", "@activityLiveStrokeBreast": { "description": "Live swim screen: name of breaststroke." }, "activityLiveStrokeFly": "Fly", "@activityLiveStrokeFly": { "description": "Live swim screen: name of butterfly stroke." }, "activityLiveStrokeFree": "Free", "@activityLiveStrokeFree": { "description": "Live swim screen: name of freestyle stroke." }, "activityLiveThisExerciseLabel": "THIS EXERCISE", "@activityLiveThisExerciseLabel": { "description": "Live strength screen: header above the current exercise's logged sets." }, "activityLiveTimeInZonesTitle": "Time in zones", "@activityLiveTimeInZonesTitle": { "description": "Live heart-rate block: chart title for time spent in each heart-rate zone." }, "activityLiveTimeUnit": "time", "@activityLiveTimeUnit": { "description": "Live swim screen: unit label for the elapsed-time stat." }, "activityLiveTryAgain": "Try again", "@activityLiveTryAgain": { "description": "Live measured session: fix action when a GPS fix request errored out." }, "activityLiveTurnOnLocation": "Turn on location", "@activityLiveTurnOnLocation": { "description": "Live measured session: fix action when location services are off." }, "activityLiveVolumeSetsSubtitle": "{kg} KG · {n, plural, one{{n} SET} other{{n} SETS}}", "@activityLiveVolumeSetsSubtitle": { "description": "Live strength screen: shell subtitle showing training volume and set count.", "placeholders": { "kg": { "type": "String" }, "n": { "type": "int" } } }, "activityLiveWeightLabel": "WEIGHT", "@activityLiveWeightLabel": { "description": "Live strength screen: header above the weight stepper." }, "activityLiveWeightRepsLogged": "{kg} kg × {n} logged", "@activityLiveWeightRepsLogged": { "description": "Live strength screen: 'kg × N logged' shown during the rest countdown for a loaded set.", "placeholders": { "kg": { "type": "String" }, "n": { "type": "int" } } }, "activityLiveWorkWord": "Work", "@activityLiveWorkWord": { "description": "The word 'Work', used standalone for interval announcements and labels." }, "activityLiveYouLabel": "YOU", "@activityLiveYouLabel": { "description": "Live match screen: label above the user's own score." }, "activityLiveZoneLabel": "Zone {z}", "@activityLiveZoneLabel": { "description": "Live heart-rate block: pill showing the current heart-rate zone number.", "placeholders": { "z": { "type": "int" } } }, "activityLiveLogSet": "Log set", "@activityLiveLogSet": { "description": "Live strength screen: button that banks the current set." }, "activityLiveRestOverAnnounce": "Rest over", "@activityLiveRestOverAnnounce": { "description": "Live strength screen: screen-reader announcement when the rest countdown ends." }, "activityLiveSkipRest": "Skip rest", "@activityLiveSkipRest": { "description": "Live strength screen: button that skips the remaining rest countdown." }, "gesturesNavTitle": "Double-tap", "@gesturesNavTitle": { "description": "Title of the double-tap gesture settings screen" }, "gesturesSectionTitle": "Tap the band twice", "@gesturesSectionTitle": { "description": "Section heading explaining the double-tap gesture on the band" }, "gesturesSectionBody": "Works only while the app is connected. A tap the band saved while your phone was away is ignored, so it never fires hours late.", "@gesturesSectionBody": { "description": "Body text explaining when the double-tap gesture actually works" }, "gesturesItDoesTitle": "It does", "@gesturesItDoesTitle": { "description": "Heading for the group of selectable double-tap actions" }, "gesturesNoPhoneActionsTitle": "Nothing on the phone?", "@gesturesNoPhoneActionsTitle": { "description": "Heading shown when no phone-side actions are available" }, "gesturesNoPhoneActionsBody": "Ring my phone and flashlight are missing because the app could not reach the system to ask what’s allowed. Reopen the app and come back.", "@gesturesNoPhoneActionsBody": { "description": "Body text explaining why phone-native double-tap actions are missing" }, "settingsBarcodeSaveFailed": "That could not be saved — it may be back next time you open the app.", "@settingsBarcodeSaveFailed": { "description": "Snackbar shown when the barcode-lookup preference fails to save" }, "settingsIconRowTitle": "Icon", "@settingsIconRowTitle": { "description": "Row title for the home-screen app icon picker" }, "settingsIconRowConfirmHint": "iPhone will ask you to confirm", "@settingsIconRowConfirmHint": { "description": "Hint under the app icon row noting iOS confirms every icon change" }, "settingsIconChoiceLabel": "{label} icon.", "@settingsIconChoiceLabel": { "description": "Accessibility label for one app-icon choice", "placeholders": { "label": { "type": "String" } } }, "settingsSelectedSuffix": " Selected.", "@settingsSelectedSuffix": { "description": "Accessibility suffix appended when an option is the current selection" }, "settingsHealthSyncOff": "Off. Nothing is written to {store}", "@settingsHealthSyncOff": { "description": "Health-sync subtitle when the write toggle is off", "placeholders": { "store": { "type": "String" } } }, "settingsHealthSyncReady": "Writes each day’s sleep, resting heart rate, HRV, respiratory rate, energy and workouts to {store} once it is final", "@settingsHealthSyncReady": { "description": "Health-sync subtitle when the write is active and ready", "placeholders": { "store": { "type": "String" } } }, "settingsHealthSyncNeedsPermission": "{store} has not granted write access. Tap to open it", "@settingsHealthSyncNeedsPermission": { "description": "Health-sync subtitle when write permission is missing", "placeholders": { "store": { "type": "String" } } }, "settingsHealthSyncNotInstalled": "Health Connect is not installed. Tap to get it", "@settingsHealthSyncNotInstalled": { "description": "Health-sync subtitle when Health Connect is missing (Android)" }, "settingsHealthSyncNeedsUpdate": "Health Connect is too old to write to. Tap to update it", "@settingsHealthSyncNeedsUpdate": { "description": "Health-sync subtitle when Health Connect needs an update" }, "settingsHealthSyncUnsupported": "This device has no health store to write to", "@settingsHealthSyncUnsupported": { "description": "Health-sync subtitle when the device has no health store at all" }, "settingsHealthSyncChecking": "Checking {store}…", "@settingsHealthSyncChecking": { "description": "Health-sync subtitle while the state is being determined", "placeholders": { "store": { "type": "String" } } }, "settingsWriteToHealthStoreRowTitle": "Write to {store}", "@settingsWriteToHealthStoreRowTitle": { "description": "Settings row title to enable writing to the platform health store", "placeholders": { "store": { "type": "String" } } }, "settingsHealthShareOffTitle": "Contribution off", "@settingsHealthShareOffTitle": { "description": "Dialog title after withdrawing health-data contribution consent" }, "settingsHealthShareOffNeverUploaded": "Nothing was ever uploaded. Nothing will be.", "@settingsHealthShareOffNeverUploaded": { "description": "Dialog body when consent is withdrawn and no upload had ever happened" }, "settingsHealthShareOffDetail": "Nothing further will be uploaded.\n\nOne copy of your database was uploaded on {date}. The server keeps only the most recent copy per device. We tried to tell it your consent is withdrawn — that message is sent once and is not retried, so if this phone is offline it will not have arrived, and we cannot show you that the copy is gone either.", "@settingsHealthShareOffDetail": { "description": "Dialog body when consent is withdrawn and a previous upload exists, {date} is a local date/time string", "placeholders": { "date": { "type": "String" } } }, "settingsOk": "OK", "@settingsOk": { "description": "Generic OK button on the health-contribution-off dialog" }, "settingsHealthShareOnTitle": "Contribute your health data?", "@settingsHealthShareOnTitle": { "description": "Dialog title asking to grant whole-database health contribution" }, "settingsHealthShareOnBody": "Once a day, on Wi-Fi and while charging, a compressed copy of your ENTIRE database is uploaded — every day of scores and every raw sensor row the band has sent. It is used to improve the algorithms.\n\nIt is not anonymous in any meaningful sense: it is your whole health history. You can switch this off at any time, and nothing further is sent from that moment.", "@settingsHealthShareOnBody": { "description": "Dialog body explaining what the whole-database health-share upload does" }, "settingsNo": "No", "@settingsNo": { "description": "Decline button on the health-contribution consent dialog" }, "settingsContribute": "Contribute", "@settingsContribute": { "description": "Accept button on the health-contribution consent dialog" }, "settingsResetTitle": "Delete everything?", "@settingsResetTitle": { "description": "Confirmation dialog title for resetting all app data" }, "settingsResetBackupWarning": "App data deleted. Backup cleanup was incomplete. Some files or folder access may remain.", "@settingsResetBackupWarning": { "description": "Warning after reset when backup files or folder access could not be removed" }, "settingsResetPairingKeyWarning": "App data deleted, but a sensor pairing key could not be removed from secure storage. Delete everything again to retry.", "@settingsResetPairingKeyWarning": { "description": "Warning after reset when a sensor pairing key could not be removed from secure storage" }, "settingsResetChatGptWarning": "App data deleted, but the ChatGPT sign-in may not be fully removed. Disconnect OpenStrap in ChatGPT settings to make sure its access is revoked. Deleting everything again only retries removing what is left on this device.", "@settingsResetChatGptWarning": { "description": "Warning after reset when the ChatGPT sign-in may not have been revoked or removed from secure storage" }, "settingsResetBody": "This permanently deletes this app's data on this device:\n\n· every measured day, sleep, workout and route\n· every lab result, meal, medication dose, habit, breathing session and logged set\n· your journal, cycle log and what the app has learned as your usual\n· your profile, every preference and any stored AI key\n· the home-screen widget and every scheduled reminder\n\nExported copies and backups in previous or unavailable folders may remain. Delete those separately.\n\nThe band is unpaired, and it cannot re-send history it has already handed over. Export from Your data first if you want a copy.", "@settingsResetBody": { "description": "Confirmation dialog body listing exactly what a full reset deletes" }, "settingsResetKeepData": "Keep my data", "@settingsResetKeepData": { "description": "Cancel button on the reset-everything confirmation dialog" }, "settingsResetDeleteEverything": "Delete everything", "@settingsResetDeleteEverything": { "description": "Confirm button on the reset-everything confirmation dialog" }, "settingsNavTitle": "Settings", "@settingsNavTitle": { "description": "Title of the main settings screen" }, "settingsGroupTheBand": "The band", "@settingsGroupTheBand": { "description": "Settings group heading for band-related rows" }, "settingsAlarmRowTitle": "Alarm", "@settingsAlarmRowTitle": { "description": "Settings row title opening the alarm screen" }, "settingsAlarmRowSub": "Buzzes on your wrist, on the band’s own clock", "@settingsAlarmRowSub": { "description": "Settings row subtitle describing the band alarm" }, "settingsZoneAlertRowTitle": "HR zone alert", "@settingsZoneAlertRowTitle": { "description": "Settings row title for the live-workout HR zone crossing haptic" }, "settingsZoneAlertRowSub": "Buzz when your heart rate crosses into or out of the target zone during a live workout", "@settingsZoneAlertRowSub": { "description": "Settings row subtitle for the HR zone alert toggle" }, "settingsZoneAlertTargetRowTitle": "Target zone", "@settingsZoneAlertTargetRowTitle": { "description": "Settings row title for picking which HR zone the alert watches" }, "settingsZoneAlertTargetRowValue": "Zone {zone}", "@settingsZoneAlertTargetRowValue": { "description": "Value shown on the target-zone row, e.g. Zone 3", "placeholders": { "zone": { "type": "int" } } }, "settingsGroupThisPhone": "This phone", "@settingsGroupThisPhone": { "description": "Settings group heading for phone-side sensing rows" }, "settingsStepsRowTitle": "Steps", "@settingsStepsRowTitle": { "description": "Settings row title for the phone's own step counter" }, "settingsStepsRowSub": "This phone’s own step counter, for the hours the band doesn’t cover. Nothing leaves the device", "@settingsStepsRowSub": { "description": "Settings row subtitle explaining the phone step counter" }, "settingsGroupNotifications": "Notifications", "@settingsGroupNotifications": { "description": "Settings group heading for the notifications row" }, "settingsManageNotificationsRowTitle": "Manage notifications", "@settingsManageNotificationsRowTitle": { "description": "Settings row title opening the notification settings screen" }, "settingsManageNotificationsRowSub": "What may interrupt you, quiet hours, and off switches for all of them", "@settingsManageNotificationsRowSub": { "description": "Settings row subtitle for the manage-notifications row" }, "settingsGroupPreferences": "Preferences", "@settingsGroupPreferences": { "description": "Settings group heading for units/appearance/cycle-tracking" }, "settingsUnitsRowTitle": "Units", "@settingsUnitsRowTitle": { "description": "Settings row title cycling the measurement unit system" }, "settingsAppearanceRowTitle": "Appearance", "@settingsAppearanceRowTitle": { "description": "Settings row title cycling the app theme" }, "settingsClockFormatRowTitle": "Time format", "@settingsClockFormatRowTitle": { "description": "Settings row title cycling the 12/24-hour clock format" }, "settingsClockFormatSystem": "System", "@settingsClockFormatSystem": { "description": "Clock format value: follow the operating system setting" }, "settingsClockFormat24h": "24-hour", "@settingsClockFormat24h": { "description": "Clock format value: 24-hour clock (e.g. 19:30)" }, "settingsClockFormat12h": "12-hour", "@settingsClockFormat12h": { "description": "Clock format value: 12-hour clock with AM/PM (e.g. 7:30 PM)" }, "settingsCycleTrackingRowTitle": "Cycle tracking", "@settingsCycleTrackingRowTitle": { "description": "Settings row title toggling cycle tracking" }, "settingsCycleTrackingRowSub": "Adds the Cycle tab to Wellness. Off hides it and keeps everything already logged", "@settingsCycleTrackingRowSub": { "description": "Settings row subtitle for the cycle-tracking toggle" }, "settingsGroupYourData": "Your data", "@settingsGroupYourData": { "description": "Settings group heading for export/backup/health-write rows" }, "settingsExportBackupImportRowTitle": "Export, backup, import", "@settingsExportBackupImportRowTitle": { "description": "Settings row title opening the data screen" }, "settingsExportBackupImportRowSub": "Spreadsheets, a full copy, and bringing history in", "@settingsExportBackupImportRowSub": { "description": "Settings row subtitle for the data screen entry" }, "settingsGroupAutomation": "Automation", "@settingsGroupAutomation": { "description": "Settings group heading for double-tap and Tasker/Shortcuts rows" }, "settingsDoubleTapRowTitle": "Double-tap", "@settingsDoubleTapRowTitle": { "description": "Settings row title opening the double-tap gesture screen" }, "settingsDoubleTapRowSub": "What a double-tap on the band does", "@settingsDoubleTapRowSub": { "description": "Settings row subtitle for the double-tap gesture entry" }, "settingsKeepAliveRowTitle": "Keep syncing in the background", "@settingsKeepAliveRowTitle": { "description": "Android settings row title for the battery-optimization exemption" }, "settingsKeepAliveRowSub": "So battery saving doesn’t stop the overnight sync", "@settingsKeepAliveRowSub": { "description": "Android settings row subtitle for the battery-optimization exemption" }, "settingsKeepAliveAllow": "Allow", "@settingsKeepAliveAllow": { "description": "Value shown on the background-sync row while the exemption has not been granted; tapping asks for it" }, "settingsAutostartRowTitle": "Allow auto-start", "@settingsAutostartRowTitle": { "description": "Android settings row title, shown only on phone makers with a separate autostart allowlist" }, "settingsAutostartRowSub": "This phone’s maker needs one more setting before the app can keep syncing overnight", "@settingsAutostartRowSub": { "description": "Subtitle for the autostart row; tapping opens the phone maker's own settings screen" }, "settingsTaskerShortcutsRowTitle": "Tasker and Shortcuts", "@settingsTaskerShortcutsRowTitle": { "description": "Settings row title opening the automation screen" }, "settingsTaskerShortcutsRowSub": "Android only for events out. iOS can buzz the band but cannot be triggered by it", "@settingsTaskerShortcutsRowSub": { "description": "Settings row subtitle stating the Android/iOS automation asymmetry" }, "settingsGroupPrivacy": "Privacy", "@settingsGroupPrivacy": { "description": "Settings group heading for telemetry/barcode/health-share/update rows" }, "settingsCrashReportsRowTitle": "Crash reports", "@settingsCrashReportsRowTitle": { "description": "Settings row title toggling crash telemetry" }, "settingsCrashReportsRowSub": "Nothing is sent until you say so", "@settingsCrashReportsRowSub": { "description": "Settings row subtitle for the crash-reports toggle" }, "settingsBarcodeLookupRowTitle": "Look barcodes up online", "@settingsBarcodeLookupRowTitle": { "description": "Settings row title toggling online barcode lookup" }, "settingsBarcodeLookupRowSub": "Sends a scanned barcode to openfoodfacts.org. Nothing about you goes with it", "@settingsBarcodeLookupRowSub": { "description": "Settings row subtitle for the barcode-lookup toggle" }, "settingsContributeHealthDataRowTitle": "Contribute my health data", "@settingsContributeHealthDataRowTitle": { "description": "Settings row title toggling whole-database health contribution" }, "settingsContributeHealthDataRowSub": "Uploads your whole database once a day, on Wi-Fi and charging, to improve the algorithms", "@settingsContributeHealthDataRowSub": { "description": "Settings row subtitle for the health-data-contribution toggle" }, "settingsCheckForUpdatesRowTitle": "Check for updates", "@settingsCheckForUpdatesRowTitle": { "description": "Settings row title toggling background update checks" }, "settingsUpdateBelowMinimum": "This build is below the minimum supported build. Install the newer release from GitHub", "@settingsUpdateBelowMinimum": { "description": "Update-check subtitle when this build is below the minimum supported version" }, "settingsUpdateAvailable": "A newer build is published on GitHub", "@settingsUpdateAvailable": { "description": "Update-check subtitle when a newer build is available" }, "settingsUpdateCheckSub": "Asks the release server on launch. It sees your IP address and when you open the app", "@settingsUpdateCheckSub": { "description": "Update-check subtitle when the app is up to date" }, "settingsGroupAbout": "About", "@settingsGroupAbout": { "description": "Settings group heading for version/notices rows" }, "settingsVersionRowTitle": "Version", "@settingsVersionRowTitle": { "description": "Settings row title showing the app version" }, "settingsNoticesLicencesRowTitle": "Notices and licences", "@settingsNoticesLicencesRowTitle": { "description": "Settings row title opening open-source notices and licences" }, "settingsNoticesLicencesRowSub": "Who this app is not, and whose data it uses", "@settingsNoticesLicencesRowSub": { "description": "Settings row subtitle for the notices-and-licences row" }, "settingsGroupDeveloper": "Developer", "@settingsGroupDeveloper": { "description": "Settings group heading for the hidden developer tools" }, "settingsComponentGalleryRowTitle": "Component gallery", "@settingsComponentGalleryRowTitle": { "description": "Developer settings row title opening the UI component gallery" }, "settingsComponentGalleryRowSub": "Every component, at any text scale, in either theme", "@settingsComponentGalleryRowSub": { "description": "Developer settings row subtitle for the component gallery" }, "settingsDeveloperModeRowTitle": "Developer mode", "@settingsDeveloperModeRowTitle": { "description": "Developer settings row title to leave developer mode" }, "settingsResetAllDataRowTitle": "Reset all data", "@settingsResetAllDataRowTitle": { "description": "Settings row title for the destructive full data reset" }, "settingsNotificationsNavTitle": "Notifications", "@settingsNotificationsNavTitle": { "description": "Title of the notification settings screen" }, "settingsNotificationsNavSub": "WHAT MAY INTERRUPT YOU", "@settingsNotificationsNavSub": { "description": "Subtitle under the notification settings screen title" }, "settingsNotificationsOffSystemTitle": "Notifications are off at the system level", "@settingsNotificationsOffSystemTitle": { "description": "Status card title when OS-level notification permission is denied" }, "settingsNotificationsOffSystemBody": "Nothing below can reach you until the OS lets it.", "@settingsNotificationsOffSystemBody": { "description": "Status card body when OS-level notification permission is denied" }, "settingsTurnThemOn": "Turn them on", "@settingsTurnThemOn": { "description": "Fix button turning on OS notification permission" }, "settingsGroupManageNotifications": "Manage notifications", "@settingsGroupManageNotifications": { "description": "Settings group heading listing every individual notification toggle" }, "settingsHealthExceptionsRowTitle": "Health exceptions", "@settingsHealthExceptionsRowTitle": { "description": "Notification row title for the health-exception alert toggle" }, "settingsHealthExceptionsRowSub": "One a day at most, and only when something moved away from your usual", "@settingsHealthExceptionsRowSub": { "description": "Notification row subtitle for the health-exception alert toggle" }, "settingsBandAlertsRowTitle": "Band alerts", "@settingsBandAlertsRowTitle": { "description": "Notification row title for band device alerts" }, "settingsBandAlertsRowSub": "Flat battery, on the charger, gone quiet", "@settingsBandAlertsRowSub": { "description": "Notification row subtitle for band device alerts" }, "settingsAlarmLatchFailedRowTitle": "Alarm not confirmed", "@settingsAlarmLatchFailedRowTitle": { "description": "Notification row title for the alarm latch-failure alert" }, "settingsAlarmLatchFailedRowSub": "Warn when the band never confirms an alarm this app just armed", "@settingsAlarmLatchFailedRowSub": { "description": "Notification row subtitle for the alarm latch-failure alert" }, "settingsAlarmNightCheckRowTitle": "No-alarm check-in", "@settingsAlarmNightCheckRowTitle": { "description": "Notification row title for the 7pm no-alarm-tonight check" }, "settingsAlarmNightCheckRowSub": "A 7pm heads-up on any night with no wake alarm armed — silent otherwise", "@settingsAlarmNightCheckRowSub": { "description": "Notification row subtitle for the 7pm no-alarm-tonight check" }, "settingsAlertMeAtRowTitle": "Alert me at", "@settingsAlertMeAtRowTitle": { "description": "Notification row title for the low-battery threshold" }, "settingsAlertMeAtRowSub": "Warn when the band drops under this charge level", "@settingsAlertMeAtRowSub": { "description": "Notification row subtitle for the low-battery threshold" }, "settingsRecoveryReadyRowTitle": "Recovery ready", "@settingsRecoveryReadyRowTitle": { "description": "Notification row title for the morning recovery-ready alert" }, "settingsRecoveryReadyRowSub": "One note when your morning recovery score lands", "@settingsRecoveryReadyRowSub": { "description": "Notification row subtitle for the recovery-ready alert" }, "settingsWeeklyLookbackRowTitle": "Weekly lookback", "@settingsWeeklyLookbackRowTitle": { "description": "Notification row title for the weekly summary alert" }, "settingsWeeklyLookbackRowSub": "Sunday evening, but only for a week that actually found something. Most weeks are quiet", "@settingsWeeklyLookbackRowSub": { "description": "Notification row subtitle for the weekly summary alert" }, "settingsDetectedWorkoutsRowTitle": "Detected workouts", "@settingsDetectedWorkoutsRowTitle": { "description": "Notification row title for auto-detected workout prompts" }, "settingsDetectedWorkoutsRowSub": "Ask about efforts the band spotted that you did not start. Off hides the prompt and the review cards; the band goes on measuring either way", "@settingsDetectedWorkoutsRowSub": { "description": "Notification row subtitle for auto-detected workout prompts" }, "settingsMovementNudgeRowTitle": "Movement nudge", "@settingsMovementNudgeRowTitle": { "description": "Notification row title for the sedentary-movement nudge" }, "settingsMovementNudgeRowSub": "After two hours without moving, or 90 minutes at a desk. A phone notification plus a buzz on the band when it’s connected", "@settingsMovementNudgeRowSub": { "description": "Notification row subtitle for the sedentary-movement nudge" }, "settingsWindDownRowTitle": "Wind-down", "@settingsWindDownRowTitle": { "description": "Notification row title for the bedtime wind-down nudge" }, "settingsWindDownRowSub": "A heads-up about 45 minutes before the bedtime learned from your own nights, kept clear of your quiet hours. Appears after about a week of wear", "@settingsWindDownRowSub": { "description": "Notification row subtitle for the bedtime wind-down nudge" }, "settingsStepGoalAlertsRowTitle": "Step goal alerts", "@settingsStepGoalAlertsRowTitle": { "description": "Notification row title for the step-goal achievement alert" }, "settingsStepGoalAlertsRowSub": "Tells you once when today crosses your steps goal", "@settingsStepGoalAlertsRowSub": { "description": "Notification row subtitle for the step-goal achievement alert" }, "settingsMedicationRemindersRowTitle": "Medication reminders", "@settingsMedicationRemindersRowTitle": { "description": "Notification row title for medication-dose reminders" }, "settingsMedicationRemindersRowSub": "One notification per scheduled dose, plus a buzz on the band when it’s connected. Skipped for doses already marked", "@settingsMedicationRemindersRowSub": { "description": "Notification row subtitle for medication-dose reminders" }, "settingsDailyCheckInRowTitle": "Daily check-in", "@settingsDailyCheckInRowTitle": { "description": "Notification row title for the evening journal check-in prompt" }, "settingsDailyCheckInRowSub": "One prompt in the evening to write the day — mood, energy, stress. Skipped once the day already has a rating in it", "@settingsDailyCheckInRowSub": { "description": "Notification row subtitle for the evening journal check-in prompt" }, "settingsWaterReminderRowTitle": "Water reminder", "@settingsWaterReminderRowTitle": { "description": "Notification row title for the water-logging reminder" }, "settingsWaterReminderRowSub": "A buzz on the strap and a notification on your phone through your waking hours, to remind you to log a drink. Nothing is measured either way", "@settingsWaterReminderRowSub": { "description": "Notification row subtitle for the water-logging reminder" }, "settingsRemindMeEveryRowTitle": "Remind me every", "@settingsRemindMeEveryRowTitle": { "description": "Notification row title cycling the water-reminder interval" }, "settingsGroupTheStrap": "The strap", "@settingsGroupTheStrap": { "description": "Settings group heading for the strap-buzz-on-notification row" }, "settingsBuzzOnAppNotificationsRowTitle": "Buzz on app notifications", "@settingsBuzzOnAppNotificationsRowTitle": { "description": "Settings row title opening the band-notification relay screen" }, "settingsBuzzOnAppNotificationsRowSub": "Pick which phone apps make the strap buzz", "@settingsBuzzOnAppNotificationsRowSub": { "description": "Settings row subtitle for the band-notification relay screen entry" }, "settingsGroupQuietHours": "Quiet hours", "@settingsGroupQuietHours": { "description": "Settings group heading for the quiet-hours rows" }, "settingsQuietHoursRowTitle": "Quiet hours", "@settingsQuietHoursRowTitle": { "description": "Settings row title toggling quiet hours" }, "settingsQuietHoursRowSub": "Nothing buzzes inside this window", "@settingsQuietHoursRowSub": { "description": "Settings row subtitle for the quiet-hours toggle" }, "settingsQuietHoursStartsRowTitle": "Starts", "@settingsQuietHoursStartsRowTitle": { "description": "Settings row title for the quiet-hours start time" }, "settingsQuietHoursEndsRowTitle": "Ends", "@settingsQuietHoursEndsRowTitle": { "description": "Settings row title for the quiet-hours end time" }, "settingsHealthExceptionsBreakThroughRowTitle": "Health exceptions break through", "@settingsHealthExceptionsBreakThroughRowTitle": { "description": "Settings row title toggling whether health-exception alerts bypass quiet hours" }, "settingsAlarmNotOnListTitle": "The alarm is not on this list", "@settingsAlarmNotOnListTitle": { "description": "Status card title clarifying the alarm has its own off switch" }, "settingsAlarmNotOnListBody": "Cancel it on the Alarm screen instead.", "@settingsAlarmNotOnListBody": { "description": "Status card body directing to the alarm screen to cancel it" }, "settingsImportNoPermission": "{store} did not grant those fields. Nothing was read.", "@settingsImportNoPermission": { "description": "Result message when the health store denies profile-field read permission", "placeholders": { "store": { "type": "String" } } }, "settingsImportEmptyWithBirthday": "Nothing came back. {store} holds no height, weight, birthday or sex for you — type them in here instead.", "@settingsImportEmptyWithBirthday": { "description": "Result message when the health store (with birthday support) has no profile fields for the user", "placeholders": { "store": { "type": "String" } } }, "settingsImportEmpty": "Nothing came back. {store} holds no height, weight or sex for you — type them in here instead.", "@settingsImportEmpty": { "description": "Result message when the health store (no birthday support) has no profile fields for the user", "placeholders": { "store": { "type": "String" } } }, "settingsImportNoChange": "Read {fields}. Your profile already says the same thing, so nothing changed.", "@settingsImportNoChange": { "description": "Result message when the health store returned fields that already match the stored profile", "placeholders": { "fields": { "type": "String" } } }, "settingsImportUpdated": "Updated {fields} from {store}.", "@settingsImportUpdated": { "description": "Result message when the health store's fields were applied to the profile", "placeholders": { "fields": { "type": "String" }, "store": { "type": "String" } } }, "settingsImportFailed": "Failed: {error}", "@settingsImportFailed": { "description": "Result message shown when the health-profile import throws", "placeholders": { "error": { "type": "String" } } }, "settingsAgeFieldLabel": "Age", "@settingsAgeFieldLabel": { "description": "Label used in the invalid-field list when the age field cannot be read" }, "settingsEditProfileNavTitle": "Edit profile", "@settingsEditProfileNavTitle": { "description": "Title of the edit-profile screen" }, "settingsNameFieldLabel": "NAME", "@settingsNameFieldLabel": { "description": "Field label for the profile name text field" }, "settingsSexFieldLabel": "SEX", "@settingsSexFieldLabel": { "description": "Field label for the profile sex selector" }, "settingsSexMale": "Male", "@settingsSexMale": { "description": "Sex option: male" }, "settingsSexFemale": "Female", "@settingsSexFemale": { "description": "Sex option: female" }, "settingsSexPreferNotToSay": "Prefer not to say", "@settingsSexPreferNotToSay": { "description": "Sex option: prefer not to say" }, "settingsAgeYearsFieldLabel": "AGE (YEARS)", "@settingsAgeYearsFieldLabel": { "description": "Field label for the profile age text field" }, "settingsFourFieldsTitle": "These four change your numbers", "@settingsFourFieldsTitle": { "description": "Status card title explaining what the four profile fields affect" }, "settingsFourFieldsBody": "They feed heart-rate zones, calorie estimates and training load. Clear one and only the metrics that need it stay unavailable.", "@settingsFourFieldsBody": { "description": "Status card body explaining what the four profile fields affect" }, "settingsImportBlockAppleHealth": "Height, weight, birthday and sex from {store}. Height and weight update every time; age and sex only fill an empty field.", "@settingsImportBlockAppleHealth": { "description": "Import-block explainer text on Apple Health (birthday-capable stores)", "placeholders": { "store": { "type": "String" } } }, "settingsImportBlockOther": "Height and weight, straight out of {store}. It has no birthday and no sex to read — no app can — so set those two above yourself.", "@settingsImportBlockOther": { "description": "Import-block explainer text on Health Connect (no birthday support)", "placeholders": { "store": { "type": "String" } } }, "settingsNotSetHint": "Not set", "@settingsNotSetHint": { "description": "Hint text shown in an empty profile field" }, "settingsAutomationNavTitle": "Automation", "@settingsAutomationNavTitle": { "description": "Title of the automation settings screen" }, "settingsSyncFinishesSectionTitle": "When a sync finishes", "@settingsSyncFinishesSectionTitle": { "description": "Section heading explaining the outbound sync-complete event" }, "settingsSyncFinishesAndroidBody": "The app broadcasts an intent your automation app can react to. Filter on the action below; it says how many records arrived and when.", "@settingsSyncFinishesAndroidBody": { "description": "Section body on Android explaining the sync-complete broadcast" }, "settingsSyncFinishesIosBody": "iOS can’t do this: Shortcuts automations only start on Apple’s own fixed events, and apps can’t add one. This is an iOS limit, not a setting.", "@settingsSyncFinishesIosBody": { "description": "Section body on iOS explaining why the sync-complete trigger cannot work" }, "settingsSyncFinishesExtras": "Extras: records (int), at (unix seconds)", "@settingsSyncFinishesExtras": { "description": "Technical detail line listing the broadcast intent's extras" }, "settingsNeverSendSectionTitle": "What it will never send", "@settingsNeverSendSectionTitle": { "description": "Section heading listing what the automation event never includes" }, "settingsNeverSendBody": "No recovery, strain or sleep score is sent, on either platform. A missing number would arrive as a bare zero. Sync facts go out, not measurements.", "@settingsNeverSendBody": { "description": "Section body listing what the automation event never includes" }, "settingsBuzzFromShortcutSectionTitle": "Buzzing the band from a shortcut", "@settingsBuzzFromShortcutSectionTitle": { "description": "Section heading explaining the inbound band-buzz endpoint" }, "settingsBuzzFromShortcutAndroidBody": "Send wtf.openstrap.openstrap_edge.BUZZ_STRAP with this token as the “token” string extra. Without it any app on the phone could buzz your band.", "@settingsBuzzFromShortcutAndroidBody": { "description": "Section body on Android explaining how to trigger the band buzz" }, "settingsBuzzFromShortcutIosBody": "This direction works on iOS: a shortcut you run yourself can reach the app. What it cannot do is run itself when the band syncs.", "@settingsBuzzFromShortcutIosBody": { "description": "Section body on iOS explaining the inbound band-buzz endpoint" }, "settingsNoTokenYet": "No token yet — reopen this screen.", "@settingsNoTokenYet": { "description": "Body shown when the automation auth token has not loaded yet" }, "settingsCopied": "Copied", "@settingsCopied": { "description": "Button label after the automation token was copied" }, "settingsCopyTheToken": "Copy the token", "@settingsCopyTheToken": { "description": "Button label to copy the automation token" }, "bandStatusBluetoothDeniedTitle": "Bluetooth is switched off for this app", "@bandStatusBluetoothDeniedTitle": { "description": "BandStatus card title: app-level Bluetooth permission denied" }, "bandStatusBluetoothDeniedReason": "The phone isn’t letting OpenStrap use Bluetooth, so nothing can connect. Allow Bluetooth for OpenStrap in your phone’s settings.", "@bandStatusBluetoothDeniedReason": { "description": "BandStatus card body: app-level Bluetooth permission denied" }, "bandStatusBluetoothDeniedFix": "Open Settings → OpenStrap and allow Bluetooth", "@bandStatusBluetoothDeniedFix": { "description": "BandStatus fix action: app-level Bluetooth permission denied" }, "bandStatusBluetoothOffTitle": "Bluetooth is turned off", "@bandStatusBluetoothOffTitle": { "description": "BandStatus card title: phone Bluetooth radio is off" }, "bandStatusBluetoothOffReason": "The phone’s radio is off, so the band cannot be reached by any app. The band keeps recording meanwhile; nothing is lost.", "@bandStatusBluetoothOffReason": { "description": "BandStatus card body: phone Bluetooth radio is off" }, "bandStatusBluetoothOffFix": "Turn Bluetooth on", "@bandStatusBluetoothOffFix": { "description": "BandStatus fix action: phone Bluetooth radio is off" }, "bandStatusBluetoothUnsupportedTitle": "This phone has no Bluetooth Low Energy radio", "@bandStatusBluetoothUnsupportedTitle": { "description": "BandStatus card title: phone has no BLE radio" }, "bandStatusBluetoothUnsupportedReason": "The band can only be reached over Bluetooth Low Energy. Imported data still works; a live link does not.", "@bandStatusBluetoothUnsupportedReason": { "description": "BandStatus card body: phone has no BLE radio" }, "bandStatusReconnectPausedTitle": "Reconnecting has been paused", "@bandStatusReconnectPausedTitle": { "description": "BandStatus card title: auto-reconnect paused after repeated bond refusals" }, "bandStatusReconnectPausedReason": "The band refused the pairing key {n, plural, one{{n} time} other{{n} times}} in a row, so the app stopped retrying to save battery. It will try again on its own in about 30 minutes.", "@bandStatusReconnectPausedReason": { "description": "BandStatus card body: auto-reconnect paused, with the refusal count", "placeholders": { "n": { "type": "int" } } }, "bandStatusRepairNeededTitle": "The band needs to be paired again", "@bandStatusRepairNeededTitle": { "description": "BandStatus card title: band needs re-pairing" }, "bandStatusRepairNeededReason": "The band rejects this phone’s encryption key, so no data moves. Your recordings are safe on the band; pair it again to continue.", "@bandStatusRepairNeededReason": { "description": "BandStatus card body: band needs re-pairing" }, "bandStatusReconnectPausedFix": "If it pauses again, forget the band in the phone’s Bluetooth settings, then pair it again here", "@bandStatusReconnectPausedFix": { "description": "BandStatus fix action for the reconnect-paused state: re-pair only if the pause trips again after the automatic retry" }, "bandStatusRepairFix": "Forget the band in the phone’s Bluetooth settings, then pair it again here", "@bandStatusRepairFix": { "description": "BandStatus fix action: forget and re-pair the band (shared by reconnect-paused and repair-needed states)" }, "bandStatusSyncStuckTitle": "One batch of recordings will not finish transferring", "@bandStatusSyncStuckTitle": { "description": "BandStatus card title: a sync batch will not finish transferring" }, "bandStatusSyncStuckReason": "The band keeps resending the same batch because the app’s confirmation isn’t getting through. Nothing is lost; it’s all saved here.", "@bandStatusSyncStuckReason": { "description": "BandStatus card body: a sync batch will not finish transferring" }, "bandStatusSyncStuckFix": "Reconnect the band; if it repeats tomorrow, pair it again", "@bandStatusSyncStuckFix": { "description": "BandStatus fix action: a sync batch will not finish transferring" }, "bandStatusStrapUnresponsiveTitle": "The band has stopped handing over its recordings", "@bandStatusStrapUnresponsiveTitle": { "description": "BandStatus card title: band holds newer data it will not hand over" }, "bandStatusStrapUnresponsiveReason": "The band reports newer recordings than it will send. Those recordings are still on the band and still safe; it just is not passing them across.", "@bandStatusStrapUnresponsiveReason": { "description": "BandStatus card body: band holds newer data it will not hand over" }, "bandStatusStrapUnresponsiveFix": "Put the band on its charger for a minute, then reconnect", "@bandStatusStrapUnresponsiveFix": { "description": "BandStatus fix action: band holds newer data it will not hand over" }, "bandStatusClockLostTitle": "Syncs are finishing with no data in them", "@bandStatusClockLostTitle": { "description": "BandStatus card title: syncs complete with no sensor data, clock likely lost" }, "bandStatusClockLostReason": "Syncs finish without any sensor readings, which usually means the band’s clock is off. The app resets it on every connect.", "@bandStatusClockLostReason": { "description": "BandStatus card body: syncs complete with no sensor data, clock likely lost" }, "bandStatusClockLostFix": "Leave the band connected for a few minutes; if nothing arrives by tomorrow, pair it again", "@bandStatusClockLostFix": { "description": "BandStatus fix action: syncs complete with no sensor data, clock likely lost" }, "bandStatusConnectedReason": "The band is linked and handing over its recordings.", "@bandStatusConnectedReason": { "description": "BandStatus card body: band is connected and syncing normally" }, "bandStatusConnectingTitle": "Connecting", "@bandStatusConnectingTitle": { "description": "BandStatus card title: link to the band is opening" }, "bandStatusConnectingReason": "Opening the link to the band.", "@bandStatusConnectingReason": { "description": "BandStatus card body: link to the band is opening" }, "bandStatusScanningTitle": "Looking for the band", "@bandStatusScanningTitle": { "description": "BandStatus card title: scanning for the band" }, "bandStatusScanningReason": "Listening for the band to advertise itself.", "@bandStatusScanningReason": { "description": "BandStatus card body: scanning for the band" }, "bandStatusDisconnectedReason": "The band is out of range, on its charger, or held by another app. It keeps recording either way.", "@bandStatusDisconnectedReason": { "description": "BandStatus card body: band is not connected" }, "bandStatusDisconnectedFix": "Bring the band near the phone, and close any other app connected to it", "@bandStatusDisconnectedFix": { "description": "BandStatus fix action: band is not connected" }, "devicesTierBeatToBeatLabel": "Beat-to-beat intervals", "@devicesTierBeatToBeatLabel": { "description": "SourceTier label: electrical beat-to-beat sensor (chest strap)" }, "devicesTierBeatToBeatDetail": "Electrical R-peak detection.", "@devicesTierBeatToBeatDetail": { "description": "SourceTier detail: electrical beat-to-beat sensor (chest strap)" }, "devicesTierWristOpticalLabel": "Wrist optical pulse", "@devicesTierWristOpticalLabel": { "description": "SourceTier label: wrist optical pulse (the band)" }, "devicesTierWristOpticalDetail": "Continuous 24/7 pulse, sleep and temperature. HRV is measured from your pulse at the wrist, not a chest strap.", "@devicesTierWristOpticalDetail": { "description": "SourceTier detail: wrist optical pulse (the band)" }, "devicesTierPhoneLabel": "Steps only", "@devicesTierPhoneLabel": { "description": "SourceTier label: phone motion coprocessor, steps only" }, "devicesTierPhoneDetail": "The phone’s own motion coprocessor. Steps and nothing else.", "@devicesTierPhoneDetail": { "description": "SourceTier detail: phone motion coprocessor, steps only" }, "deviceActionNoneLabel": "Do nothing", "@deviceActionNoneLabel": { "description": "Band double-tap action picker: label for the do-nothing option" }, "deviceActionNoneBlurb": "Double-tap does nothing.", "@deviceActionNoneBlurb": { "description": "Band double-tap action picker: blurb for the do-nothing option" }, "deviceActionMediaPlayPauseLabel": "Play / pause music", "@deviceActionMediaPlayPauseLabel": { "description": "Band double-tap action picker: label for play/pause music" }, "deviceActionMediaPlayPauseBlurb": "Toggle whatever is playing.", "@deviceActionMediaPlayPauseBlurb": { "description": "Band double-tap action picker: blurb for play/pause music" }, "deviceActionMediaNextLabel": "Next track", "@deviceActionMediaNextLabel": { "description": "Band double-tap action picker: label for next track" }, "deviceActionMediaNextBlurb": "Skip to the next track.", "@deviceActionMediaNextBlurb": { "description": "Band double-tap action picker: blurb for next track" }, "deviceActionMediaPrevLabel": "Previous track", "@deviceActionMediaPrevLabel": { "description": "Band double-tap action picker: label for previous track" }, "deviceActionMediaPrevBlurb": "Go back a track.", "@deviceActionMediaPrevBlurb": { "description": "Band double-tap action picker: blurb for previous track" }, "deviceActionVolumeUpLabel": "Volume up", "@deviceActionVolumeUpLabel": { "description": "Band double-tap action picker: label for volume up" }, "deviceActionVolumeUpBlurb": "Raise media volume a step.", "@deviceActionVolumeUpBlurb": { "description": "Band double-tap action picker: blurb for volume up" }, "deviceActionVolumeDownLabel": "Volume down", "@deviceActionVolumeDownLabel": { "description": "Band double-tap action picker: label for volume down" }, "deviceActionVolumeDownBlurb": "Lower media volume a step.", "@deviceActionVolumeDownBlurb": { "description": "Band double-tap action picker: blurb for volume down" }, "deviceActionRingPhoneLabel": "Ring my phone", "@deviceActionRingPhoneLabel": { "description": "Band double-tap action picker: label for ring my phone" }, "deviceActionRingPhoneBlurb": "Play a loud sound so you can find your phone.", "@deviceActionRingPhoneBlurb": { "description": "Band double-tap action picker: blurb for ring my phone" }, "deviceActionTorchLabel": "Flashlight", "@deviceActionTorchLabel": { "description": "Band double-tap action picker: label for flashlight toggle" }, "deviceActionTorchBlurb": "Toggle your phone's flashlight.", "@deviceActionTorchBlurb": { "description": "Band double-tap action picker: blurb for flashlight toggle" }, "deviceActionMarkMomentLabel": "Mark a moment", "@deviceActionMarkMomentLabel": { "description": "Band double-tap action picker: label for mark a moment" }, "deviceActionMarkMomentBlurb": "Tag the current moment in your journal.", "@deviceActionMarkMomentBlurb": { "description": "Band double-tap action picker: blurb for mark a moment" }, "deviceActionWorkoutToggleLabel": "Start / stop workout", "@deviceActionWorkoutToggleLabel": { "description": "Band double-tap action picker: label for start/stop workout" }, "deviceActionWorkoutToggleBlurb": "Begin or end a workout from your wrist.", "@deviceActionWorkoutToggleBlurb": { "description": "Band double-tap action picker: blurb for start/stop workout" }, "deviceActionLogWaterLabel": "Log water", "@deviceActionLogWaterLabel": { "description": "Band double-tap action picker: label for log water" }, "deviceActionLogWaterBlurb": "Add a glass to today's water, same step as the + on the nutrition screen.", "@deviceActionLogWaterBlurb": { "description": "Band double-tap action picker: blurb for log water" }, "deviceActionBroadcastToTaskerLabel": "Broadcast to Tasker", "@deviceActionBroadcastToTaskerLabel": { "description": "Band double-tap action picker: label for Tasker broadcast (Android only)" }, "deviceActionBroadcastToTaskerBlurb": "Fire a broadcast intent so Tasker can trigger any automation.", "@deviceActionBroadcastToTaskerBlurb": { "description": "Band double-tap action picker: blurb for Tasker broadcast (Android only)" }, "profileCommunityGroup": "Community", "@profileCommunityGroup": { "description": "Title of the Profile section grouping the project's public community links." }, "profileGithubTitle": "GitHub", "@profileGithubTitle": { "description": "Title of the Profile row linking to the project's GitHub repo." }, "profileGithubSub": "Please star and show your support — it helps the project grow", "@profileGithubSub": { "description": "Subtitle of the Profile row linking to the project's GitHub repo." }, "profileRedditTitle": "Reddit", "@profileRedditTitle": { "description": "Title of the Profile row linking to the project's subreddit." }, "profileRedditSub": "Join r/OpenStrap — post your achievements, questions, anything", "@profileRedditSub": { "description": "Subtitle of the Profile row linking to the project's subreddit." }, "profileDiscordTitle": "Discord", "@profileDiscordTitle": { "description": "Title of the Profile row linking to the project's Discord server." }, "profileDiscordSub": "Hang out with other users and the people building this", "@profileDiscordSub": { "description": "Subtitle of the Profile row linking to the project's Discord server." }, "profileSponsorTitle": "Sponsor", "@profileSponsorTitle": { "description": "Title of the Profile row linking to GitHub Sponsors." }, "profileSponsorSub": "This is a free, open-source project — sponsoring keeps it going", "@profileSponsorSub": { "description": "Subtitle of the Profile row linking to GitHub Sponsors." }, "nudgeDiscordTitle": "Come say hi", "@nudgeDiscordTitle": { "description": "Title of the Home nudge card inviting the user to join Discord." }, "nudgeDiscordBody": "Other OpenStrap users hang out on Discord — bugs, ideas, and people running the same band as you.", "@nudgeDiscordBody": { "description": "Body of the Home nudge card inviting the user to join Discord." }, "nudgeDiscordCta": "Join Discord", "@nudgeDiscordCta": { "description": "CTA button label of the Home nudge card inviting the user to join Discord." }, "nudgeDonateTitle": "Enjoying OpenStrap?", "@nudgeDonateTitle": { "description": "Title of the Home nudge card inviting the user to sponsor the project." }, "nudgeDonateBody": "It is a free, open-source project with no subscription. Sponsoring keeps it maintained.", "@nudgeDonateBody": { "description": "Body of the Home nudge card inviting the user to sponsor the project." }, "nudgeDonateCta": "Support the project", "@nudgeDonateCta": { "description": "CTA button label of the Home nudge card inviting the user to sponsor the project." }, "nudgeNotNow": "Not now", "@nudgeNotNow": { "description": "Semantic label for the button that snoozes a Home community nudge." }, "nudgeDontShowAgain": "Don't show this again", "@nudgeDontShowAgain": { "description": "Label and semantic label for the button that permanently dismisses a Home community nudge." }, "signalRrIntervals": "Beat-to-beat intervals", "@signalRrIntervals": { "description": "Human name for the rrIntervals input signal." }, "signalHr1Hz": "Continuous heart rate", "@signalHr1Hz": { "description": "Human name for the hr1Hz input signal." }, "signalHrSparse": "Heart rate", "@signalHrSparse": { "description": "Human name for the hrSparse input signal." }, "signalAccel1Hz": "Movement", "@signalAccel1Hz": { "description": "Human name for the accel1Hz input signal." }, "signalAccelHighRate": "High-rate movement", "@signalAccelHighRate": { "description": "Human name for the accelHighRate input signal." }, "signalPpgGreen": "Green PPG", "@signalPpgGreen": { "description": "Human name for the ppgGreen input signal." }, "signalPpgRedIr": "Red/infrared PPG", "@signalPpgRedIr": { "description": "Human name for the ppgRedIr input signal." }, "signalSkinTempRaw": "Skin temperature", "@signalSkinTempRaw": { "description": "Human name for the skinTempRaw input signal." }, "signalVendorScalars": "The device’s own numbers", "@signalVendorScalars": { "description": "Human name for the vendorScalars input signal." }, "missingSignalRrIntervals": "no beat-to-beat intervals", "@missingSignalRrIntervals": { "description": "Sub-label on a device that cannot serve a metric because its hardware does not report beat-to-beat intervals. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalHr1Hz": "no continuous heart rate", "@missingSignalHr1Hz": { "description": "Sub-label on a device that cannot serve a metric because its hardware does not report continuous heart rate. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalHrSparse": "no heart rate", "@missingSignalHrSparse": { "description": "Sub-label on a device that cannot serve a metric because its hardware does not report heart rate at all. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalAccel1Hz": "no accelerometer", "@missingSignalAccel1Hz": { "description": "Sub-label on a device that cannot serve a metric because it has no accelerometer. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalAccelHighRate": "no high-rate accelerometer", "@missingSignalAccelHighRate": { "description": "Sub-label on a device that cannot serve a metric because its accelerometer does not report at a high sample rate. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalPpgGreen": "no green PPG", "@missingSignalPpgGreen": { "description": "Sub-label on a device that cannot serve a metric because it has no green photoplethysmography (optical) sensor. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalPpgRedIr": "no red/infrared PPG", "@missingSignalPpgRedIr": { "description": "Sub-label on a device that cannot serve a metric because it has no red or infrared photoplethysmography (optical) sensor. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalSkinTempRaw": "no temperature sensor", "@missingSignalSkinTempRaw": { "description": "Sub-label on a device that cannot serve a metric because it has no skin temperature sensor. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalVendorScalars": "reports nothing of its own", "@missingSignalVendorScalars": { "description": "Sub-label on a device that cannot serve a metric because it publishes no pre-computed numbers of its own (only raw sensor signals). Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalUnknown": "cannot supply this", "@missingSignalUnknown": { "description": "Fallback sub-label on a device that cannot serve a metric when no specific missing sensor can be named. Lower case: it is appended after the device name and a middle dot." }, "devicesSensorLimit": "{count, plural, =1{One sensor is the most this phone will pair alongside your band. Remove it to add another.} other{This phone will pair at most {count} sensors alongside your band. Remove one to add another.}}", "@devicesSensorLimit": { "description": "Refusal shown when the paired-sensor cap is already reached.", "placeholders": { "count": { "type": "int" } } }, "devicesOrderNotSaved": "That order could not be saved. Nothing changed.", "@devicesOrderNotSaved": { "description": "Shown when a signal-priority write fails." }, "devicesRequestNotSaved": "That request could not be saved. Please try again.", "@devicesRequestNotSaved": { "description": "Shown when the add-a-band restart request could not be persisted." }, "ecgTitle": "ECG", "@ecgTitle": { "description": "WHOOP MG ECG: ECG" }, "ecgHeartScreener": "Heart Screener", "@ecgHeartScreener": { "description": "WHOOP MG ECG: Heart Screener" }, "ecgEntryMeta": "WHOOP MG · band-reported", "@ecgEntryMeta": { "description": "WHOOP MG ECG: WHOOP MG · band-reported" }, "ecgOpen": "Open", "@ecgOpen": { "description": "WHOOP MG ECG: Open" }, "ecgTakeEcg": "Take ECG", "@ecgTakeEcg": { "description": "WHOOP MG ECG: Take ECG" }, "ecgNeedsMg": "Take ECG needs a connected WHOOP MG.", "@ecgNeedsMg": { "description": "WHOOP MG ECG: Take ECG needs a connected WHOOP MG." }, "ecgHistoryEmpty": "No readings yet.", "@ecgHistoryEmpty": { "description": "WHOOP MG ECG: No readings yet." }, "ecgHistoryEmptyWhy": "Readings you take are saved here and stay readable while the band is away.", "@ecgHistoryEmptyWhy": { "description": "WHOOP MG ECG: Readings you take are saved here and stay readable while the band is away." }, "ecgWristPrompt": "Which wrist is the band on?", "@ecgWristPrompt": { "description": "WHOOP MG ECG: Which wrist is the band on?" }, "ecgWristLeft": "Left wrist", "@ecgWristLeft": { "description": "WHOOP MG ECG: Left wrist" }, "ecgWristRight": "Right wrist", "@ecgWristRight": { "description": "WHOOP MG ECG: Right wrist" }, "ecgInstruction": "Rest your arm. Touch both metal sides with your opposite thumb and index finger. Keep still.", "@ecgInstruction": { "description": "WHOOP MG ECG: Rest your arm. Touch both metal sides with your opposite thumb and index finger. Keep still." }, "ecgIllustration": "Illustration: the band on your wrist, and the thumb and index finger of your other hand touching its two metal sides.", "@ecgIllustration": { "description": "WHOOP MG ECG: Illustration: the band on your wrist, and the thumb and index finger of your other hand touching its two metal sides." }, "ecgContactLost": "Adjust your fingers and keep still", "@ecgContactLost": { "description": "WHOOP MG ECG: Adjust your fingers and keep still" }, "ecgPreparing": "Preparing the band…", "@ecgPreparing": { "description": "WHOOP MG ECG: Preparing the band…" }, "ecgRecovering": "Stopping a previous reading first…", "@ecgRecovering": { "description": "WHOOP MG ECG: Stopping a previous reading first…" }, "ecgWaiting": "Waiting for contact", "@ecgWaiting": { "description": "WHOOP MG ECG: Waiting for contact" }, "ecgMeasuring": "Measuring", "@ecgMeasuring": { "description": "WHOOP MG ECG: Measuring" }, "ecgRestarting": "Restarting…", "@ecgRestarting": { "description": "WHOOP MG ECG: Restarting…" }, "ecgSaving": "Saving…", "@ecgSaving": { "description": "WHOOP MG ECG: Saving…" }, "ecgCleaningUp": "Stopping the band…", "@ecgCleaningUp": { "description": "WHOOP MG ECG: Stopping the band…" }, "ecgCompleted": "Reading saved", "@ecgCompleted": { "description": "WHOOP MG ECG: Reading saved" }, "ecgUnreadableTitle": "The band could not read this", "@ecgUnreadableTitle": { "description": "WHOOP MG ECG: The band could not read this" }, "ecgInconclusiveTitle": "Inconclusive", "@ecgInconclusiveTitle": { "description": "WHOOP MG ECG: Inconclusive" }, "ecgInconclusiveRetryHint": "The band could not decide. You can try once more.", "@ecgInconclusiveRetryHint": { "description": "WHOOP MG ECG: The band could not decide. You can try once more." }, "ecgTryOnceMore": "Try once more", "@ecgTryOnceMore": { "description": "WHOOP MG ECG: Try once more" }, "ecgTakeAnother": "Take another", "@ecgTakeAnother": { "description": "WHOOP MG ECG: Take another" }, "ecgDone": "Done", "@ecgDone": { "description": "WHOOP MG ECG: Done" }, "ecgViewReading": "View reading", "@ecgViewReading": { "description": "WHOOP MG ECG: View reading" }, "ecgCancelledTitle": "Reading cancelled", "@ecgCancelledTitle": { "description": "WHOOP MG ECG: Reading cancelled" }, "ecgFailedTitle": "Reading failed", "@ecgFailedTitle": { "description": "WHOOP MG ECG: Reading failed" }, "ecgFailedDisconnected": "The band disconnected.", "@ecgFailedDisconnected": { "description": "WHOOP MG ECG: The band disconnected." }, "ecgFailedTimeout": "No result within two minutes.", "@ecgFailedTimeout": { "description": "WHOOP MG ECG: No result within two minutes." }, "ecgFailedGeneric": "The band did not accept the reading ({reason}).", "@ecgFailedGeneric": { "description": "WHOOP MG ECG: The band did not accept the reading ({reason}).", "placeholders": { "reason": { "type": "String" } } }, "ecgBusy": "Finish the other live session first.", "@ecgBusy": { "description": "WHOOP MG ECG: Finish the other live session first." }, "ecgIncompatible": "This band is not a WHOOP MG.", "@ecgIncompatible": { "description": "WHOOP MG ECG: This band is not a WHOOP MG." }, "ecgDisconnected": "Connect your WHOOP MG first.", "@ecgDisconnected": { "description": "WHOOP MG ECG: Connect your WHOOP MG first." }, "ecgCleanupIncomplete": "The band may still be generating. It will be stopped on the next connection.", "@ecgCleanupIncomplete": { "description": "WHOOP MG ECG: The band may still be generating. It will be stopped on the next connection." }, "ecgLivePreview": "Live signal preview", "@ecgLivePreview": { "description": "WHOOP MG ECG: Live signal preview" }, "ecgBandReported": "Band-reported result", "@ecgBandReported": { "description": "WHOOP MG ECG: Band-reported result" }, "ecgNotDiagnosis": "The category comes from the band. This is not a diagnosis.", "@ecgNotDiagnosis": { "description": "WHOOP MG ECG: The category comes from the band. This is not a diagnosis." }, "ecgCategorySinus": "Sinus rhythm", "@ecgCategorySinus": { "description": "WHOOP MG ECG: Sinus rhythm" }, "ecgCategoryLowHr": "Low heart rate", "@ecgCategoryLowHr": { "description": "WHOOP MG ECG: Low heart rate" }, "ecgCategoryPossibleAfib": "Possible AFib", "@ecgCategoryPossibleAfib": { "description": "WHOOP MG ECG: Possible AFib" }, "ecgCategoryAfibHighHr": "AFib with high heart rate", "@ecgCategoryAfibHighHr": { "description": "WHOOP MG ECG: AFib with high heart rate" }, "ecgCategoryHighHr": "High heart rate", "@ecgCategoryHighHr": { "description": "WHOOP MG ECG: High heart rate" }, "ecgCategoryHighHrNoAfib": "High heart rate, no AFib detected", "@ecgCategoryHighHrNoAfib": { "description": "WHOOP MG ECG: High heart rate, no AFib detected" }, "ecgCategoryInconclusive": "Inconclusive", "@ecgCategoryInconclusive": { "description": "WHOOP MG ECG: Inconclusive" }, "ecgCategoryUnreadable": "Unreadable", "@ecgCategoryUnreadable": { "description": "WHOOP MG ECG: Unreadable" }, "ecgReasonLowAmplitude": "Low amplitude", "@ecgReasonLowAmplitude": { "description": "WHOOP MG ECG: Low amplitude" }, "ecgReasonNoise": "Significant noise", "@ecgReasonNoise": { "description": "WHOOP MG ECG: Significant noise" }, "ecgReasonUnstable": "Unstable signal", "@ecgReasonUnstable": { "description": "WHOOP MG ECG: Unstable signal" }, "ecgReasonNotEnoughData": "Not enough data", "@ecgReasonNotEnoughData": { "description": "WHOOP MG ECG: Not enough data" }, "ecgAnalyzeNow": "Analyze now", "@ecgAnalyzeNow": { "description": "WHOOP MG ECG: Analyze now" }, "ecgAnalyzeCloudTitle": "Send this reading to your model?", "@ecgAnalyzeCloudTitle": { "description": "WHOOP MG ECG: Send this reading to your model?" }, "ecgAnalyzeCloudBody": "The reading summary and the full waveform (every sample the band recorded, 100 per second) will be sent to {host} as {model}. No raw frames, no band serial.", "@ecgAnalyzeCloudBody": { "description": "WHOOP MG ECG: The reading summary and a bounded waveform envelope will be sent to {host} as {model}. No raw frames, no band serial.", "placeholders": { "host": { "type": "String" }, "model": { "type": "String" } } }, "ecgContinue": "Continue", "@ecgContinue": { "description": "WHOOP MG ECG: Continue" }, "ecgCancel": "Cancel", "@ecgCancel": { "description": "WHOOP MG ECG: Cancel" }, "ecgDelete": "Delete reading", "@ecgDelete": { "description": "WHOOP MG ECG: Delete reading" }, "ecgAvgHr": "Average heart rate", "@ecgAvgHr": { "description": "WHOOP MG ECG: Average heart rate" }, "ecgQuality": "Signal quality", "@ecgQuality": { "description": "WHOOP MG ECG: Signal quality" }, "ecgInterruptions": "Interruptions", "@ecgInterruptions": { "description": "WHOOP MG ECG: Interruptions" }, "ecgDuration": "Duration", "@ecgDuration": { "description": "WHOOP MG ECG: Duration" }, "ecgMissingSegments": "Missing segments", "@ecgMissingSegments": { "description": "WHOOP MG ECG: Missing segments" }, "ecgWristLabel": "Wrist", "@ecgWristLabel": { "description": "WHOOP MG ECG: Wrist" }, "ecgZoomIn": "Zoom in", "@ecgZoomIn": { "description": "WHOOP MG ECG: Zoom in" }, "ecgZoomOut": "Zoom out", "@ecgZoomOut": { "description": "WHOOP MG ECG: Zoom out" }, "ecgClose": "Close ECG", "@ecgClose": { "description": "WHOOP MG ECG: Close ECG" }, "ecgProgress": "{pct}% complete", "@ecgProgress": { "description": "WHOOP MG ECG: {pct}% complete", "placeholders": { "pct": { "type": "int" } } }, "ecgWaveformEmpty": "No waveform was saved with this reading.", "@ecgWaveformEmpty": { "description": "WHOOP MG ECG: No waveform was saved with this reading." }, "ecgWaveformLabel": "Accepted waveform, microvolts as the band sent them. Gaps are missing seconds.", "@ecgWaveformLabel": { "description": "WHOOP MG ECG: Accepted waveform, microvolts as the band sent them. Gaps are missing seconds." }, "ecgSampleNote": "{count} samples at {rate} Hz, filtered, input-referred µV. No lead or polarity is claimed.", "@ecgSampleNote": { "description": "WHOOP MG ECG: {count} samples at {rate} Hz, filtered, input-referred µV. No lead or polarity is claimed.", "placeholders": { "count": { "type": "int" }, "rate": { "type": "int" } } }, "activityReviewTitle": "Detected activities", "activityPossibleNap": "Possible nap", "activityPossibleWorkout": "Possible workout", "activityConfirm": "Confirm", "activityEdit": "Edit", "activityDiscard": "Discard", "activityChangeSport": "Change sport", "@activityChangeSport": { "description": "Action on a detected workout: open the editor to pick the right sport (and times)." }, "activityNotAWorkout": "Not a workout", "@activityNotAWorkout": { "description": "One-tap correction on a detected workout: it was not a workout. Kept across re-analysis." }, "activitySaveConfirm": "Save and confirm", "activityNothing": "Nothing to review", "activityEmptyBody": "Possible naps and workouts will appear here.", "activityLoadFailed": "Could not load activities. Try again.", "activityReviewProblem": "Could not finish", "activityReview": "Review", "activityLoading": "Loading…", "activityPending": "{count} to review", "@activityPending": { "placeholders": { "count": { "type": "int" } } }, "activityLengthMinutes": "{minutes} min", "@activityLengthMinutes": { "placeholders": { "minutes": { "type": "int" } } }, "activityStart": "Start", "activityEnd": "End", "activityCheckTimes": "Check the times", "activityNapWindow": "Choose a past window between 5 minutes and 6 hours.", "activityEditNap": "Edit nap", "activityEditWorkout": "Edit workout", "activityNapAlerts": "Detected naps", "activityPushHint": "Push alerts only. Suggestions remain in Detected activities.", "devicesWornOn": "Worn on", "@devicesWornOn": { "description": "Step calibration wearing-location setting" }, "devicesWornOnSub": "Where the band sits. Used to calibrate steps.", "@devicesWornOnSub": { "description": "Step calibration wearing-location setting" }, "devicesWornWrist": "Wrist", "@devicesWornWrist": { "description": "Step calibration wearing-location setting" }, "devicesWornBicep": "Upper arm", "@devicesWornBicep": { "description": "Step calibration wearing-location setting" }, "devicesWornOther": "Somewhere else", "@devicesWornOther": { "description": "Step calibration wearing-location setting" }, "devicesWornSheetTitle": "Where do you wear it?", "@devicesWornSheetTitle": { "description": "Step calibration wearing-location setting" }, "devicesWornWristSub": "The default. Best step accuracy the band can give.", "@devicesWornWristSub": { "description": "Step calibration wearing-location setting" }, "devicesWornBicepSub": "Under-counts steps — the arm swings less than the wrist.", "@devicesWornBicepSub": { "description": "Step calibration wearing-location setting" }, "devicesWornUnknown": "Unknown", "@devicesWornUnknown": { "description": "Device detail: the stored wearing code is not one this build knows" }, "devicesWornOtherSub": "A pocket or bag. The band cannot see gait well there.", "@devicesWornOtherSub": { "description": "Step calibration wearing-location setting" }, "tabHome": "Home", "tabHealth": "Health", "tabNutrition": "Nutrition", "tabWorkout": "Workout", "tabWellness": "Wellness", "@tabHome": { "description": "Bottom tab bar labels (tabHome..tabWellness). Keep short; the five must read as different words." }, "activityCatalogueName": "{key, select, other{{name}}}", "@activityCatalogueName": { "description": "Display name only. Never persist translated activity or group names.", "placeholders": { "key": { "type": "String" }, "name": { "type": "String" } } }, "supplementSmartWindowMinutes": "{m} min before wake time", "@supplementSmartWindowMinutes": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "m": { "type": "int" } } }, "supplementGoalValue": "Goal {target}", "@supplementGoalValue": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "target": { "type": "String" } } }, "supplementOfCountUnit": "of {n} {unit}", "@supplementOfCountUnit": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "n": { "type": "int" }, "unit": { "type": "String" } } }, "supplementZoneStartsAt": "Z{n} · {name} starts at", "@supplementZoneStartsAt": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "n": { "type": "int" }, "name": { "type": "String" } } }, "supplementClimbedExport": "+{m} m elevation", "@supplementClimbedExport": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "m": { "type": "String" } } }, "supplementClimbedExportFeet": "+{ft} ft elevation", "@supplementClimbedExportFeet": { "description": "Share poster caption: elevation gained, in feet for imperial units", "placeholders": { "ft": { "type": "String" } } }, "supplementLapsExport": "{n} laps", "@supplementLapsExport": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "n": { "type": "String" } } }, "supplementReasonCount": "{reason} There were {have}, and it needs {need}.", "@supplementReasonCount": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "reason": { "type": "String" }, "have": { "type": "String" }, "need": { "type": "String" } } }, "supplementNeedNights": "Need {n} more nights", "@supplementNeedNights": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "n": { "type": "int" } } }, "supplementNeedDays": "Wear {n} more days to unlock", "@supplementNeedDays": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "n": { "type": "int" } } }, "supplementCountOf": "{have} of {need} {unit}", "@supplementCountOf": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "have": { "type": "String" }, "need": { "type": "String" }, "unit": { "type": "String" } } }, "supplementOutOf": "of {value}", "@supplementOutOf": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "value": { "type": "String" } } }, "supplementMinutesValue": "{m}m", "@supplementMinutesValue": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "m": { "type": "String" } } }, "supplementHoursMinutesValue": "{h}h {m}m", "@supplementHoursMinutesValue": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "h": { "type": "String" }, "m": { "type": "String" } } }, "exerciseCatalogueName": "{key, select, other{{name}}}", "@exerciseCatalogueName": { "description": "Display only. Original exercise keys, labels, credits and licences are unchanged.", "placeholders": { "key": { "type": "String" }, "name": { "type": "String" } } }, "supplementUnreadableFields": "{fields} are not numbers. Nothing was saved.", "@supplementUnreadableFields": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "fields": { "type": "String" } } }, "supplementGoalSemantic": "{label}, {current} toward {target}. {rate}", "@supplementGoalSemantic": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "label": { "type": "String" }, "current": { "type": "String" }, "target": { "type": "String" }, "rate": { "type": "String" } } }, "supplementObservationSemantic": "Health observation. {headline}. {detail}. {advice}", "@supplementObservationSemantic": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "headline": { "type": "String" }, "detail": { "type": "String" }, "advice": { "type": "String" } } }, "supplementUnavailable": "{label}, unavailable", "@supplementUnavailable": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "label": { "type": "String" } } }, "supplementChartLatest": "Latest {value}", "@supplementChartLatest": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "value": { "type": "String" } } }, "supplementChartRange": "ranging {lo} to {hi}", "@supplementChartRange": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "lo": { "type": "String" }, "hi": { "type": "String" } } }, "supplementChartSteady": "roughly level across {n} readings", "@supplementChartSteady": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "n": { "type": "int" } } }, "supplementChartChange": "{direction} {value} across {n} readings", "@supplementChartChange": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "direction": { "type": "String" }, "value": { "type": "String" }, "n": { "type": "int" } } }, "supplementMeasuredIn": "measured in {unit}", "@supplementMeasuredIn": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "unit": { "type": "String" } } }, "supplementChartFromTo": "from {start} to {end}", "@supplementChartFromTo": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "start": { "type": "String" }, "end": { "type": "String" } } }, "supplementChartLegend": "Key: {labels}", "@supplementChartLegend": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "labels": { "type": "String" } } }, "supplementBandOffSpan": "Your band was off your wrist {start} – {end}.", "@supplementBandOffSpan": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "start": { "type": "String" }, "end": { "type": "String" } } }, "supplementNavBack": "Back", "@supplementNavBack": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": {} }, "supplementHoursValue": "{h}h", "@supplementHoursValue": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "h": { "type": "String" } } }, "supplementSweepAbove": "above your usual range", "@supplementSweepAbove": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": {} }, "supplementSweepBelow": "below your usual range", "@supplementSweepBelow": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": {} }, "supplementSweepHighest": "the highest in {count} days", "@supplementSweepHighest": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "count": { "type": "String" } } }, "supplementSweepLowest": "the lowest in {count} days", "@supplementSweepLowest": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "count": { "type": "String" } } }, "supplementSweepFinding": "{value} — {direction} (usually {range})", "@supplementSweepFinding": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "value": { "type": "String" }, "direction": { "type": "String" }, "range": { "type": "String" } } }, "supplementSweepPair": "{first} and {second} — both outside your usual range on the same day, which is worth noticing but is not a measured relationship between them", "@supplementSweepPair": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "first": { "type": "String" }, "second": { "type": "String" } } }, "supplementProteinShort": "P", "@supplementProteinShort": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": {} }, "supplementCarbsShort": "C", "@supplementCarbsShort": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": {} }, "supplementFatShort": "F", "@supplementFatShort": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": {} }, "supplementCoachJournal": "Add journal for {date}: tags {tags}, note \"{note}\".", "@supplementCoachJournal": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "date": { "type": "String" }, "tags": { "type": "String" }, "note": { "type": "String" } } }, "supplementCoachPeriod": "Log a period start on {date}.", "@supplementCoachPeriod": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "date": { "type": "String" } } }, "supplementCoachStart": "Start a {type} session now.", "@supplementCoachStart": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "type": { "type": "String" } } }, "supplementCoachFood": "Add \"{name}\" to {meal} on {date}.", "@supplementCoachFood": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "name": { "type": "String" }, "meal": { "type": "String" }, "date": { "type": "String" } } }, "supplementCoachFoodEnergy": "Add \"{name}\" to {meal} on {date} ({kcal} kcal).", "@supplementCoachFoodEnergy": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "name": { "type": "String" }, "meal": { "type": "String" }, "date": { "type": "String" }, "kcal": { "type": "String" } } }, "supplementCoachFields": "Record {fields} for {date}.", "@supplementCoachFields": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "fields": { "type": "String" }, "date": { "type": "String" } } }, "supplementCoachCompleted": "Save a {minutes}-minute {type} starting {time} on {date}.", "@supplementCoachCompleted": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "minutes": { "type": "String" }, "type": { "type": "String" }, "time": { "type": "String" }, "date": { "type": "String" } } }, "supplementCoachMedication": "Schedule {name} at {time}, {days}. This app does not check interactions.", "@supplementCoachMedication": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "name": { "type": "String" }, "time": { "type": "String" }, "days": { "type": "String" } } }, "supplementCoachDose": "Record {name} on {date} as {state}.", "@supplementCoachDose": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "name": { "type": "String" }, "date": { "type": "String" }, "state": { "type": "String" } } }, "supplementCoachStepGoal": "Set your daily step goal to {goal}.", "@supplementCoachStepGoal": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "goal": { "type": "String" } } }, "supplementCoachProviderError": "Provider error ({code}): {detail}", "@supplementCoachProviderError": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "code": { "type": "String" }, "detail": { "type": "String" } } }, "supplementCoachModelsError": "Models request failed ({code}): {detail}", "@supplementCoachModelsError": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "code": { "type": "String" }, "detail": { "type": "String" } } }, "supplementCoachOversize": "That question pulled in too much data ({size} KB; the limit is {limit} KB), so nothing was sent. Try a shorter time range, or start a new chat.", "@supplementCoachOversize": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "size": { "type": "String" }, "limit": { "type": "String" } } }, "supplementCoachRendering": "Rendering {kind}…", "@supplementCoachRendering": { "description": "Presentation-only text; interpolated values remain unchanged.", "placeholders": { "kind": { "type": "String" } } }, "supplementADeviationNotATemperaturefc109f": "A deviation, not a temperature. Imported nights carry different units, so they are not charted together.", "@supplementADeviationNotATemperaturefc109f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementADoseIsDue1543e3": "A dose is due.", "@supplementADoseIsDue1543e3": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementALocalModelCanTake62d4a8": "A local model can take a while to load before its first reply. Default is 5 minutes (300s). Cloud providers always use 2 minutes.", "@supplementALocalModelCanTake62d4a8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementALowConfidenceOverlayA9fbabe": "A low-confidence overlay: a wrist sensor cannot see slow-wave activity, so deep sleep here is heart-rate flatness inside NREM.", "@supplementALowConfidenceOverlayA9fbabe": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAMinuteOfNotesTonightac2cf6": "A minute of notes tonight teaches OpenStrap what actually moves your recovery.", "@supplementAMinuteOfNotesTonightac2cf6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAPossibleNapIsReady84b3cf": "A possible nap is ready to review.", "@supplementAPossibleNapIsReady84b3cf": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAPossibleWorkoutIsReady2861bb": "A possible workout is ready to review.", "@supplementAPossibleWorkoutIsReady2861bb": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAStepGoalOf500f44746": "A step goal of 500–100,000 is a real one. Nothing was saved.", "@supplementAStepGoalOf500f44746": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAWeightedCompositeOfA8941a5": "A weighted mix of a few inputs, each compared with your own history. Each input's weight, and whether it had enough history last night, is listed on the Recovery screen. A missing input is left out and the rest re-weighted, never counted as zero.", "@supplementAWeightedCompositeOfA8941a5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAASMSleepAccountingDefinitions79c9d9": "AASM sleep-accounting definitions", "@supplementAASMSleepAccountingDefinitions79c9d9": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAN2554PedometerPhonePedometer79c0a4": "AN-2554 pedometer · phone pedometer (HealthKit / Health Connect)", "@supplementAN2554PedometerPhonePedometer79c0a4": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAboutYourBedtimeLogYourb7f0e2": "About your bedtime — log your day", "@supplementAboutYourBedtimeLogYourb7f0e2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAddAMedicationef7260": "Add a medication", "@supplementAddAMedicationef7260": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAlreadySyncing7ed158": "Already syncing.", "@supplementAlreadySyncing7ed158": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAwakeMin81d9ac": "Awake min", "@supplementAwakeMin81d9ac": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBaevskyStressIndexOverA037465": "Baevsky stress index over a resting window: a histogram measure of how tightly beat intervals cluster. There is deliberately no fallback when the resting window is missing.", "@supplementBaevskyStressIndexOverA037465": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBandBatteryAndCharging0d7f7d": "Band battery and charging", "@supplementBandBatteryAndCharging0d7f7d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBanisterTRIMPFamilyLogCompressed553d36": "Banister TRIMP family · log-compressed", "@supplementBanisterTRIMPFamilyLogCompressed553d36": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBedtimee3cb8b": "Bedtime", "@supplementBedtimee3cb8b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBloodOxygen8cd845": "Blood oxygen", "@supplementBloodOxygen8cd845": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBreathingRateRecoveredFromRespiratory66461f": "Breathing rate recovered from respiratory sinus arrhythmia — the periodic modulation breathing imposes on beat timing — over a grid of candidate rates.", "@supplementBreathingRateRecoveredFromRespiratory66461f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBreathingVariability99a552": "Breathing variability", "@supplementBreathingVariability99a552": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCardiovascularLoadOverTheDayd6c4f3": "Cardiovascular load over the day, compressed onto a 0–21 scale.", "@supplementCardiovascularLoadOverTheDayd6c4f3": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementChargeYourStrapBeforeBedcb17aa": "Charge your strap before bed", "@supplementChargeYourStrapBeforeBedcb17aa": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCharging5f99fe": "Charging", "@supplementCharging5f99fe": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCoefficientOfVariationOfPerc71989": "Coefficient of variation of per-window respiratory rate across the night.", "@supplementCoefficientOfVariationOfPerc71989": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementColeKripkeWakeSpineHRVcd5f37": "Cole–Kripke wake spine + HRV overlay", "@supplementColeKripkeWakeSpineHRVcd5f37": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCountedNeverModelledAStepc66896": "Counted, never modelled. A step count comes from a gait-capable counter: the band's 100 Hz pedometer while it streams, or your phone's. Each stretch of the day is counted by whichever of the two was actually recording it, and a stretch both covered is counted once, so a session never takes the day from the sensor that carried the rest of it. There is no 1 Hz estimate — walking cadence sits above what one sample a second can resolve, so a day with no counter behind it reports no steps rather than a guess.", "@supplementCountedNeverModelledAStepc66896": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCreatinined3029a": "Creatinine", "@supplementCreatinined3029a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDailyRecoveryReadinessFromYourf995c0": "Your daily recovery score", "@supplementDailyRecoveryReadinessFromYourf995c0": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDeepMin28f1fc": "Deep min", "@supplementDeepMin28f1fc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDeviceAlerts608f4f": "Device alerts", "@supplementDeviceAlerts608f4f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDidYouNapccbced": "Did you nap?", "@supplementDidYouNapccbced": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDidYouWorkOut9601b8": "Did you work out?", "@supplementDidYouWorkOut9601b8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementENMOOverAPersonalDynamice858c1": "ENMO over a personal dynamic-range floor", "@supplementENMOOverAPersonalDynamice858c1": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementEditDailyStepGoal3f9637": "Edit daily step goal", "@supplementEditDailyStepGoal3f9637": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementElevatedRestingHRSuppressedHRVfaf9cb": "Elevated resting HR + suppressed HRV over recent nights.", "@supplementElevatedRestingHRSuppressedHRVfaf9cb": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementEmptyResponseFromProvider2db057": "Empty response from provider.", "@supplementEmptyResponseFromProvider2db057": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementEndTheActiveWorkout37ce3f": "End the active workout.", "@supplementEndTheActiveWorkout37ce3f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementEndWorkout3e8d62": "End workout", "@supplementEndWorkout3e8d62": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementFastingGlucose5433f3": "Fasting glucose", "@supplementFastingGlucose5433f3": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementFastingInsulincf8459": "Fasting insulin", "@supplementFastingInsulincf8459": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementFerritin3c7c47": "Ferritin", "@supplementFerritin3c7c47": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementFolatec66dfd": "Folate", "@supplementFolatec66dfd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementFreeT4f89836": "Free T4", "@supplementFreeT4f89836": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementGoal9fe00a": "Goal", "@supplementGoal9fe00a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementGood61dedc": "Good", "@supplementGood61dedc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHDLCholesterold579f5": "HDL cholesterol", "@supplementHDLCholesterold579f5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHEALTHOBSERVATION4f314b": "HEALTH OBSERVATION", "@supplementHEALTHOBSERVATION4f314b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHRRecovery1b0d16": "HR recovery", "@supplementHRRecovery1b0d16": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHRVStabilitydfdddc": "HRV stability", "@supplementHRVStabilitydfdddc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHaematocrit2a11fb": "Haematocrit", "@supplementHaematocrit2a11fb": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHaemoglobinc80789": "Haemoglobin", "@supplementHaemoglobinc80789": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHardMinutes9feee8": "Hard minutes", "@supplementHardMinutes9feee8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHealthAlerts1de231": "Health alerts", "@supplementHealthAlerts1de231": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHeartRateRecoveryfdc20e": "Heart-rate recovery", "@supplementHeartRateRecoveryfdc20e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHeartRateToEnergyRegression1e01ee": "Heart-rate-to-energy regression over the waking span, anchored on your weight, age and sex. An estimate, and sensitive to all three.", "@supplementHeartRateToEnergyRegression1e01ee": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHighb1a595": "High", "@supplementHighb1a595": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHowFarSleepingHeartRatee471ae": "How far sleeping heart rate falls below the waking average.", "@supplementHowFarSleepingHeartRatee471ae": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHowWasToday812df3": "How was today?", "@supplementHowWasToday812df3": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementHrvRmssdf7982b": "Hrv rmssd", "@supplementHrvRmssdf7982b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementIllnessUnusualPhysiologyAndTemperatureda080b": "Illness, unusual physiology and temperature signals", "@supplementIllnessUnusualPhysiologyAndTemperatureda080b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementImportedFromWHOOPbb12b5": "Imported from WHOOP", "@supplementImportedFromWHOOPbb12b5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementIrregularHeartRhythmScreene259c5": "Irregular heart rhythm — screen", "@supplementIrregularHeartRhythmScreene259c5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementKeytel2005HarrisBenedictMifflind13096": "Keytel 2005 · Harris–Benedict / Mifflin BMR floor", "@supplementKeytel2005HarrisBenedictMifflind13096": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLDLCholesterol097ebc": "LDL cholesterol", "@supplementLDLCholesterol097ebc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLastNightIsStillBeinga75a55": "Last night is still being worked out.", "@supplementLastNightIsStillBeinga75a55": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLogAWorkout6929de": "Log a workout", "@supplementLogAWorkout6929de": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLogHowTheDayWent0af477": "Log how the day went", "@supplementLogHowTheDayWent0af477": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLogJournal7b63e0": "Log journal", "@supplementLogJournal7b63e0": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLogPeriod9fe2f6": "Log period", "@supplementLogPeriod9fe2f6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLowa12494": "Low", "@supplementLowa12494": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLowBatteryc5b099": "Low battery", "@supplementLowBatteryc5b099": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLowReadinessTodayfcb16c": "Low recovery today", "@supplementLowReadinessTodayfcb16c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMagnesiume6a692": "Magnesium", "@supplementMagnesiume6a692": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMarkADoseebc759": "Mark a dose", "@supplementMarkADoseebc759": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMedication36da83": "Medication", "@supplementMedication36da83": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMinutesOfSleepDetectedOUTSIDE0e1868": "Minutes of sleep detected OUTSIDE the main night: the same wrist z-angle window detector the night uses, confirmed by a heart-rate dip. Naps are counted separately and never folded into time asleep.", "@supplementMinutesOfSleepDetectedOUTSIDE0e1868": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMinutesWhoseAccelerationSitsAbovee173ee": "Minutes whose acceleration sits above a movement floor. That floor is pooled from your own recent days once there are enough of them, and a population one before that. This is activity VOLUME, not locomotion: steps are counted by a pedometer and are never derived from it.", "@supplementMinutesWhoseAccelerationSitsAbovee173ee": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMinutesWithABandRecord3ca74f": "Minutes with a band record present. The band logs to flash only while it is on a wrist, so record presence IS wear.", "@supplementMinutesWithABandRecord3ca74f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementModerateea8b09": "Moderate", "@supplementModerateea8b09": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMoodEnergyStressAMinute54d5f9": "Mood, energy, stress — a minute of it.", "@supplementMoodEnergyStressAMinute54d5f9": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMorningBriefing0da62b": "Morning briefing", "@supplementMorningBriefing0da62b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMorningCortisolc31c55": "Morning cortisol", "@supplementMorningCortisolc31c55": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMotionCoprocessord1ef3c": "Motion coprocessor", "@supplementMotionCoprocessord1ef3c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMovementMinutes4670da": "Movement minutes", "@supplementMovementMinutes4670da": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNightToNightCoefficientOf0cae4a": "Night-to-night coefficient of variation of RMSSD.", "@supplementNightToNightCoefficientOf0cae4a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNightlySweepe95625": "Nightly sweep", "@supplementNightlySweepe95625": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoAlarmSetForTonight1dd33d": "No alarm set for tonight", "@supplementNoAlarmSetForTonight1dd33d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoMotionWasRecordedAlongside2b680c": "No motion was recorded alongside the heart rate.", "@supplementNoMotionWasRecordedAlongside2b680c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoNightLongEnoughTo022959": "No night long enough to score was recorded.", "@supplementNoNightLongEnoughTo022959": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoReadiness723eb1": "No recovery", "@supplementNoReadiness723eb1": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoTargetYeta4b21a": "No target yet", "@supplementNoTargetYeta4b21a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoWakingHeartRateWase66108": "No waking heart rate was recorded for this day.", "@supplementNoWakingHeartRateWase66108": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNocturnalHRDipf94b8c": "Overnight HR dip", "@supplementNocturnalHRDipf94b8c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNocturnalDippingLiteraturePersonalBaseline63f775": "Nocturnal dipping literature; personal baseline", "@supplementNocturnalDippingLiteraturePersonalBaseline63f775": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNocturnalHeartRateMinimumPersonal5237e7": "Nocturnal heart-rate minimum; personal baseline, not population", "@supplementNocturnalHeartRateMinimumPersonal5237e7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNotEnoughHistoryYetTo635525": "Not enough history yet to know what normal looks like for you.", "@supplementNotEnoughHistoryYetTo635525": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNotEnoughNightsOfRestingce7af6": "Not enough nights of resting heart rate behind the reserve yet.", "@supplementNotEnoughNightsOfRestingce7af6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNothingFromLastNightHas71866a": "Nothing from last night has reached the app yet.", "@supplementNothingFromLastNightHas71866a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNothingRecordedSaysWhyThis97026a": "Nothing recorded says why this is missing.", "@supplementNothingRecordedSaysWhyThis97026a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNothingStoodOutTonight468e67": "Nothing stood out tonight.", "@supplementNothingStoodOutTonight468e67": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementOffe3de5a": "Off", "@supplementOffe3de5a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementPairedSensor0ff7bd": "Paired sensor", "@supplementPairedSensor0ff7bd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementPlews2013LnRMSSDHopkinsSmallestdd73bd": "Plews 2013 (lnRMSSD) · Hopkins smallest-worthwhile-change gate", "@supplementPlews2013LnRMSSDHopkinsSmallestdd73bd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementPlotting351c45": "Plotting…", "@supplementPlotting351c45": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementPosesbcddeb": "Poses", "@supplementPosesbcddeb": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementPossibleIllnessOnset9dccbc": "Possible illness onset", "@supplementPossibleIllnessOnset9dccbc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementProviderReturnedANonJSON31ec8d": "Provider returned a non-JSON response. Check the API base URL — it must point at an OpenAI-compatible /chat/completions endpoint.", "@supplementProviderReturnedANonJSON31ec8d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementProviderReturnedAnUnsupportedResponse711ef9": "The provider sent a reply this app can’t read. Use a standard OpenAI-compatible /chat/completions endpoint; streaming-only ones don’t work.", "@supplementProviderReturnedAnUnsupportedResponse711ef9": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementQueryingYourData547061": "Querying your data…", "@supplementQueryingYourData547061": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementREMSleepd0c12b": "REM sleep", "@supplementREMSleepd0c12b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRMSSDOverTheLongestArtefact4d9ff2": "RMSSD over the longest artefact-free window during sleep. Beat timing is recovered from the band's 1 Hz records and corrected by the Lipponen–Tarvainen method before any statistic is taken. Pulse-derived, so this is PRV: real and trendable, but not ECG HRV.", "@supplementRMSSDOverTheLongestArtefact4d9ff2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementReadingYourFoodLog4efdaa": "Reading your food log…", "@supplementReadingYourFoodLog4efdaa": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementReadingYourMedications855987": "Reading your medications…", "@supplementReadingYourMedications855987": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRecommendedBedtime4cba4c": "Recommended bedtime", "@supplementRecommendedBedtime4cba4c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRecordPresenceNotHeartRate83be2e": "Record-presence, not heart-rate validity", "@supplementRecordPresenceNotHeartRate83be2e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRelativeOnlyUncalibratedADC306a93": "Relative only — uncalibrated ADC", "@supplementRelativeOnlyUncalibratedADC306a93": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRemMin0d0cd5": "Rem min", "@supplementRemMin0d0cd5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementReps702045": "Reps", "@supplementReps702045": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRequestTimeoutSeconds1c1975": "Request timeout (seconds)", "@supplementRequestTimeoutSeconds1c1975": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRestingHrdfb52f": "Resting hr", "@supplementRestingHrdfb52f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSaveStepGoalf99049": "Save step goal", "@supplementSaveStepGoalf99049": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSetStepGoalb12cf1": "Set step goal", "@supplementSetStepGoalb12cf1": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementShownTonightOnVitalsa1d4ef": "Shown tonight on Vitals", "@supplementShownTonightOnVitalsa1d4ef": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSkinTemperatureElevated8165c1": "Skin temperature elevated", "@supplementSkinTemperatureElevated8165c1": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSleepDebtMin0cdfc7": "Sleep debt min", "@supplementSleepDebtMin0cdfc7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSleepEfficiency9c3cbc": "Sleep efficiency", "@supplementSleepEfficiency9c3cbc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSleepEfficiencyPctc39ed5": "Sleep efficiency pct", "@supplementSleepEfficiencyPctc39ed5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSleepMin16cd5b": "Sleep min", "@supplementSleepMin16cd5b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSmartWakeOff20d2dc": "Smart wake off", "@supplementSmartWakeOff20d2dc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSmartWakeOnTheBand381ebf": "Smart wake on — the band still buzzes at the wake time either way", "@supplementSmartWakeOnTheBand381ebf": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSmartWakeWindowb1483d": "Smart wake window", "@supplementSmartWakeWindowb1483d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSomethingStoodOutToday463b39": "Something stood out today", "@supplementSomethingStoodOutToday463b39": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementStagedFromBeatTimingVariabilityb83d0c": "Staged from beat-timing variability and movement. A wrist sensor separates REM from light sleep only approximately.", "@supplementStagedFromBeatTimingVariabilityb83d0c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementStartWorkoutd0f3f2": "Start workout", "@supplementStartWorkoutd0f3f2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementStepGoalReached03be1a": "Step goal reached", "@supplementStepGoalReached03be1a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementStillWorkingOut5f72c7": "Still working out?", "@supplementStillWorkingOut5f72c7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSustainedRiseVsYourBaseline67c853": "Sustained rise above your usual — a possible illness signal.", "@supplementSustainedRiseVsYourBaseline67c853": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSyncing221ca6": "Syncing…", "@supplementSyncing221ca6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTalkItThrough88a9d2": "Talk it through", "@supplementTalkItThrough88a9d2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTapForLastNightS6fe212": "Tap for last night's sleep, recovery and what it means for today.", "@supplementTapForLastNightS6fe212": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTapToLogAGlass879bad": "Tap to log a glass.", "@supplementTapToLogAGlass879bad": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTellItAboutYourDay129cfd": "Tell it about your day — it proposes tags and a note, you decide what to keep.", "@supplementTellItAboutYourDay129cfd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTellItAboutYourDayef23a5": "Tell it about your day…", "@supplementTellItAboutYourDayef23a5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementThatNightHasNoSleepa8ce2d": "That night has no sleep efficiency behind it.", "@supplementThatNightHasNoSleepa8ce2d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementThatNightHasNoTotalb1cf0a": "That night has no total sleep time behind it.", "@supplementThatNightHasNoTotalb1cf0a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementThatNightHasNoWake1fabdf": "That night has no wake time behind it.", "@supplementThatNightHasNoWake1fabdf": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheBandDidNotConfirmb7159e": "The band did not confirm this alarm — check the strap.", "@supplementTheBandDidNotConfirmb7159e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheBandHasNotYet9773f2": "The band has not yet held a high enough heart rate through a hard effort to measure a ceiling from.", "@supplementTheBandHasNotYet9773f2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheDropInHeartRate80433d": "The drop in heart rate over the 60 seconds after a bout ends, averaged across the day's bouts.", "@supplementTheDropInHeartRate80433d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheHighestHeartRateHeldc1c878": "Your highest heart rate so far is well below what your age predicts, so the zones stay on the age estimate until the band sees a harder effort.", "@supplementTheHighestHeartRateHeldc1c878": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheLowestSustainedSleepingHeart72e5dd": "The lowest sustained sleeping heart rate of the night, taken over a rolling window of the overnight series. Not a spot reading, and not a daytime minimum.", "@supplementTheLowestSustainedSleepingHeart72e5dd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheNightSMeanRaw25e383": "The night's mean raw sensor reading, expressed as distance from your own recent nights. There is no conversion to degrees anywhere in the path.", "@supplementTheNightSMeanRaw25e383": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheRatioOfLowTo817781": "The ratio of low- to high-frequency power in beat-interval variability, from a Lomb–Scargle periodogram (the series is unevenly sampled, so an FFT would be wrong).", "@supplementTheRatioOfLowTo817781": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementThereIsNoRestingHeart36a9ca": "There is no resting heart rate from a scored night to measure against.", "@supplementThereIsNoRestingHeart36a9ca": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementThereIsNoScoredNight5d353d": "There is no scored night to read this from.", "@supplementThereIsNoScoredNight5d353d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTheseRecordingsAreNotStamped66b52f": "These recordings are not stamped with which strap made them, and this number has to be calibrated per strap, so it is withheld rather than guessed.", "@supplementTheseRecordingsAreNotStamped66b52f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementThisDayCameFromAn2dc4b2": "This day came from an import that only covers the night, so there is nothing recorded for the waking day.", "@supplementThisDayCameFromAn2dc4b2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTimeAsleepAsAFraction516f7f": "Time asleep as a fraction of time in bed.", "@supplementTimeAsleepAsAFraction516f7f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTimeToMove7afe98": "Time to move", "@supplementTimeToMove7afe98": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTodayHasNotProducedAnyf103a0": "Today has not produced any activity to read yet — nothing has reached the app for it.", "@supplementTodayHasNotProducedAnyf103a0": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTooFewCleanBeatTo5c2edf": "Too few clean beat-to-beat intervals to work this out.", "@supplementTooFewCleanBeatTo5c2edf": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTooFewHalfHourStretchesbe11a5": "Too few half-hour stretches of clean breathing through the night to compare against each other.", "@supplementTooFewHalfHourStretchesbe11a5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTooFewHeartRateSamples412047": "Too few heart-rate samples were recorded to work this out.", "@supplementTooFewHeartRateSamples412047": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTooFewRecordedSessionsTofa71f6": "Too few recorded sessions to describe a pattern rather than noise.", "@supplementTooFewRecordedSessionsTofa71f6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTotalCholesterol175f97": "Total cholesterol", "@supplementTotalCholesterol175f97": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTotalSleepTimeFromThee13b95": "Total sleep time from the wrist z-angle sleep window, staged by a combined actigraphy and heart-rate model.", "@supplementTotalSleepTimeFromThee13b95": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTotalTestosterone9e1b98": "Total testosterone", "@supplementTotalTestosterone9e1b98": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTrainingImpulseTimeInEachcd2945": "Training impulse: time in each heart-rate zone, weighted by the physiological cost of that zone.", "@supplementTrainingImpulseTimeInEachcd2945": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTransferrinSaturation31bc19": "Transferrin saturation", "@supplementTransferrinSaturation31bc19": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTriglycerides95ae7f": "Triglycerides", "@supplementTriglycerides95ae7f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementUnexpectedResponseFromProvider8b5e12": "Unexpected response from provider.", "@supplementUnexpectedResponseFromProvider8b5e12": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementUnknownSensor98a1f7": "Unknown sensor", "@supplementUnknownSensor98a1f7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementUnusualForYou770b0d": "Unusual for you", "@supplementUnusualForYou770b0d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementUnusualOvernightPhysiology69c322": "Unusual overnight physiology", "@supplementUnusualOvernightPhysiology69c322": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementUnusualTogether4ca5cd": "Unusual together", "@supplementUnusualTogether4ca5cd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementVO2maxEst25e886": "VO2max (est.)", "@supplementVO2maxEst25e886": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementViewData9a8de9": "View data", "@supplementViewData9a8de9": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementVitaminB12be7c1e": "Vitamin B12", "@supplementVitaminB12be7c1e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementVitaminD25OHacb2ca": "Vitamin D (25-OH)", "@supplementVitaminD25OHacb2ca": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWHOOPSOwnNightlyValue5e1394": "WHOOP's own nightly value, read from the blood oxygen column of an imported export and stored as-is.", "@supplementWHOOPSOwnNightlyValue5e1394": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWebsterColeKripkeRescoringHRV378025": "Webster / Cole–Kripke rescoring + HRV staging", "@supplementWebsterColeKripkeRescoringHRV378025": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWindDown1d651a": "Wind down", "@supplementWindDown1d651a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWindDownMovementNudgesGoalsc032fa": "Wind-down, movement nudges, goals and weekly recaps", "@supplementWindDownMovementNudgesGoalsc032fa": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWithheld96ac7e": "Withheld", "@supplementWithheld96ac7e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWithinUserDispersion6ba4c5": "Within-user dispersion", "@supplementWithinUserDispersion6ba4c5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWorking13b7bf": "Working…", "@supplementWorking13b7bf": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYouHaveNoWakeAlarmaf3d5a": "You have no wake alarm armed for tonight.", "@supplementYouHaveNoWakeAlarmaf3d5a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYouHaveSetYourZones535d10": "You have set your zones manually, so there is no measured reserve anchor to plot a distribution against.", "@supplementYouHaveSetYourZones535d10": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYouVeBeenStillForbb79a9": "You've been still for a couple of hours.", "@supplementYouVeBeenStillForbb79a9": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourAgeIsNotOn9fe209": "Your age is not on file, and this is worked out from it.", "@supplementYourAgeIsNotOn9fe209": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourBandHasnTSynced0a4dfd": "Your band hasn't synced in a while", "@supplementYourBandHasnTSynced0a4dfd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourBeatToBeatPatternfed8f0": "Your beat-to-beat pattern looked irregular today. This is a screen, not a diagnosis — see a clinician if you have symptoms.", "@supplementYourBeatToBeatPatternfed8f0": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourHeightIsNotOn733908": "Your height is not on file, and this is worked out from it.", "@supplementYourHeightIsNotOn733908": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourMorningBriefingIsReadydd0ae8": "Your morning briefing is ready", "@supplementYourMorningBriefingIsReadydd0ae8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourNightlySignalsDeviateFromc8d20a": "Your overnight signals are off your usual.", "@supplementYourNightlySignalsDeviateFromc8d20a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourRating83cd62": "Your rating", "@supplementYourRating83cd62": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourRecoveryIsReadya1734c": "Your recovery is ready", "@supplementYourRecoveryIsReadya1734c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourRecoveryMarkersAreBelow2fc2f7": "Your recovery markers are below your usual range — ease off.", "@supplementYourRecoveryMarkersAreBelow2fc2f7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourRestingHRHasFallenca6165": "Your resting heart rate has fallen noticeably below its recent usual.", "@supplementYourRestingHRHasFallenca6165": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourRestingHRHasRisen59f637": "Your resting heart rate has risen noticeably above its recent usual.", "@supplementYourRestingHRHasRisen59f637": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourRestingHeartRateTrend8eccb6": "Your resting heart-rate trend shifted", "@supplementYourRestingHeartRateTrend8eccb6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourSexIsNotOn676db8": "Your sex is not on file, and the formula behind this needs it.", "@supplementYourSexIsNotOn676db8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourStrapAlarmJustFiredd366d3": "Your strap alarm just fired.", "@supplementYourStrapAlarmJustFiredd366d3": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourWeekInReviewabd176": "Your week in review", "@supplementYourWeekInReviewabd176": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYourWeightIsNotOn4ae5a6": "Your weight is not on file, and this is worked out from it.", "@supplementYourWeightIsNotOn4ae5a6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementYouVeBeenInA933b2c": "You’ve been in a typing posture for over 90 minutes without walking.", "@supplementYouVeBeenInA933b2c": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAlcoholUnitsea84fd": "alcohol units", "@supplementAlcoholUnitsea84fd": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementAnImprovement00aad0": "an improvement", "@supplementAnImprovement00aad0": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBrMin0041f9": "br/min", "@supplementBrMin0041f9": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementBreakfast9e3a82": "breakfast", "@supplementBreakfast9e3a82": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCaffeineMgf15138": "caffeine mg", "@supplementCaffeineMgf15138": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementCme283e1": "cm", "@supplementCme283e1": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDinner78cbc7": "dinner", "@supplementDinner78cbc7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementDown77346d": "down", "@supplementDown77346d": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementEnergy173d91": "energy", "@supplementEnergy173d91": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementEveryDaya3fd74": "every day", "@supplementEveryDaya3fd74": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementFiguref85bdc": "figure", "@supplementFiguref85bdc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementG54fd17": "g", "@supplementG54fd17": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementIOSCanOnlyShowThe2139b2": "iOS shows the pairing sheet only before the app has used Bluetooth. Close OpenStrap completely, then reopen it to see the sheet.", "@supplementIOSCanOnlyShowThe2139b2": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementKcal72037b": "kcal", "@supplementKcal72037b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementKg138984": "kg", "@supplementKg138984": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementKm08ec69": "km", "@supplementKm08ec69": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementLunch094530": "lunch", "@supplementLunch094530": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementM6b0d31": "m", "@supplementM6b0d31": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMinb6c935": "min", "@supplementMinb6c935": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMissed09f750": "missed", "@supplementMissed09f750": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementMood89b9fb": "mood", "@supplementMood89b9fb": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNoTrendYetNotEnoughc23fe5": "no trend yet, not enough days recorded", "@supplementNoTrendYetNotEnoughc23fe5": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNotTaken3d2bc8": "not_taken", "@supplementNotTaken3d2bc8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementNothing0feca7": "nothing", "@supplementNothing0feca7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementReadinesseb830b": "recovery", "@supplementReadinesseb830b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementRestingHeartRatec5adc7": "resting heart rate", "@supplementRestingHeartRatec5adc7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementScore75ebcb": "score", "@supplementScore75ebcb": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementScreensMinab5656": "screens min", "@supplementScreensMinab5656": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSleepEfficiency548fe0": "sleep efficiency", "@supplementSleepEfficiency548fe0": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSleepQualitya146dc": "sleep quality", "@supplementSleepQualitya146dc": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSnack1ba61a": "snack", "@supplementSnack1ba61a": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSoreness91da9e": "soreness", "@supplementSoreness91da9e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementSteady0c69e7": "steady", "@supplementSteady0c69e7": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementStrain26d10f": "strain", "@supplementStrain26d10f": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementStress165bd3": "stress", "@supplementStress165bd3": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTimeAsleep78b642": "time asleep", "@supplementTimeAsleep78b642": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTrendingDownfc2716": "trending down", "@supplementTrendingDownfc2716": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementTrendingUp34094b": "trending up", "@supplementTrendingUp34094b": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementUp7c0a25": "up", "@supplementUp7c0a25": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementVanHees2015WindowDetectionbef776": "van Hees 2015 window detection + nocturnal HR dip", "@supplementVanHees2015WindowDetectionbef776": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementVanHees2015WebsterCole3d69f8": "van Hees 2015 · Webster / Cole–Kripke rescoring", "@supplementVanHees2015WebsterCole3d69f8": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWaterMl7902c6": "water ml", "@supplementWaterMl7902c6": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWeightKge50726": "weight kg", "@supplementWeightKge50726": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWorkoutc87292": "workout", "@supplementWorkoutc87292": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWorseThanUsual06f439": "worse than usual", "@supplementWorseThanUsual06f439": { "description": "Presentation-only text for existing interface, exports or notifications." }, "supplementWristOptical06ad7e": "wrist optical", "@supplementWristOptical06ad7e": { "description": "Presentation-only text for existing interface, exports or notifications." }, "presentationBluetoothHeartRateSensor": "Bluetooth heart rate sensor", "presentationGarminWatch": "Garmin watch", "presentationPolarSensor": "Polar sensor", "presentationCorosWatch": "Coros watch", "presentationCOROSWatch": "COROS watch", "presentationSmartRingR11MR10M": "Smart ring (R11M/R10M)", "presentationDaFitMOYOUNGWatch": "DaFit / MOYOUNG watch", "presentationWearFitBand": "WearFit band", "presentationSmartRingBandLefunProtocol": "Smart ring/band (Lefun protocol)", "presentationHPlusHRBand": "HPlus HR band", "presentationFossilSkagenHybridSmartwatch": "Fossil/Skagen Hybrid Smartwatch", "presentationColmiRing": "Colmi ring", "presentationNoSleepWasScoredForThisDayRestingHR": "no sleep was scored for this day — resting HR is only ever measured over a sleep window, never over waking hours.", "presentationBaevskyStressIndex0100RestingAutonomicTensionPRV": "Baevsky Stress Index → 0–100; resting autonomic tension (PRV).", "presentationNoReadinessInputsPresentNeverImputed": "no readiness inputs present — \"—\" (never imputed).", "presentationMETValueYourWeightRefinedByHeartRateOr": "MET value × your weight, refined by heart rate — or heart rate alone, for an activity that carries no MET.", "presentationMood": "Mood", "presentationSleepQuality": "Sleep quality", "presentationHeightCm": "Height (cm)", "presentationHeightIn": "Height (in)", "presentationWeightLb": "Weight (lb)", "presentationS": "s", "presentationV": "µV", "presentationReadsTheRingDirectlyNoAccountNoKeyExchange": "Reads the ring directly — no account, no key exchange.", "presentationPebble2OrPebble2SEOnlyPairsOnly": "Pebble 2 or Pebble 2 SE only. Pairs only for now — nothing is read or stored yet.", "presentationTheOriginalFossilSkagenHybridSmartwatchNotTheNewer": "The original Fossil/Skagen hybrid smartwatch, not the newer Hybrid HR. Pairs and connects; nothing derives from it yet.", "presentationABudgetActivityBandPairsAndBanksItsRaw": "A budget activity band. Pairs and banks its raw data, but nothing is derived from it yet.", "presentationPairsAndBanksItsRawDataNothingIsDecoded": "Pairs and banks its raw data — nothing is decoded yet.", "presentationAGenericRingOrBandSoldUnderManyStorefront": "A generic ring or band sold under many storefront names. Pairs and connects; reports nothing yet.", "presentationAGenericHPlusFamilyHRBandPairsAndBanks": "A generic HPlus-family HR band. Pairs and banks its history; nothing is decoded into a number yet.", "presentationPairsAndBanksItsRawDataInTheBackground": "Pairs and banks its raw data in the background, but does not derive anything from it yet.", "presentationAnUnbrandedDaFitMOYOUNGStyleWatchPairsAndBanks": "An unbranded DaFit/MOYOUNG-style watch. Pairs and banks its own data; nothing derives from it yet.", "presentationAnUnbrandedMakibesHR3BoardPairsAndBanksIts": "An unbranded Makibes HR3 board. Pairs and banks its raw data; nothing is derived from it yet.", "presentationAnUnbrandedID115BoardPairsAndBanksItsRaw": "An unbranded ID115 board. Pairs and banks its raw data; nothing is derived from it yet.", "presentationAnUnbrandedXWatchBoardPairsAndBanksItsRaw": "An unbranded XWatch board. Pairs and banks its raw data; nothing is derived from it yet.", "presentationAnUnbrandedWatch9BoardPairsAndBanksItsRaw": "An unbranded Watch9 board. Pairs and banks its raw data; nothing is derived from it yet.", "presentationAnSMAQ2OSSSmartwatchPairsAndBanksIts": "An SMA-Q2-OSS smartwatch. Pairs and banks its raw data; nothing is derived from it yet.", "presentationATLW64OrNO1F1FitnessBandPairsAnd": "A TLW64 or NO1 F1 fitness band. Pairs and banks its raw data; nothing is derived from it yet.", "presentationCaffeine": "Caffeine", "presentationAlcohol": "Alcohol", "presentationMeasurementsOf": "{have} of {total} measures", "@presentationMeasurementsOf": { "placeholders": { "have": { "type": "int" }, "total": { "type": "int" } } }, "presentationAveragePulse": "{value} bpm avg", "@presentationAveragePulse": { "placeholders": { "value": { "type": "String" } } }, "presentationSoreness": "Soreness", "presentationScreensBeforeBed": "Screens before bed", "presentationIn": "in", "presentationLb": "lb", "presentationMl": "ml", "presentationMg": "mg", "presentationUnits": "units", "presentationWeightRepsLogged": "{weight} {unit} × {reps} logged", "@presentationWeightRepsLogged": { "placeholders": { "weight": { "type": "String" }, "unit": { "type": "String" }, "reps": { "type": "int" } } }, "presentationVolumeUnit": "{unit} volume", "@presentationVolumeUnit": { "placeholders": { "unit": { "type": "String" } } }, "journalTagCaffeine": "caffeine", "journalTagAlcohol": "alcohol", "journalTagLateMeal": "late meal", "journalTagStress": "stress", "journalTagPoorSleep": "poor sleep", "journalTagTravel": "travel", "journalTagScreensLate": "screens late", "journalTagMeds": "meds", "journalTagSick": "sick", "journalTagSauna": "sauna", "journalTagColdPlunge": "cold plunge", "journalTagSocial": "social", "journalTagWorkout": "workout", "journalTagRestDay": "rest day", "liveHrShowingDeviceSemantics": "Showing {label}. Tap to switch device.", "@liveHrShowingDeviceSemantics": { "placeholders": { "label": { "type": "String" } } }, "devicesResetSourceSemantics": "Reset {signal} to the default order", "@devicesResetSourceSemantics": { "placeholders": { "signal": { "type": "String" } } }, "metricDetailStepsGoalValue": "{count, plural, other{{value} steps}}", "@metricDetailStepsGoalValue": { "placeholders": { "count": { "type": "int" }, "value": { "type": "String" } } }, "scrubberNothingSelected": "Nothing selected", "supplementUnreadableField": "{field} is not a number. Nothing was saved.", "@supplementUnreadableField": { "placeholders": { "field": { "type": "String" } } }, "activityZonesNameWarmUp": "Warm-up", "activityZonesNameEasy": "Easy", "activityZonesNameAerobic": "Aerobic", "activityZonesNameThreshold": "Threshold", "activityZonesNameMaxEffort": "Max effort", "dataBackupFolder": "Backup folder", "dataBackupFolderDefault": "App folder (default)", "dataBackupFolderSub": "Choose where new backups are saved. Existing backups stay where they are", "dataBackupFolderUseDefault": "Use default folder", "dataBackupFolderSaved": "Backup folder saved.", "dataBackupFolderRetry": "Retry with Back up now, or choose another folder", "@dataBackupFolder": { "description": "Android automatic backup folder setting." }, "@dataBackupFolderDefault": { "description": "Android automatic backup folder setting." }, "@dataBackupFolderSub": { "description": "Android automatic backup folder setting." }, "@dataBackupFolderUseDefault": { "description": "Android automatic backup folder setting." }, "@dataBackupFolderSaved": { "description": "Android automatic backup folder setting." }, "@dataBackupFolderRetry": { "description": "Android automatic backup folder setting." }, "findingIllnessTitle": "Resting heart rate has been raised", "@findingIllnessTitle": { "description": "Findings log / health-exception copy (lib/compute/findings.dart)." }, "findingIllnessDetail": "Recent nights put your resting heart rate above your usual, from one very high night or a few slightly raised ones. One signal: a pattern, not a cause.", "@findingIllnessDetail": { "description": "Findings log / health-exception copy (lib/compute/findings.dart)." }, "findingLowReadinessTitle": "Low recovery", "@findingLowReadinessTitle": { "description": "Findings log / health-exception copy (lib/compute/findings.dart)." }, "findingLowReadinessDetail": "Recovery was in its lowest band. Taken together, that night's signals sat well below your usual.", "@findingLowReadinessDetail": { "description": "Findings log / health-exception copy (lib/compute/findings.dart)." }, "findingLowReadinessScoredDetail": "Recovery scored {score}, its lowest band. Taken together, that night's signals sat well below your usual.", "@findingLowReadinessScoredDetail": { "description": "Findings log / health-exception copy (lib/compute/findings.dart).", "placeholders": { "score": { "type": "int" } } }, "devicesWhatItDoesStored": "Everything it sends is saved under its name. Scores from it are experimental and off until it’s been checked against the hardware.", "@devicesWhatItDoesStored": { "description": "Row sub: a paired device with no beat-timing tier (wearable, scale, plain sensor)." }, "devicesWhatItDoesBeats": "Heartbeat timing is saved under its name, during workouts and a few minutes after. Scoring workouts from it is experimental and off for now.", "@devicesWhatItDoesBeats": { "description": "Row sub: a workout sensor ranked for beat timing." }, "pairSensorExplainerWorkout": "Heart rate for workouts; it doesn’t replace your band. It records while a workout runs, once checked against the hardware; until then it records nothing.", "@pairSensorExplainerWorkout": { "description": "Explanatory body before pairing a workout sensor (chest strap, arm band)." }, "pairSensorExplainerCoros": "A sports watch. Each sync reads battery and a few seconds of heart rate. No workout uses it, and its readings never feed a score.", "@pairSensorExplainerCoros": { "description": "Explanatory body before pairing a Coros watch (synced in short windows, never armed by a workout)." }, "pairSensorExplainerWearable": "Its own records are saved and labelled as its own. Working out our numbers from it (sleep, resting heart rate, strain) is experimental and off for now.", "@pairSensorExplainerWearable": { "description": "Explanatory body before pairing a watch, ring or band that is not the primary band." }, "pairSensorExplainerMeasurement": "Its readings are saved under its name. Using them in your profile is experimental and off until it’s been checked against the hardware.", "@pairSensorExplainerMeasurement": { "description": "Explanatory body before pairing a scale or thermometer." }, "pairSensorKeyReplacesTitle": "Pairing replaces the Oura app's key", "@pairSensorKeyReplacesTitle": { "description": "Warning title on the ring pairing screen, shown before the user pairs." }, "pairSensorKeyReplacesBody": "The ring holds one key. Pairing without the Oura app’s key gives it a new one, and the Oura app stops working with it until the ring is reset.", "@pairSensorKeyReplacesBody": { "description": "Warning body: pairing installs a new key that replaces the key the ring's own app uses." }, "devicePickerBlurbUltrahuman": "Reads the ring directly — no account, no key exchange.", "@devicePickerBlurbUltrahuman": { "description": "Category row subtitle for an Ultrahuman smart ring." }, "devicePickerBlurbPebble": "Pebble 2 or Pebble 2 SE only. Syncs steps and sleep, and heart rate on a Pebble 2 (the SE has no heart-rate sensor).", "@devicePickerBlurbPebble": { "description": "Category row subtitle for a Pebble 2 / 2 SE watch." }, "pairSensorStoredOnSync": "Records stored when it syncs", "@pairSensorStoredOnSync": { "description": "Row sub: paired wearable, whose records are stored when it syncs; no workout uses it." }, "pairSensorStoredOnReading": "Readings stored as it takes them", "@pairSensorStoredOnReading": { "description": "Row sub: paired measurement device (a scale, a thermometer); no workout uses it." }, "pairSensorSyncedInWindows": "Synced in short windows", "@pairSensorSyncedInWindows": { "description": "Row sub: paired Coros watch, which syncs in short windows and is never used by a workout." }, "pairSensorPairingMiband234": "Pairing… If the band buzzes, tap it to confirm.", "@pairSensorPairingMiband234": { "description": "Row sub: a Mi Band 2/3 pairing, waiting for a tap on the band." }, "missingSignalSteps": "no step count", "@missingSignalSteps": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own step count. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalSkinTempC": "no skin temperature", "@missingSignalSkinTempC": { "description": "Sub-label on a device that cannot serve a metric because it does not report a skin temperature in degrees. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalActivityLevel": "no activity record", "@missingSignalActivityLevel": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own activity value per record. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalDeviceHrv": "no HRV of its own", "@missingSignalDeviceHrv": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own HRV figure. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalDeviceStages": "no sleep stages of its own", "@missingSignalDeviceStages": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own sleep stages. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalDeviceResp": "no breathing rate of its own", "@missingSignalDeviceResp": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own breathing rate. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalDeviceStress": "no stress of its own", "@missingSignalDeviceStress": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own stress figure. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "missingSignalDeviceSpo2": "no SpO2 of its own", "@missingSignalDeviceSpo2": { "description": "Sub-label on a device that cannot serve a metric because it does not report its own SpO2 figure. Names the physical absence, not the metric. Lower case: it is appended after the device name and a middle dot." }, "wearableFlagRowSub": "Experimental. On uses this device's data for your numbers", "@wearableFlagRowSub": { "description": "Developer settings: sub-label under a paired wearable or workout sensor's name. Turning it on lets its data feed the app's numbers (experimental until checked on real hardware)." }, "wearableFlagActive": "Active", "@wearableFlagActive": { "description": "Developer settings: value shown for the wearable that is on and is the one whose data fills the days the main band did not record." }, "signalSteps": "Steps", "@signalSteps": { "description": "Human name for an input signal: step counts the device made itself. Used as a section heading and screen-reader label." }, "signalSkinTempC": "Skin temperature (°C)", "@signalSkinTempC": { "description": "Human name for an input signal: skin temperature in absolute degrees Celsius. Used as a section heading and screen-reader label." }, "signalActivityLevel": "Activity", "@signalActivityLevel": { "description": "Human name for an input signal: the device's own activity value per record. Used as a section heading and screen-reader label." }, "signalDeviceHrv": "The device’s own HRV", "@signalDeviceHrv": { "description": "Human name for an input signal: the device's own HRV figure. Used as a section heading and screen-reader label." }, "signalDeviceStages": "The device’s own sleep stages", "@signalDeviceStages": { "description": "Human name for an input signal: the device's own sleep stages. Used as a section heading and screen-reader label." }, "signalDeviceResp": "The device’s own breathing rate", "@signalDeviceResp": { "description": "Human name for an input signal: the device's own breathing rate. Used as a section heading and screen-reader label." }, "signalDeviceStress": "The device’s own stress", "@signalDeviceStress": { "description": "Human name for an input signal: the device's own stress figure. Used as a section heading and screen-reader label." }, "signalDeviceSpo2": "The device’s own SpO2", "@signalDeviceSpo2": { "description": "Human name for an input signal: the device's own SpO2 figure. Used as a section heading and screen-reader label." }, "wearableSettingsGroup": "Wearable numbers", "@wearableSettingsGroup": { "description": "Wearable numbers (wearable*): how a non-WHOOP wearable's metrics are presented, the one-line reasons a metric is not available, and what a wearable unlocks before pairing." }, "wearablePresentationRowTitle": "Show", "wearablePresentationRowSub": "One number per metric, or ours beside your wearable's own", "wearablePresentationOneNumber": "One number", "wearablePresentationSideBySide": "Side by side", "wearableEstimatesRowTitle": "Estimates", "wearableEstimatesRowSub": "Values we estimate where your wearable gives nothing", "wearableOurs": "Ours", "wearableEstimated": "Estimated", "wearableNotAvailable": "Not available", "wearableMethodHr1min": "1-min heart rate", "wearableMethodHr5min": "5-min heart rate", "wearableMethodDeviceStages": "its sleep stages", "wearableMethodSkinTemp": "skin temperature", "wearableMethodRest": "rest in 5-min heart rate", "wearableMethodRhrOnly": "resting heart rate only", "wearableMethodZoneMinutes": "heart-rate zone minutes", "wearableMethodActivity": "5-min step counts", "wearableMethodPartialComposite": "resting heart rate and skin temperature only (partial)", "wearableProvisional": "Provisional", "wearableMethodStrap": "a strap, every second", "wearableMethodStrapBeats": "a strap's beat-to-beat intervals", "wearableMethodRhrStrapComposite": "resting heart rate and a strap's beat-to-beat intervals", "wearableMethodRingBeats": "its own beat-to-beat intervals", "wearableUnlocksTitle": "What this wearable unlocks", "wearableUnlocksOurs": "Measured by us", "wearableUnlocksDevice": "Its own values, labelled as its", "wearableUnlocksEstimated": "Estimated, labelled", "wearableUnlocksStrap": "Measured by us with a strap session", "wearableUnlocksNone": "Not available", "wearableDayTitle": "Today's numbers", "wearableDayRowSub": "What we measure from it, beside its own values", "wearableNotActiveTitle": "Not your active wearable", "wearableNotActiveWhy": "Numbers come from one wearable at a time, and this one is not on yet", "wearableUseThis": "Use this wearable (developer)", "wearableNoDayTitle": "Nothing for today yet", "wearableNoDayWhy": "No day has been worked out from this wearable yet", "wearableBandDayTitle": "Your band has today", "wearableBandDayWhy": "Your band recorded today, so today's numbers come from it, not from this wearable", "wearableWhyEstimateHidden": "Only an estimate exists, and estimates are hidden in Settings", "wearableWhyNoNight": "No night stored for this day", "wearableWhyNeedsThreeNights": "Needs three weekend nights", "wearableWhyNoNightHr": "No heart rate during the night", "wearableWhySkinTempNotDecoded": "Skin temperature is not decoded yet", "wearableWhyNeedsBeats": "Needs beat-to-beat intervals", "wearableWhyNoWakeHr": "No waking heart rate", "wearableWhyNoWakeHrOrProfile": "No waking heart rate, or no profile", "wearableWhyNeedsStrap": "Needs a strap session", "wearableWhyNeedsHistory": "Needs a night of history", "wearableWhyNeedsThreeDaysHr": "Needs three days of heart rate", "wearableWhyNeedsRhrBaseline": "Needs your usual resting heart rate", "wearableWhyNoHrDip": "No sustained dip in the night's heart rate", "wearableWhyNoNightForNaps": "No night to measure daytime rest against", "wearableWhyNeedsThreeNightsTemp": "Needs three nights of skin temperature", "wearableWhyTooSparseForWorkouts": "One heart rate every 5 minutes cannot place a workout", "wearableRowSleepWindow": "Night length", "wearableRowEfficiency": "Sleep efficiency", "wearableRowSleepStages": "Deep sleep", "wearableRowNaps": "Naps", "wearableRowSleepDebt": "Sleep debt", "wearableRowRestingHr": "Resting heart rate", "wearableRowNadir": "Lowest night heart rate", "wearableRowHrv": "HRV", "wearableRowRespiratoryRate": "Respiratory rate", "wearableRowSpo2": "Blood oxygen", "wearableRowStress": "Stress", "wearableRowSkinTemp": "Skin temperature", "wearableRowReadiness": "Recovery", "wearableRowIrregularRhythm": "Irregular rhythm", "wearableRowSteps": "Steps", "wearableRowStrain": "Strain", "wearableRowCalories": "Calories", "wearableRowMovement": "Movement", "wearableRowAutoWorkouts": "Workouts found", "wearableRowHrr": "Heart-rate recovery", "wearableRowBaselines": "Usual resting HR", "wearableRowSkinTempBaseline": "Usual skin temperature", "wearableRowCircadian": "Body-clock peak", "wearableRowStrapWorkouts": "Workouts with a strap", "wearableUnitBpm": "bpm", "wearableUnitMs": "ms", "wearableUnitPct": "%", "wearableUnitKcal": "kcal", "wearableUnitBrMin": "br/min", "wearableUnitHours": "h", "wearableUnitSd": "SD", "wearableUnitCelsius": "°C", "wearableUnitMin": "min", "wearableSourceOurs": "From your {device} · {method}", "@wearableSourceOurs": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" }, "method": { "type": "String", "example": "1-min heart rate" } } }, "wearableSourceOursPlain": "From your {device}", "@wearableSourceOursPlain": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableSourceStrap": "From {method}", "@wearableSourceStrap": { "description": "Source line under a value a workout strap measured, not the wearable; method names the strap (e.g. a strap's beat-to-beat intervals)", "placeholders": { "method": { "type": "String", "example": "a strap's beat-to-beat intervals" } } }, "wearableSourceDevice": "Your {device}'s own value", "@wearableSourceDevice": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableSourceEstimated": "Estimated from your {device} · {method}", "@wearableSourceEstimated": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" }, "method": { "type": "String", "example": "1-min heart rate" } } }, "wearableSourceEstimatedPlain": "Estimated from your {device}", "@wearableSourceEstimatedPlain": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableDetailDeviceSays": "Your {device} says", "@wearableDetailDeviceSays": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableDetailNoDeviceValue": "Your {device} gives no value of its own for this", "@wearableDetailNoDeviceValue": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableBand": "On test data this is off by about {band} on average from the same number worked out second by second. Single days can be further off.", "@wearableBand": { "description": "Confidence line under a wearable value: the method's measured mean absolute error against 1 Hz data, from a synthetic validation run. An average, not a per-day bound.", "placeholders": { "band": { "type": "String", "example": "1 bpm" } } }, "wearableBandTruth": "On test nights this window's length is off by about {band} on average from the true time in bed. Single nights can be further off.", "@wearableBandTruth": { "description": "Confidence line under a wearable's sleep window: the method's measured mean absolute error of the window's length against the time in bed the synthetic validation nights were built with (a length, not where the edges fall). An average, not a per-night bound.", "placeholders": { "band": { "type": "String", "example": "30 min" } } }, "wearableBandPartial": "On test data this resting-HR-only score is off by about {band} on average from the same partial score worked out second by second. It is not compared with full recovery.", "@wearableBandPartial": { "description": "Confidence line under the partial (resting-HR-only) readiness value: its measured mean absolute error against the same partial score from 1 Hz data, from a synthetic validation run.", "placeholders": { "band": { "type": "String", "example": "3" } } }, "wearableScoresTitle": "Your {device}'s own scores", "@wearableScoresTitle": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoNightReading": "No night reading from your {device}", "@wearableWhyNoNightReading": { "placeholders": { "device": { "type": "String", "example": "Ultrahuman ring" } } }, "wearableWhyNoStagedNight": "Your {device} staged no night", "@wearableWhyNoStagedNight": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoMovementData": "Needs movement data your {device} does not give", "@wearableWhyNoMovementData": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoDeviceHrv": "Needs beat-to-beat intervals; your {device} gave no HRV", "@wearableWhyNoDeviceHrv": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoDeviceResp": "Your {device} gave no respiration", "@wearableWhyNoDeviceResp": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoDeviceSpo2": "Your {device} gave no blood oxygen", "@wearableWhyNoDeviceSpo2": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoDeviceStress": "Your {device} gave no stress", "@wearableWhyNoDeviceStress": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyReadinessRhrOnly": "Needs two of HRV, resting HR, respiration and skin temperature measured by us; your {device} gives us resting HR only", "@wearableWhyReadinessRhrOnly": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoDeviceSteps": "Your {device} gave no step count", "@wearableWhyNoDeviceSteps": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoWake": "Your {device} reports no wake, and we place none off one-a-minute heart rate yet", "@wearableWhyNoWake": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNeverBeats": "Needs beat-to-beat intervals; your {device} gives none", "@wearableWhyNeverBeats": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNeverResp": "Your {device} gives no respiration", "@wearableWhyNeverResp": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNeverSpo2": "Your {device} gives no blood oxygen", "@wearableWhyNeverSpo2": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNeverStress": "Your {device} gives no stress", "@wearableWhyNeverStress": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNeverSkinTemp": "Your {device} gives no skin temperature", "@wearableWhyNeverSkinTemp": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNoMovementRecord": "Your {device} keeps no movement record we decode", "@wearableWhyNoMovementRecord": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableScoreSleep": "Sleep score", "@wearableScoreSleep": { "description": "A device's own score, named on its page (wearableScore*). Never one of ours." }, "wearableScoreReadiness": "Readiness score", "wearableScoreBodyBattery": "Body battery", "wearableScoreImpedance": "Body impedance", "wearableWhyNoDeviceNap": "Your {device} recorded no nap", "@wearableWhyNoDeviceNap": { "placeholders": { "device": { "type": "String", "example": "Garmin watch" } } }, "wearableWhyNotDecoded": "Your {device} records what this needs; we do not decode it yet", "@wearableWhyNotDecoded": { "placeholders": { "device": { "type": "String", "example": "Oura Ring" } } }, "wearableWhyBeatsNotSeparated": "Not worked out from your {device}'s beats; a strap's beats can't be told apart from them overnight", "@wearableWhyBeatsNotSeparated": { "placeholders": { "device": { "type": "String", "example": "Oura Ring" } } }, "devicePickerBlurbThermometer": "Saves each reading as a body temperature.", "@devicePickerBlurbThermometer": { "description": "Device picker blurb under this device category." }, "devicePickerBlurbMiscaleBc": "Saves each settled weight and bio-impedance, including stored ones.", "@devicePickerBlurbMiscaleBc": { "description": "Device picker blurb under this device category." }, "devicePickerBlurbMiscale2": "Saves each settled weight, including stored ones.", "@devicePickerBlurbMiscale2": { "description": "Device picker blurb under this device category." }, "iosUninstallUnpairsWarning": "On iOS, deleting OpenStrap also unpairs every band and sensor paired here from the phone, so other apps, including the maker's own, lose them too.", "@iosUninstallUnpairsWarning": { "description": "iOS only: AccessorySetupKit pairings are removed by iOS for all apps when OpenStrap is deleted." }, "logFoodEditTitle": "Edit this entry", "@logFoodEditTitle": { "description": "Log food sheet: title when editing an existing entry" }, "logFoodDateLabel": "Date", "@logFoodDateLabel": { "description": "Log food sheet: row label for the day the food was eaten" }, "logFoodTimeLabel": "Time", "@logFoodTimeLabel": { "description": "Log food sheet: row label for the time the food was eaten" }, "logFoodSearchLabel": "Search your foods", "@logFoodSearchLabel": { "description": "Log food sheet: label of the search field over past foods" }, "logFoodSearchHint": "Anything you have logged", "@logFoodSearchHint": { "description": "Log food sheet: hint in the search field over past foods" }, "logFoodSearchNoMatch": "Nothing you have logged matches that.", "@logFoodSearchNoMatch": { "description": "Log food sheet: shown when the search over past foods finds nothing" }, "logFoodRemoveEntry": "Remove this entry", "@logFoodRemoveEntry": { "description": "Log food sheet: button that removes the entry being edited" }, "nutritionProteinToday": "Protein today", "@nutritionProteinToday": { "description": "Nutrition Today tab: label of the protein-versus-target card" }, "nutritionProteinToGo": "{grams} g to go", "@nutritionProteinToGo": { "description": "Nutrition Today tab: grams of protein still needed to reach the target", "placeholders": { "grams": { "type": "int" } } }, "nutritionTargetReached": "Target reached", "@nutritionTargetReached": { "description": "Nutrition Today tab: protein target met or exceeded" }, "dayTimelineZoomNoHr": "No heart rate in this stretch", "@dayTimelineZoomNoHr": { "description": "Shown in place of the zoomed day chart when the chosen window has no heart rate." }, "dayTimelineZoomPerMinute": "1-minute averages. Drag the handles to zoom; two hours or less shows every second while it is still kept.", "@dayTimelineZoomPerMinute": { "description": "Footnote under the day heart-rate chart at per-minute resolution." }, "dayTimelineZoomPerMinuteOnly": "1-minute averages. Second-by-second readings are no longer kept for this stretch.", "@dayTimelineZoomPerMinuteOnly": { "description": "Footnote when zoomed in but the per-second rows have been pruned." }, "dayTimelineZoomPerSecond": "Every second the band recorded. Second-by-second readings are kept for recent days only.", "@dayTimelineZoomPerSecond": { "description": "Footnote when the zoomed day chart shows per-second readings." }, "dataExportHeartRate": "Export heart rate, minute by minute", "@dataExportHeartRate": { "description": "Data screen row: export per-minute heart rate as CSV." }, "dataExportHeartRateSub": "One CSV for the days you pick, with a 1-minute average for every recorded minute. Second-by-second data is in the database export", "@dataExportHeartRateSub": { "description": "Subtitle for the per-minute heart rate CSV export row." }, "dataHeartRateRangeHelp": "Heart rate is kept from {first} to {last}", "@dataHeartRateRangeHelp": { "description": "Date range picker heading for the heart rate export, naming the available range.", "placeholders": { "first": { "type": "String" }, "last": { "type": "String" } } }, "pairSensorUnreachableIos": "iPhone only lets apps reach sensors offered in the system pairing sheet, and a {label} can’t be offered there yet. Pair it on Android for now.", "@pairSensorUnreachableIos": { "description": "Pairing a sensor iOS cannot reach through the system pairing sheet.", "placeholders": { "label": { "type": "String" } } }, "sleepDetailStagedBy": "Staged by {label}", "@sleepDetailStagedBy": { "description": "Pill naming the device whose own sleep staging is shown.", "placeholders": { "label": { "type": "String" } } }, "sleepDetailDeviceMissingStages": "{label} does not report {stages}; that time is counted in its other stages.", "@sleepDetailDeviceMissingStages": { "description": "Note that a device cannot report some sleep stages; stages is a list of stage names.", "placeholders": { "label": { "type": "String" }, "stages": { "type": "String" } } }, "trendNormalForYou": "Normal for you", "@trendNormalForYou": { "description": "Trend verdict: the reading is inside the user's usual range." }, "trendAboveUsual": "Above usual", "@trendAboveUsual": { "description": "Trend verdict: the reading is above the user's usual range." }, "trendBelowUsual": "Below usual", "@trendBelowUsual": { "description": "Trend verdict: the reading is below the user's usual range." }, "trendVsUsual": "{diff} from your usual {usual}", "@trendVsUsual": { "description": "Difference between the reading and the centre of the user's usual range; diff is signed and formatted with its unit.", "placeholders": { "diff": { "type": "String" }, "usual": { "type": "String" } } }, "trendUsualRange": "Usual range {lo}–{hi}{unit}", "@trendUsualRange": { "description": "The user's usual range in words; unit is empty or starts with a space.", "placeholders": { "lo": { "type": "String" }, "hi": { "type": "String" }, "unit": { "type": "String" } } }, "trendNeedsDays": "Your usual range appears after {need} days. {have} so far.", "@trendNeedsDays": { "description": "Short note shown instead of the usual-range band while there is not enough history.", "placeholders": { "need": { "type": "int" }, "have": { "type": "int" } } }, "monthGridLegendBetter": "Better than usual", "@monthGridLegendBetter": { "description": "Month grid legend: day outside the usual range in the good direction." }, "monthGridLegendUsual": "Usual for you", "@monthGridLegendUsual": { "description": "Month grid legend: day inside the usual range." }, "monthGridLegendWorse": "Worse than usual", "@monthGridLegendWorse": { "description": "Month grid legend: day outside the usual range in the bad direction." }, "monthGridLegendOutside": "Outside your usual range", "@monthGridLegendOutside": { "description": "Month grid legend: day outside the usual range for a metric with no better direction." }, "monthGridRangeFootnote": "One cell per day. A bar at the top means above your usual range, at the bottom below it. An outlined cell has no value.", "@monthGridRangeFootnote": { "description": "Month grid footnote explaining the cell marks." }, "monthGridNoRangeTitle": "{title}: no usual range yet", "@monthGridNoRangeTitle": { "description": "Month grid: status card title when a metric has no usual range to colour its days against, e.g. 'Sleep: no usual range yet'.", "placeholders": { "title": { "type": "String" } } }, "monthGridFlatBody": "Your days have all been about the same, so there is no usual range to place a day against yet.", "@monthGridFlatBody": { "description": "Month grid: status card body when there is enough history but it is too flat to give a usual range." }, "monthGridRowSemantics": "{title}: {have} of {total} days have a value. {below} below and {above} above your usual range.", "@monthGridRowSemantics": { "description": "Screen-reader summary of one month grid row.", "placeholders": { "title": { "type": "String" }, "have": { "type": "int" }, "total": { "type": "int" }, "below": { "type": "int" }, "above": { "type": "int" } } }, "zoneRowsRange": "{lo}–{hi} bpm", "@zoneRowsRange": { "description": "Heart-rate zone row: the zone's range in beats per minute.", "placeholders": { "lo": { "type": "int" }, "hi": { "type": "int" } } }, "zoneRowsRangeTop": "{lo}+ bpm", "@zoneRowsRangeTop": { "description": "Heart-rate zone row: the top zone, which has no upper edge.", "placeholders": { "lo": { "type": "int" } } }, "zoneRowsMinutes": "{minutes} min", "@zoneRowsMinutes": { "description": "Heart-rate zone row: minutes spent in the zone.", "placeholders": { "minutes": { "type": "int" } } }, "advancedTitle": "Advanced charts", "@advancedTitle": { "description": "Title of the screen that holds the research charts, reached from Health." }, "advancedIntro": "Research views of the same data. Nothing here changes your scores.", "@advancedIntro": { "description": "One-line introduction at the top of the Advanced charts screen." }, "advancedBeatsTitle": "Beat to beat", "@advancedBeatsTitle": { "description": "Advanced charts screen: row opening the beat-to-beat charts." }, "advancedBeatsSub": "Each beat against the last, HRV through the night, deceleration capacity", "@advancedBeatsSub": { "description": "Advanced charts screen: what the beat-to-beat row contains." }, "advancedRhythmTitle": "Sleep timing and daily rhythm", "@advancedRhythmTitle": { "description": "Advanced charts screen: row and screen title for the sleep-timing and daily-rhythm research charts." }, "advancedRhythmSub": "Sleep hour by hour, variability while still, the predicted shape of today", "@advancedRhythmSub": { "description": "Advanced charts screen: what the sleep-timing row contains." }, "healthAdvancedLinkTitle": "Advanced charts", "@healthAdvancedLinkTitle": { "description": "Health tab: link row to the Advanced charts screen." }, "healthAdvancedLinkSub": "Beat-to-beat detail and sleep timing, for the curious", "@healthAdvancedLinkSub": { "description": "Health tab: subtitle of the link row to the Advanced charts screen." }, "tabToday": "Today", "@tabToday": { "description": "Bottom tab: today's scores and plan." }, "tabSleep": "Sleep", "@tabSleep": { "description": "Bottom tab: last night, sleep plan, alarm and body clock." }, "tabActivity": "Activity", "@tabActivity": { "description": "Bottom tab: workouts, steps and food. Also the Activity screen title." }, "profileBandBattery": "Band {pct}%", "@profileBandBattery": { "description": "Profile devices row: the band's battery level.", "placeholders": { "pct": { "type": "int" } } }, "profileExportRow": "Export and backup", "@profileExportRow": { "description": "Profile row: open export, backup and import." }, "profileExportRowSub": "Spreadsheets, a full copy, and bringing history in", "@profileExportRowSub": { "description": "Subtitle of the export row on Profile." }, "profileSettingsRow": "Settings", "@profileSettingsRow": { "description": "Profile row: open Settings." }, "profileSettingsRowSub": "Band, app, data, privacy and advanced", "@profileSettingsRowSub": { "description": "Subtitle of the Settings row on Profile: its groups." }, "settingsGroupApp": "App", "@settingsGroupApp": { "description": "Settings group: notifications, units, appearance, time format, cycle tracking." }, "settingsGroupData": "Data", "@settingsGroupData": { "description": "Settings group: export, health app sync, phone steps." }, "settingsGroupAdvanced": "Advanced", "@settingsGroupAdvanced": { "description": "Settings group: automation and other rarely changed settings." }, "settingsCycleTrackingRowSubHealth": "Adds Cycle to Health. Off hides it and keeps everything already logged", "@settingsCycleTrackingRowSubHealth": { "description": "Subtitle of the cycle tracking switch." }, "sleepTabPlanTitle": "Your sleep plan", "@sleepTabPlanTitle": { "description": "Sleep tab section: sleep need, debt and target bedtime." }, "sleepTabMoreTitle": "Alarm and body clock", "@sleepTabMoreTitle": { "description": "Sleep tab section with links to the alarm and the body clock." }, "healthWellbeingTitle": "Mind, habits and medication", "@healthWellbeingTitle": { "description": "Health tab section with doors to mind, habits, medication and cycle." }, "healthWellbeingMindSub": "Breathing, mood and the journal", "@healthWellbeingMindSub": { "description": "Health tab: subtitle of the Mind door." }, "healthWellbeingHabitsSub": "Daily habits, counted as days kept", "@healthWellbeingHabitsSub": { "description": "Health tab: subtitle of the Habits door." }, "healthWellbeingMedsSub": "Today's doses and the last week", "@healthWellbeingMedsSub": { "description": "Health tab: subtitle of the Medication door." }, "healthWellbeingCycleSub": "Log your period and see where you are in the cycle", "@healthWellbeingCycleSub": { "description": "Health tab: subtitle of the Cycle door." }, "activityStepsFoodTitle": "Steps and food", "@activityStepsFoodTitle": { "description": "Activity tab section with doors to steps and nutrition." }, "activityStepsSub": "Today and every day before it", "@activityStepsSub": { "description": "Activity tab: subtitle of the Steps door." }, "activityNutritionSub": "Log food and see today's protein", "@activityNutritionSub": { "description": "Activity tab: subtitle of the Nutrition door." }, "homeBackToToday": "Back to today", "@homeBackToToday": { "description": "Today tab: button shown after stepping back to an earlier day." }, "homeSomeDataMissingTitle": "Some of today's data is missing", "@homeSomeDataMissingTitle": { "description": "Today tab: one card listing every missing reading and why." }, "homeFirstWeekTitle": "Your first weeks", "@homeFirstWeekTitle": { "description": "Today tab: card saying when each score first appears." }, "homeFirstWeekWear": "Wear the band tonight", "@homeFirstWeekWear": { "description": "First weeks card step." }, "homeFirstWeekSleep": "Sleep: the morning after your first night", "@homeFirstWeekSleep": { "description": "First weeks card step." }, "homeFirstWeekStrain": "Strain: from day {day}", "@homeFirstWeekStrain": { "description": "First weeks card step. day is the first day strain can be scored.", "placeholders": { "day": { "type": "int" } } }, "homeFirstWeekRecovery": "Recovery: from night {night}, once it knows your normal", "@homeFirstWeekRecovery": { "description": "First weeks card step. night is the first night recovery can be scored.", "placeholders": { "night": { "type": "int" } } }, "homeFirstWeekSoFar": "{count, plural, =1{1 day recorded so far} other{{count} days recorded so far}}", "@homeFirstWeekSoFar": { "description": "First weeks card footer.", "placeholders": { "count": { "type": "int" } } }, "homeFirstWeekDone": "Done: {step}", "@homeFirstWeekDone": { "description": "Screen-reader label for a finished first-weeks step.", "placeholders": { "step": { "type": "String" } } }, "homeCoachSetUpChip": "Ask questions about your data: set up the coach", "@homeCoachSetUpChip": { "description": "Today tab chip when no coach model is configured." }, "profileSetupCycleSub": "Log your period in Health. You can change this later.", "@profileSetupCycleSub": { "description": "Onboarding: subtitle of the cycle tracking switch." }, "homeRecoverySleeping": "Sleeping…", "@homeRecoverySleeping": { "description": "Recovery ring value while last night is still in progress (no confirmed wake yet)." }, "homeRecoveryAfterWake": "Recovery is scored after you wake.", "@homeRecoveryAfterWake": { "description": "Why the recovery ring has no number while the night is still in progress." }, "homeRecoveryFinishingUp": "Finishing up", "@homeRecoveryFinishingUp": { "description": "Caption under a greyed, provisional recovery number: wake detected, the night's data is still arriving." }, "homeRecoveryUpdated": "Updated {time} · {from} → {to}", "@homeRecoveryUpdated": { "description": "Quiet note when today's recovery changed after it was first shown (re-analysis or late sync).", "placeholders": { "time": { "type": "String" }, "from": { "type": "int" }, "to": { "type": "int" } } }, "dataRecoveryChanged": "Recovery changed: {list}", "@dataRecoveryChanged": { "description": "After re-analysis, the days whose recovery changed, e.g. 'Oct 8 2 → 28, Oct 6 40 → 44'.", "placeholders": { "list": { "type": "String" } } }, "deviceUseScoresTitle": "Use this device for scores", "@deviceUseScoresTitle": { "description": "Device page: switch title on a paired non-WHOOP wearable. On makes it the wearable the app's scores come from." }, "deviceUseWorkoutsTitle": "Use during workouts", "@deviceUseWorkoutsTitle": { "description": "Device page: switch title on a paired heart-rate strap. On uses its data during workouts." }, "deviceUseReadingsTitle": "Use readings (weight) in your numbers", "@deviceUseReadingsTitle": { "description": "Device page: switch title on a paired scale. On uses its weighings in the app's numbers." }, "deviceUseBeta": "Beta", "@deviceUseBeta": { "description": "Small chip beside a device's use switch, marking the feature as beta." }, "deviceUseBetaSub": "Experimental. Scores from this device haven't been checked on real hardware yet.", "@deviceUseBetaSub": { "description": "Device page: one-line note under the beta use switch." }, "deviceUseWorking": "Updating your days…", "@deviceUseWorking": { "description": "Device page: shown under the use switch while past days are being recalculated after it was flipped." }, "deviceUseSheetTitle": "Use {device} for scores?", "@deviceUseSheetTitle": { "description": "Confirmation sheet title before a wearable starts feeding scores.", "placeholders": { "device": { "type": "String" } } }, "deviceUseSheetWhat": "This device becomes the one your scores come from. Past days with its data are worked out again. Some values are estimates, and they're labelled.", "@deviceUseSheetWhat": { "description": "Confirmation sheet: what turning a wearable on does." }, "deviceUseSheetSwitch": "Only one device can do this at a time, so {other} will be switched off.", "@deviceUseSheetSwitch": { "description": "Confirmation sheet: shown when another wearable is feeding scores now; it stops when this one starts.", "placeholders": { "other": { "type": "String" } } }, "deviceUseSheetOff": "You can turn it off any time. Whatever it added is then taken back out.", "@deviceUseSheetOff": { "description": "Confirmation sheet: the switch can be turned off, and the device's contribution is removed." }, "deviceUseSheetConfirm": "Use it", "@deviceUseSheetConfirm": { "description": "Confirmation sheet: confirm button." }, "deviceUseSheetCancel": "Not now", "@deviceUseSheetCancel": { "description": "Confirmation sheet: cancel button." }, "settingsReportIssueRowTitle": "Report an issue", "@settingsReportIssueRowTitle": { "description": "Settings row that opens the issue report screen." }, "settingsReportIssueRowSub": "Sends what you choose to the maintainers; your data is encrypted, the report details are not", "@settingsReportIssueRowSub": { "description": "Settings row subtitle for Report an issue." }, "reportNavTitle": "Report an issue", "@reportNavTitle": { "description": "Issue report screen title." }, "reportCategoryGroup": "What it's about", "@reportCategoryGroup": { "description": "Issue report: heading over the category choices." }, "reportCategorySync": "Sync", "@reportCategorySync": { "description": "Issue report category." }, "reportCategorySleep": "Sleep", "@reportCategorySleep": { "description": "Issue report category." }, "reportCategoryRecovery": "Recovery", "@reportCategoryRecovery": { "description": "Issue report category." }, "reportCategoryWorkout": "Workout", "@reportCategoryWorkout": { "description": "Issue report category." }, "reportCategoryPairing": "Pairing", "@reportCategoryPairing": { "description": "Issue report category." }, "reportCategoryOther": "Other", "@reportCategoryOther": { "description": "Issue report category." }, "reportTitleLabel": "Title", "@reportTitleLabel": { "description": "Issue report: title field label." }, "reportTitleHint": "One line on what went wrong", "@reportTitleHint": { "description": "Issue report: title field hint." }, "reportDescriptionLabel": "What happened", "@reportDescriptionLabel": { "description": "Issue report: description field label." }, "reportDescriptionHint": "What you did, what you expected, what you saw", "@reportDescriptionHint": { "description": "Issue report: description field hint." }, "reportAttachGroup": "Attachments", "@reportAttachGroup": { "description": "Issue report: heading over screenshot and database options." }, "reportScreenshotRow": "Add a screenshot", "@reportScreenshotRow": { "description": "Issue report: pick a screenshot." }, "reportScreenshotRemove": "Remove the screenshot", "@reportScreenshotRemove": { "description": "Issue report: remove the picked screenshot." }, "reportDatabaseRow": "Include the last 2 weeks of health data", "@reportDatabaseRow": { "description": "Issue report: switch to attach the database. Off by default." }, "reportDatabaseWarning": "Your sleep, heart rate and other health data from the last 14 days (fewer days of second-by-second data if the ticket would be too big), plus your daily scores and settings. It goes only if this is on, and the server deletes it after 14 days. A ticket with health data can be up to 95 MB, so use Wi-Fi if you can.", "@reportDatabaseWarning": { "description": "Issue report: plain warning under the database switch." }, "reportIncludedGroup": "What's included", "@reportIncludedGroup": { "description": "Issue report: heading over the list of files in the report." }, "reportIncludedNote": "The category, title, description, app version, platform, system version, phone model, install ID, and whether a database or screenshot is attached travel unencrypted so we can track the report, and are kept for 90 days. Everything else is encrypted on this phone before it leaves, so only the maintainers can read it, and is deleted after 30 days, or after 14 days if your database is attached. “Share locally” is different: the ZIP it hands to the share sheet is not encrypted.", "@reportIncludedNote": { "description": "Issue report: note under the file list." }, "reportFileManifest": "This list of files", "@reportFileManifest": { "description": "Issue report file description: manifest.json." }, "reportFileMeta": "App version, phone model, system version, language, time zone and a random install ID", "@reportFileMeta": { "description": "Issue report file description: meta.json." }, "reportFileDevice": "Your paired band and sensors: type, connection, battery and when they last synced", "@reportFileDevice": { "description": "Issue report file description: device.json." }, "reportFileState": "Sync and scoring status, and recent errors", "@reportFileState": { "description": "Issue report file description: state.json." }, "reportFileSyncLog": "The app's recent sync log", "@reportFileSyncLog": { "description": "Issue report file description: logs/sync.log." }, "reportFileTelemetry": "Errors and events this phone recorded in the last 7 days", "@reportFileTelemetry": { "description": "Issue report file description: logs/telemetry.json." }, "reportFileUser": "Your category, title and description", "@reportFileUser": { "description": "Issue report file description: user.txt." }, "reportFileScreenshot": "The screenshot you picked", "@reportFileScreenshot": { "description": "Issue report file description: the screenshot." }, "reportFileDatabase": "Your full health database, compressed", "@reportFileDatabase": { "description": "Issue report file description: database.db.gz." }, "reportFileDatabaseSlice": "Last 14 days of health data, plus daily scores and settings, compressed", "@reportFileDatabaseSlice": { "description": "Issue report file description: database_14d.db.gz." }, "reportFullDatabaseRow": "Full health database (share locally only)", "@reportFullDatabaseRow": { "description": "Issue report: switch to put the whole database in the locally shared file. Off by default; never uploaded." }, "reportFullDatabaseWarning": "Your whole health record. It only goes in the file Share locally makes, never to our server.", "@reportFullDatabaseWarning": { "description": "Issue report: plain line under the full database switch." }, "reportFullDatabaseNoUpload": "The full database is too big to upload. Use Share locally and send the file to us.", "@reportFullDatabaseNoUpload": { "description": "Issue report: shown under Create ticket while the full database switch is on (Create ticket is disabled)." }, "reportDatabaseCovered": "Covered by the full database below.", "@reportDatabaseCovered": { "description": "Issue report: line under the 2-week switch while the full database switch is on." }, "reportStageSlice": "Preparing last 2 weeks…", "@reportStageSlice": { "description": "Report screen: progress text inside the busy button while the 2-week database is built." }, "reportSend": "Create ticket", "@reportSend": { "description": "Issue report: send button." }, "reportSaveInstead": "Share locally", "@reportSaveInstead": { "description": "Issue report: save the archive on the phone, nothing sent." }, "reportNeedTitle": "Add a title first.", "@reportNeedTitle": { "description": "Issue report: shown when sending without a title." }, "reportSentTitle": "Ticket created", "@reportSentTitle": { "description": "Issue report: success card title." }, "reportSentBody": "Your ticket ID is {id}. Quote it if you talk to us about this.", "@reportSentBody": { "description": "Issue report: success card body with the report ID.", "placeholders": { "id": { "type": "String" } } }, "reportCopyId": "Copy ID", "@reportCopyId": { "description": "Issue report: copy the report ID." }, "reportNotSentTitle": "Ticket not created", "@reportNotSentTitle": { "description": "Issue report: failure card title." }, "reportTooLarge": "This ticket is too large to upload. Use Share locally and send the file to us, or turn off the health data or remove the screenshot.", "@reportTooLarge": { "description": "Issue report: 413 or local size check." }, "reportRateLimited": "You've created 3 tickets today. Try again tomorrow, or share this one locally instead.", "@reportRateLimited": { "description": "Issue report: 429." }, "reportStorageFull": "The report server has no room for a database right now. You can create the ticket without it.", "@reportStorageFull": { "description": "Issue report: 507 storage full." }, "reportSendWithoutDb": "Create ticket without the database", "@reportSendWithoutDb": { "description": "Issue report: resend after 507." }, "reportSendFailed": "Couldn't create the ticket. Check your connection, or share it locally instead.", "@reportSendFailed": { "description": "Issue report: network or server error." }, "reportMyReportsGroup": "My reports", "@reportMyReportsGroup": { "description": "Issue report: heading over reports sent from this phone." }, "reportMyReportsSub": "Tap to delete it now. Otherwise it's deleted on {date}", "@reportMyReportsSub": { "description": "Issue report: row subtitle for a sent report.", "placeholders": { "date": { "type": "String" } } }, "reportDelete": "Delete", "@reportDelete": { "description": "Issue report: delete a sent report." }, "reportDeleteFailed": "Couldn't delete it. Try again later.", "@reportDeleteFailed": { "description": "Issue report: delete failed." }, "reportDeleteConfirmTitle": "Delete report {id}?", "@reportDeleteConfirmTitle": { "description": "Issue report: confirm before deleting a sent report.", "placeholders": { "id": { "type": "String" } } }, "reportDeleteConfirmBody": "It will be removed from the server straight away, and its ID won't open it any more. There's no undo.", "@reportDeleteConfirmBody": { "description": "Issue report: what deleting a sent report does." }, "reportSaveFailedTitle": "Couldn't share the report", "@reportSaveFailedTitle": { "description": "Report screen: title of the card shown when building or sharing the local zip failed. Nothing was sent." }, "reportSaveFailedBody": "Something went wrong while building or sharing the file. No ticket was created.", "@reportSaveFailedBody": { "description": "Report screen: body of the save-failed card." }, "reportSaveRetry": "Try again", "@reportSaveRetry": { "description": "Report screen: button that retries saving the report locally." }, "reportStageCollecting": "Collecting app info…", "@reportStageCollecting": { "description": "Report screen: progress text inside the busy button." }, "reportStageLogs": "Reading logs…", "@reportStageLogs": { "description": "Report screen: progress text inside the busy button." }, "reportStageDatabase": "Compressing database…", "@reportStageDatabase": { "description": "Report screen: progress text inside the busy button." }, "reportStagePacking": "Packing files…", "@reportStagePacking": { "description": "Report screen: progress text inside the busy button." }, "reportStageEncrypting": "Encrypting…", "@reportStageEncrypting": { "description": "Report screen: progress text inside the busy button." }, "reportStageUploading": "Uploading {size} MB…", "@reportStageUploading": { "description": "Report screen: progress text inside the busy button, with the ticket size in megabytes (e.g. 64 or 0.4).", "placeholders": { "size": { "type": "String" } } }, "reportStageSharing": "Preparing to share…", "@reportStageSharing": { "description": "Report screen: progress text inside the busy button." }, "homeRecoveryStartsIn": "{count, plural, =1{Recovery starts in 1 night} other{Recovery starts in {count} nights}}", "@homeRecoveryStartsIn": { "description": "First weeks card step: live countdown until recovery can first be scored. count is the number of nights still needed.", "placeholders": { "count": { "type": "int" } } }, "healthWellbeingAllSub": "Breathing, mood, the journal, habits and medication", "@healthWellbeingAllSub": { "description": "Health tab: subtitle of the single door into the wellness screen (mind, habits, medication, cycle tabs)." }, "healthWellbeingAllSubCycle": "Breathing, mood, the journal, habits, medication and cycle", "@healthWellbeingAllSubCycle": { "description": "Health tab: subtitle of the wellness door when cycle tracking is on (the Cycle tab is shown)." }, "reportIdCopied": "Copied {id}", "@reportIdCopied": { "description": "Snackbar after copying the ticket ID on the report screen.", "placeholders": { "id": { "type": "String" } } }, "dataReanalyzeFailed": "Re-analysis failed: {error}", "@dataReanalyzeFailed": { "description": "Re-analyze result: the pass itself failed.", "placeholders": { "error": { "type": "String" } } }, "dataReanalyzeDaysFailed": "{n, plural, one{1 day could not be analyzed. If this keeps happening, please report it.} other{{n} days could not be analyzed. If this keeps happening, please report it.}}", "@dataReanalyzeDaysFailed": { "description": "Re-analyze result: N days could not be derived.", "placeholders": { "n": { "type": "int" } } }, "napsInFuture": "That nap hasn't finished yet. Log it once you're awake.", "@napsInFuture": { "description": "Validation error when a manually logged nap ends after the current time." }, "journalComposeEntrySaveFailed": "Not saved — your entry is still here. Try again.", "@journalComposeEntrySaveFailed": { "description": "Snackbar shown when saving the day's journal entry fails; the screen stays open with the entry intact." }, "journalComposeLoadFailed": "Could not open this day's journal.", "@journalComposeLoadFailed": { "description": "Shown in place of the journal form when reading the day's entry fails." }, "journalComposeTryAgain": "Try again", "@journalComposeTryAgain": { "description": "Button that retries loading the journal entry after a failure." }, "journalComposeAddToJournal": "Add to journal", "@journalComposeAddToJournal": { "description": "Journal AI chat sheet: primary button that copies the proposed tags and note into the day's entry." }, "workoutLoadFailedTitle": "Activity could not be read", "@workoutLoadFailedTitle": { "description": "Title of the card shown on the Activity tab when the sessions failed to load from the database." }, "workoutLoadFailedBody": "Your sessions failed to load. Nothing was deleted — this is a read that went wrong, not missing data.", "@workoutLoadFailedBody": { "description": "Body of the card shown on the Activity tab when the sessions failed to load from the database." }, "liveHrNoReadingTitle": "No live reading", "liveHrNotPairedWhy": "No band is paired.", "liveHrNotPairedFix": "Pair one from Profile to read live beats.", "liveHrNotConnectedWhy": "Your band is not connected.", "liveHrNotConnectedFix": "Live beats need an open link — the app connects when you open it with the band in range.", "liveHrNoRecentBeatWhy": "No beat in the last {seconds} seconds.", "@liveHrNoRecentBeatWhy": { "placeholders": { "seconds": { "type": "int" } } }, "liveHrStreamingFix": "The band streams while it is on your wrist and the app is open.", "liveHrTraceCaption": "The last {count} readings — {min}–{max} bpm. Not stored; this is the live stream, not a record of your day.", "@liveHrTraceCaption": { "placeholders": { "count": { "type": "int" }, "min": { "type": "int" }, "max": { "type": "int" } } }, "notifRecoveryReadyBody": "Recovery {score}.", "@notifRecoveryReadyBody": { "description": "OS notification body when the day's recovery score is ready.", "placeholders": { "score": { "type": "int" } } }, "notifRecoveryReadySleptBody": "Recovery {score}, slept {hours}h {minutes}m.", "@notifRecoveryReadySleptBody": { "description": "OS notification body when the day's recovery score is ready, with last night's sleep time.", "placeholders": { "score": { "type": "int" }, "hours": { "type": "int" }, "minutes": { "type": "int" } } }, "notifStepGoalBody": "You hit about {steps} steps — at or above your {goal} goal.", "@notifStepGoalBody": { "description": "OS notification body when the day's step estimate reaches the goal.", "placeholders": { "steps": { "type": "int" }, "goal": { "type": "int" } } }, "notifLowBatteryBody": "Your band is at {percent}%. Charge it soon.", "@notifLowBatteryBody": { "description": "OS notification body when the band's battery is low.", "placeholders": { "percent": { "type": "int" } } }, "profileImplausibleFields": "Check {fields}: out of range, so nothing was saved.", "@profileImplausibleFields": { "description": "Shown when a typed age, height or weight is outside the believable range.", "placeholders": { "fields": { "type": "String" } } }, "notifBatteryForecastBeforeWakeBody": "At {rate}%/h it runs out around {time} — before you wake. Charge it now to keep tonight's sleep.", "@notifBatteryForecastBeforeWakeBody": { "description": "OS notification body when the band is forecast to run flat before the user wakes. rate is the drain in percent per hour, already formatted; time is a clock time, already formatted.", "placeholders": { "rate": { "type": "String" }, "time": { "type": "String" } } }, "notifBatteryForecastReserveBody": "At {rate}%/h it runs out around {time}, just after your usual wake time — about {left}% left when you get up. Charge it now to keep tonight's sleep.", "@notifBatteryForecastReserveBody": { "description": "OS notification body when the band is forecast to wake with almost no charge left. rate is the drain in percent per hour, already formatted; time is a clock time, already formatted.", "placeholders": { "rate": { "type": "String" }, "time": { "type": "String" }, "left": { "type": "int" } } }, "notifBatteryForecastAfterWakeBody": "At {rate}%/h it runs out around {time}, after your usual wake time.", "@notifBatteryForecastAfterWakeBody": { "description": "OS notification body when the band's battery forecast lasts past the usual wake time. rate is the drain in percent per hour, already formatted; time is a clock time, already formatted.", "placeholders": { "rate": { "type": "String" }, "time": { "type": "String" } } }, "notifWindDownBody": "Your bedtime is around {time}. Start slowing down.", "@notifWindDownBody": { "description": "OS notification body for the wind-down reminder. time is a clock time, already formatted.", "placeholders": { "time": { "type": "String" } } }, "notifWorkoutIdleBody": "Nothing above resting effort has been recorded for {minutes} minutes. If the session is over, finish it from the Workout tab.", "@notifWorkoutIdleBody": { "description": "OS notification body when a live workout has shown no effort for a while.", "placeholders": { "minutes": { "type": "int" } } }, "settingsStepCalibration": "Step calibration", "settingsStepCalibrationSub": "Learns how your strap over- or under-counts your own walking, and corrects it on the phone. Nothing is written to the strap and nothing leaves the device", "stepCalTitle": "Step calibration", "stepCalIntro": "Your strap counts steps off its own motion sensor, and how far off it is depends on you. These routines measure that. Nothing leaves your phone.", "stepCalSlowTitle": "Slow walk", "stepCalSlowSub": "walk slowly, phone in your pocket", "stepCalSlowGuide": "Walk slowly and evenly, strap snug. Count 100 steps yourself.", "stepCalBriskTitle": "Brisk walk", "stepCalBriskSub": "walk at your usual pace", "stepCalBriskGuide": "Walk at your normal pace. Count 100 steps yourself.", "stepCalJogTitle": "Jog", "stepCalJogSub": "jog steadily", "stepCalJogGuide": "Jog steadily. Count 100 steps yourself.", "stepCalEverydayTitle": "Around the house", "stepCalEverydaySub": "tidy up for three minutes, phone in pocket", "stepCalEverydayGuide": "Do ordinary things around the house — carry, lift, tidy — with your phone in your pocket. Three minutes. Do not pace deliberately.", "stepCalCalibrated": "Calibrated — counted {n} times", "stepCalNotCalibrated": "Not calibrated yet", "stepCalBandSeen": "{count, plural, one{step the band has seen} other{steps the band has seen}}", "@stepCalBandSeen": { "placeholders": { "count": { "type": "int" } } }, "stepCalCountYourself": "Count your own steps. Stop when you reach {target}.", "stepCalElapsed": "Keep going — this one is timed.", "stepCalHowManyCounted": "How many steps did you count?", "stepCalFinish": "Done", "stepCalCancel": "Cancel", "stepCalKeepWalking": "Nothing recorded yet — start walking with the strap snug.", "stepCalKeepMoving": "Nothing recorded yet — keep the phone on you and keep moving.", "stepCalNoSignal": "The band recorded nothing during that routine.", "stepCalNoPhoneAccess": "This routine needs your phone’s step counter, and access was not granted. That counter is the reference for household movement.", "stepCalPhoneNotReady": "Your phone’s step counter did not answer. Try again in a moment.", "stepCalNoPhone": "Your phone counted no steps while you did that. Keep it in your pocket next time — it is the reference for household movement.", "stepCalBandQuiet": "The band saw almost no movement. It is worth checking the strap is worn snugly and streaming.", "stepCalTooShort": "That routine was too short to measure against. Walk the full count.", "stepCalMismatch": "The band counted far more than you did. Something other than walking was being picked up.", "stepCalWrongSource": "That routine used the wrong reference.", "stepCalBadData": "That routine produced unreadable sensor data.", "stepCalRatioOutOfRange": "Your count and the band’s are too far apart to use. Repeat the routine and walk the full count.", "stepCalCadenceOutOfRange": "The band could not find a walking rhythm in that routine. Start walking right after you press start and keep a steady pace.", "stepCalRoutineTooShort": "That routine ended before the timer finished. Keep going until it completes.", "stepCalSaveFailed": "Could not save that calibration.", "stepCalDoneGait": "Saved. You counted {count} steps and the band saw {band} steps. From now on this kind of walking is corrected by {pct}%.", "stepCalDoneHousehold": "Saved. Your phone counted {count} steps of the {band} steps the band saw. Household movement is now scaled to {gain}.", "@stepCalCalibrated": { "description": "Badge on a category row: how many supervised routines are behind its gain.", "placeholders": { "n": { "type": "int" } } }, "@stepCalCountYourself": { "description": "Instruction during a gait routine. The wearer counts their own steps; the band's live count is shown only as feedback, because a run that ended on the band's own count would always fit exactly 1.0.", "placeholders": { "target": { "type": "int" } } }, "@stepCalDoneGait": { "description": "Result of a gait calibration: what the wearer counted, what the band counted, and the percentage correction now applied. Signed, so a reduction reads as -12%.", "placeholders": { "count": { "type": "int" }, "band": { "type": "int" }, "pct": { "type": "int" } } }, "@stepCalDoneHousehold": { "description": "Result of a household calibration: the phone's count (the reference), the band's count, and the resulting scale as a fixed-2 string.", "placeholders": { "count": { "type": "int" }, "band": { "type": "int" }, "gain": { "type": "String" } } }, "dataStorageGroup": "Storage", "@dataStorageGroup": { "description": "Data screen group title: storage settings and compaction." }, "dataKeepHistory": "Keep raw readings", "@dataKeepHistory": { "description": "Row title: how long the compressed raw-reading archive is kept." }, "dataKeepHistorySub": "A compressed copy of each day's second-by-second readings, kept after the app clears them. A day older than this keeps its scores but can't be re-scored when scoring improves", "@dataKeepHistorySub": { "description": "Row sub for the archive window setting." }, "dataKeepDays": "{days} days", "@dataKeepDays": { "description": "Archive window value: a number of days.", "placeholders": { "days": { "type": "int" } } }, "dataKeepYear": "1 year", "@dataKeepYear": { "description": "Archive window value: one year." }, "dataKeepForever": "Forever", "@dataKeepForever": { "description": "Archive window value: never delete." }, "dataKeepShorterTitle": "Keep {window} of raw readings?", "@dataKeepShorterTitle": { "description": "Confirm title when the archive window is shortened.", "placeholders": { "window": { "type": "String" } } }, "dataKeepShorterBody": "Readings more than about {window} before your latest one are deleted now. Those days keep their scores, but can't be re-scored after future updates.", "@dataKeepShorterBody": { "description": "Confirm body when the archive window is shortened.", "placeholders": { "window": { "type": "String" } } }, "dataKeepShorterConfirm": "Delete older readings", "@dataKeepShorterConfirm": { "description": "Confirm button: shorten the window and delete older archive." }, "dataKeepShorterCancel": "Keep them", "@dataKeepShorterCancel": { "description": "Cancel button: keep the current window." }, "dataCompact": "Compact database", "@dataCompact": { "description": "Row title: compact the database file." }, "dataCompactSub": "Clears what the settings above no longer keep, then gives the unused space back to the phone. Needs free space of about twice the database's size", "@dataCompactSub": { "description": "Row sub for Compact database." }, "dataCompactPruning": "Clearing old data…", "@dataCompactPruning": { "description": "Progress line while old data is cleared before compaction." }, "dataCompactVacuuming": "Compacting…", "@dataCompactVacuuming": { "description": "Progress line while the database file is rewritten." }, "dataCompactFreed": "Freed {freed} MB. The database is now {size} MB.", "@dataCompactFreed": { "description": "Compaction result: megabytes freed and the new size.", "placeholders": { "freed": { "type": "int" }, "size": { "type": "int" } } }, "dataCompactNoSpace": "Old data was cleared, but compacting needs {need} MB free and the phone has {free} MB.", "@dataCompactNoSpace": { "description": "Compaction refused: not enough free storage.", "placeholders": { "need": { "type": "int" }, "free": { "type": "int" } } }, "dataCompactUnknownSpace": "Old data was cleared, but the phone's free space couldn't be read, so the file was not compacted.", "@dataCompactUnknownSpace": { "description": "Compaction refused: free storage could not be read." }, "dataCompactBusy": "A sync or a live session is running. Try again once it's done.", "@dataCompactBusy": { "description": "Compaction refused: a sync or session is running." }, "dataSizeMb": "{mb} MB", "@dataSizeMb": { "description": "A size in megabytes, shown as the row value.", "placeholders": { "mb": { "type": "int" } } } }