From b786a5adee6e2eb0094c29fcb01f6055f604b5c4 Mon Sep 17 00:00:00 2001 From: JohanStefanes Date: Thu, 15 Oct 2026 19:21:05 +0200 Subject: [PATCH] fix(copy): correct stale and misleading WHOOP 5.0/MG text on Apple, Android and docs User-facing text only; no BLE, gating, analytics or storage behaviour changes. - Point every 5/MG probe reference at Test Centre -> 5/MG protocol diagnostics -> Protocol probes (or Connection & Sync), not the removed Settings -> Experimental section (Refs #2464) - Strap alarm: say on both platforms that a 5/MG only arms while Protocol probes is on, and that an earlier alarm may still be set on the strap - Probe verdicts for opcodes 98/84 say "answered", not "ACCEPTED", identically on Swift and Kotlin (tests updated) - Health sync card, Sync now hint and Shortcuts reply no longer claim a pairing handshake is in progress for a hello-suppressed 5/MG - Pairing-mode step says how (tap until the LEDs flash blue); onboarding expectation card, steps, skin-temp, SpO2 and HRV caveats match the code - Translations updated in all Android locales and the xcstrings catalog - README, FEATURES, FAQ, ANDROID, ANALYTICS and protocol docs match the app Verified: macOS (Strand) and iOS (NOOPiOS) builds succeed; WhoopProtocol and StrandAnalytics swift test pass; Android testFullDebugUnitTest passes except two RecoveryDriversTest cases that fail identically on main; i18n_audit --ci and doc_comment_lint pass. Not tested on hardware (text only). Co-Authored-By: Claude Opus 5.5 --- .../StrandAnalytics/SpotHrvReading.swift | 10 +- .../WhoopProtocol/BodyLocationProbe.swift | 2 +- .../WhoopProtocol/ExtendedBatteryProbe.swift | 2 +- .../BodyLocationProbeTests.swift | 4 +- .../ExtendedBatteryProbeTests.swift | 2 +- README.md | 28 +- Strand/BLE/BLEManager.swift | 18 +- Strand/Onboarding/OnboardingWizard.swift | 2 +- Strand/Resources/Localizable.xcstrings | 1555 +---------------- Strand/Screens/AddDeviceWizard.swift | 2 +- Strand/Screens/DataSourcesView.swift | 17 +- Strand/Screens/DevicesView.swift | 25 +- Strand/Screens/FullDayChartView.swift | 2 +- Strand/Screens/HRVSnapshotView.swift | 6 +- Strand/Screens/HealthView.swift | 9 +- Strand/Screens/LiveView.swift | 15 +- Strand/Screens/NoopLimitationsView.swift | 2 +- Strand/Screens/SettingsView.swift | 16 +- Strand/Screens/SmartAlarmView.swift | 19 +- Strand/Screens/TestCentreView.swift | 2 +- Strand/Screens/TodayView.swift | 4 +- Strand/Screens/VitalSignsSummary.swift | 21 +- Strand/System/AppChangelog.swift | 4 +- Strand/System/DebugDataDiagnostics.swift | 2 +- Strand/System/SyncActivityCopy.swift | 2 +- StrandTests/HelloSuppressionTests.swift | 4 +- StrandiOS/App/StrandiOSApp.swift | 2 +- StrandiOS/System/NOOPAppIntents.swift | 4 +- .../Widgets/SyncLiveActivityController.swift | 4 +- Tools/i18n/ar_wip.json | 24 +- Tools/i18n_audit_baseline.json | 14 +- Tools/linux-capture/README.md | 24 +- .../java/com/noop/analytics/SpotHrvReading.kt | 12 +- .../java/com/noop/ble/BondRefusalGiveUp.kt | 4 +- .../main/java/com/noop/ble/WhoopBleClient.kt | 52 +- .../com/noop/testcentre/AndroidDiagnostics.kt | 2 +- .../main/java/com/noop/ui/AddDeviceWizard.kt | 2 +- .../main/java/com/noop/ui/DevicesScreen.kt | 14 +- .../src/main/java/com/noop/ui/HealthScreen.kt | 9 +- .../java/com/noop/ui/HealthVitalsLogic.kt | 4 +- .../java/com/noop/ui/HrvSnapshotScreen.kt | 2 +- .../src/main/java/com/noop/ui/LiveScreen.kt | 9 +- .../src/main/java/com/noop/ui/LogExport.kt | 2 +- .../java/com/noop/ui/NoopLimitationsScreen.kt | 2 +- .../main/java/com/noop/ui/SettingsLogic.kt | 2 +- .../main/java/com/noop/ui/SettingsScreen.kt | 11 +- .../main/java/com/noop/ui/SmartAlarmScreen.kt | 17 +- .../main/java/com/noop/ui/TestCentreScreen.kt | 6 +- .../com/noop/ui/WhoopModelComparisonScreen.kt | 4 +- .../app/src/main/res/values-de/strings.xml | 53 +- .../app/src/main/res/values-es/strings.xml | 49 +- .../app/src/main/res/values-fr/strings.xml | 49 +- .../app/src/main/res/values-it/strings.xml | 49 +- .../app/src/main/res/values-pl/strings.xml | 51 +- .../src/main/res/values-pt-rPT/strings.xml | 49 +- .../app/src/main/res/values-ru/strings.xml | 51 +- .../app/src/main/res/values-zh/strings.xml | 51 +- android/app/src/main/res/values/strings.xml | 47 +- .../noop/ble/BodyLocationProbeFormatTest.kt | 4 +- .../ble/ExtendedBatteryProbeFormatTest.kt | 2 +- docs/ANALYTICS.md | 4 +- docs/ANDROID.md | 37 +- docs/FAQ.md | 7 +- docs/FEATURES.md | 51 +- docs/OURA_PROTOCOL.md | 5 +- docs/PROTOCOL_IMPLEMENTATION.md | 12 +- docs/WHOOP5_OPTICAL_EXPERIMENT.md | 8 +- 67 files changed, 588 insertions(+), 1992 deletions(-) diff --git a/Packages/StrandAnalytics/Sources/StrandAnalytics/SpotHrvReading.swift b/Packages/StrandAnalytics/Sources/StrandAnalytics/SpotHrvReading.swift index d8c99148f6..ee318a374a 100644 --- a/Packages/StrandAnalytics/Sources/StrandAnalytics/SpotHrvReading.swift +++ b/Packages/StrandAnalytics/Sources/StrandAnalytics/SpotHrvReading.swift @@ -22,7 +22,7 @@ import Foundation /// result is `.insufficient` with the surviving/needed counts so the UI can say so plainly (never a /// fabricated value, unknown stays the "no value" glyph). /// - The caveat (`caveatFor`) is source-aware: a 60 s spot reading is not the overnight baseline, it -/// needs enough beats, and R-R derived from a WHOOP 5/MG's optical PPG is noisier than a chest +/// needs enough beats, and R-R derived from a WHOOP strap's optical PPG is noisier than a chest /// strap's electrical R-R. Pure strings, US-neutral, no em-dashes. /// /// Pure arithmetic + small value types, no I/O — fully unit-testable against a known RR series. @@ -30,9 +30,9 @@ public enum SpotHrvReading { /// Where the live R-R intervals came from — drives the honesty caveat (optical PPG is noisier). public enum Source: Sendable { - /// WHOOP 5/MG: R-R is derived from the optical PPG waveform — beat-to-beat, but noisier. + /// Any WHOOP strap (4.0, 5.0, MG): R-R is derived from the optical PPG via 0x2A37 — beat-to-beat, but noisier. case opticalPPG - /// WHOOP 4 or a chest strap (e.g. Polar H10) over the standard 0x2A37 profile — electrical R-R. + /// An electrical chest strap (e.g. Polar H10) over the standard 0x2A37 profile. case chestStrap /// Source not known (generic / unspecified strap). case unknown @@ -89,8 +89,8 @@ public enum SpotHrvReading { "only a reading with enough clean beats is shown." switch source { case .opticalPPG: - return base + " On a WHOOP 5.0/MG the intervals come from the optical pulse signal, which is " + - "noisier than a chest strap, so treat the number as a rough estimate." + return base + " On a WHOOP strap (4.0, 5.0 or MG) the intervals come from the optical pulse signal, which is " + + "noisier than an electrical chest strap such as a Polar H10, so treat the number as a rough estimate." case .chestStrap, .unknown: return base } diff --git a/Packages/WhoopProtocol/Sources/WhoopProtocol/BodyLocationProbe.swift b/Packages/WhoopProtocol/Sources/WhoopProtocol/BodyLocationProbe.swift index e4a7d17ee3..7d948be181 100644 --- a/Packages/WhoopProtocol/Sources/WhoopProtocol/BodyLocationProbe.swift +++ b/Packages/WhoopProtocol/Sources/WhoopProtocol/BodyLocationProbe.swift @@ -44,7 +44,7 @@ public enum BodyLocationProbe { if resultCode == 3 { verdict = "opcode 84 REJECTED by firmware (UNSUPPORTED)" } else if hasPayload { - verdict = "opcode 84 ACCEPTED — \(pay.count)-byte payload" + verdict = "opcode 84 answered — \(pay.count)-byte payload (not a success verdict; see the bytes below)" } else { verdict = "opcode 84 answered with a bare stub — ambiguous" } diff --git a/Packages/WhoopProtocol/Sources/WhoopProtocol/ExtendedBatteryProbe.swift b/Packages/WhoopProtocol/Sources/WhoopProtocol/ExtendedBatteryProbe.swift index 5b7d536da6..7151d676fd 100644 --- a/Packages/WhoopProtocol/Sources/WhoopProtocol/ExtendedBatteryProbe.swift +++ b/Packages/WhoopProtocol/Sources/WhoopProtocol/ExtendedBatteryProbe.swift @@ -37,7 +37,7 @@ public enum ExtendedBatteryProbe { if resultCode == 3 { verdict = "opcode 98 REJECTED by firmware (UNSUPPORTED) — evidence for the decompile's 87" } else if hasPayload { - verdict = "opcode 98 ACCEPTED — \(pay.count)-byte payload" + verdict = "opcode 98 answered — \(pay.count)-byte payload (not a success verdict; see the bytes below)" } else { verdict = "opcode 98 answered with a bare stub — ambiguous" } diff --git a/Packages/WhoopProtocol/Tests/WhoopProtocolTests/BodyLocationProbeTests.swift b/Packages/WhoopProtocol/Tests/WhoopProtocolTests/BodyLocationProbeTests.swift index 4c4ecfd0d2..23c31d15ce 100644 --- a/Packages/WhoopProtocol/Tests/WhoopProtocolTests/BodyLocationProbeTests.swift +++ b/Packages/WhoopProtocol/Tests/WhoopProtocolTests/BodyLocationProbeTests.swift @@ -21,7 +21,7 @@ final class BodyLocationProbeTests: XCTestCase { func testWhoop4_acceptedDecodesTheFourFields() { let (text, payHex) = BodyLocationProbe.format(frame: hexToBytes(wristFrame), cmdOff: 6, isWhoop5: false, prevPayloadHex: nil) XCTAssertTrue(text.contains("WHOOP 4.0")) - XCTAssertTrue(text.contains("opcode 84 ACCEPTED — 4-byte payload")) + XCTAssertTrue(text.contains("opcode 84 answered — 4-byte payload (not a success verdict; see the bytes below)")) XCTAssertTrue(text.contains(wristFrame)) // full raw hex on one copyable line XCTAssertTrue(text.contains(" @00 01 01 5a 00")) // offset-labelled hex grid XCTAssertTrue(text.contains("revision: 1")) @@ -79,7 +79,7 @@ final class BodyLocationProbeTests: XCTestCase { let (text, _) = BodyLocationProbe.format(frame: hexToBytes(wristFrame), cmdOff: 6, isWhoop5: false, prevPayloadHex: nil) let golden = [ "#690 BODY-LOCATION PROBE — WHOOP 4.0", - "Verdict: opcode 84 ACCEPTED — 4-byte payload", + "Verdict: opcode 84 answered — 4-byte payload (not a success verdict; see the bytes below)", "", "Raw frame (15 B):", "aa09000024005401015a00deadbeef", diff --git a/Packages/WhoopProtocol/Tests/WhoopProtocolTests/ExtendedBatteryProbeTests.swift b/Packages/WhoopProtocol/Tests/WhoopProtocolTests/ExtendedBatteryProbeTests.swift index ab834509dc..213f7dfaa3 100644 --- a/Packages/WhoopProtocol/Tests/WhoopProtocolTests/ExtendedBatteryProbeTests.swift +++ b/Packages/WhoopProtocol/Tests/WhoopProtocolTests/ExtendedBatteryProbeTests.swift @@ -19,7 +19,7 @@ final class ExtendedBatteryProbeTests: XCTestCase { func testWhoop4RealCapture_acceptedWithVoltageAndGrid() { let (text, payHex) = ExtendedBatteryProbe.format(frame: hexToBytes(realFrame), cmdOff: 6, isWhoop5: false, prevPayloadHex: nil) XCTAssertTrue(text.contains("WHOOP 4.0")) - XCTAssertTrue(text.contains("opcode 98 ACCEPTED — 29-byte payload")) + XCTAssertTrue(text.contains("opcode 98 answered — 29-byte payload (not a success verdict; see the bytes below)")) XCTAssertTrue(text.contains(realFrame)) // full raw hex on one copyable line XCTAssertTrue(text.contains("Voltage: 3.97 V")) // pay[7..8] = 0x0f82 = 3970 mV XCTAssertTrue(text.contains("(mV=3970 @07)")) diff --git a/README.md b/README.md index 0fef9a1cc8..34bd1e2df8 100644 --- a/README.md +++ b/README.md @@ -193,8 +193,9 @@ shared cross-platform code. | **Data Sources** | One-tap import of a WHOOP CSV export, an Apple Health export, or a **nutrition CSV** (Cronometer / MacroFactor), plus live-strap status. "Bring your history in once, then it's yours." | | **Notifications** | Configure local notifications and thresholds (`Strand/Data/NotificationSettingsStore.swift`). | | **Automations** | Turn the strap's physical inputs and live biometrics into Mac actions — all on-device (see below). | +| **Alarms** | Your strap wake-alarm and the evening wind-down reminder, in one place (see [Alarms](#alarms-on-device) below). | | **Coach** | An optional **AI Coach** you can ask about your data in plain language. It is off until you add your own key — Anthropic, OpenAI, or any OpenAI-compatible endpoint including a local/self-hosted model (Ollama, LM Studio) — and it sends only a short text summary of recent metrics plus your question, never raw streams or identifiers. With a local model the conversation never leaves your machine. Available on macOS, Android, and iOS. See [`docs/PRIVACY_SECURITY.md`](docs/PRIVACY_SECURITY.md). | -| **Settings** | Profile, preferences, **step calibration** (tune the stride/step estimate to your own walking), unit choices, the in-app **What's new** changelog, and an opt-in **Experimental** section (WHOOP 5/MG protocol probes). On **iOS**, also **Export for Shortcuts** — a HealthKit-free path that hands your metrics to Apple Health via the Shortcuts app. | +| **Settings** | Profile, preferences, **step calibration** (tune the stride/step estimate to your own walking), unit choices, the in-app **What's new** changelog, and **Test Centre**, which holds the opt-in WHOOP 5/MG protocol probes (Test Centre → 5/MG protocol diagnostics → Protocol probes). On **iOS**, also **Export for Shortcuts** — a HealthKit-free path that hands your metrics to Apple Health via the Shortcuts app. | There is also a **menu-bar extra** (`Strand/MenuBar/MenuBarContent.swift`) with a glanceable live HR readout and a compact popover, a first-run **onboarding wizard** @@ -216,9 +217,18 @@ and an in-app **"What's new"** changelog shown after each update. - **Inactivity reminder.** An optional gentle wrist buzz after you've been sitting still too long — your idle threshold, your active hours, a re-nudge cooldown, respects quiet hours, **off by default**. -- **Smart alarm.** Arms the strap's own **firmware** alarm to buzz at your wake - time (still fires if the Mac is asleep or NOOP is closed), with an optional - light-sleep wake window when the Mac stays awake and connected. + +### Alarms (on-device) + +`Strand/Screens/SmartAlarmView.swift` (the **Alarms** screen; Android has a matching Alarms screen): + +- **Strap wake-alarm.** Arms the strap's own **firmware** alarm to buzz at your wake time, so it still + fires if the Mac is asleep or NOOP is closed. Confirmed on WHOOP 4.0. On WHOOP 5.0 / MG it is + experimental: it is only armed when **Protocol probes** is on (Test Centre → 5/MG protocol + diagnostics), and even then a wake is not guaranteed, so keep a backup alarm. +- **Wind-down reminder.** Lives on the same screen, so every wake and wind-down control sits together. +- **No light-sleep early wake on Apple platforms.** The phone-based smart wake (light-sleep detection) + is Android-only. --- @@ -249,7 +259,7 @@ NOOP is an independent, **experimental** project — capable, but a work in prog | Strap | Status | |---|---| | **WHOOP 4.0** | ✅ The tested, supported path. Live HR, recovery, strain, sleep, history offload — the full experience. (v1.95 also unlocked sleep + recovery on the newer "v25" 4.0 firmware layout that earlier versions could only read live HR from.) | -| **WHOOP 5.0 / MG** | 🧪 **Live heart rate works** (confirmed on real hardware). Pick "WHOOP 5.0 / MG" before connecting — and see the pairing note below, because you can't just scan for it. Deeper 5/MG metrics (recovery, strain, sleep) are still being mapped; there's an opt-in **Settings → Experimental** toggle for 5/MG owners who want to help document the protocol. | +| **WHOOP 5.0 / MG** | 🧪 **Live heart rate works** (confirmed on real hardware). Pick "WHOOP 5.0 / MG" before connecting — and see the pairing note below, because you can't just scan for it. Sleep, recovery and strain are scored on-device, with the overnight-input limits listed under "WHOOP 5.0 / MG analysis limits" below; there's an opt-in **Protocol probes** switch (Test Centre → 5/MG protocol diagnostics) for 5/MG owners who want to help document the protocol. | | **Oura Ring (Gen 3 measured; Ring 5 reported)** | 🧪 **Experimental, not a supported strap.** Pairs on **iOS / Android only** and reads real overnight data — heart rate, sleep stages, skin temperature, SpO₂, motion. The ring's night feeds the scorer, so a ring-only day gets a **Sleep** and a **Strain** score but **no Recovery** (it needs an HRV baseline the ring cannot provide), and some metrics are permanently out of reach. See **Oura ring support** below before you expect anything from it. | > ### WHOOP 5.0 / MG analysis limits @@ -262,7 +272,7 @@ NOOP is an independent, **experimental** project — capable, but a work in prog > | Sleep duration / detection | Experimental; can fall back to heart rate when motion is sparse | > | Sleep stages | Approximate and not reliable while full overnight motion and cardiorespiratory inputs remain incomplete | > | Skin temperature | Raw values decode on supported historical layouts; not available consistently across 5/MG firmware | -> | Blood oxygen / SpO₂ | Not recoverable offline from current time-multiplexed PPG data | +> | Blood oxygen / SpO₂ | No verified value. NOOP cannot recover SpO₂ from the current time-multiplexed PPG data. The strap's own @82 SpO₂ candidate decodes only during sleep and is unverified. It appears only in the Blood Oxygen tile, as an "estimate", behind the default-off "Blood Oxygen: strap estimate" toggle, and never feeds recovery or illness scoring. | > | Overnight HRV and respiratory rate | Incomplete unless sufficient R-R intervals are captured | > > In short: seeing the Sleep, Health, Readiness, or Insights screens doesn't mean their deepest @@ -291,8 +301,10 @@ NOOP is an independent, **experimental** project — capable, but a work in prog > **Only one device at a time.** Because the strap holds a single bond, don't leave it connected to your > phone *and* your Mac (or the WHOOP app) at once — live heart rate will still show on all of them > (that rides the bond-free standard profile), but **none** of them will have the real encrypted bond. -> If HR streams fine yet **buzz, alarm, double-tap and history don't work**, that's the tell: the strap -> isn't truly bonded to this device. Free it from everything else, then pair here. +> If HR streams fine yet **buzz, double-tap and history don't work**, that's the tell: the strap +> isn't truly bonded to this device. Free it from everything else, then pair here. (The 5/MG strap +> alarm is separate and experimental: even on a properly bonded strap it stays off until you turn on +> **Protocol probes** in Test Centre → 5/MG protocol diagnostics, and even then a wake is not guaranteed.) > > Bonding to NOOP may take the strap's bond away from the WHOOP app, so the official app might need to > re-pair afterwards. This is the **hardest part of 5/MG support** — if it refuses, you're almost diff --git a/Strand/BLE/BLEManager.swift b/Strand/BLE/BLEManager.swift index 690e394194..9eb5ba6909 100644 --- a/Strand/BLE/BLEManager.swift +++ b/Strand/BLE/BLEManager.swift @@ -220,7 +220,7 @@ struct BondRefusalGiveUp { /// /// Pure. Byte-identical to the Kotlin `BondRefusalGiveUp.helloSuppressedHint`. static func helloSuppressedHint() -> String { - "The secure handshake with your strap never completes, and the attempt itself is what drops the link. NOOP has switched it off for this strap so live heart rate keeps streaming. History sync stays unavailable until it pairs, and so do motion, skin temperature, SpO₂ and respiratory rate, so sleep is staged from heart rate alone. Some straps have paired again after being put in pairing mode. Tap until the LEDs flash blue, then tap Connect." + "The secure handshake with your strap never completes, and the attempt itself is what drops the link. NOOP has switched it off for this strap so live heart rate keeps streaming. History sync stays unavailable until it pairs, and so do motion and skin temperature, so sleep is staged from heart rate alone. Some straps have paired again after being put in pairing mode. Tap until the LEDs flash blue, then tap Connect." } /// The paused hint for a bond that failed WITHOUT the strap ever answering (#1635). @@ -3489,7 +3489,7 @@ public final class BLEManager: NSObject, ObservableObject { log("Deep-data: needs a WHOOP 5.0/MG strap selected — ignored."); return } guard PuffinExperiment.deepDataEnabled else { - log("Deep-data: the deep-data experiment is off — enable it in Settings → Experimental first."); return + log("Deep-data: the deep-data experiment is off — turn on 'Legacy R22 feature-flag experiment' in Test Centre → 5/MG protocol diagnostics first."); return } guard state.connected, state.encryptedBond else { // The R22 SET_CONFIG writes go over the encrypted command channel, so the live-HR-only @@ -3778,7 +3778,7 @@ public final class BLEManager: NSObject, ObservableObject { log("ECG gate (#891): needs a WHOOP 5/MG strap selected — ignored."); return } guard PuffinExperiment.ecgRawDataEnabled else { - log("ECG gate (#891): the experiment is off — enable it in Settings → Experimental first."); return + log("ECG gate (#891): the experiment is off — turn on 'WHOOP MG ECG raw-data gate' in Test Centre → 5/MG protocol diagnostics first."); return } let variant = whoop5Variant guard variant.isMG else { @@ -4074,7 +4074,7 @@ public final class BLEManager: NSObject, ObservableObject { // branch, and 4.0 has no allowlist. So this guard is not merely belt-and-braces on every family — // for the family most likely to run this first, it is the belt. guard TestCentre.active(.connection) else { - log("Feature-flag probe (#761) ignored — Test Centre → Connection is off") + log("Feature-flag probe (#761) ignored — Test Centre → Connection & Sync is off") return } guard featureFlagReport == nil else { @@ -4156,7 +4156,7 @@ public final class BLEManager: NSObject, ObservableObject { // Defence in depth: the menu entry is already Test-Centre gated, but the sender re-checks so no // other path can start a probe on a default install. guard TestCentre.active(.connection) else { - log("Device-config read probe (#103) ignored — Test Centre → Connection is off") + log("Device-config read probe (#103) ignored — Test Centre → Connection & Sync is off") return } guard deviceConfigReport == nil else { @@ -6814,8 +6814,12 @@ extension BLEManager: @preconcurrency CBPeripheralDelegate { // counting silently; recordRefusal() below stays false (latched), so no epitaph spam. log("WHOOP 5/MG: bond still refused during a paused-state probe (streak \(bondRefusalStreak)) - the give-up stays latched") } else if bondRefusalStreak >= 2 { - state.pairingHint = "NOOP can see your strap but it's refusing to pair - it's likely still bonded to the official WHOOP app, or your phone is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) on a 5.0/MG, tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed under iPhone Settings → Bluetooth, tap it and choose Forget This Device, then reconnect in NOOP." - log("WHOOP 5/MG: bond refused \(bondRefusalStreak)× with no successful bond — the strap is refusing the encrypted link (WHOOP app holds it, or a stale iOS pairing). Surfacing pairing-mode + forget-device guidance (#78).") + #if os(macOS) + state.pairingHint = "NOOP can see your strap but it's refusing to pair. It is likely still held by the official WHOOP app, or this Mac is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed in System Settings → Bluetooth, open its details and choose Forget This Device, then reconnect in NOOP." + #else + state.pairingHint = "NOOP can see your strap but it's refusing to pair. It is likely still held by the official WHOOP app, or your iPhone is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed under iPhone Settings → Bluetooth, tap it and choose Forget This Device, then reconnect in NOOP." + #endif + log("WHOOP 5/MG: bond refused \(bondRefusalStreak)× with no successful bond — the strap is refusing the encrypted link (WHOOP app holds it, or a stale OS pairing). Surfacing pairing-mode + forget-device guidance (#78).") } else { log("WHOOP 5/MG: bond write refused (insufficient) — retrying once; will surface pairing-mode guidance if it persists (#78).") } diff --git a/Strand/Onboarding/OnboardingWizard.swift b/Strand/Onboarding/OnboardingWizard.swift index fb8fdb0002..6e50bb6142 100644 --- a/Strand/Onboarding/OnboardingWizard.swift +++ b/Strand/Onboarding/OnboardingWizard.swift @@ -641,7 +641,7 @@ private struct ScanStep: View { .foregroundStyle(StrandPalette.textPrimary) } - Text("WHOOP straps don't appear in your \(Platform.deviceNoun)'s Bluetooth settings. They advertise on a custom profile that only apps like NOOP can find, so there's nothing to pair there, and you shouldn't try.") + Text("You don't pair a WHOOP strap from your \(Platform.deviceNoun)'s Bluetooth settings. It advertises on a custom profile that only apps like NOOP can find, so don't try to pair it there. If a WHOOP is already listed there from an earlier pairing, leave it unless NOOP's re-pair steps ask you to forget it.") .font(StrandFont.subhead) .foregroundStyle(StrandPalette.textSecondary) .fixedSize(horizontal: false, vertical: true) diff --git a/Strand/Resources/Localizable.xcstrings b/Strand/Resources/Localizable.xcstrings index 7f227851a7..b0bf02311f 100644 --- a/Strand/Resources/Localizable.xcstrings +++ b/Strand/Resources/Localizable.xcstrings @@ -1,6 +1,11 @@ { "sourceLanguage": "en", "strings": { + "Waiting for your strap…": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Warte auf deinen Strap…"}}, "es": {"stringUnit": {"state": "translated", "value": "Esperando a tu pulsera…"}}, "fr": {"stringUnit": {"state": "translated", "value": "En attente de votre bracelet…"}}, "it": {"stringUnit": {"state": "translated", "value": "In attesa della tua fascia…"}}, "pl": {"stringUnit": {"state": "translated", "value": "Czekam na Twoją opaskę…"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "A aguardar a tua pulseira…"}}, "ru": {"stringUnit": {"state": "translated", "value": "Ожидание браслета…"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "正在等待你的手环…"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "正在等待你的手環…"}}}}, + "Available once the strap finishes pairing.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Verfügbar, sobald der Strap die Kopplung abgeschlossen hat."}}, "es": {"stringUnit": {"state": "translated", "value": "Disponible cuando la pulsera termine de emparejarse."}}, "fr": {"stringUnit": {"state": "translated", "value": "Disponible une fois l'appairage du bracelet terminé."}}, "it": {"stringUnit": {"state": "translated", "value": "Disponibile quando la fascia ha terminato l'associazione."}}, "pl": {"stringUnit": {"state": "translated", "value": "Dostępne po zakończeniu parowania opaski."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Disponível quando a pulseira terminar o emparelhamento."}}, "ru": {"stringUnit": {"state": "translated", "value": "Станет доступно, когда браслет завершит сопряжение."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "手环完成配对后可用。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "手環完成配對後可用。"}}}}, + "No raw SpO₂ counts (WHOOP 4.0 only)": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Keine rohen SpO₂-Zählwerte (nur WHOOP 4.0)"}}, "es": {"stringUnit": {"state": "translated", "value": "Sin recuentos brutos de SpO₂ (solo WHOOP 4.0)"}}, "fr": {"stringUnit": {"state": "translated", "value": "Pas de valeurs brutes de SpO₂ (WHOOP 4.0 uniquement)"}}, "it": {"stringUnit": {"state": "translated", "value": "Nessun conteggio SpO₂ grezzo (solo WHOOP 4.0)"}}, "pl": {"stringUnit": {"state": "translated", "value": "Brak surowych odczytów SpO₂ (tylko WHOOP 4.0)"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Sem contagens brutas de SpO₂ (apenas WHOOP 4.0)"}}, "ru": {"stringUnit": {"state": "translated", "value": "Нет сырых значений SpO₂ (только WHOOP 4.0)"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "无原始 SpO₂ 计数(仅限 WHOOP 4.0)"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "無原始 SpO₂ 計數(僅限 WHOOP 4.0)"}}}}, + "This strap doesn’t send an SpO₂ signal for this chart. Import a WHOOP export or Apple Health data to see it.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Dieser Strap sendet kein SpO₂-Signal für dieses Diagramm. Importiere einen WHOOP-Export oder Apple-Health-Daten, um es zu sehen."}}, "es": {"stringUnit": {"state": "translated", "value": "Esta pulsera no envía una señal de SpO₂ para este gráfico. Importa una exportación de WHOOP o datos de Apple Health para verla."}}, "fr": {"stringUnit": {"state": "translated", "value": "Ce bracelet n’envoie pas de signal SpO₂ pour ce graphique. Importez un export WHOOP ou des données Apple Health pour le voir."}}, "it": {"stringUnit": {"state": "translated", "value": "Questa fascia non invia un segnale SpO₂ per questo grafico. Importa un’esportazione WHOOP o i dati di Apple Health per vederlo."}}, "pl": {"stringUnit": {"state": "translated", "value": "Ta opaska nie wysyła sygnału SpO₂ dla tego wykresu. Zaimportuj eksport WHOOP lub dane Apple Health, aby go zobaczyć."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Esta pulseira não envia um sinal de SpO₂ para este gráfico. Importa uma exportação da WHOOP ou dados do Apple Health para o ver."}}, "ru": {"stringUnit": {"state": "translated", "value": "Этот браслет не передаёт сигнал SpO₂ для этого графика. Импортируйте экспорт WHOOP или данные Apple Health, чтобы увидеть его."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "此手环不会为该图表发送 SpO₂ 信号。导入 WHOOP 导出文件或 Apple Health数据即可查看。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "此手環不會為此圖表傳送 SpO₂ 訊號。匯入 WHOOP 匯出檔案或 Apple Health資料即可查看。"}}}}, + "When it is armed, the wake-alarm above buzzes your wrist from the strap's own firmware. On a WHOOP 5/MG that needs Protocol probes on (Test Centre → 5/MG protocol diagnostics). It can't sound a loud alarm, and NOOP on a Mac schedules no backup notification, so nothing else goes off at your wake time. Keep your phone's built-in Clock alarm as your real backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Wenn er eingestellt ist, lässt der Weckalarm oben dein Handgelenk über die eigene Firmware des Straps vibrieren. Auf einem WHOOP 5/MG setzt das voraus, dass Protokolltests an sind (Testzentrum → 5/MG-Protokolldiagnose). Einen lauten Alarm kann er nicht abspielen, und NOOP plant auf dem Mac keine Ersatz-Mitteilung, sodass zu deiner Weckzeit sonst nichts ausgelöst wird. Behalte den eingebauten Wecker deines Telefons als echten Ersatz. NOOPs telefonbasiertes Smart-Wecken (Leichtschlaf-Erkennung) gibt es in der Android-App."}}, "es": {"stringUnit": {"state": "translated", "value": "Cuando está programada, la alarma de despertar de arriba hace vibrar tu muñeca desde el propio firmware de la pulsera. En una WHOOP 5/MG eso requiere tener activadas las Sondas de protocolo (Centro de pruebas → Diagnóstico del protocolo 5/MG). No puede sonar como una alarma fuerte, y NOOP en un Mac no programa ninguna notificación de respaldo, así que a tu hora de despertar no suena nada más. Mantén la alarma del Reloj de tu teléfono como tu verdadero respaldo. El despertar inteligente de NOOP basado en el teléfono (detección de sueño ligero) está disponible en la app de Android."}}, "fr": {"stringUnit": {"state": "translated", "value": "Une fois programmée, l’alarme de réveil ci-dessus fait vibrer votre poignet depuis le micrologiciel du bracelet lui-même. Sur un WHOOP 5/MG, cela exige que Sondes de protocole soit activé (Centre de test → Diagnostics du protocole 5/MG). Elle ne peut pas émettre d’alarme sonore forte, et NOOP sur Mac ne programme aucune notification de secours : rien d’autre ne se déclenche à l’heure de votre réveil. Gardez l’alarme de l’app Horloge de votre téléphone comme véritable solution de secours. Le réveil intelligent de NOOP basé sur le téléphone (détection du sommeil léger) est disponible dans l’app Android."}}, "it": {"stringUnit": {"state": "translated", "value": "Quando è impostata, la sveglia qui sopra fa vibrare il polso dal firmware della fascia stessa. Su un WHOOP 5/MG richiede che le Sonde di protocollo siano attive (Centro test → Diagnostica protocollo 5/MG). Non può emettere una sveglia sonora forte e NOOP su Mac non programma alcuna notifica di riserva, quindi all’ora della sveglia non scatta nient’altro. Tieni la sveglia dell’app Orologio del telefono come vera riserva. La sveglia intelligente di NOOP basata sul telefono (rilevamento del sonno leggero) è disponibile nell’app Android."}}, "pl": {"stringUnit": {"state": "translated", "value": "Gdy jest ustawiony, powyższy alarm budzenia wibruje na nadgarstku dzięki oprogramowaniu wbudowanemu paska. Na WHOOP 5/MG wymaga to włączonych Sond protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Nie może włączyć głośnego alarmu, a NOOP na Macu nie planuje powiadomienia zapasowego, więc o godzinie pobudki nic innego się nie włączy. Zachowaj wbudowany budzik w telefonie jako prawdziwą kopię zapasową. Inteligentne budzenie w telefonie NOOP (wykrywanie lekkiego snu) jest dostępne w aplikacji Android."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Depois de armado, o alarme acima faz vibrar o teu pulso a partir do firmware da própria pulseira. Num WHOOP 5/MG, isso requer as Sondas de protocolo ativadas (Centro de testes → Diagnóstico do protocolo 5/MG). Não pode fazer soar um alarme alto e o NOOP num Mac não agenda nenhuma notificação de reserva, pelo que nada mais dispara à hora de acordar. Mantém o alarme da app Relógio do teu telemóvel como a tua verdadeira reserva. O despertar inteligente do NOOP baseado no telefone (deteção de sono leve) está disponível na app Android."}}, "ru": {"stringUnit": {"state": "translated", "value": "Когда будильник установлен, он заставляет браслет вибрировать на запястье с помощью собственной прошивки. На WHOOP 5/MG для этого должны быть включены Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Громкий звуковой сигнал он подать не может, а NOOP на Mac не планирует резервное уведомление, поэтому в время пробуждения больше ничего не сработает. Используйте встроенный будильник «Часы» на телефоне как настоящий резервный вариант. Умное пробуждение NOOP на основе телефона (определение лёгкого сна) доступно в приложении для Android."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "设置后,上方的唤醒闹钟会通过手环自身的固件震动你的手腕。在 WHOOP 5/MG 上,这需要开启“协议探测”(测试中心 → 5/MG 协议诊断)。它无法发出响亮的闹铃,而且 NOOP 在 Mac 上不会安排备用通知,因此到起床时间不会有其他提醒。请保留手机自带的时钟闹钟作为真正的后备。NOOP 基于手机的智能唤醒(浅睡检测)在 Android 应用上可用。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "設定後,上方的喚醒鬧鐘會透過手環自身的韌體震動你的手腕。在 WHOOP 5/MG 上,這需要開啟「協定探測」(測試中心 → 5/MG 協定診斷)。它無法發出響亮的鬧鈴,而且 NOOP 在 Mac 上不會安排備用通知,因此到起床時間不會有其他提醒。請保留手機內建的時鐘鬧鐘作為真正的備援。NOOP 基於手機的智慧喚醒(淺睡偵測)在 Android 應用程式上可用。"}}}}, "Move, relative to tonight": {"localizations": {"en": {"stringUnit": {"state": "translated", "value": "Move, relative to tonight"}}, "de": {"stringUnit": {"state": "translated", "value": "Bewegung, relativ zu dieser Nacht"}}, "es": {"stringUnit": {"state": "translated", "value": "Movimiento, en relación con esta noche"}}, "fr": {"stringUnit": {"state": "translated", "value": "Mouvement, par rapport à cette nuit"}}, "it": {"stringUnit": {"state": "translated", "value": "Movimento, rispetto a questa notte"}}, "pl": {"stringUnit": {"state": "translated", "value": "Ruch, w odniesieniu do tej nocy"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Movimento, em relação a esta noite"}}, "ru": {"stringUnit": {"state": "translated", "value": "Движение, относительно этой ночи"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "活动,相对于今晚"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "活動,相對於今晚"}}}}, "Route and GPS distance, without the heart-rate and calorie summary": {"localizations": {"en": {"stringUnit": {"state": "translated", "value": "Route and GPS distance, without the heart-rate and calorie summary"}}, "de": {"stringUnit": {"state": "translated", "value": "Route und GPS-Distanz, ohne die Herzfrequenz- und Kalorienübersicht"}}, "es": {"stringUnit": {"state": "translated", "value": "Ruta y distancia GPS, sin el resumen de frecuencia cardiaca y calorías"}}, "fr": {"stringUnit": {"state": "translated", "value": "Itinéraire et distance GPS, sans le récapitulatif de fréquence cardiaque et de calories"}}, "it": {"stringUnit": {"state": "translated", "value": "Percorso e distanza GPS, senza il riepilogo di frequenza cardiaca e calorie"}}, "pl": {"stringUnit": {"state": "translated", "value": "Trasa i dystans GPS, bez podsumowania tętna i kalorii"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Rota e distância GPS, sem o resumo de frequência cardíaca e calorias"}}, "ru": {"stringUnit": {"state": "translated", "value": "Маршрут и GPS-дистанция, без сводки пульса и калорий"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "路线和 GPS 距离,不含心率和卡路里摘要"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "路線和 GPS 距離,不含心率和卡路里摘要"}}}}, "Export Workout Route": {"localizations": {"en": {"stringUnit": {"state": "translated", "value": "Export Workout Route"}}, "de": {"stringUnit": {"state": "translated", "value": "Trainingsroute exportieren"}}, "es": {"stringUnit": {"state": "translated", "value": "Exportar ruta del entrenamiento"}}, "fr": {"stringUnit": {"state": "translated", "value": "Exporter l’itinéraire de la séance"}}, "it": {"stringUnit": {"state": "translated", "value": "Esporta il percorso dell’allenamento"}}, "pl": {"stringUnit": {"state": "translated", "value": "Eksportuj trasę treningu"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Exportar rota do treino"}}, "ru": {"stringUnit": {"state": "translated", "value": "Экспортировать маршрут тренировки"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "导出运动路线"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "匯出運動路線"}}}}, @@ -513,64 +518,7 @@ } } }, - "NOOP is connecting to your strap and will sync as soon as it's ready.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "NOOP verbindet sich mit deinem Strap und synchronisiert, sobald er bereit ist." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "NOOP se está conectando a tu pulsera y sincronizará en cuanto esté lista." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "NOOP se connecte à votre bracelet et synchronisera dès qu'il sera prêt." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "NOOP si sta collegando alla fascia e sincronizzerà non appena sarà pronta." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "O NOOP está a ligar-se à sua pulseira e sincronizará assim que estiver pronta." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "NOOP подключается к браслету и синхронизирует, как только он будет готов." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "NOOP 正在连接你的手环,准备就绪后会立即同步。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "NOOP 正在連接你的手環,準備就緒後會立即同步。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "NOOP łączy się z paskiem i zsynchronizuje go, gdy tylko będzie gotowy." - } - } - } - }, + "Your strap isn't ready to hand over its history yet, so the sync is waiting. It starts if the strap is connected and paired within the next 10 minutes. Open NOOP to see the strap's status.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Dein Strap ist noch nicht bereit, seinen Verlauf herauszugeben, daher wartet die Synchronisierung. Sie startet, wenn der Strap innerhalb der nächsten 10 Minuten verbunden und gekoppelt ist. Öffne NOOP, um den Status des Straps zu sehen."}}, "es": {"stringUnit": {"state": "translated", "value": "Tu pulsera aún no está lista para entregar su historial, así que la sincronización está en espera. Empieza si la pulsera se conecta y se empareja en los próximos 10 minutos. Abre NOOP para ver el estado de la pulsera."}}, "fr": {"stringUnit": {"state": "translated", "value": "Votre bracelet n'est pas encore prêt à livrer son historique, la synchronisation est donc en attente. Elle démarre si le bracelet est connecté et appairé dans les 10 prochaines minutes. Ouvrez NOOP pour voir l'état du bracelet."}}, "it": {"stringUnit": {"state": "translated", "value": "La tua fascia non è ancora pronta a fornire la sua cronologia, quindi la sincronizzazione è in attesa. Parte se la fascia si connette e si associa entro i prossimi 10 minuti. Apri NOOP per vedere lo stato della fascia."}}, "pl": {"stringUnit": {"state": "translated", "value": "Twoja opaska nie jest jeszcze gotowa do przekazania historii, więc synchronizacja czeka. Rozpocznie się, jeśli opaska połączy się i sparuje w ciągu najbliższych 10 minut. Otwórz NOOP, aby zobaczyć stan opaski."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "A tua pulseira ainda não está pronta para entregar o seu histórico, por isso a sincronização está em espera. Começa se a pulseira se ligar e emparelhar nos próximos 10 minutos. Abre o NOOP para ver o estado da pulseira."}}, "ru": {"stringUnit": {"state": "translated", "value": "Ваш браслет ещё не готов передать свою историю, поэтому синхронизация ожидает. Она начнётся, если браслет подключится и сопряжётся в ближайшие 10 минут. Откройте NOOP, чтобы увидеть состояние браслета."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "你的手环尚未准备好提供其历史数据,因此同步正在等待。如果手环在接下来 10 分钟内连接并完成配对,同步就会开始。打开 NOOP 查看手环状态。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "你的手環尚未準備好提供其歷史資料,因此同步正在等待。如果手環在接下來 10 分鐘內連線並完成配對,同步就會開始。開啟 NOOP 查看手環狀態。"}}}}, "No heart rate stored for today yet": { "localizations": { "de": { @@ -18387,122 +18335,8 @@ } } }, - "* on-device estimate: skin temp is a nightly ±°C deviation (firmware-dependent); no steps over BLE on a 4.0. No SpO₂ % off the strap; import a WHOOP CSV for a real %.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "* Schätzung auf dem Gerät: Hauttemperatur ist eine nächtliche ±°C-Abweichung (firmwareabhängig); keine Schritte über BLE auf einem 4.0. Kein SpO₂-%-Wert vom Strap; importiere einen WHOOP-CSV-Export für echte %." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "* estimación en el dispositivo: la temperatura cutánea es una desviación nocturna de ±°C (depende del firmware); sin pasos por BLE en un 4.0. Sin % de SpO₂ desde la pulsera; importa un CSV de WHOOP para un % real." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "* estimation sur l'appareil : la température cutanée est un écart nocturne en ±°C (selon le micrologiciel) ; pas de pas via BLE sur un 4.0. Pas de % de SpO₂ depuis le bracelet ; importez un CSV WHOOP pour un % réel." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "* stima sul dispositivo: la temperatura della pelle è una deviazione notturna in ±°C (dipende dal firmware); nessun passo via BLE su un 4.0. Nessuna % di SpO₂ dalla fascia; importa un CSV WHOOP per una % reale." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "* estimativa no dispositivo: a temperatura da pele é um desvio noturno de ±°C (depende do firmware); nenhuma etapa sobre BLE num 4.0. Sem SpO₂% de desconto na bracelete; importar um CSV WHOOP por % real." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "* оценка на устройстве: температура кожи — это ночное отклонение ±°C (зависит от прошивки); шаги по BLE недоступны на 4.0. Кислород в крови (SpO₂) с браслета не передаётся; импортируйте CSV WHOOP, чтобы получить реальный %." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "* 设备端估算:皮肤温度为每晚 ±°C 偏差(取决于固件);4.0 无法通过 BLE 读取步数。手环无法提供 SpO₂ %;导入 WHOOP CSV 可获得真实百分比。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "* 裝置端估算:皮膚溫度為每晚 ±°C 的偏差值(視韌體而定);4.0 無法透過 BLE 讀取步數。手環無法提供 SpO₂ %;匯入 WHOOP CSV 才能取得真實百分比。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "* szacunki na urządzeniu: temperatura skóry to nocne odchylenie ±°C (zależne od oprogramowania sprzętowego); żadnych kroków w stosunku do BLE w wersji 4.0. Nie SpO₂ % off pasek; zaimportuj WHOOP CSV za prawdziwy %." - } - } - } - }, - "* on-device estimate: skin temp is a nightly ±°C deviation, steps are a raw motion count (#78). No SpO₂ % off the strap; import a WHOOP CSV for a real %.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "* Schätzung auf dem Gerät: Hauttemperatur ist eine nächtliche ±°C-Abweichung, Schritte sind ein roher Bewegungszähler (#78). Kein SpO₂-%-Wert vom Strap; importiere einen WHOOP-CSV-Export für echte %." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "* estimación en el dispositivo: la temperatura cutánea es una desviación nocturna de ±°C, los pasos son un conteo bruto de movimiento (#78). Sin % de SpO₂ desde la pulsera; importa un CSV de WHOOP para un % real." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "* estimation sur l'appareil : la température cutanée est un écart nocturne en ±°C, les pas sont un décompte brut de mouvement (#78). Pas de % de SpO₂ depuis le bracelet ; importez un CSV WHOOP pour un % réel." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "* stima sul dispositivo: la temperatura della pelle è una deviazione notturna in ±°C, i passi sono un conteggio grezzo del movimento (#78). Nessuna % di SpO₂ dalla fascia; importa un CSV WHOOP per una % reale." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "* estimativa no dispositivo: a temperatura da pele é um desvio noturno de ±°C, os passos são uma contagem bruta de movimentos (#78). Sem SpO₂% de desconto na bracelete; importar um CSV WHOOP por % real." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "* оценка на устройстве: температура кожи — это ночное отклонение ±°C, шаги — необработанный подсчёт движений (#78). С браслета не поступает % SpO₂; импортируйте CSV WHOOP, чтобы получить реальный %." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "* 设备端估算:皮肤温度为每晚 ±°C 偏差,步数为原始运动计数(#78)。手环无法提供 SpO₂ %;导入 WHOOP CSV 可获得真实百分比。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "* 裝置端估算:皮膚溫度為每晚 ±°C 的偏差值,步數是原始動作計數(#78)。手環無法提供 SpO₂ %;匯入 WHOOP CSV 才能取得真實百分比。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "* szacunki na urządzeniu: temperatura skóry to nocne odchylenie ±°C, kroki to surowa liczba ruchów (#78). Nie SpO₂ % off pasek; zaimportuj WHOOP CSV za prawdziwy %." - } - } - } - }, + "* on-device estimate: skin temp is measured nightly (firmware-dependent; °C, or vs your baseline); no steps over BLE on a 4.0. No SpO₂ % off the strap; import a WHOOP CSV for a real %.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "* Schätzung auf dem Gerät: Die Hauttemperatur wird nächtlich gemessen (abhängig von der Firmware; °C oder im Vergleich zu deiner Basislinie); keine Schritte über BLE bei einem 4.0. Kein SpO₂-Wert in % vom Strap; importiere eine WHOOP-CSV für einen echten Wert."}}, "es": {"stringUnit": {"state": "translated", "value": "* Estimación en el dispositivo: la temperatura cutánea se mide por la noche (según el firmware; °C, o respecto a tu línea base); sin pasos por BLE en un 4.0. Sin SpO₂ % desde la pulsera; importa un CSV de WHOOP para un valor real."}}, "fr": {"stringUnit": {"state": "translated", "value": "* Estimation sur l’appareil : la température cutanée est mesurée chaque nuit (selon le firmware ; °C, ou par rapport à votre référence) ; pas de pas via BLE sur un 4.0. Pas de SpO₂ % depuis le bracelet ; importez un CSV WHOOP pour une vraie valeur."}}, "it": {"stringUnit": {"state": "translated", "value": "* Stima sul dispositivo: la temperatura cutanea viene misurata ogni notte (dipende dal firmware; °C, o rispetto alla tua linea di base); nessun passo via BLE su un 4.0. Nessun SpO₂ % dalla fascia; importa un CSV WHOOP per un valore reale."}}, "pl": {"stringUnit": {"state": "translated", "value": "* Szacunek na urządzeniu: temperatura skóry jest mierzona co noc (zależnie od firmware’u; °C lub względem Twojej wartości bazowej); brak kroków przez BLE w modelu 4.0. Brak SpO₂ % z opaski; zaimportuj WHOOP CSV, aby uzyskać prawdziwą wartość."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "* Estimativa no dispositivo: a temperatura da pele é medida durante a noite (depende do firmware; °C, ou face à tua linha de base); sem passos por BLE num 4.0. Sem SpO₂ % a partir da pulseira; importa um CSV da WHOOP para um valor real."}}, "ru": {"stringUnit": {"state": "translated", "value": "* Оценка на устройстве: температура кожи измеряется каждую ночь (зависит от прошивки; °C или относительно вашей базовой линии); шагов по BLE на 4.0 нет. SpO₂ % с браслета нет; для реального значения импортируйте CSV из WHOOP."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "* 设备端估算:皮肤温度每晚测量(取决于固件;°C,或相对于你的基线);WHOOP 4.0 无法通过 BLE 获取步数。手环不提供 SpO₂ %;导入 WHOOP CSV 可获得真实数值。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "* 裝置端估算:皮膚溫度每晚測量(取決於韌體;°C,或相對於你的基線);WHOOP 4.0 無法透過 BLE 取得步數。手環不提供 SpO₂ %;匯入 WHOOP CSV 可取得真實數值。"}}}}, + "* on-device estimate: respiratory rate is derived from beat-to-beat data, and steps count the strap's motion counter only while it reports walking or running, scaled by your Step calibration. Skin temp is measured nightly (°C, or vs your baseline). No verified SpO₂ % off the strap: an unverified estimate is opt-in via “Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”; import a WHOOP CSV for a real %.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "* Schätzung auf dem Gerät: Die Atemfrequenz wird aus Schlag-zu-Schlag-Daten abgeleitet, und die Schritte zählen den Bewegungszähler des Straps nur, solange er Gehen oder Laufen meldet, skaliert mit deiner Schrittkalibrierung. Die Hauttemperatur wird nächtlich gemessen (°C oder im Vergleich zu deiner Basislinie). Kein verifizierter SpO₂-Wert vom Strap: Eine unverifizierte Schätzung gibt es optional über „Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)“; importiere eine WHOOP-CSV für einen echten Wert."}}, "es": {"stringUnit": {"state": "translated", "value": "* Estimación en el dispositivo: la frecuencia respiratoria se deriva de datos latido a latido, y los pasos cuentan el contador de movimiento de la pulsera solo mientras indica caminar o correr, escalado con tu calibración de pasos. La temperatura cutánea se mide por la noche (°C, o respecto a tu línea base). Sin SpO₂ % verificado desde la pulsera: una estimación no verificada es opcional mediante “Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”; importa un CSV de WHOOP para un valor real."}}, "fr": {"stringUnit": {"state": "translated", "value": "* Estimation sur l’appareil : la fréquence respiratoire est dérivée des données battement par battement, et les pas comptent le compteur de mouvement du bracelet uniquement lorsqu’il indique de la marche ou de la course, mis à l’échelle par votre étalonnage des pas. La température cutanée est mesurée chaque nuit (°C, ou par rapport à votre référence). Pas de SpO₂ % vérifié depuis le bracelet : une estimation non vérifiée est disponible en option via « Blood Oxygen: strap estimate (WHOOP 5/MG, Oura) » ; importez un CSV WHOOP pour une vraie valeur."}}, "it": {"stringUnit": {"state": "translated", "value": "* Stima sul dispositivo: la frequenza respiratoria deriva dai dati battito per battito e i passi contano il contatore di movimento della fascia solo mentre segnala camminata o corsa, scalato con la tua calibrazione dei passi. La temperatura cutanea viene misurata ogni notte (°C, o rispetto alla tua linea di base). Nessun SpO₂ % verificato dalla fascia: una stima non verificata è disponibile come opzione tramite “Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”; importa un CSV WHOOP per un valore reale."}}, "pl": {"stringUnit": {"state": "translated", "value": "* Szacunek na urządzeniu: częstość oddechów wynika z danych uderzenie po uderzeniu, a kroki liczą licznik ruchu opaski tylko wtedy, gdy zgłasza ona chód lub bieg, przeskalowany Twoją kalibracją kroków. Temperatura skóry jest mierzona co noc (°C lub względem Twojej wartości bazowej). Brak zweryfikowanego SpO₂ % z opaski: niezweryfikowany szacunek jest opcjonalny przez „Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”; zaimportuj WHOOP CSV, aby uzyskać prawdziwą wartość."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "* Estimativa no dispositivo: a frequência respiratória é derivada de dados batimento a batimento, e os passos contam o contador de movimento da pulseira apenas enquanto este indica caminhada ou corrida, escalado pela tua calibração de passos. A temperatura da pele é medida durante a noite (°C, ou face à tua linha de base). Sem SpO₂ % verificado a partir da pulseira: uma estimativa não verificada está disponível como opção em “Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”; importa um CSV da WHOOP para um valor real."}}, "ru": {"stringUnit": {"state": "translated", "value": "* Оценка на устройстве: частота дыхания выводится из данных от удара к удару, а шаги считаются по счётчику движения браслета только пока он сообщает ходьбу или бег, с учётом вашей калибровки шагов. Температура кожи измеряется каждую ночь (°C или относительно вашей базовой линии). Подтверждённого SpO₂ % с браслета нет: неподтверждённая оценка включается опционально через «Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)»; для реального значения импортируйте CSV из WHOOP."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "* 设备端估算:呼吸率由逐拍数据推算;步数仅在手环报告步行或跑步时才计入其运动计数器,并按你的步数校准进行换算。皮肤温度每晚测量(°C,或相对于你的基线)。手环没有经过验证的 SpO₂ %:可通过“Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”选择启用未经验证的估算值;导入 WHOOP CSV 可获得真实数值。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "* 裝置端估算:呼吸率由逐拍資料推算;步數僅在手環回報步行或跑步時才計入其動作計數器,並依你的步數校準進行換算。皮膚溫度每晚測量(°C,或相對於你的基線)。手環沒有經過驗證的 SpO₂ %:可透過「Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)」選擇啟用未經驗證的估算值;匯入 WHOOP CSV 可取得真實數值。"}}}}, "+%lld pt": { "localizations": { "de": { @@ -33965,64 +33799,7 @@ } } }, - "Armed on the strap with an experimental 5/MG command. Strap-driven wakes have been reported on 5.0 and MG, but are not guaranteed. Keep a backup alarm for anything you cannot miss.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Alarm wurde mit einem experimentellen 5/MG-Befehl auf dem Strap aktiviert. Weckvorgänge durch den Strap wurden für 5.0 und MG gemeldet, sind aber nicht garantiert. Behalte für alles Wichtige einen Ersatzwecker." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La alarma se activó en la pulsera con un comando experimental 5/MG. Se han comunicado despertares desde pulseras 5.0 y MG, pero no están garantizados. Mantén una alarma de respaldo para lo que no puedas perderte." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "L’alarme est activée sur le bracelet avec une commande expérimentale 5/MG. Des réveils par le bracelet ont été signalés sur 5.0 et MG, sans être garantis. Gardez une alarme de secours pour tout réveil important." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La sveglia è stata attivata sulla fascia con un comando sperimentale 5/MG. Sono stati segnalati risvegli dalla fascia su 5.0 e MG, ma non sono garantiti. Tieni una sveglia di riserva per gli impegni importanti." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "O alarme foi armado na pulseira com um comando experimental 5/MG. Foram comunicados despertares pela pulseira em 5.0 e MG, mas não são garantidos. Mantém um alarme de reserva para tudo o que não podes perder." - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Alarm uzbrojono na opasce eksperymentalnym poleceniem 5/MG. Zgłaszano wybudzanie przez opaski 5.0 i MG, ale nie jest ono gwarantowane. Zachowaj alarm zapasowy na ważne okazje." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Будильник установлен на браслете экспериментальной командой 5/MG. Сообщалось о срабатывании на 5.0 и MG, но оно не гарантировано. Оставьте резервный будильник для важных событий." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已通过实验性 5/MG 命令在手环上设置闹钟。有用户报告 5.0 和 MG 手环能够唤醒,但不保证每次生效。重要事项请保留备用闹钟。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "已透過實驗性 5/MG 指令在手環上設定鬧鐘。有使用者回報 5.0 和 MG 手環能夠喚醒,但不保證每次生效。重要事項請保留備用鬧鐘。" - } - } - } - }, + "NOOP sets this on the strap with an experimental 5/MG command whenever the strap connects or you change the alarm. Strap-driven wakes have been reported on 5.0 and MG, but are not guaranteed. Keep a backup alarm for anything you cannot miss.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "NOOP stellt den Alarm mit einem experimentellen 5/MG-Befehl auf dem Strap ein, sobald sich der Strap verbindet oder du den Alarm änderst. Weckvorgänge durch den Strap wurden für 5.0 und MG gemeldet, sind aber nicht garantiert. Behalte für alles Wichtige einen Ersatzwecker."}}, "es": {"stringUnit": {"state": "translated", "value": "NOOP lo configura en la pulsera con un comando experimental 5/MG cada vez que la pulsera se conecta o cambias la alarma. Se han comunicado despertares desde pulseras 5.0 y MG, pero no están garantizados. Mantén una alarma de respaldo para lo que no puedas perderte."}}, "fr": {"stringUnit": {"state": "translated", "value": "NOOP l’enregistre sur le bracelet avec une commande expérimentale 5/MG à chaque connexion du bracelet et à chaque modification de l’alarme. Des réveils par le bracelet ont été signalés sur 5.0 et MG, sans être garantis. Gardez une alarme de secours pour tout réveil important."}}, "it": {"stringUnit": {"state": "translated", "value": "NOOP la imposta sulla fascia con un comando sperimentale 5/MG ogni volta che la fascia si connette o modifichi la sveglia. Sono stati segnalati risvegli dalla fascia su 5.0 e MG, ma non sono garantiti. Tieni una sveglia di riserva per gli impegni importanti."}}, "pl": {"stringUnit": {"state": "translated", "value": "NOOP ustawia ją na opasce eksperymentalnym poleceniem 5/MG za każdym razem, gdy opaska się połączy lub zmienisz alarm. Zgłaszano wybudzanie przez opaski 5.0 i MG, ale nie jest ono gwarantowane. Zachowaj alarm zapasowy na ważne okazje."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "O NOOP define-o na pulseira com um comando experimental 5/MG sempre que a pulseira se liga ou alteras o alarme. Foram comunicados despertares pela pulseira em 5.0 e MG, mas não são garantidos. Mantém um alarme de reserva para tudo o que não podes perder."}}, "ru": {"stringUnit": {"state": "translated", "value": "NOOP устанавливает его на браслете экспериментальной командой 5/MG при каждом подключении браслета и при каждом изменении будильника. Сообщалось о срабатывании на 5.0 и MG, но оно не гарантировано. Оставьте резервный будильник для важных событий."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "每当手环连接或你更改闹钟时,NOOP 都会通过实验性 5/MG 命令将其设置到手环上。有用户报告 5.0 和 MG 手环能够唤醒,但不保证每次生效。重要事项请保留备用闹钟。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "每當手環連線或你更改鬧鐘時,NOOP 都會透過實驗性 5/MG 指令將其設定到手環上。有使用者回報 5.0 和 MG 手環能夠喚醒,但不保證每次生效。重要事項請保留備用鬧鐘。"}}}}, "Armed on the strap itself, so it can buzz at your wake time even if your phone is asleep or NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). Keep a backup alarm for anything you truly can't miss.": { "localizations": { "de": { @@ -34139,122 +33916,7 @@ } } }, - "Arms the strap to buzz at your wake time, even if NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). Keep a backup alarm for anything you truly can't miss.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Armiert den Riemen, um zu deiner Weckzeit zu summen, auch wenn NOOP geschlossen ist. Sendet den genauen Alarmbefehl, den die offizielle App sendet, bestätigtes Summen auf einem echten WHOOP 4.0 (Community-Wire-Capture + On-Device-Test, #535). Halte einen Backup-Alarm für alles, was du wirklich nicht verpassen kannst." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Arma la correa para zumbir en su tiempo de vela, incluso si NOOP está cerrado. Envía el comando de alarma exacto que la aplicación oficial envía, confirma el zumbido en un WHOOP 4.0 real (community wire capture + on-device test, #535). Mantenga una alarma de respaldo para cualquier cosa que realmente no pueda faltar." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Bras la sangle pour bourdonner à votre réveil, même si NOOP est fermé. Envoie la commande d'alarme exacte que l'application officielle envoie, confirmé bourdonnement sur un vrai WHOOP 4.0 (prise de fil communautaire + test sur l'appareil, #535). Gardez une alarme de secours pour tout ce que vous ne pouvez vraiment pas manquer." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Imposta la fascia per vibrare all'orario di sveglia, anche se NOOP è chiuso. Invia esattamente lo stesso comando sveglia dell'app ufficiale, con vibrazione confermata su un vero WHOOP 4.0 (cattura del traffico dalla community + test sul dispositivo, #535). Tieni una sveglia di riserva per tutto ciò che non puoi assolutamente perdere." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Arma a pega para vibrar na hora de acordar, mesmo que o NOOP esteja fechado. Envia o comando de alarme exato que a aplicação oficial envia, zumbido confirmado num WHOOP 4.0 real (captura de fio da comunidade + teste no dispositivo, #535). Mantenha um alarme de reserva para qualquer coisa que não possa realmente perder." - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Uzbraja pasek, aby brzęczał w momencie przebudzenia, nawet jeśli NOOP jest zamknięty. Wysyła dokładną komendę alarmową wysyłaną przez oficjalną aplikację, potwierdzone brzęczenie na prawdziwym WHOOP 4.0 (przechwytywanie połączeń społecznościowych + test na urządzeniu, #535). Zachowaj alarm zapasowy na wypadek wszystkiego, czego naprawdę nie możesz przegapić." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Настраивает браслет на вибрацию в час пробуждения, даже если NOOP закрыт. Отправляет ровно ту команду будильника, что и официальное приложение; вибрация подтверждена на настоящем WHOOP 4.0 (перехват трафика сообществом + проверка на устройстве, #535). Оставьте резервный будильник для всего, что действительно нельзя пропустить." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设置手环在你的起床时间震动,即使 NOOP 已关闭。发送与官方应用完全相同的闹钟命令,已在真实的 WHOOP 4.0 上确认可以震动(社区抓包 + 设备实测,#535)。对于绝不能错过的事项请保留备用闹钟。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "設定手環在你的起床時間震動,即使 NOOP 已關閉。傳送與官方應用程式完全相同的鬧鐘指令,已在真實的 WHOOP 4.0 上確認可以震動(社群封包擷取 + 裝置實測,#535)。對於絕不能錯過的事項請保留備用鬧鐘。" - } - } - } - }, - "Arms the strap to buzz at your wake time, even if NOOP is closed. Still experimental on WHOOP 4.0, so keep a backup alarm until you've confirmed it wakes you.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Stellt den Strap scharf, damit er zu deiner Aufwachzeit vibriert, selbst wenn NOOP geschlossen ist. Auf WHOOP 4.0 noch experimentell, also halte einen Ersatzwecker bereit, bis du bestätigt hast, dass es dich weckt." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Programa la pulsera para vibrar a tu hora de despertar, aunque NOOP esté cerrado. Aún es experimental en WHOOP 4.0, así que mantén una alarma de respaldo hasta confirmar que te despierta." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Arme le bracelet pour vibrer à votre heure de réveil, même si NOOP est fermé. Encore expérimental sur WHOOP 4.0, donc gardez une alarme de secours jusqu'à ce que vous ayez confirmé qu'elle vous réveille." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Imposta la fascia per vibrare all'ora del risveglio, anche se NOOP è chiuso. È ancora sperimentale su WHOOP 4.0, quindi tieni una sveglia di riserva finché non hai verificato che ti svegli." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Arma a pega para vibrar na hora de acordar, mesmo que o NOOP esteja fechado. Ainda experimental no WHOOP 4.0, por isso mantenha um alarme de reserva até confirmar que o acorda." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Активирует вибрацию браслета в момент пробуждения, даже если NOOP закрыт. На WHOOP 4.0 это всё ещё экспериментальная функция, поэтому держите резервный будильник, пока не убедитесь, что она вас будит." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "设定手环在你的起床时间震动,即使 NOOP 已关闭。在 WHOOP 4.0 上仍属实验性,因此在你确认它能叫醒你之前,请保留一个备用闹钟。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "設定手環在你的起床時間震動,即使 NOOP 已關閉。在 WHOOP 4.0 上仍屬實驗性,因此在你確認它能叫醒你之前,請保留一個備用鬧鐘。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Uzbraja pasek, aby brzęczał w momencie przebudzenia, nawet jeśli NOOP jest zamknięty. Wciąż eksperymentuję z WHOOP 4.0, więc przechowuj alarm zapasowy, dopóki nie potwierdzisz, że cię obudzi." - } - } - } - }, + "Arms the strap to buzz at your wake time, even if NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). On a WHOOP 5/MG this is experimental and only arms while Protocol probes is on (Test Centre → 5/MG protocol diagnostics). Keep a backup alarm for anything you truly can't miss.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Stellt den Strap so ein, dass er zu deiner Weckzeit vibriert, auch wenn NOOP geschlossen ist. Sendet genau den Alarmbefehl, den auch die offizielle App sendet; Vibration auf einem echten WHOOP 4.0 bestätigt (Community-Funkmitschnitt + Test am Gerät, #535). Auf einem WHOOP 5/MG ist das experimentell und wird nur eingestellt, solange Protokolltests an sind (Testzentrum → 5/MG-Protokolldiagnose). Behalte einen Ersatzwecker für alles, was du wirklich nicht verpassen darfst."}}, "es": {"stringUnit": {"state": "translated", "value": "Programa la pulsera para vibrar a tu hora de despertar, incluso con NOOP cerrado. Envía exactamente el mismo comando de alarma que la app oficial; la vibración está confirmada en un WHOOP 4.0 real (captura de tráfico de la comunidad + prueba en el dispositivo, #535). En un WHOOP 5/MG es experimental y solo se programa mientras las Sondas de protocolo estén activadas (Centro de pruebas → Diagnóstico del protocolo 5/MG). Mantén una alarma de respaldo para lo que no puedas perderte."}}, "fr": {"stringUnit": {"state": "translated", "value": "Programme le bracelet pour vibrer à votre heure de réveil, même si NOOP est fermé. Envoie exactement la commande d’alarme que l’app officielle envoie ; vibration confirmée sur un vrai WHOOP 4.0 (capture de trames par la communauté + test sur l’appareil, #535). Sur un WHOOP 5/MG, c’est expérimental et l’alarme n’est programmée que lorsque Sondes de protocole est activé (Centre de test → Diagnostics du protocole 5/MG). Gardez une alarme de secours pour tout ce que vous ne pouvez pas manquer."}}, "it": {"stringUnit": {"state": "translated", "value": "Imposta la fascia per vibrare all’ora della sveglia, anche se NOOP è chiuso. Invia esattamente lo stesso comando sveglia dell’app ufficiale; vibrazione confermata su un vero WHOOP 4.0 (cattura del traffico dalla community + test sul dispositivo, #535). Su un WHOOP 5/MG è sperimentale e viene impostata solo con Sonde di protocollo attive (Centro test → Diagnostica protocollo 5/MG). Tieni una sveglia di riserva per tutto ciò che non puoi assolutamente perdere."}}, "pl": {"stringUnit": {"state": "translated", "value": "Ustawia opaskę tak, aby zawibrowała o godzinie pobudki, nawet gdy NOOP jest zamknięty. Wysyła dokładnie to samo polecenie alarmu co oficjalna aplikacja; wibracja potwierdzona na prawdziwym WHOOP 4.0 (przechwycenie transmisji przez społeczność + test na urządzeniu, #535). Na WHOOP 5/MG jest to funkcja eksperymentalna i alarm jest ustawiany tylko przy włączonych Sondach protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Zachowaj alarm zapasowy na wszystko, czego naprawdę nie możesz przegapić."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Programa a pulseira para vibrar à hora de acordar, mesmo com o NOOP fechado. Envia exatamente o mesmo comando de alarme que a app oficial; vibração confirmada num WHOOP 4.0 real (captura de tráfego da comunidade + teste no dispositivo, #535). Num WHOOP 5/MG é experimental e só é programado enquanto as Sondas de protocolo estiverem ativadas (Centro de testes → Diagnóstico do protocolo 5/MG). Mantém um alarme de reserva para tudo o que não podes perder."}}, "ru": {"stringUnit": {"state": "translated", "value": "Настраивает браслет на вибрацию в час пробуждения, даже если NOOP закрыт. Отправляет ровно ту же команду будильника, что и официальное приложение; вибрация подтверждена на настоящем WHOOP 4.0 (перехват трафика сообществом + проверка на устройстве, #535). На WHOOP 5/MG это экспериментально: будильник устанавливается, только пока включены Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Оставьте резервный будильник для всего, что действительно нельзя пропустить."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "设置手环在你的起床时间震动,即使 NOOP 已关闭。发送与官方应用完全相同的闹钟命令,已在真实的 WHOOP 4.0 上确认可以震动(社区抓包 + 设备实测,#535)。在 WHOOP 5/MG 上此功能为实验性,仅在“协议探测”开启时才会设置(测试中心 → 5/MG 协议诊断)。对于绝不能错过的事项请保留备用闹钟。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "設定手環在你的起床時間震動,即使 NOOP 已關閉。傳送與官方應用程式完全相同的鬧鐘指令,已在真實的 WHOOP 4.0 上確認可以震動(社群封包擷取 + 裝置實測,#535)。在 WHOOP 5/MG 上此功能為實驗性,僅在「協定探測」開啟時才會設定(測試中心 → 5/MG 協定診斷)。對於絕不能錯過的事項請保留備用鬧鐘。"}}}}, "Arrange Today": { "localizations": { "de": { @@ -42935,64 +42597,6 @@ } } }, - "Broadcasts the live heart rate NOOP derives from the strap once connected.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sendet die Live-Herzfrequenz, die NOOP aus dem Strap ableitet, sobald verbunden." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Difunde la frecuencia cardíaca en vivo que NOOP obtiene de la pulsera una vez conectada." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Diffuse la fréquence cardiaque en direct que NOOP déduit du bracelet une fois connecté." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Trasmette la frequenza cardiaca in diretta che NOOP ricava dalla fascia una volta connessa." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Transmite a frequência cardíaca em direto que o NOOP deriva da bracelete, uma vez ligada." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Транслирует пульс в реальном времени, который NOOP вычисляет по данным браслета после подключения." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "连接后广播 NOOP 从手环解析出的实时心率。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "連接後,廣播 NOOP 從手環推算出的即時心率。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Transmituje na żywo tętno NOOP uzyskane z paska po podłączeniu." - } - } - } - }, "Broadcasts the strap's own live heart rate over Bluetooth.": { "localizations": { "de": { @@ -46926,64 +46530,7 @@ } } }, - "Can't connect: your strap's pairing was reset": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbindung nicht möglich: Die Kopplung deines Straps wurde zurückgesetzt" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "No se puede conectar: el emparejamiento de tu pulsera se restableció" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Connexion impossible : le jumelage de votre bracelet a été réinitialisé" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Impossibile connettersi, l'associazione della tua fascia è stata reimpostata" - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Não é possível ligar: ​​o emparelhamento da tua bracelete foi redefinido" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Не удаётся подключиться: сопряжение браслета было сброшено" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "无法连接,你的手环配对已被重置" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "無法連接,你的手環配對已被重置" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Nie można się połączyć: parowanie paska zostało zresetowane" - } - } - } - }, + "Your strap needs help to reconnect: steps below": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Dein Strap braucht Hilfe beim Wiederverbinden: Schritte unten"}}, "es": {"stringUnit": {"state": "translated", "value": "Tu pulsera necesita ayuda para volver a conectarse: pasos abajo"}}, "fr": {"stringUnit": {"state": "translated", "value": "Votre bracelet a besoin d'aide pour se reconnecter : étapes ci-dessous"}}, "it": {"stringUnit": {"state": "translated", "value": "La tua fascia ha bisogno di aiuto per riconnettersi: passaggi qui sotto"}}, "pl": {"stringUnit": {"state": "translated", "value": "Twoja opaska potrzebuje pomocy, aby się ponownie połączyć: kroki poniżej"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "A tua pulseira precisa de ajuda para voltar a ligar-se: passos abaixo"}}, "ru": {"stringUnit": {"state": "translated", "value": "Браслету нужна помощь с повторным подключением: шаги ниже"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "你的手环需要帮助才能重新连接:请见下方步骤"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "你的手環需要協助才能重新連線:請見下方步驟"}}}}, "Cancel": { "localizations": { "de": { @@ -55795,64 +55342,7 @@ } } }, - "Connected. History sync is experimental on 5.0.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbunden. Verlaufssynchronisierung ist auf 5.0 experimentell." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Conectada. La sincronización del historial es experimental en la 5.0." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Connecté. La synchronisation de l'historique est expérimentale sur la 5.0." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Connessa. La sincronizzazione della cronologia è sperimentale su 5.0." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Ligado. A sincronização do histórico é experimental na versão 5.0." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Подключено. Синхронизация истории на 5.0 экспериментальная." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "已连接。5.0 上的历史同步为实验性功能。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "已連接。歷史同步在 5.0 上仍屬實驗性。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Połączony. Synchronizacja historii jest eksperymentalna w wersji 5.0." - } - } - } - }, + "Connected. History sync is experimental on WHOOP 5.0/MG.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Verbunden. Verlaufssynchronisierung ist auf WHOOP 5.0/MG experimentell."}}, "es": {"stringUnit": {"state": "translated", "value": "Conectada. La sincronización del historial es experimental en WHOOP 5.0/MG."}}, "fr": {"stringUnit": {"state": "translated", "value": "Connecté. La synchronisation de l'historique est expérimentale sur WHOOP 5.0/MG."}}, "it": {"stringUnit": {"state": "translated", "value": "Connessa. La sincronizzazione della cronologia è sperimentale su WHOOP 5.0/MG."}}, "pl": {"stringUnit": {"state": "translated", "value": "Połączono. Synchronizacja historii jest eksperymentalna na WHOOP 5.0/MG."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Ligado. A sincronização do histórico é experimental no WHOOP 5.0/MG."}}, "ru": {"stringUnit": {"state": "translated", "value": "Подключено. Синхронизация истории на WHOOP 5.0/MG экспериментальная."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "已连接。WHOOP 5.0/MG 上的历史同步为实验性功能。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "已連接。歷史同步在 WHOOP 5.0/MG 上仍屬實驗性。"}}}}, "Connected. New strap data is written automatically, with periodic background refresh when iOS allows it.": { "localizations": { "de": { @@ -57983,64 +57473,7 @@ } } }, - "Counter ticks per step. Leave at 1.0 unless your steps run high. On a WHOOP 5/MG they can run very high (10× or more), so this goes up to 30. Walk a known 1,000 steps and divide NOOP's count by the real count to get your value.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zählerticks pro Schritt. Lass es auf 1,0, außer deine Schritte fallen zu hoch aus. Auf einem WHOOP 5/MG können sie sehr hoch ausfallen (10× oder mehr), daher geht das hier bis 30. Geh bekannte 1.000 Schritte und teile NOOPs Zählung durch die echte Zahl, um deinen Wert zu erhalten." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Pulsos del contador por paso. Déjalo en 1.0 salvo que tus pasos salgan altos. En una WHOOP 5/MG pueden salir muy altos (10× o más), por eso llega hasta 30. Camina 1.000 pasos conocidos y divide el conteo de NOOP entre el conteo real para obtener tu valor." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Impulsions du compteur par pas. Laissez à 1,0 sauf si vos pas sont très élevés. Sur un WHOOP 5/MG, ils peuvent être très élevés (10× ou plus), donc ceci va jusqu'à 30. Marchez un nombre connu de 1 000 pas et divisez le comptage de NOOP par le comptage réel pour obtenir votre valeur." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Conteggi del contatore per passo, lascia a 1.0 a meno che i tuoi passi non siano molto elevati. Su un WHOOP 5/MG possono essere molto alti (10× o più), quindi questo arriva fino a 30. Cammina per 1.000 passi noti e dividi il conteggio di NOOP per quello reale per ottenere il tuo valore." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Contador de ticks por etapa. Deixe em 1,0, a menos que os teus passos sejam altos. Num WHOOP 5/MG podem correr muito alto (10× ou mais), por isso isto vai até 30. Caminhe 1.000 passos conhecidos e divida a contagem do NOOP pela contagem real para obter o teu valor." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Тиков счётчика на шаг. Оставьте 1,0, если только количество шагов не завышено. На WHOOP 5/MG оно может быть очень высоким (в 10 раз и более), поэтому значение доходит до 30. Пройдите известные 1000 шагов и разделите счёт NOOP на реальное количество, чтобы получить своё значение." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "每步的计数器计数,除非你的步数偏高,否则保持为 1.0。在 WHOOP 5/MG 上,它们可能非常高(10 倍或更多),因此此值最高可到 30。走一段已知的 1,000 步,用 NOOP 的计数除以真实计数,即可得到你的数值。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "每步的計數器計數,除非你的步數偏高,否則保持為 1.0。在 WHOOP 5/MG 上,它們可能非常高(10 倍或更多),因此此值最高可到 30。走一段已知的 1,000 步,用 NOOP 的計數除以真實計數,即可得到你的數值。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Licznik taktów na krok. Zostaw na 1,0, chyba że Twoje kroki będą wysokie. Na WHOOP 5/MG mogą biegać bardzo wysoko (10× lub więcej), więc liczba ta wzrasta do 30. Przejdź znane 1000 kroków i podziel liczbę NOOP przez liczbę rzeczywistą, aby otrzymać wartość." - } - } - } - }, + "Counter ticks per step for a WHOOP 5/MG's own step counter (a WHOOP 4.0 uses the Steps estimate below instead). Leave at 1.0 unless your steps consistently read high or low. Walk a known 1,000 steps and divide NOOP's count by the real count to get your value.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Zählerticks pro Schritt für den eigenen Schrittzähler eines WHOOP 5/MG (ein WHOOP 4.0 nutzt stattdessen die Schrittschätzung unten). Lass es auf 1,0, außer deine Schritte fallen durchgehend zu hoch oder zu niedrig aus. Geh 1.000 bekannte Schritte und teile NOOPs Zählung durch die echte Zahl, um deinen Wert zu erhalten."}}, "es": {"stringUnit": {"state": "translated", "value": "Pulsos del contador por paso para el contador de pasos propio de una WHOOP 5/MG (una WHOOP 4.0 usa en su lugar la estimación de pasos de más abajo). Déjalo en 1.0 salvo que tus pasos salgan siempre altos o bajos. Camina 1.000 pasos conocidos y divide el conteo de NOOP entre el conteo real para obtener tu valor."}}, "fr": {"stringUnit": {"state": "translated", "value": "Impulsions du compteur par pas pour le compteur de pas propre à un WHOOP 5/MG (un WHOOP 4.0 utilise à la place l’estimation des pas ci-dessous). Laissez à 1,0 sauf si vos pas sont systématiquement trop élevés ou trop bas. Marchez 1 000 pas connus et divisez le comptage de NOOP par le comptage réel pour obtenir votre valeur."}}, "it": {"stringUnit": {"state": "translated", "value": "Conteggi del contatore per passo, per il contapassi interno di un WHOOP 5/MG (un WHOOP 4.0 usa invece la stima dei passi qui sotto). Lascia a 1.0 a meno che i tuoi passi risultino costantemente troppo alti o troppo bassi. Cammina per 1.000 passi noti e dividi il conteggio di NOOP per quello reale per ottenere il tuo valore."}}, "pl": {"stringUnit": {"state": "translated", "value": "Takty licznika na krok dla własnego licznika kroków WHOOP 5/MG (WHOOP 4.0 używa zamiast tego szacunku kroków poniżej). Zostaw 1,0, chyba że Twoje kroki są stale zawyżone lub zaniżone. Przejdź znane 1000 kroków i podziel liczbę NOOP przez liczbę rzeczywistą, aby otrzymać swoją wartość."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Ticks do contador por passo para o contador de passos próprio de um WHOOP 5/MG (um WHOOP 4.0 usa, em vez disso, a estimativa de passos abaixo). Deixa em 1,0, a menos que os teus passos saiam sistematicamente altos ou baixos. Caminha 1.000 passos conhecidos e divide a contagem do NOOP pela contagem real para obteres o teu valor."}}, "ru": {"stringUnit": {"state": "translated", "value": "Тиков счётчика на шаг для собственного счётчика шагов WHOOP 5/MG (WHOOP 4.0 вместо этого использует оценку шагов ниже). Оставьте 1,0, если только шаги стабильно не завышены или не занижены. Пройдите известные 1000 шагов и разделите счёт NOOP на реальное количество, чтобы получить своё значение."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "适用于 WHOOP 5/MG 自带计步器的每步计数器计数(WHOOP 4.0 改用下方的步数估算)。除非你的步数持续偏高或偏低,否则保持为 1.0。走一段已知的 1,000 步,用 NOOP 的计数除以真实计数,即可得到你的数值。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "適用於 WHOOP 5/MG 內建計步器的每步計數器計數(WHOOP 4.0 改用下方的步數估算)。除非你的步數持續偏高或偏低,否則保持為 1.0。走一段已知的 1,000 步,用 NOOP 的計數除以真實計數,即可得到你的數值。"}}}}, "Coupled read": { "localizations": { "de": { @@ -74425,64 +73858,7 @@ } } }, - "Finishing the pairing handshake. Sync now becomes available once the strap is paired.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Kopplungs-Handshake wird abgeschlossen. „Jetzt synchronisieren“ wird verfügbar, sobald der Strap gekoppelt ist." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Terminando el handshake de emparejamiento. Sincronizar ahora estará disponible una vez que la pulsera esté emparejada." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Finalisation de la poignée de main d'appairage. La synchronisation immédiate devient disponible une fois le bracelet appairé." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Completamento della procedura di abbinamento. La sincronizzazione immediata sarà disponibile una volta abbinata la fascia." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Finalização do aperto de mão de emparelhamento. A sincronização fica agora disponível quando a bracelete é emparelhada." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Завершение процедуры сопряжения. Синхронизация станет доступна, как только браслет будет сопряжён." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "正在完成配对握手。手环配对后即可使用同步。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "正在完成配對交握。手環配對完成後,即可使用「立即同步」。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Zakończenie uścisku dłoni w ramach parowania. Synchronizacja staje się teraz dostępna po sparowaniu paska." - } - } - } - }, + "Sync now isn't available on this connection yet. Pulling stored history needs the strap's full secure pairing, which hasn't completed.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "„Jetzt synchronisieren“ ist auf dieser Verbindung noch nicht verfügbar. Das Abrufen des gespeicherten Verlaufs braucht die vollständige, sichere Kopplung des Straps, die noch nicht abgeschlossen ist."}}, "es": {"stringUnit": {"state": "translated", "value": "«Sincronizar ahora» aún no está disponible en esta conexión. Obtener el historial almacenado requiere el emparejamiento seguro completo de la pulsera, que no se ha completado."}}, "fr": {"stringUnit": {"state": "translated", "value": "« Synchroniser maintenant » n'est pas encore disponible sur cette connexion. La récupération de l'historique stocké nécessite l'appairage sécurisé complet du bracelet, qui n'est pas terminé."}}, "it": {"stringUnit": {"state": "translated", "value": "«Sincronizza ora» non è ancora disponibile su questa connessione. Recuperare la cronologia memorizzata richiede l'associazione sicura completa della fascia, che non è stata completata."}}, "pl": {"stringUnit": {"state": "translated", "value": "„Zsynchronizuj teraz” nie jest jeszcze dostępne przy tym połączeniu. Pobranie zapisanej historii wymaga pełnego, bezpiecznego sparowania opaski, które nie zostało ukończone."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "«Sincronize agora» ainda não está disponível nesta ligação. Obter o histórico guardado requer o emparelhamento seguro completo da pulseira, que não foi concluído."}}, "ru": {"stringUnit": {"state": "translated", "value": "«Синхронизировать сейчас» пока недоступно при этом подключении. Для получения сохранённой истории нужно полное защищённое сопряжение браслета, которое не завершено."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "此连接上暂时无法使用“立即同步”。拉取已存储的历史数据需要手环完成完整的安全配对,而配对尚未完成。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "此連線上暫時無法使用「立即同步」。拉取已儲存的歷史資料需要手環完成完整的安全配對,而配對尚未完成。"}}}}, "Fire a single haptic pulse on the strap (requires a bonded connection)": { "localizations": { "de": { @@ -81927,64 +81303,7 @@ } } }, - "Heart rate · HRV · Skin temp* · Resp rate* · Steps* · Sleep · Strain · Battery": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Herzfrequenz · HRV · Hauttemp.* · Atemfreq.* · Schritte* · Schlaf · Belastung · Akku" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Frecuencia cardíaca · VFC · Temp. cutánea* · Frec. respiratoria* · Pasos* · Sueño · Esfuerzo · Batería" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Fréquence cardiaque · VFC · Temp. cutanée* · Fréq. respiratoire* · Pas* · Sommeil · Effort · Batterie" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Frequenza cardiaca · HRV · Temp. cutanea* · Freq. respiratoria* · Passi* · Sonno · Carico · Batteria" - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Frequência cardíaca · VFC · Temperatura da pele* · Frequência respiratória* · Passos* · Sono · Tensão · Bateria" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Пульс · ВСР · Темп. кожи* · Частота дыхания* · Шаги* · Сон · Нагрузка · Батарея" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "心率 · HRV · 皮肤温度* · 呼吸频率* · 步数* · 睡眠 · 强度 · 电量" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "心率 · HRV · 皮膚溫度* · 呼吸率* · 步數* · 睡眠 · 強度 · 電量" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Tętno · HRV · Temperatura skóry* · Częstość oddechów* · Kroki* · Sen · Obciążenie · Bateria" - } - } - } - }, + "Heart rate · HRV · Skin temp · Resp rate* · Steps* · Sleep · Strain · Battery": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Herzfrequenz · HRV · Hauttemp. · Atemfreq.* · Schritte* · Schlaf · Belastung · Akku"}}, "es": {"stringUnit": {"state": "translated", "value": "Frecuencia cardíaca · VFC · Temp. cutánea · Frec. respiratoria* · Pasos* · Sueño · Esfuerzo · Batería"}}, "fr": {"stringUnit": {"state": "translated", "value": "Fréquence cardiaque · VFC · Temp. cutanée · Fréq. respiratoire* · Pas* · Sommeil · Effort · Batterie"}}, "it": {"stringUnit": {"state": "translated", "value": "Frequenza cardiaca · HRV · Temp. cutanea · Freq. respiratoria* · Passi* · Sonno · Carico · Batteria"}}, "pl": {"stringUnit": {"state": "translated", "value": "Tętno · HRV · Temperatura skóry · Częstość oddechów* · Kroki* · Sen · Obciążenie · Bateria"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Frequência cardíaca · VFC · Temperatura da pele · Frequência respiratória* · Passos* · Sono · Tensão · Bateria"}}, "ru": {"stringUnit": {"state": "translated", "value": "Пульс · ВСР · Темп. кожи · Частота дыхания* · Шаги* · Сон · Нагрузка · Батарея"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "心率 · HRV · 皮肤温度 · 呼吸频率* · 步数* · 睡眠 · 强度 · 电量"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "心率 · HRV · 皮膚溫度 · 呼吸率* · 步數* · 睡眠 · 強度 · 電量"}}}}, "Heart rate · HRV* · Sleep · Resting HR · Skin temp* · Battery": { "localizations": { "de": { @@ -83383,64 +82702,7 @@ } } }, - "History sync is experimental on 5.0.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verlaufssynchronisierung ist auf 5.0 experimentell." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La sincronización del historial es experimental en la 5.0." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La synchronisation de l'historique est expérimentale sur 5.0." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La sincronizzazione della cronologia è sperimentale su 5.0." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "A sincronização do histórico é experimental na versão 5.0." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Синхронизация истории экспериментальна на 5.0." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "历史同步在 5.0 上属实验性。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "歷史同步在 5.0 上屬實驗性。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Synchronizacja historii jest eksperymentalna w wersji 5.0." - } - } - } - }, + "History sync is experimental on WHOOP 5.0/MG.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Verlaufssynchronisierung ist auf WHOOP 5.0/MG experimentell."}}, "es": {"stringUnit": {"state": "translated", "value": "La sincronización del historial es experimental en WHOOP 5.0/MG."}}, "fr": {"stringUnit": {"state": "translated", "value": "La synchronisation de l'historique est expérimentale sur WHOOP 5.0/MG."}}, "it": {"stringUnit": {"state": "translated", "value": "La sincronizzazione della cronologia è sperimentale su WHOOP 5.0/MG."}}, "pl": {"stringUnit": {"state": "translated", "value": "Synchronizacja historii jest eksperymentalna na WHOOP 5.0/MG."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "A sincronização do histórico é experimental no WHOOP 5.0/MG."}}, "ru": {"stringUnit": {"state": "translated", "value": "Синхронизация истории на WHOOP 5.0/MG экспериментальная."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG 上的历史同步为实验性功能。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "歷史同步在 WHOOP 5.0/MG 上仍屬實驗性。"}}}}, "History synced": { "localizations": { "de": { @@ -106755,10 +106017,7 @@ "comment": "MEDICAL SAFETY COPY — needs a native speaker, not a machine translation. Deliberately left untranslated: a disclaimer that drifts in meaning is worse than one shown in English. Until a human translates it, the absent localizations make the runtime fall back to this English source text, which is correct and complete. Keep every element when translating: not a medical device, not a diagnosis, and the instruction to see a doctor.", "shouldTranslate": false }, - "NOOP is not a medical device and this is not an ECG test. It asks your MG to start its ECG subsystem and logs whatever comes back — unvalidated instrumentation for protocol research, never a measurement or a diagnosis, including any heart-rhythm classification the strap happens to send. Don't use it to make a health decision; see a doctor if you have symptoms.\n\nHold the two indents on the clasp with the fingers of your other hand for the whole capture. The MG measures across your wrist AND that clasp, so until you hold it the circuit is open, the strap has nothing to record, and you would see zero packets whatever the firmware did.\n\nNobody has confirmed a strap honours these commands, so the likely outcome is that nothing happens. Everything here is reversible: “Stop” turns the streams back off. Results land in the strap log.": { - "comment": "MEDICAL SAFETY COPY — needs a native speaker, not a machine translation. Deliberately left untranslated: a disclaimer that drifts in meaning is worse than one shown in English. Until a human translates it, the absent localizations make the runtime fall back to this English source text, which is correct and complete. Keep every element when translating: not a medical device, not a diagnosis, and the instruction to see a doctor. The middle paragraph is a RUN INSTRUCTION, not a disclaimer: without the clasp held the electrode circuit is open and the capture returns zero packets for a reason that has nothing to do with the firmware, so a translation that loses it produces false negatives in the very reports #891 is asking people for.", - "shouldTranslate": false - }, + "NOOP is not a medical device and this is not an ECG test. It asks your MG to start its ECG subsystem and logs whatever comes back — unvalidated instrumentation for protocol research, never a measurement or a diagnosis, including any heart-rhythm classification the strap happens to send. Don't use it to make a health decision; see a doctor if you have symptoms.\n\nHold the two indents on the clasp with the fingers of your other hand for the whole capture. The MG measures across your wrist AND that clasp, so until you hold it the circuit is open, the strap has nothing to record, and you would see zero packets whatever the firmware did.\n\nResults vary between straps: some MG runs have streamed live ECG frames, others acknowledge every command and send nothing, so an empty capture is a common result. Everything here is reversible: “Stop” turns the streams back off. Results land in the strap log.": {"comment": "MEDICAL SAFETY COPY — needs a native speaker, not a machine translation. Deliberately left untranslated: a disclaimer that drifts in meaning is worse than one shown in English. Until a human translates it, the absent localizations make the runtime fall back to this English source text, which is correct and complete. Keep every element when translating: not a medical device, not a diagnosis, and the instruction to see a doctor. The middle paragraph is a RUN INSTRUCTION, not a disclaimer: without the clasp held the electrode circuit is open and the capture returns zero packets for a reason that has nothing to do with the firmware, so a translation that loses it produces false negatives in the very reports #891 is asking people for.", "shouldTranslate": false}, "NOOP is not a medical device. It is for informational and personal-insight purposes only and is not intended to diagnose, treat, cure or prevent any condition. Talk to a clinician for medical advice.": { "localizations": { "de": { @@ -123940,64 +123199,7 @@ } } }, - "Pairing…": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wird gekoppelt…" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Emparejando…" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Association…" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Abbinamento in corso…" - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Emparelhamento…" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Сопряжение…" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "配对中…" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "配對中…" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Łączenie w pary…" - } - } - } - }, + "Not fully paired": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Nicht vollständig gekoppelt"}}, "es": {"stringUnit": {"state": "translated", "value": "No totalmente emparejada"}}, "fr": {"stringUnit": {"state": "translated", "value": "Pas entièrement appairé"}}, "it": {"stringUnit": {"state": "translated", "value": "Non completamente associata"}}, "pl": {"stringUnit": {"state": "translated", "value": "Nie w pełni sparowana"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Não totalmente emparelhada"}}, "ru": {"stringUnit": {"state": "translated", "value": "Сопряжение не завершено"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "尚未完全配对"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "尚未完全配對"}}}}, "Pairs directly with your strap over Bluetooth: no WHOOP app, no cloud.": { "localizations": { "de": { @@ -128454,64 +127656,7 @@ } } }, - "Put the band into pairing mode, on your wrist and awake.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Versetze das Band in den Kopplungsmodus, am Handgelenk und wach." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Pon la banda en modo de emparejamiento, en tu muñeca y activa." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Mettez la bande en mode d'appairage, à votre poignet et activée." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Metti la band in modalità abbinamento, al polso e attiva." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Coloque a bracelete no modo de emparelhamento, no pulso e acordada." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Переведите браслет в режим сопряжения, наденьте на запястье и убедитесь, что он активен." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "让手环进入配对模式,戴在手腕上并保持唤醒。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "讓手環進入配對模式,戴在你的手腕上並保持喚醒。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Przełącz opaskę w tryb parowania, załóż ją na nadgarstek i obudź się." - } - } - } - }, + "Put the band into pairing mode: tap it repeatedly until its LEDs flash blue. Keep it on your wrist and awake.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Versetze das Band in den Kopplungsmodus: Tippe wiederholt darauf, bis die LEDs blau blinken. Trage es am Handgelenk und lass es wach."}}, "es": {"stringUnit": {"state": "translated", "value": "Pon la banda en modo de emparejamiento: tócala repetidamente hasta que sus LED parpadeen en azul. Mantenla en la muñeca y activa."}}, "fr": {"stringUnit": {"state": "translated", "value": "Mettez le bracelet en mode d'appairage : tapotez-le à plusieurs reprises jusqu'à ce que ses LED clignotent en bleu. Gardez-le au poignet et éveillé."}}, "it": {"stringUnit": {"state": "translated", "value": "Metti la fascia in modalità di associazione: toccala ripetutamente finché i LED non lampeggiano in blu. Tienila al polso e attiva."}}, "pl": {"stringUnit": {"state": "translated", "value": "Włącz na opasce tryb parowania: stukaj w nią wielokrotnie, aż diody LED zaczną migać na niebiesko. Trzymaj ją na nadgarstku i w stanie aktywnym."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Coloca a pulseira em modo de emparelhamento: toca nela repetidamente até os LED piscarem a azul. Mantém-na no pulso e ativa."}}, "ru": {"stringUnit": {"state": "translated", "value": "Переведите браслет в режим сопряжения: несколько раз постучите по нему, пока светодиоды не замигают синим. Держите его на запястье и в активном состоянии."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "让手环进入配对模式:反复轻拍手环,直到指示灯闪烁蓝色。请将其戴在手腕上并保持唤醒。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "讓手環進入配對模式:反覆輕拍手環,直到指示燈閃爍藍色。請將其戴在手腕上並保持喚醒。"}}}}, "Put the strap on first. The deep stream is on-wrist only.": { "localizations": { "de": { @@ -134871,64 +134016,7 @@ } } }, - "Recovery, Test Centre, experimental probes, and backup. Tucked away to keep the everyday screen tidy.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Erholung, Testzentrum, experimentelle Sonden und Sicherung. Verstaut, damit der Alltags-Bildschirm aufgeräumt bleibt." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Recuperación, Test Centre, pruebas experimentales y respaldo. Guardado aparte para mantener ordenada la pantalla de uso diario." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Récupération, Centre de test, sondes expérimentales et sauvegarde. Rangés à part pour garder l'écran du quotidien épuré." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Recupero, Centro test, sonde sperimentali e backup. Messi da parte per mantenere ordinata la schermata di tutti i giorni." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Recuperação, Centro de Testes, sondas experimentais e cópia de segurança. Escondido para manter o ecrã do dia a dia organizado." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Восстановление, Тестовый центр, экспериментальные пробы и резервное копирование. Убрано подальше, чтобы не загромождать повседневный экран." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "恢复、测试中心、实验性探测和备份。收纳于此,让日常界面保持整洁。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "恢復、測試中心、實驗性探測和備份。收納於此,讓日常畫面保持整潔。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Regeneracja, Centrum testowe, sondy eksperymentalne i kopia zapasowa. Schowany, aby utrzymać porządek na ekranie na co dzień." - } - } - } - }, + "Recovery, HRV tuning, Test Centre (including the WHOOP 5/MG protocol probes), experimental features, and backup. Tucked away to keep the everyday screen tidy.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Erholung, HRV-Abstimmung, Testzentrum (einschließlich der Protokolltests für WHOOP 5/MG), experimentelle Funktionen und Sicherung. Verstaut, damit der Alltags-Bildschirm aufgeräumt bleibt."}}, "es": {"stringUnit": {"state": "translated", "value": "Recuperación, ajuste de HRV, Centro de pruebas (incluidas las sondas de protocolo de WHOOP 5/MG), funciones experimentales y respaldo. Guardado aparte para mantener ordenada la pantalla de uso diario."}}, "fr": {"stringUnit": {"state": "translated", "value": "Récupération, réglage de la VFC, Centre de test (y compris les sondes de protocole WHOOP 5/MG), fonctions expérimentales et sauvegarde. Rangés à part pour garder l'écran du quotidien épuré."}}, "it": {"stringUnit": {"state": "translated", "value": "Recupero, regolazione HRV, Centro test (comprese le sonde di protocollo WHOOP 5/MG), funzioni sperimentali e backup. Messi da parte per mantenere ordinata la schermata di tutti i giorni."}}, "pl": {"stringUnit": {"state": "translated", "value": "Regeneracja, strojenie HRV, Centrum testowe (w tym sondy protokołu WHOOP 5/MG), funkcje eksperymentalne i kopia zapasowa. Schowane, aby utrzymać porządek na ekranie na co dzień."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Recuperação, ajuste de HRV, Centro de Testes (incluindo as sondas de protocolo do WHOOP 5/MG), funcionalidades experimentais e cópia de segurança. Escondido para manter o ecrã do dia a dia organizado."}}, "ru": {"stringUnit": {"state": "translated", "value": "Восстановление, настройка HRV, Тестовый центр (включая пробы протокола WHOOP 5/MG), экспериментальные функции и резервное копирование. Убрано подальше, чтобы не загромождать повседневный экран."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "恢复、HRV 调校、测试中心(包括 WHOOP 5/MG 协议探测)、实验性功能和备份。收纳于此,让日常界面保持整洁。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "恢復、HRV 調校、測試中心(包括 WHOOP 5/MG 協定探測)、實驗性功能和備份。收納於此,讓日常畫面保持整潔。"}}}}, "Recovery, strain and sleep in one glance": { "localizations": { "de": { @@ -164565,64 +163653,6 @@ } } }, - "The WHOOP MG has ECG electrodes in its clasp. This unlocks a gated, hand-run probe on the Devices screen that asks the strap to start its ECG subsystem and logs whatever comes back. MG only — a plain WHOOP 5.0 has no electrodes, and NOOP will refuse to send unless your strap identifies itself as an MG. Nobody has confirmed a strap honours these commands, so it may simply do nothing. Turn on “Record puffin frames to a file” below first if you want a complete byte-level capture to share.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der WHOOP MG hat EKG-Elektroden im Verschluss. Das schaltet auf dem Bildschirm „Geräte“ eine abgesicherte, von Hand gestartete Probe frei, die den Strap auffordert, sein EKG-Subsystem zu starten, und alles protokolliert, was zurückkommt. Nur MG — ein einfacher WHOOP 5.0 hat keine Elektroden, und NOOP sendet nur, wenn sich dein Strap als MG ausweist. Niemand hat bestätigt, dass ein Strap diese Befehle befolgt, es kann also schlicht nichts passieren. Schalte zuerst unten „Puffin-Frames in eine Datei aufzeichnen“ ein, wenn du eine vollständige Aufzeichnung auf Byte-Ebene zum Teilen möchtest." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "El WHOOP MG tiene electrodos de ECG en el cierre. Esto desbloquea en la pantalla «Dispositivos» una sonda restringida y de ejecución manual que pide a la pulsera que inicie su subsistema de ECG y registra todo lo que llegue. Solo MG: una WHOOP 5.0 normal no tiene electrodos, y NOOP se negará a enviar a menos que tu pulsera se identifique como MG. Nadie ha confirmado que una pulsera obedezca estos comandos, así que puede que simplemente no haga nada. Activa antes «Graba fotogramas puffin en un archivo», más abajo, si quieres una captura completa a nivel de bytes para compartir." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Le WHOOP MG possède des électrodes ECG dans son fermoir. Cela débloque, sur l'écran « Appareils », une sonde restreinte et lancée à la main qui demande au bracelet de démarrer son sous-système ECG et journalise tout ce qui revient. MG uniquement — un WHOOP 5.0 ordinaire n'a pas d'électrodes, et NOOP refusera d'envoyer si votre bracelet ne s'identifie pas comme un MG. Personne n'a confirmé qu'un bracelet honore ces commandes, il se peut donc qu'il ne se passe rien. Activez d'abord « Enregistrer les trames puffin dans un fichier » ci-dessous si vous voulez une capture complète au niveau des octets à partager." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Il WHOOP MG ha elettrodi ECG nella chiusura. Questo sblocca, nella schermata «Dispositivi», una sonda vincolata ed eseguita a mano che chiede alla fascia di avviare il suo sottosistema ECG e registra tutto ciò che torna indietro. Solo MG — un normale WHOOP 5.0 non ha elettrodi e NOOP si rifiuterà di inviare se la fascia non si identifica come MG. Nessuno ha confermato che una fascia rispetti questi comandi, quindi potrebbe semplicemente non fare nulla. Attiva prima «Registra i frame puffin in un file» qui sotto se vuoi un'acquisizione completa a livello di byte da condividere." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "O WHOOP MG tem elétrodos de ECG no fecho. Isto desbloqueia, no ecrã «Dispositivos», uma sonda restrita e executada à mão que pede à bracelete para iniciar o seu subsistema de ECG e regista tudo o que voltar. Apenas MG — um WHOOP 5.0 normal não tem elétrodos, e o NOOP recusa enviar a menos que a tua bracelete se identifique como MG. Ninguém confirmou que uma bracelete cumpra estes comandos, por isso pode simplesmente não fazer nada. Ativa primeiro «Gravar frames de papagaios-do-mar num ficheiro», abaixo, se quiseres uma captura completa ao nível dos bytes para partilhar." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "У WHOOP MG есть электроды ЭКГ в застёжке. Это открывает на экране «Устройства» ограниченную пробу, запускаемую вручную: она просит браслет запустить подсистему ЭКГ и записывает всё, что придёт в ответ. Только MG — у обычного WHOOP 5.0 электродов нет, и NOOP откажется отправлять команды, если браслет не идентифицирует себя как MG. Никто не подтвердил, что браслет выполняет эти команды, поэтому может просто ничего не произойти. Сначала включите ниже «Записывать пакеты данных puffin в файл», если хотите получить полную побайтовую запись, которой можно поделиться." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "WHOOP MG 的表扣中带有心电图电极。此选项会在「设备」界面解锁一个受限的手动探测:它请求手环启动其心电图子系统,并记录返回的所有内容。仅限 MG——普通的 WHOOP 5.0 没有电极,除非你的手环表明自己是 MG,否则 NOOP 将拒绝发送。没有人确认过手环会执行这些命令,因此可能根本不会有任何反应。如果你想获得完整的字节级采集以便分享,请先启用下方的「将 puffin 帧记录到文件」。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "WHOOP MG 的錶扣中帶有心電圖電極。此選項會在「裝置」畫面解鎖一個受限的手動探測:它請求手環啟動其心電圖子系統,並記錄回傳的所有內容。僅限 MG——一般的 WHOOP 5.0 沒有電極,除非你的手環表明自己是 MG,否則 NOOP 將拒絕傳送。沒有人確認過手環會執行這些命令,因此可能根本不會有任何反應。如果你想取得完整的位元組層級擷取以便分享,請先啟用下方的「將 puffin 幀記錄到檔案」。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "WHOOP MG ma w zapięciu elektrody ECG. Odblokowuje to bramkowaną, ręcznie uruchamianą sondę na ekranie Urządzenia, która prosi pasek o uruchomienie podsystemu ECG i rejestruje wszystko, co wróci. Tylko MG — zwykły WHOOP 5.0 nie ma elektrod, a NOOP odmówi wysłania, chyba że Twój pasek zidentyfikuje się jako MG. Nikt nie potwierdził, że pasek spełnia te polecenia, więc może po prostu nic nie robić. Włącz najpierw opcję „Nagraj klatki maskonurów do pliku” poniżej, jeśli chcesz udostępnić pełne przechwycenie na poziomie bajtów." - } - } - } - }, "The average above was edited. The graph, zones and Effort stay from the recorded session.": { "localizations": { "de": { @@ -165615,123 +164645,7 @@ } } }, - "The wake-alarm above buzzes your wrist from the strap's own firmware. It can't sound a loud alarm, and a sideloaded app can't sound a reliable background wake on this device either (that needs a critical-alert permission this build doesn't have). Keep your phone's built-in Clock alarm as a backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app.": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Weckalarm oben vibriert dein Handgelenk aus der Firmware des Straps. Er kann keinen lauten Alarm abspielen, und eine sideloadete App kann auf diesem Gerät auch kein zuverlässiges Hintergrund-Wecken abspielen (dafür braucht es eine Berechtigung für kritische Hinweise, die dieser Build nicht hat). Behalte den eingebauten Wecker deines Telefons als Backup. NOOPs telefonbasiertes Smart-Wecken (Leichtschlaf-Erkennung) gibt es in der Android-App." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La alarma de despertar de arriba vibra en tu muñeca desde el propio firmware de la pulsera. No puede sonar como una alarma fuerte, y una app instalada por sideload tampoco puede garantizar un despertar en segundo plano en este dispositivo (eso requiere un permiso de alertas críticas que esta versión no tiene). Mantén la alarma del Reloj de tu teléfono como respaldo. El despertar inteligente de NOOP basado en el teléfono (detección de sueño ligero) está disponible en la app de Android." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "L'alarme de réveil ci-dessus fait vibrer votre poignet depuis le micrologiciel du bracelet lui-même. Elle ne peut pas émettre une alarme sonore forte, et une app installée en sideload ne peut pas non plus émettre un réveil fiable en arrière-plan sur cet appareil (cela nécessite une autorisation d'alerte critique que cette version n'a pas). Gardez l'alarme intégrée de l'app Horloge de votre téléphone comme solution de secours. Le réveil intelligent de NOOP basé sur le téléphone (détection du sommeil léger) est disponible dans l'app Android." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La sveglia qui sopra fa vibrare il tuo polso dal firmware stesso della fascia. Non può emettere una sveglia sonora, e nemmeno un'app installata tramite sideload può emettere una sveglia in background affidabile su questo dispositivo (servirebbe un permesso di avviso critico che questa build non ha). Tieni la sveglia integrata Orologio del tuo telefono come riserva. La sveglia intelligente di NOOP basata sul telefono (rilevamento del sonno leggero) è disponibile nell'app Android." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "O despertador acima vibra no teu pulso a partir do firmware da própria bracelete. Não pode fazer soar um alarme alto e uma aplicação transferida por sideload também não pode fazer soar uma ativação de fundo fiável neste dispositivo (que precisa de uma permissão de alerta crítico que esta compilação não tem). Mantenha o alarme do relógio integrado do teu telemóvel como cópia de segurança. O smart wake baseado no telefone do NOOP (deteção de sono leve) está disponível na aplicação Android." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Будильник выше вибрирует на запястье силами собственной прошивки браслета. Он не может подать громкий звуковой сигнал, а стороннее (сайдлоаднутое) приложение также не может надёжно разбудить в фоне на этом устройстве (для этого нужно разрешение критических уведомлений, которого нет в этой сборке). Используйте встроенный будильник «Часы» на телефоне как резервный вариант. Умное пробуждение NOOP на основе телефона (определение лёгкого сна) доступно в приложении для Android." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "上方的唤醒闹钟通过手环自身的固件震动你的手腕。它无法发出响亮的闹钟声,而旁加载的应用在此设备上也无法发出可靠的后台唤醒(那需要此版本所不具备的关键提醒权限)。请保留你手机内置的「时钟」闹钟作为备用。NOOP 基于手机的智能唤醒(浅睡检测)在 Android 应用上可用。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "上方的喚醒鬧鐘透過手環自身的韌體震動你的手腕。它無法發出響亮的鬧鐘聲,而側載的應用程式在此裝置上也無法發出可靠的背景喚醒(那需要此版本所不具備的關鍵提醒權限)。請保留你手機內建的「時鐘」鬧鐘作為備用。NOOP 基於手機的智慧喚醒(淺睡偵測)在 Android 應用程式上可用。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Powyższy alarm budzenia włączy się na nadgarstku za pomocą oprogramowania wbudowanego paska. Nie może włączyć głośnego alarmu, a aplikacja załadowana z boku nie może również wywołać niezawodnego wybudzenia w tle na tym urządzeniu (co wymaga pozwolenia na alert krytyczny, którego nie ma ta kompilacja). Zachowaj wbudowany budzik w telefonie jako kopię zapasową. Inteligentne budzenie w telefonie NOOP (wykrywanie lekkiego snu) jest dostępne w aplikacji Android." - } - } - } - }, - "The wake-alarm above buzzes your wrist from the strap's own firmware. It can't sound a loud alarm. We also schedule a backup notification at your wake time, but a sideloaded app can't sound a guaranteed wake on this device (that needs a critical-alert permission this build doesn't have), so Focus or silent mode can still mute it. Keep your phone's built-in Clock alarm as your real backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Weckalarm oben vibriert dein Handgelenk aus der Firmware des Straps. Er kann keinen lauten Alarm abspielen. Wir planen zusätzlich eine Backup-Mitteilung zu deiner Aufwachzeit, aber eine sideloadete App kann auf diesem Gerät kein garantiertes Wecken abspielen (dafür braucht es eine Berechtigung für kritische Hinweise, die dieser Build nicht hat) – Fokus oder Lautlos können sie also stummschalten. Behalte den eingebauten Wecker deines Telefons als echtes Backup. NOOPs telefonbasiertes Smart-Wecken (Leichtschlaf-Erkennung) gibt es in der Android-App." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La alarma de despertar de arriba vibra en tu muñeca desde el propio firmware de la pulsera. No puede sonar como una alarma fuerte. También programamos una notificación de respaldo a tu hora de despertar, pero una app instalada por sideload no puede garantizar un despertar en este dispositivo (eso requiere un permiso de alertas críticas que esta versión no tiene), así que un modo de concentración o el silencio pueden acallarla. Mantén la alarma del Reloj de tu teléfono como tu verdadero respaldo. El despertar inteligente de NOOP basado en el teléfono (detección de sueño ligero) está disponible en la app de Android." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "L'alarme de réveil ci-dessus fait vibrer votre poignet depuis le micrologiciel du bracelet lui-même. Elle ne peut pas émettre une alarme sonore forte. Nous programmons aussi une notification de secours à l'heure de votre réveil, mais une app installée en sideload ne peut pas garantir un réveil sonore sur cet appareil (cela nécessite une autorisation d'alerte critique que cette version n'a pas), donc le mode Focus ou le mode silencieux peuvent quand même la couper. Gardez l'alarme intégrée de l'app Horloge de votre téléphone comme véritable solution de secours. Le réveil intelligent de NOOP basé sur le téléphone (détection du sommeil léger) est disponible dans l'app Android." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La sveglia qui sopra ti fa vibrare il polso dal firmware della fascia stessa. Non può suonare una sveglia sonora. Programmiamo anche una notifica di riserva alla tua ora di risveglio, ma un'app sideloaded non può garantire un risveglio sonoro su questo dispositivo (servirebbe il permesso per avvisi critici che questa build non ha), quindi Full immersion o la modalità silenziosa possono comunque silenziarla. Tieni la sveglia dell'app Orologio del telefono come vera riserva. La sveglia smart di NOOP basata sul telefono (rilevamento del sonno leggero) è disponibile nell'app Android." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "O despertador acima vibra no teu pulso a partir do firmware da própria bracelete. Não pode fazer soar um alarme alto. Também agendamos uma notificação de cópia de segurança no horário de ativação, mas uma aplicação transferida por sideload não pode soar uma ativação garantida neste dispositivo (que precisa de uma permissão de alerta crítico que esta compilação não tem), pelo que o modo Foco ou silencioso ainda pode silenciá-lo. Mantenha o alarme de relógio integrado do teu telemóvel como o teu verdadeiro cópia de segurança. O smart wake baseado no telefone do NOOP (deteção de sono leve) está disponível na aplicação Android." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Будильник выше вибрирует на запястье силами собственной прошивки браслета. Он не может подать громкий звуковой сигнал. Мы также планируем резервное уведомление на время пробуждения, но стороннее (сайдлоаднутое) приложение не может гарантированно разбудить на этом устройстве (для этого нужно разрешение критических уведомлений, которого нет в этой сборке), поэтому режим «Не беспокоить» или беззвучный режим всё равно может его заглушить. Используйте встроенный будильник «Часы» на телефоне как настоящий резервный вариант. Умное пробуждение NOOP на основе телефона (определение лёгкого сна) доступно в приложении для Android." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "上方的唤醒闹钟由手环自身固件震动你的手腕,无法发出响亮的闹铃。我们也会在你的起床时间安排一条备用通知,但侧载应用在此设备上无法保证响铃唤醒(那需要本构建版本没有的重要提醒权限),因此专注模式或静音模式仍可能将其静音。请保留手机自带时钟闹钟作为真正的后备。NOOP 基于手机的智能唤醒(浅睡检测)在 Android 应用上可用。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "上方的喚醒鬧鐘由手環自身的韌體震動你的手腕,它無法發出響亮的鬧鈴。我們也會在你的起床時間安排一則備用通知,但側載應用程式無法在此裝置上保證發出喚醒聲音(那需要此建置版本沒有的重要警示權限),因此專注模式或靜音模式仍可能將其靜音。請保留手機內建的時鐘鬧鐘作為你真正的備援。NOOP 基於手機的智慧喚醒(淺睡偵測)在 Android 應用程式上可用。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Powyższy alarm budzenia włączy się na nadgarstku za pomocą oprogramowania wbudowanego paska. To nie może wywołać głośnego alarmu. Planujemy również powiadomienie o kopii zapasowej w momencie wybudzenia, ale aplikacja załadowana z boku nie może zagwarantować gwarantowanego wybudzenia na tym urządzeniu (co wymaga pozwolenia na alert krytyczny, którego nie ma ta kompilacja), więc skupienie lub tryb cichy mogą nadal je wyciszyć. Zachowaj wbudowany budzik w telefonie jako prawdziwą kopię zapasową. Inteligentne budzenie w telefonie NOOP (wykrywanie lekkiego snu) jest dostępne w aplikacji Android." - } - } - } - }, + "When it is armed, the wake-alarm above buzzes your wrist from the strap's own firmware. On a WHOOP 5/MG that needs Protocol probes on (Test Centre → 5/MG protocol diagnostics). It can't sound a loud alarm. NOOP also schedules a backup notification at your wake time, but a sideloaded app can't sound a guaranteed wake on this device (that needs a critical-alert permission this build doesn't have), so Focus or silent mode can still mute it. Keep your phone's built-in Clock alarm as your real backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Wenn er eingestellt ist, lässt der Weckalarm oben dein Handgelenk über die eigene Firmware des Straps vibrieren. Auf einem WHOOP 5/MG setzt das voraus, dass Protokolltests an sind (Testzentrum → 5/MG-Protokolldiagnose). Einen lauten Alarm kann er nicht abspielen. NOOP plant zusätzlich eine Ersatz-Mitteilung zu deiner Weckzeit, aber eine sideloadete App kann auf diesem Gerät kein garantiertes Wecken auslösen (dafür braucht es eine Berechtigung für kritische Hinweise, die dieser Build nicht hat). Fokus oder Lautlos können sie also trotzdem stummschalten. Behalte den eingebauten Wecker deines Telefons als echten Ersatz. NOOPs telefonbasiertes Smart-Wecken (Leichtschlaf-Erkennung) gibt es in der Android-App."}}, "es": {"stringUnit": {"state": "translated", "value": "Cuando está programada, la alarma de despertar de arriba hace vibrar tu muñeca desde el propio firmware de la pulsera. En una WHOOP 5/MG eso requiere tener activadas las Sondas de protocolo (Centro de pruebas → Diagnóstico del protocolo 5/MG). No puede sonar como una alarma fuerte. NOOP también programa una notificación de respaldo a tu hora de despertar, pero una app instalada por sideload no puede garantizar un despertar en este dispositivo (eso requiere un permiso de alertas críticas que esta versión no tiene), así que un modo de concentración o el silencio pueden acallarla. Mantén la alarma del Reloj de tu teléfono como tu verdadero respaldo. El despertar inteligente de NOOP basado en el teléfono (detección de sueño ligero) está disponible en la app de Android."}}, "fr": {"stringUnit": {"state": "translated", "value": "Une fois programmée, l’alarme de réveil ci-dessus fait vibrer votre poignet depuis le micrologiciel du bracelet lui-même. Sur un WHOOP 5/MG, cela exige que Sondes de protocole soit activé (Centre de test → Diagnostics du protocole 5/MG). Elle ne peut pas émettre d’alarme sonore forte. NOOP programme aussi une notification de secours à l’heure de votre réveil, mais une app installée en sideload ne peut pas garantir un réveil sonore sur cet appareil (cela nécessite une autorisation d’alerte critique que cette version n’a pas), donc le mode Concentration ou le mode silencieux peuvent quand même la couper. Gardez l’alarme de l’app Horloge de votre téléphone comme véritable solution de secours. Le réveil intelligent de NOOP basé sur le téléphone (détection du sommeil léger) est disponible dans l’app Android."}}, "it": {"stringUnit": {"state": "translated", "value": "Quando è impostata, la sveglia qui sopra fa vibrare il polso dal firmware della fascia stessa. Su un WHOOP 5/MG richiede che le Sonde di protocollo siano attive (Centro test → Diagnostica protocollo 5/MG). Non può emettere una sveglia sonora forte. NOOP programma anche una notifica di riserva all’ora della sveglia, ma un’app installata tramite sideload non può garantire una sveglia sonora su questo dispositivo (servirebbe il permesso per gli avvisi critici che questa build non ha), quindi Focus o la modalità silenziosa possono comunque silenziarla. Tieni la sveglia dell’app Orologio del telefono come vera riserva. La sveglia intelligente di NOOP basata sul telefono (rilevamento del sonno leggero) è disponibile nell’app Android."}}, "pl": {"stringUnit": {"state": "translated", "value": "Gdy jest ustawiony, powyższy alarm budzenia wibruje na nadgarstku dzięki oprogramowaniu wbudowanemu paska. Na WHOOP 5/MG wymaga to włączonych Sond protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Nie może włączyć głośnego alarmu. NOOP planuje też powiadomienie zapasowe na godzinę pobudki, ale aplikacja zainstalowana spoza sklepu (sideload) nie może na tym urządzeniu zagwarantować budzenia (wymaga to uprawnienia do alertów krytycznych, którego ta kompilacja nie ma), więc tryb Skupienia lub tryb cichy nadal mogą je wyciszyć. Zachowaj wbudowany budzik w telefonie jako prawdziwą kopię zapasową. Inteligentne budzenie w telefonie NOOP (wykrywanie lekkiego snu) jest dostępne w aplikacji Android."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Depois de armado, o alarme acima faz vibrar o teu pulso a partir do firmware da própria pulseira. Num WHOOP 5/MG, isso requer as Sondas de protocolo ativadas (Centro de testes → Diagnóstico do protocolo 5/MG). Não pode fazer soar um alarme alto. O NOOP também agenda uma notificação de reserva à hora de acordar, mas uma app instalada por sideload não consegue garantir um despertar neste dispositivo (isso requer uma permissão de alertas críticos que esta compilação não tem), pelo que o modo Foco ou o silencioso ainda a podem silenciar. Mantém o alarme da app Relógio do teu telemóvel como a tua verdadeira reserva. O despertar inteligente do NOOP baseado no telefone (deteção de sono leve) está disponível na app Android."}}, "ru": {"stringUnit": {"state": "translated", "value": "Когда будильник установлен, он заставляет браслет вибрировать на запястье с помощью собственной прошивки. На WHOOP 5/MG для этого должны быть включены Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Громкий звуковой сигнал он подать не может. NOOP также планирует резервное уведомление на время пробуждения, но установленное вне App Store (сайдлоад) приложение не может гарантированно разбудить на этом устройстве (для этого нужно разрешение критических уведомлений, которого нет в этой сборке), поэтому режим «Фокусировка» или беззвучный режим всё равно могут его заглушить. Используйте встроенный будильник «Часы» на телефоне как настоящий резервный вариант. Умное пробуждение NOOP на основе телефона (определение лёгкого сна) доступно в приложении для Android."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "设置后,上方的唤醒闹钟会通过手环自身的固件震动你的手腕。在 WHOOP 5/MG 上,这需要开启“协议探测”(测试中心 → 5/MG 协议诊断)。它无法发出响亮的闹铃。NOOP 也会在你的起床时间安排一条备用通知,但侧载应用在此设备上无法保证响铃唤醒(那需要本构建版本没有的重要提醒权限),因此专注模式或静音模式仍可能将其静音。请保留手机自带的时钟闹钟作为真正的后备。NOOP 基于手机的智能唤醒(浅睡检测)在 Android 应用上可用。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "設定後,上方的喚醒鬧鐘會透過手環自身的韌體震動你的手腕。在 WHOOP 5/MG 上,這需要開啟「協定探測」(測試中心 → 5/MG 協定診斷)。它無法發出響亮的鬧鈴。NOOP 也會在你的起床時間安排一則備用通知,但側載應用程式無法在此裝置上保證發出喚醒聲音(那需要此建置版本沒有的重要警示權限),因此專注模式或靜音模式仍可能將其靜音。請保留手機內建的時鐘鬧鐘作為真正的備援。NOOP 基於手機的智慧喚醒(淺睡偵測)在 Android 應用程式上可用。"}}}}, "Theme": { "localizations": { "de": { @@ -172834,64 +171748,7 @@ } } }, - "Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and shows the strap's full raw reply. A battery-style payload confirms 98 on your firmware; a short stub means it stays ambiguous. Nothing is written to the strap.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zwei unabhängige Protokolltabellen widersprechen sich beim Extended-Battery-Opcode (98 vs. 87). Dies sendet das kuratierte, nur lesende 98 und zeigt die vollständige Rohantwort des Bands. Eine batterieartige Nutzlast bestätigt 98 auf deiner Firmware; ein kurzer Stub bleibt mehrdeutig. Es wird nichts auf das Band geschrieben." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Dos tablas de protocolo independientes discrepan sobre el opcode de batería extendida (98 vs 87). Esto envía el 98 curado y de solo lectura y muestra la respuesta cruda completa de la banda. Una carga tipo batería confirma 98 en tu firmware; un stub corto lo deja ambiguo. No se escribe nada en la banda." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Deux tables de protocole indépendantes divergent sur l'opcode de batterie étendue (98 contre 87). Ceci envoie le 98 curé en lecture seule et affiche la réponse brute complète du bracelet. Une charge de type batterie confirme 98 sur votre firmware ; un stub court le laisse ambigu. Rien n'est écrit sur le bracelet." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Due tabelle di protocollo indipendenti non concordano sull'opcode della batteria estesa (98 vs 87). Questo invia il comando curato in sola lettura 98 e mostra la risposta grezza completa della fascia. Un payload di tipo batteria conferma 98 sul tuo firmware; una risposta breve significa che resta ambiguo. Nulla viene scritto sulla fascia." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Duas tabelas de protocolo independentes discordam quanto ao opcode de bateria alargada (98 vs 87). Isto envia o 98 de leitura, validado e mostra a resposta bruta completa da bracelete. Uma carga útil tipo bateria confirma 98 no teu firmware; um esboço curto significa que permanece ambíguo. Nada é escrito na bracelete." - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Dwie niezależne tabele protokołów nie zgadzają się co do kodu operacji o rozszerzonej baterii (98 vs 87). Spowoduje to wysłanie wybranego numeru 98 w trybie tylko do odczytu i wyświetlenie pełnej nieprzetworzonej odpowiedzi paska. Ładunek przypominający baterię potwierdza 98 w oprogramowaniu sprzętowym; krótki odcinek oznacza, że ​​pozostaje niejednoznaczny. Na pasku nic nie jest zapisane." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Две независимые таблицы протокола расходятся в коде расширенных данных о батарее (98 против 87). Здесь отправляется проверенная команда только для чтения 98 и показывается полный сырой ответ браслета. Ответ в формате батареи подтверждает 98 на вашей прошивке; короткая заглушка означает, что вопрос остаётся открытым. На браслет ничего не записывается." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "两份独立的协议表对扩展电池操作码存在分歧(98 与 87)。此操作发送经整理的只读 98 并显示手环的完整原始回复。返回电池格式的负载即可确认你的固件使用 98;若只返回简短存根,则仍无法确定。不会向手环写入任何内容。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "兩份獨立的協定表對擴充電池操作碼存在分歧(98 與 87)。此操作傳送經整理的唯讀 98 並顯示手環的完整原始回覆。返回電池格式的酬載即可確認你的韌體使用 98;若只返回簡短存根,則仍無法確定。不會向手環寫入任何內容。" - } - } - } - }, + "Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and shows the strap's full raw reply. On a WHOOP 4.0, a battery-style payload confirms 98 on your firmware and the result decodes the pack voltage; a short stub means it stays ambiguous. On a WHOOP 5/MG, NOOP decodes no value from the reply and the pack charge does not come from this command; read the \"Result code\" line instead: UNSUPPORTED means this firmware rejects 98. Nothing is written to the strap.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Zwei unabhängige Protokolltabellen widersprechen sich bei der Opcode-Nummer für erweiterte Akkuinfos (98 vs. 87). Das sendet das kuratierte, rein lesende 98 und zeigt die vollständige Rohantwort des Straps. Bei einem WHOOP 4.0 bestätigt eine akkutypische Nutzlast 98 auf deiner Firmware, und das Ergebnis dekodiert die Packspannung; ein kurzer Stub bleibt uneindeutig. Bei einem WHOOP 5/MG dekodiert NOOP keinen Wert aus der Antwort, und der Ladestand des Akkupacks stammt nicht aus diesem Befehl; lies stattdessen die Zeile „Result code“: UNSUPPORTED bedeutet, dass diese Firmware 98 ablehnt. Es wird nichts auf den Strap geschrieben."}}, "es": {"stringUnit": {"state": "translated", "value": "Dos tablas de protocolo independientes no coinciden en el opcode de batería ampliada (98 frente a 87). Esto envía el 98 curado, de solo lectura, y muestra la respuesta completa en bruto de la pulsera. En un WHOOP 4.0, una carga útil de tipo batería confirma el 98 en tu firmware y el resultado decodifica el voltaje del pack; un stub corto lo deja ambiguo. En un WHOOP 5/MG, NOOP no decodifica ningún valor de la respuesta y la carga del pack no procede de este comando; lee en su lugar la línea «Result code»: UNSUPPORTED significa que este firmware rechaza el 98. No se escribe nada en la pulsera."}}, "fr": {"stringUnit": {"state": "translated", "value": "Deux tables de protocole indépendantes divergent sur l'opcode de batterie étendue (98 contre 87). Ceci envoie le 98 retenu, en lecture seule, et affiche la réponse brute complète du bracelet. Sur un WHOOP 4.0, une charge utile de type batterie confirme le 98 sur votre firmware et le résultat décode la tension du pack ; un stub court reste ambigu. Sur un WHOOP 5/MG, NOOP ne décode aucune valeur de la réponse et la charge du pack ne provient pas de cette commande ; lisez plutôt la ligne « Result code » : UNSUPPORTED signifie que ce firmware rejette le 98. Rien n'est écrit sur le bracelet."}}, "it": {"stringUnit": {"state": "translated", "value": "Due tabelle di protocollo indipendenti non concordano sull'opcode della batteria estesa (98 contro 87). Questo invia il 98 selezionato, di sola lettura, e mostra la risposta grezza completa della fascia. Su un WHOOP 4.0, un payload di tipo batteria conferma il 98 sul tuo firmware e il risultato decodifica la tensione del pacco; un breve stub resta ambiguo. Su un WHOOP 5/MG, NOOP non decodifica alcun valore dalla risposta e la carica del pacco non deriva da questo comando; leggi invece la riga «Result code»: UNSUPPORTED significa che questo firmware rifiuta il 98. Non viene scritto nulla sulla fascia."}}, "pl": {"stringUnit": {"state": "translated", "value": "Dwie niezależne tabele protokołu różnią się co do kodu operacji rozszerzonych informacji o baterii (98 vs 87). Wysyła to wybrane, tylko do odczytu 98 i pokazuje pełną surową odpowiedź opaski. Na WHOOP 4.0 ładunek w stylu baterii potwierdza 98 w Twoim firmware, a wynik dekoduje napięcie pakietu; krótki stub pozostaje niejednoznaczny. Na WHOOP 5/MG NOOP nie dekoduje żadnej wartości z odpowiedzi, a poziom naładowania pakietu nie pochodzi z tego polecenia; zamiast tego czytaj wiersz „Result code”: UNSUPPORTED oznacza, że to oprogramowanie odrzuca 98. Nic nie jest zapisywane na opasce."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Duas tabelas de protocolo independentes divergem quanto ao opcode da bateria alargada (98 vs 87). Isto envia o 98 selecionado, só de leitura, e mostra a resposta bruta completa da pulseira. Num WHOOP 4.0, um payload do tipo bateria confirma o 98 no teu firmware e o resultado descodifica a tensão do pack; um stub curto continua ambíguo. Num WHOOP 5/MG, o NOOP não descodifica nenhum valor da resposta e a carga do pack não vem deste comando; lê antes a linha «Result code»: UNSUPPORTED significa que este firmware rejeita o 98. Nada é escrito na pulseira."}}, "ru": {"stringUnit": {"state": "translated", "value": "Две независимые таблицы протокола расходятся в коде операции расширенной информации о батарее (98 против 87). Эта проверка отправляет выбранную команду 98 (только чтение) и показывает полный необработанный ответ браслета. На WHOOP 4.0 данные в формате батареи подтверждают 98 на вашей прошивке, а результат расшифровывает напряжение батареи; короткая заглушка остаётся неоднозначной. На WHOOP 5/MG NOOP не расшифровывает значение из ответа, а заряд батарейного блока берётся не из этой команды; смотрите строку «Result code»: UNSUPPORTED означает, что эта прошивка отвергает 98. На браслет ничего не записывается."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "两份独立的协议表对扩展电池信息的操作码存在分歧(98 与 87)。此操作会发送经过筛选的只读 98,并显示手环的完整原始回复。在 WHOOP 4.0 上,电池格式的负载可在你的固件上确认 98,结果会解码电池组电压;较短的占位回复则仍不确定。在 WHOOP 5/MG 上,NOOP 不会从回复中解码任何数值,电池组电量也并非来自此命令;请改看“Result code”一行:UNSUPPORTED 表示此固件拒绝 98。不会向手环写入任何内容。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "兩份獨立的協定表對擴充電池資訊的操作碼存在分歧(98 與 87)。此操作會傳送經過篩選的唯讀 98,並顯示手環的完整原始回覆。在 WHOOP 4.0 上,電池格式的負載可在你的韌體上確認 98,結果會解碼電池組電壓;較短的佔位回覆則仍不確定。在 WHOOP 5/MG 上,NOOP 不會從回覆中解碼任何數值,電池組電量也並非來自此指令;請改看「Result code」一行:UNSUPPORTED 表示此韌體拒絕 98。不會向手環寫入任何內容。"}}}}, "Type in a blood-pressure reading or a cholesterol value from your last appointment. It stays on %@, and over time you'll see how it lines up with your sleep, heart rate and recovery.": { "localizations": { "de": { @@ -175776,122 +174633,8 @@ } } }, - "WHOOP 4.0 is tested and works end to end. WHOOP 5.0/MG is newer: live heart rate works today, but deeper metrics (recovery, strain, sleep) for 5/MG are still being figured out. NOOP always tells you what's live versus still building.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 ist getestet und funktioniert durchgehend. WHOOP 5.0/MG ist neuer: Live-Herzfrequenz funktioniert heute, aber tiefere Metriken (Erholung, Belastung, Schlaf) für 5/MG werden noch entschlüsselt. NOOP sagt dir immer, was live ist und was noch im Aufbau." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 está probado y funciona de principio a fin. WHOOP 5.0/MG es más nuevo: la frecuencia cardíaca en vivo funciona hoy, pero las métricas más profundas (recuperación, esfuerzo, sueño) para 5/MG aún se están resolviendo. NOOP siempre te dice qué está activo y qué sigue en construcción." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 est testé et fonctionne de bout en bout. WHOOP 5.0/MG est plus récent : la fréquence cardiaque en direct fonctionne dès aujourd'hui, mais les métriques plus poussées (récupération, effort, sommeil) pour le 5/MG sont encore en cours de résolution. NOOP vous indique toujours ce qui est actif et ce qui est encore en construction." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 è testato e funziona da cima a fondo. WHOOP 5.0/MG è più recente: la frequenza cardiaca dal vivo funziona già, ma le metriche più profonde (recupero, carico, sonno) per 5/MG sono ancora in fase di studio. NOOP ti dice sempre cosa è attivo e cosa è ancora in costruzione." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "O WHOOP 4.0 foi testado e funciona de uma ponta à outra. WHOOP 5.0/MG é mais recente: a frequência cardíaca em direto funciona hoje, mas métricas mais profundas (recuperação, esforço, sono) para 5/MG ainda estão a ser descobertas. O NOOP informa sempre o que está ativo e o que ainda está em construção." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 протестирован и работает от начала до конца. WHOOP 5.0/MG новее: пульс в реальном времени уже работает, но более глубокие метрики (восстановление, нагрузка, сон) для 5/MG всё ещё дорабатываются. NOOP всегда сообщает, что уже работает, а что ещё в разработке." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 已经过测试,端到端可用。WHOOP 5.0/MG 较新:实时心率现已可用,但 5/MG 的深层指标(恢复、强度、睡眠)仍在研究中。NOOP 始终会告诉你哪些已可用、哪些仍在开发。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 已通過測試,可完整運作。WHOOP 5.0/MG 較新:即時心率現在可用,但 5/MG 的深層指標(恢復、強度、睡眠)仍在破解中。NOOP 永遠會告訴你哪些已可用、哪些還在建置。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 został przetestowany i działa kompleksowo. WHOOP 5.0/MG jest nowszy: tętno na żywo działa już dzisiaj, ale głębsze wskaźniki (regeneracja, wysiłek, sen) dla 5/MG wciąż są opracowywane. NOOP zawsze informuje Cię, co jest na żywo, a co wciąż budowane." - } - } - } - }, - "WHOOP 4.0 is the supported path": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 ist der unterstützte Weg" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 es la vía compatible" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 est la voie prise en charge" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 è il percorso supportato" - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 é o caminho suportado" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 — поддерживаемый вариант" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 是受支持的路线" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 4.0 是受支援的路徑" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Obsługiwana ścieżka to WHOOP 4.0" - } - } - } - }, + "WHOOP 4.0 is tested and works end to end. WHOOP 5.0/MG is newer: live heart rate and strap history work, and NOOP scores sleep, recovery and strain from them on your device. Some overnight inputs are still incomplete on 5/MG, so its sleep stages are approximate. NOOP always tells you what's live versus still building.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 ist getestet und funktioniert durchgängig. WHOOP 5.0/MG ist neuer: Live-Herzfrequenz und Bandverlauf funktionieren, und NOOP berechnet daraus auf deinem Gerät Schlaf, Erholung und Belastung. Einige nächtliche Eingangsdaten sind beim 5/MG noch unvollständig, daher sind seine Schlafphasen nur Näherungen. NOOP zeigt dir immer, was bereits live läuft und was noch im Aufbau ist."}}, "es": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 está probada y funciona de principio a fin. WHOOP 5.0/MG es más reciente: la frecuencia cardiaca en vivo y el historial de la pulsera funcionan, y NOOP calcula a partir de ellos el sueño, la recuperación y el esfuerzo en tu dispositivo. Algunos datos nocturnos aún están incompletos en la 5/MG, así que sus fases de sueño son aproximadas. NOOP siempre te dice qué está activo y qué sigue en desarrollo."}}, "fr": {"stringUnit": {"state": "translated", "value": "Le WHOOP 4.0 est testé et fonctionne de bout en bout. Le WHOOP 5.0/MG est plus récent : la fréquence cardiaque en direct et l'historique du bracelet fonctionnent, et NOOP en calcule le sommeil, la récupération et l'effort sur votre appareil. Certaines données nocturnes sont encore incomplètes sur le 5/MG, ses phases de sommeil sont donc approximatives. NOOP vous indique toujours ce qui est actif et ce qui est encore en construction."}}, "it": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 è testato e funziona da capo a fondo. WHOOP 5.0/MG è più recente: frequenza cardiaca live e cronologia della fascia funzionano, e NOOP ne ricava sul tuo dispositivo sonno, recupero e sforzo. Alcuni dati notturni sono ancora incompleti sul 5/MG, quindi le sue fasi del sonno sono approssimative. NOOP ti dice sempre cosa è attivo e cosa è ancora in costruzione."}}, "pl": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 jest przetestowany i działa od początku do końca. WHOOP 5.0/MG jest nowszy: tętno na żywo i historia opaski działają, a NOOP wylicza z nich na Twoim urządzeniu sen, regenerację i wysiłek. Niektóre dane nocne na 5/MG są wciąż niepełne, więc jego fazy snu są przybliżone. NOOP zawsze mówi, co działa na żywo, a co jest jeszcze w budowie."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "O WHOOP 4.0 está testado e funciona de ponta a ponta. O WHOOP 5.0/MG é mais recente: a frequência cardíaca em direto e o histórico da pulseira funcionam, e o NOOP calcula a partir deles o sono, a recuperação e o esforço no teu dispositivo. Alguns dados noturnos ainda estão incompletos no 5/MG, por isso as suas fases do sono são aproximadas. O NOOP diz-te sempre o que já está ativo e o que ainda está em construção."}}, "ru": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 проверен и работает от начала до конца. WHOOP 5.0/MG новее: пульс в реальном времени и история браслета работают, а NOOP считает по ним сон, восстановление и нагрузку на вашем устройстве. Часть ночных данных на 5/MG пока неполна, поэтому фазы сна на нём приблизительны. NOOP всегда показывает, что уже работает, а что ещё в разработке."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 经过测试,可完整使用。WHOOP 5.0/MG 较新:实时心率和手环历史数据均可使用,NOOP 会据此在你的设备上计算睡眠、恢复和负荷。5/MG 的部分夜间输入数据仍不完整,因此其睡眠分期只是近似值。NOOP 始终会告诉你哪些功能已可用、哪些仍在完善中。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 經過測試,可完整使用。WHOOP 5.0/MG 較新:即時心率和手環歷史資料均可使用,NOOP 會據此在你的裝置上計算睡眠、恢復和負荷。5/MG 的部分夜間輸入資料仍不完整,因此其睡眠分期只是近似值。NOOP 始終會告訴你哪些功能已可用、哪些仍在完善中。"}}}}, + "WHOOP 4.0 is the most tested path": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 ist der am besten getestete Weg"}}, "es": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 es la vía más probada"}}, "fr": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 est la voie la plus testée"}}, "it": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 è il percorso più testato"}}, "pl": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 to najlepiej przetestowana ścieżka"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 é o caminho mais testado"}}, "ru": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 — наиболее проверенный вариант"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 是经过最多测试的路线"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "WHOOP 4.0 是經過最多測試的路徑"}}}}, "WHOOP 4.0 protocol": { "localizations": { "de": { @@ -176814,129 +175557,7 @@ } } }, - "WHOOP straps don't appear in macOS System Settings → Bluetooth. They advertise on a custom profile that only apps like NOOP can find, so there's nothing to pair there, and you shouldn't try.": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "WHOOP-Straps erscheinen nicht in den macOS-Systemeinstellungen → Bluetooth. Sie senden über ein eigenes Profil, das nur Apps wie NOOP finden können, dort gibt es also nichts zu koppeln, und du solltest es nicht versuchen." - } - }, - "en": { - "stringUnit": { - "state": "translated", - "value": "WHOOP straps don't appear in macOS System Settings → Bluetooth. They advertise on a custom profile that only apps like NOOP can find, so there's nothing to pair there, and you shouldn't try." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Las pulseras WHOOP no aparecen en Ajustes del sistema de macOS → Bluetooth. Se anuncian con un perfil personalizado que solo apps como NOOP pueden encontrar, así que no hay nada que emparejar ahí y no deberías intentarlo." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Les bracelets WHOOP n'apparaissent pas dans Réglages Système macOS → Bluetooth. Ils diffusent sur un profil personnalisé que seules des apps comme NOOP peuvent détecter ; il n'y a donc rien à associer là-bas, et vous ne devriez pas essayer." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Le fasce WHOOP non compaiono in Impostazioni di Sistema → Bluetooth su macOS. Si annunciano su un profilo personalizzato che solo app come NOOP possono trovare, quindi non c'è nulla da abbinare lì e non dovresti provarci." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "As braceletes WHOOP não aparecem nas definições do sistema do macOS → Bluetooth. Anunciam num perfil personalizado que apenas aplicações como o NOOP podem encontrar, por isso não há nada para emparelhar lá e não deve tentar." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Браслеты WHOOP не отображаются в «Системных настройках» macOS → Bluetooth. Они работают через особый профиль, который видят только приложения вроде NOOP, поэтому там нечего подключать, и пытаться не нужно." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 手环不会出现在 macOS 的「系统设置 → 蓝牙」中。它们通过一个只有 NOOP 这类应用才能找到的自定义配置文件进行广播,,所以那里没有可配对的设备,你也不应尝试。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 手環不會出現在 macOS 的「系統設定 → 藍牙」中。它們透過一個只有 NOOP 這類應用程式才能找到的自訂設定檔進行廣播,,所以那裡沒有可配對的裝置,你也不應嘗試。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Paski WHOOP nie pojawiają się w Ustawieniach systemu macOS → Bluetooth. Reklamują się na niestandardowym profilu, który mogą znaleźć tylko aplikacje takie jak NOOP, więc nie ma tam nic do sparowania i nie powinieneś próbować." - } - } - } - }, - "WHOOP straps don't appear in your %@'s Bluetooth settings. They advertise on a custom profile that only apps like NOOP can find, so there's nothing to pair there, and you shouldn't try.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "WHOOP-Straps erscheinen nicht in den Bluetooth-Einstellungen deines %@. Sie senden auf einem eigenen Profil, das nur Apps wie NOOP finden – dort gibt es also nichts zu koppeln, und du solltest es nicht versuchen." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Las pulseras WHOOP no aparecen en los ajustes de Bluetooth de tu %@. Se anuncian en un perfil propio que solo apps como NOOP pueden encontrar, así que ahí no hay nada que emparejar, y no deberías intentarlo." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Les bracelets WHOOP n'apparaissent pas dans les réglages Bluetooth de votre %@. Ils s'annoncent sur un profil personnalisé que seules des applications comme NOOP peuvent détecter, il n'y a donc rien à associer là-bas, et vous ne devriez pas essayer." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Le fasce WHOOP non compaiono nelle impostazioni Bluetooth del tuo %@. Si annunciano su un profilo personalizzato che solo app come NOOP possono trovare, quindi non c'è nulla da associare lì, e non dovresti provarci." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "As braceletes WHOOP não aparecem nas definições Bluetooth do teu %@. Anunciam num perfil personalizado que apenas aplicações como o NOOP podem encontrar, por isso não há nada para emparelhar lá e não deve tentar." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Браслеты WHOOP не отображаются в настройках Bluetooth на вашем %@. Они используют собственный профиль, который могут найти только такие приложения, как NOOP, поэтому сопрягать их там не с чем — и не стоит пытаться." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 手环不会出现在你 %@ 的蓝牙设置中。它们通过一个只有 NOOP 这类应用才能找到的自定义配置文件进行广播,所以那里没有可配对的设备,你也不应尝试。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 手環不會出現在你 %@ 的藍牙設定中。它們透過一個只有 NOOP 這類應用程式才能找到的自訂設定檔進行廣播,所以那裡沒有可配對的裝置,你也不應嘗試。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Paski WHOOP nie pojawiają się w ustawieniach Bluetooth %@. Reklamują się na niestandardowym profilu, który mogą znaleźć tylko aplikacje takie jak NOOP, więc nie ma tam nic do sparowania i nie powinieneś próbować." - } - } - } - }, + "You don't pair a WHOOP strap from your %@'s Bluetooth settings. It advertises on a custom profile that only apps like NOOP can find, so don't try to pair it there. If a WHOOP is already listed there from an earlier pairing, leave it unless NOOP's re-pair steps ask you to forget it.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Einen WHOOP-Strap koppelst du nicht in den Bluetooth-Einstellungen deines %@. Er sendet auf einem eigenen Profil, das nur Apps wie NOOP finden – versuche also nicht, ihn dort zu koppeln. Ist dort bereits ein WHOOP von einer früheren Kopplung aufgeführt, lass ihn bestehen, außer die Neukopplungs-Schritte von NOOP verlangen, ihn zu entfernen."}}, "es": {"stringUnit": {"state": "translated", "value": "Una pulsera WHOOP no se empareja desde los ajustes de Bluetooth de tu %@. Se anuncia en un perfil propio que solo apps como NOOP pueden encontrar, así que no intentes emparejarla ahí. Si ya aparece un WHOOP en esa lista por un emparejamiento anterior, déjalo, salvo que los pasos de reemparejamiento de NOOP te pidan olvidarlo."}}, "fr": {"stringUnit": {"state": "translated", "value": "On n'associe pas un bracelet WHOOP depuis les réglages Bluetooth de votre %@. Il s'annonce sur un profil personnalisé que seules des applications comme NOOP peuvent détecter, n'essayez donc pas de l'y associer. Si un WHOOP y figure déjà à la suite d'un appairage précédent, laissez-le, sauf si les étapes de ré-appairage de NOOP vous demandent de l'oublier."}}, "it": {"stringUnit": {"state": "translated", "value": "Una fascia WHOOP non si associa dalle impostazioni Bluetooth del tuo %@. Si annuncia su un profilo personalizzato che solo app come NOOP possono trovare, quindi non provare ad associarla da lì. Se un WHOOP è già elencato lì da un'associazione precedente, lascialo, a meno che i passaggi di riassociazione di NOOP non ti chiedano di dimenticarlo."}}, "pl": {"stringUnit": {"state": "translated", "value": "Opaski WHOOP nie paruje się w ustawieniach Bluetooth %@. Reklamuje się ona na niestandardowym profilu, który mogą znaleźć tylko aplikacje takie jak NOOP, więc nie próbuj parować jej tam. Jeśli WHOOP jest już tam widoczny po wcześniejszym sparowaniu, zostaw go, chyba że kroki ponownego parowania w NOOP każą go zapomnieć."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Uma pulseira WHOOP não se emparelha a partir das definições Bluetooth do teu %@. Anuncia-se num perfil personalizado que apenas aplicações como o NOOP podem encontrar, por isso não tentes emparelhá-la aí. Se um WHOOP já estiver listado aí por um emparelhamento anterior, deixa-o, a menos que os passos de reemparelhamento do NOOP te peçam para o esqueceres."}}, "ru": {"stringUnit": {"state": "translated", "value": "Браслет WHOOP не сопрягают в настройках Bluetooth на вашем %@. Он использует собственный профиль, который могут найти только такие приложения, как NOOP, поэтому не пытайтесь сопрягать его там. Если WHOOP уже есть в этом списке после прежнего сопряжения, оставьте его, если только шаги повторного сопряжения в NOOP не просят его забыть."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "WHOOP 手环不是在你 %@ 的蓝牙设置中配对的。它通过一个只有 NOOP 这类应用才能找到的自定义配置文件进行广播,所以请不要尝试在那里配对。如果那里已经列出了之前配对过的 WHOOP,请保持原样,除非 NOOP 的重新配对步骤要求你将其忽略。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "WHOOP 手環不是在你 %@ 的藍牙設定中配對的。它透過一個只有 NOOP 這類應用程式才能找到的自訂設定檔進行廣播,所以請不要嘗試在那裡配對。如果那裡已經列出了之前配對過的 WHOOP,請保持原樣,除非 NOOP 的重新配對步驟要求你將其忽略。"}}}}, "WHOOP's imported per-zone split for this session.": { "localizations": { "de": { @@ -186579,64 +185200,7 @@ } } }, - "WHOOP 5/MG strap alarms require Protocol probes (Test Centre → 5/MG protocol diagnostics). Your wake time is saved, but the strap is not armed yet. Keep a backup alarm.": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 5/MG-Strapalarme benötigen Protokolltests (Testcenter → 5/MG-Protokolldiagnose). Deine Weckzeit ist gespeichert, aber der Strap ist noch nicht scharfgestellt. Behalte einen Ersatzwecker." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Las alarmas de la pulsera WHOOP 5/MG requieren Sondas de protocolo (Centro de pruebas → Diagnóstico del protocolo 5/MG). La hora de despertar está guardada, pero la pulsera aún no está armada. Mantén una alarma de respaldo." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Les alarmes du bracelet WHOOP 5/MG nécessitent Sondes de protocole (Centre de test → Diagnostics du protocole 5/MG). L’heure de réveil est enregistrée, mais le bracelet ne porte pas encore une alarme active. Gardez une alarme de secours." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Le sveglie sulla fascia WHOOP 5/MG richiedono Sonde di protocollo (Centro test → Diagnostica protocollo 5/MG). L’ora di sveglia è salvata, ma la fascia non è ancora armata. Tieni una sveglia di riserva." - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Os alarmes da pulseira WHOOP 5/MG requerem Sondas de protocolo (Centro de testes → Diagnóstico do protocolo 5/MG). A hora de despertar está guardada, mas a pulseira ainda não está armada. Mantém um alarme de reserva." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Для будильника на браслете WHOOP 5/MG включите Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Время пробуждения сохранено, но будильник на браслете ещё не активирован. Оставьте резервный будильник." - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 5/MG 手环闹钟需要开启“协议探测”(测试中心 → 5/MG 协议诊断)。唤醒时间已保存,但手环闹钟尚未启用。请保留备用闹钟。" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "WHOOP 5/MG 手環鬧鐘需要開啟「協定探測」(測試中心 → 5/MG 協定診斷)。喚醒時間已儲存,但手環鬧鐘尚未啟用。請保留備用鬧鐘。" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Alarm na opasce WHOOP 5/MG wymaga włączenia Testów protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Godzina pobudki została zapisana, ale alarm na opasce nie jest jeszcze uzbrojony. Zachowaj alarm zapasowy." - } - } - } - }, + "WHOOP 5/MG strap alarms require Protocol probes (Test Centre → 5/MG protocol diagnostics). Your wake time is saved, but NOOP does not send it to the strap while Protocol probes is off. An alarm sent earlier may still be set on the strap. Keep a backup alarm.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "WHOOP-5/MG-Strapalarme benötigen Protokolltests (Testzentrum → 5/MG-Protokolldiagnose). Deine Weckzeit ist gespeichert, aber NOOP sendet sie nicht an den Strap, solange Protokolltests aus sind. Ein früher gesendeter Alarm kann noch auf dem Strap eingestellt sein. Behalte einen Ersatzwecker."}}, "es": {"stringUnit": {"state": "translated", "value": "Las alarmas de la pulsera WHOOP 5/MG requieren Sondas de protocolo (Centro de pruebas → Diagnóstico del protocolo 5/MG). La hora de despertar está guardada, pero NOOP no la envía a la pulsera mientras las Sondas de protocolo estén desactivadas. Una alarma enviada antes puede seguir configurada en la pulsera. Mantén una alarma de respaldo."}}, "fr": {"stringUnit": {"state": "translated", "value": "Les alarmes du bracelet WHOOP 5/MG nécessitent Sondes de protocole (Centre de test → Diagnostics du protocole 5/MG). L’heure de réveil est enregistrée, mais NOOP ne l’envoie pas au bracelet tant que Sondes de protocole est désactivé. Une alarme envoyée plus tôt peut encore être programmée sur le bracelet. Gardez une alarme de secours."}}, "it": {"stringUnit": {"state": "translated", "value": "Le sveglie sulla fascia WHOOP 5/MG richiedono Sonde di protocollo (Centro test → Diagnostica protocollo 5/MG). L’ora di sveglia è salvata, ma NOOP non la invia alla fascia finché Sonde di protocollo è disattivato. Una sveglia inviata in precedenza potrebbe essere ancora impostata sulla fascia. Tieni una sveglia di riserva."}}, "pl": {"stringUnit": {"state": "translated", "value": "Alarm na opasce WHOOP 5/MG wymaga włączenia Sond protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Godzina pobudki została zapisana, ale NOOP nie wysyła jej na opaskę, gdy Sondy protokołu są wyłączone. Alarm wysłany wcześniej może nadal być ustawiony na opasce. Zachowaj alarm zapasowy."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Os alarmes da pulseira WHOOP 5/MG requerem Sondas de protocolo (Centro de testes → Diagnóstico do protocolo 5/MG). A hora de despertar está guardada, mas o NOOP não a envia para a pulseira enquanto as Sondas de protocolo estiverem desligadas. Um alarme enviado antes pode continuar definido na pulseira. Mantém um alarme de reserva."}}, "ru": {"stringUnit": {"state": "translated", "value": "Для будильника на браслете WHOOP 5/MG включите Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Время пробуждения сохранено, но пока Пробы протокола выключены, NOOP не отправляет его на браслет. Ранее отправленный будильник может оставаться на браслете. Оставьте резервный будильник."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "WHOOP 5/MG 手环闹钟需要开启“协议探测”(测试中心 → 5/MG 协议诊断)。唤醒时间已保存,但在“协议探测”关闭期间,NOOP 不会把它发送到手环。之前发送过的闹钟可能仍保留在手环上。请保留备用闹钟。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "WHOOP 5/MG 手環鬧鐘需要開啟「協定探測」(測試中心 → 5/MG 協定診斷)。喚醒時間已儲存,但在「協定探測」關閉期間,NOOP 不會把它傳送到手環。先前傳送過的鬧鐘可能仍保留在手環上。請保留備用鬧鐘。"}}}}, "Your WHOOP is at 100%.": { "localizations": { "de": { @@ -207946,64 +206510,7 @@ } } }, - "No nightly skin-temp yet — needs ~4 worn nights (or import a WHOOP CSV)": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Noch keine nächtliche Hauttemperatur — benötigt ~4 getragene Nächte (oder importiere eine WHOOP-CSV)" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Aún no hay temperatura cutánea nocturna: necesita ~4 noches de uso (o importa un CSV de WHOOP)" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Pas encore de température cutanée nocturne — nécessite ~4 nuits portées (ou importez un CSV WHOOP)" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Ancora nessuna temperatura cutanea notturna — servono ~4 notti indossate (o importa un CSV WHOOP)" - } - }, - "pt-PT": { - "stringUnit": { - "state": "translated", - "value": "Ainda sem temperatura da pele noturna — precisa de ~4 noites de utilização (ou importe um CSV da WHOOP)" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Пока нет ночной температуры кожи — нужно ~4 ночи ношения (или импортируйте CSV из WHOOP)" - } - }, - "zh-Hans": { - "stringUnit": { - "state": "translated", - "value": "暂无夜间皮肤温度 — 需要约 4 个佩戴夜晚(或导入 WHOOP CSV)" - } - }, - "zh-Hant": { - "stringUnit": { - "state": "translated", - "value": "尚無夜間皮膚溫度 — 需要約 4 個佩戴夜晚(或匯入 WHOOP CSV)" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Nie ma jeszcze nocnej temperatury skóry — potrzeba ~4 przepracowanych nocy (lub zaimportuj WHOOP CSV)" - } - } - } - }, + "No nightly skin-temp yet — wear the strap overnight and let it sync (or import a WHOOP CSV)": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Noch keine nächtliche Hauttemperatur — trage den Strap über Nacht und lass ihn synchronisieren (oder importiere eine WHOOP-CSV)"}}, "es": {"stringUnit": {"state": "translated", "value": "Aún no hay temperatura cutánea nocturna: usa la pulsera durante la noche y deja que sincronice (o importa un CSV de WHOOP)"}}, "fr": {"stringUnit": {"state": "translated", "value": "Pas encore de température cutanée nocturne — portez le bracelet pendant la nuit et laissez-le se synchroniser (ou importez un CSV WHOOP)"}}, "it": {"stringUnit": {"state": "translated", "value": "Ancora nessuna temperatura cutanea notturna — indossa la fascia durante la notte e lasciala sincronizzare (o importa un CSV WHOOP)"}}, "pl": {"stringUnit": {"state": "translated", "value": "Nie ma jeszcze nocnej temperatury skóry — noś opaskę przez noc i poczekaj na synchronizację (lub zaimportuj WHOOP CSV)"}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Ainda sem temperatura da pele noturna — usa a pulseira durante a noite e deixa-a sincronizar (ou importa um CSV da WHOOP)"}}, "ru": {"stringUnit": {"state": "translated", "value": "Пока нет ночной температуры кожи — наденьте браслет на ночь и дайте ему синхронизироваться (или импортируйте CSV из WHOOP)"}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "暂无夜间皮肤温度 — 请佩戴手环过夜并等待同步(或导入 WHOOP CSV)"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "尚無夜間皮膚溫度 — 請佩戴手環過夜並等待同步(或匯入 WHOOP CSV)"}}}}, "Skin Temp Δ": { "localizations": { "en": { @@ -217511,7 +216018,7 @@ "A cardiovascular load from time in heart-rate zones (Edwards TRIMP): each zone is weighted so harder ones count for more, summed into one daily figure. Settings offers an exponential alternative (Banister) that credits short, hard efforts more.": { "localizations": { "de": { "stringUnit": { "state": "translated", "value": "Eine kardiovaskuläre Last aus der Zeit in den Herzfrequenzzonen (Edwards-TRIMP): Jede Zone wird gewichtet, sodass härtere Zonen mehr zählen, aufsummiert zu einer Tageszahl. In den Einstellungen gibt es eine exponentielle Alternative (Banister), die kurze, harte Belastungen stärker anrechnet." } }, "en": { "stringUnit": { "state": "translated", "value": "A cardiovascular load from time in heart-rate zones (Edwards TRIMP): each zone is weighted so harder ones count for more, summed into one daily figure. Settings offers an exponential alternative (Banister) that credits short, hard efforts more." } }, "es": { "stringUnit": { "state": "translated", "value": "Una carga cardiovascular a partir del tiempo en las zonas de frecuencia cardíaca (TRIMP de Edwards): cada zona se pondera para que las más duras cuenten más, sumado en una sola cifra diaria. En Ajustes hay una alternativa exponencial (Banister) que valora más los esfuerzos cortos e intensos." } }, "fr": { "stringUnit": { "state": "translated", "value": "Une charge cardiovasculaire issue du temps passé dans les zones de fréquence cardiaque (TRIMP d’Edwards) : chaque zone est pondérée pour que les plus intenses comptent davantage, additionnée en un seul chiffre journalier. Les Réglages proposent une alternative exponentielle (Banister) qui valorise davantage les efforts courts et intenses." } }, "it": { "stringUnit": { "state": "translated", "value": "Un carico cardiovascolare dato dal tempo nelle zone di frequenza cardiaca (TRIMP di Edwards): ogni zona è ponderata in modo che quelle più dure contino di più, sommato in un unico dato giornaliero. Nelle Impostazioni c’è un’alternativa esponenziale (Banister) che premia di più gli sforzi brevi e intensi." } }, "pl": { "stringUnit": { "state": "translated", "value": "Obciążenie układu krążenia wynikające z czasu w strefach tętna (TRIMP Edwardsa): każda strefa jest ważona tak, aby trudniejsze liczyły się bardziej, zsumowane w jedną wartość dzienną. W Ustawieniach jest alternatywa wykładnicza (Banister), która mocniej docenia krótkie, intensywne wysiłki." } }, "pt-PT": { "stringUnit": { "state": "translated", "value": "Uma carga cardiovascular a partir do tempo nas zonas de frequência cardíaca (TRIMP de Edwards): cada zona é ponderada para que as mais difíceis contem mais, resumido num valor diário. Nas Definições existe uma alternativa exponencial (Banister) que valoriza mais os esforços curtos e intensos." } }, "ru": { "stringUnit": { "state": "translated", "value": "Сердечно-сосудистая нагрузка по времени в пульсовых зонах (TRIMP Эдвардса): каждая зона взвешивается так, что более тяжёлые учитываются сильнее, и всё суммируется в одно дневное значение. В настройках есть экспоненциальная альтернатива (Banister), которая сильнее засчитывает короткие интенсивные усилия." } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "根据你在各心率区间的时长得出的心血管负荷(Edwards TRIMP):区间越高权重越大,汇总为一个每日数字。设置中提供指数式替代方案(Banister),会更看重短时高强度的努力。" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "根據你在各心率區間停留時間得出的心血管負荷(Edwards TRIMP):區間越高權重越大,加總成每日一個數字。設定中提供指數式替代方案(Banister),會更看重短時高強度的努力。" } } } }, - "WHOOP 5.0 / MG supports live data and strap history. Protocol-research tools are available separately in Test Centre.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG unterstützt Live-Daten und Bandverlauf. Protokollwerkzeuge sind separat im Testcenter."}},"es":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG admite datos en directo e historial. Las herramientas de protocolo están aparte en el Centro de pruebas."}},"fr":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG gère les données en direct et l’historique. Les outils de protocole sont séparés dans le Centre de test."}},"pt-PT":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG suporta dados em direto e histórico. As ferramentas de protocolo estão separadas no Centro de testes."}},"it":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG supporta i dati in tempo reale e la cronologia della fascia. Gli strumenti di ricerca sul protocollo sono separati nel Centro test."}},"pl":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG obsługuje dane na żywo i historię paska. Narzędzia badawcze protokołu są dostępne osobno w Centrum Testowym."}},"ru":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG поддерживает данные в реальном времени и историю браслета. Инструменты исследования протокола вынесены в Тестовый центр."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG 支持实时数据和手环历史。协议研究工具单独位于测试中心。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"WHOOP 5.0/MG 支援即時資料與手環歷史。協定研究工具另置於測試中心。"}}}}, + "WHOOP 5.0 / MG supports live data and strap history. Protocol-research tools are available separately in Test Centre.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG unterstützt Live-Daten und Bandverlauf. Protokollwerkzeuge sind separat im Testzentrum."}}, "es": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG admite datos en directo e historial. Las herramientas de protocolo están aparte en el Centro de pruebas."}}, "fr": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG gère les données en direct et l’historique. Les outils de protocole sont séparés dans le Centre de test."}}, "it": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG supporta i dati in tempo reale e la cronologia della fascia. Gli strumenti di ricerca sul protocollo sono separati nel Centro test."}}, "pl": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG obsługuje dane na żywo i historię paska. Narzędzia badawcze protokołu są dostępne osobno w Centrum Testowym."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG suporta dados em direto e histórico. As ferramentas de protocolo estão separadas no Centro de testes."}}, "ru": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG поддерживает данные в реальном времени и историю браслета. Инструменты исследования протокола вынесены в Тестовый центр."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG 支持实时数据和手环历史。协议研究工具单独位于测试中心。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "WHOOP 5.0/MG 支援即時資料與手環歷史。協定研究工具另置於測試中心。"}}}}, "Delete this session?": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Diese Session löschen?"}},"es":{"stringUnit":{"state":"translated","value":"¿Eliminar esta sesión?"}},"fr":{"stringUnit":{"state":"translated","value":"Supprimer cette session ?"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Eliminar esta sessão?"}},"it":{"stringUnit":{"state":"translated","value":"Eliminare questa sessione?"}},"pl":{"stringUnit":{"state":"translated","value":"Usunąć tę sesję?"}},"ru":{"stringUnit":{"state":"translated","value":"Удалить эту сессию?"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"要删除此会话吗?"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"要刪除此工作階段嗎?"}}}}, "The session %@ and its captured raw data will be deleted permanently.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Die Session %@ und ihre Rohdaten werden dauerhaft gelöscht."}},"es":{"stringUnit":{"state":"translated","value":"La sesión %@ y sus datos se eliminarán permanentemente."}},"fr":{"stringUnit":{"state":"translated","value":"La session %@ et ses données seront définitivement supprimées."}},"pt-PT":{"stringUnit":{"state":"translated","value":"A sessão %@ e os dados serão eliminados permanentemente."}},"it":{"stringUnit":{"state":"translated","value":"La sessione %@ e i suoi dati grezzi verranno eliminati definitivamente."}},"pl":{"stringUnit":{"state":"translated","value":"Sesja %@ i jej surowe dane zostaną trwale usunięte."}},"ru":{"stringUnit":{"state":"translated","value":"Сессия %@ и её сырые данные будут удалены безвозвратно."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"会话 %@ 及其采集的原始数据将被永久删除。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"工作階段 %@ 及其擷取的原始資料將被永久刪除。"}}}}, "Delete all sessions?": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Alle Sessions löschen?"}},"es":{"stringUnit":{"state":"translated","value":"¿Eliminar todas las sesiones?"}},"fr":{"stringUnit":{"state":"translated","value":"Supprimer toutes les sessions ?"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Eliminar todas as sessões?"}},"it":{"stringUnit":{"state":"translated","value":"Eliminare tutte le sessioni?"}},"pl":{"stringUnit":{"state":"translated","value":"Usunąć wszystkie sesje?"}},"ru":{"stringUnit":{"state":"translated","value":"Удалить все сессии?"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"要删除所有会话吗?"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"要刪除所有工作階段嗎?"}}}}, @@ -217533,7 +216040,7 @@ "Last exported %@ · export remains available": {"localizations":{"de":{"stringUnit":{"state":"translated","value":"Zuletzt exportiert: %@ · Export bleibt verfügbar"}},"es":{"stringUnit":{"state":"translated","value":"Última exportación: %@ · la exportación sigue disponible"}},"fr":{"stringUnit":{"state":"translated","value":"Dernier export : %@ · l’export reste disponible"}},"it":{"stringUnit":{"state":"translated","value":"Ultima esportazione: %@ · l’esportazione resta disponibile"}},"pl":{"stringUnit":{"state":"translated","value":"Ostatnio wyeksportowano: %@ · eksport pozostaje dostępny"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Última exportação: %@ · a exportação continua disponível"}},"ru":{"stringUnit":{"state":"translated","value":"Последний экспорт: %@ · экспорт остаётся доступен"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"上次导出:%@ · 仍可再次导出"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"上次匯出:%@ · 仍可再次匯出"}}}}, "Export status: %lld raw batches": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Exportstatus: %lld Rohdatenblöcke"}},"es":{"stringUnit":{"state":"translated","value":"Estado: %lld bloques sin procesar"}},"fr":{"stringUnit":{"state":"translated","value":"État : %lld blocs bruts"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Estado: %lld blocos em bruto"}},"it":{"stringUnit":{"state":"translated","value":"Stato esportazione: %lld blocchi di dati grezzi"}},"pl":{"stringUnit":{"state":"translated","value":"Stan eksportu: %lld partii surowych danych"}},"ru":{"stringUnit":{"state":"translated","value":"Состояние экспорта: %lld пакетов сырых данных"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"导出状态:%lld 批原始数据"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"匯出狀態:%lld 批原始資料"}}}}, "Legacy R22 feature-flag experiment. The strap accepts these writes, but NOOP has not observed them enabling a separate live stream. This is not required for normal WHOOP 5/MG support or for the Raw Data Collector. It writes persistent strap settings and may do nothing on your firmware.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Altes R22-Experiment. Für normalen 5/MG-Betrieb und den Rohdaten-Collector ist es nicht erforderlich."}},"es":{"stringUnit":{"state":"translated","value":"Experimento R22 antiguo. No es necesario para el uso normal ni para el recopilador de datos."}},"fr":{"stringUnit":{"state":"translated","value":"Ancienne expérience R22. Elle n’est pas requise pour l’usage normal ni pour le collecteur."}},"pt-PT":{"stringUnit":{"state":"translated","value":"Experiência R22 antiga. Não é necessária para o uso normal nem para o coletor."}},"it":{"stringUnit":{"state":"translated","value":"Vecchio esperimento con i flag R22. La fascia accetta queste scritture, ma NOOP non ha osservato l'attivazione di un flusso dal vivo separato. Non è necessario per il normale supporto WHOOP 5/MG né per il Raccoglitore dati grezzi. Scrive impostazioni persistenti sulla fascia e potrebbe non avere effetto sul tuo firmware."}},"pl":{"stringUnit":{"state":"translated","value":"Dawny eksperyment z flagami R22. Pasek przyjmuje te zapisy, ale NOOP nie zaobserwował uruchomienia osobnego strumienia na żywo. Nie jest to wymagane do normalnej obsługi WHOOP 5/MG ani do Kolektora danych surowych. Zapisuje trwałe ustawienia paska i może nie działać na Twoim oprogramowaniu."}},"ru":{"stringUnit":{"state":"translated","value":"Старый эксперимент с флагами R22. Браслет принимает эти записи, но NOOP не наблюдал включения отдельного живого потока. Для обычной поддержки WHOOP 5/MG и Сборщика сырых данных это не требуется. Записывает постоянные настройки браслета и может ничего не дать на вашей прошивке."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"旧的 R22 功能标记实验。手环会接受这些写入,但 NOOP 未观察到由此启用独立的实时数据流。正常的 WHOOP 5/MG 支持和原始数据采集器都不需要它。它会写入持久的手环设置,在你的固件上可能毫无作用。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"舊的 R22 功能標記實驗。手環會接受這些寫入,但 NOOP 未觀察到因此啟用獨立的即時資料流。正常的 WHOOP 5/MG 支援與原始資料收集器都不需要它。它會寫入持久的手環設定,在你的韌體上可能毫無作用。"}}}}, - "NOOP estimates your steps from your WHOOP's stored motion, calibrated to your phone's step count. It's an estimate, not a hardware step counter; normal WHOOP 5/MG history sync supplies the motion data.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"NOOP schätzt Schritte aus gespeicherter Bewegung und kalibriert sie mit dem Telefon. Es ist kein Hardware-Schrittzähler."}},"es":{"stringUnit":{"state":"translated","value":"NOOP estima los pasos desde el movimiento y los calibra con el teléfono. No es un contador físico."}},"fr":{"stringUnit":{"state":"translated","value":"NOOP estime les pas depuis le mouvement et les calibre avec le téléphone. Ce n’est pas un compteur matériel."}},"pt-PT":{"stringUnit":{"state":"translated","value":"O NOOP estima os passos a partir do movimento e calibra-os com o telefone. Não é um contador físico."}},"it":{"stringUnit":{"state":"translated","value":"NOOP stima i tuoi passi dal movimento memorizzato dal WHOOP, calibrato sul contapassi del telefono. È una stima, non un contapassi hardware; i dati di movimento arrivano dalla normale sincronizzazione della cronologia WHOOP 5/MG."}},"pl":{"stringUnit":{"state":"translated","value":"NOOP szacuje kroki na podstawie ruchu zapisanego przez WHOOP, kalibrując je licznikiem kroków telefonu. To oszacowanie, a nie sprzętowy krokomierz; dane o ruchu pochodzą ze zwykłej synchronizacji historii WHOOP 5/MG."}},"ru":{"stringUnit":{"state":"translated","value":"NOOP оценивает шаги по сохранённому движению WHOOP, калибруя их по шагомеру телефона. Это оценка, а не аппаратный шагомер; данные о движении приходят из обычной синхронизации истории WHOOP 5/MG."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"NOOP 根据 WHOOP 存储的运动数据估算步数,并以手机步数进行校准。这是估算值,而非硬件计步器;运动数据来自正常的 WHOOP 5/MG 历史同步。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"NOOP 根據 WHOOP 儲存的運動資料估算步數,並以手機步數進行校準。這是估算值,而非硬體計步器;運動資料來自正常的 WHOOP 5/MG 歷史同步。"}}}}, + "On a WHOOP 5.0/MG, the Steps tile shows your strap's own step counter (adjust it with Step calibration in Profile) or your phone's count. On days that have neither, NOOP estimates steps from your WHOOP's stored motion, calibrated to your phone's step count. That's what this screen tunes. It's an estimate, not a step counter; normal WHOOP 5/MG history sync supplies the motion data.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Auf einem WHOOP 5.0/MG zeigt die Schritte-Kachel den eigenen Schrittzähler deines Straps (anpassbar mit der Schrittkalibrierung im Profil) oder die Zählung deines Telefons. An Tagen mit keinem von beiden schätzt NOOP die Schritte aus der gespeicherten Bewegung deines WHOOP, kalibriert an der Schrittzahl deines Telefons. Genau das stellt dieser Bildschirm ein. Es ist eine Schätzung, kein Schrittzähler; die Bewegungsdaten stammen aus der normalen Verlaufssynchronisierung des WHOOP 5/MG."}}, "es": {"stringUnit": {"state": "translated", "value": "En un WHOOP 5.0/MG, el mosaico de pasos muestra el contador de pasos propio de la pulsera (ajústalo con la calibración de pasos en Perfil) o el conteo de tu teléfono. En los días sin ninguno de los dos, NOOP estima los pasos a partir del movimiento almacenado de tu WHOOP, calibrado con el conteo de pasos de tu teléfono. Eso es lo que ajusta esta pantalla. Es una estimación, no un contador de pasos; los datos de movimiento proceden de la sincronización normal del historial del WHOOP 5/MG."}}, "fr": {"stringUnit": {"state": "translated", "value": "Sur un WHOOP 5.0/MG, la tuile Pas affiche le compteur de pas propre au bracelet (réglable avec l’étalonnage des pas dans Profil) ou le décompte de votre téléphone. Les jours où il n’y a ni l’un ni l’autre, NOOP estime les pas à partir du mouvement enregistré par votre WHOOP, calibré sur le nombre de pas de votre téléphone. C’est ce que règle cet écran. C’est une estimation, pas un compteur de pas ; les données de mouvement proviennent de la synchronisation normale de l’historique du WHOOP 5/MG."}}, "it": {"stringUnit": {"state": "translated", "value": "Su un WHOOP 5.0/MG, il riquadro Passi mostra il contapassi della fascia (regolabile con la calibrazione dei passi in Profilo) o il conteggio del telefono. Nei giorni senza né l’uno né l’altro, NOOP stima i passi dal movimento memorizzato dal WHOOP, calibrato sul conteggio passi del telefono. È ciò che questa schermata regola. È una stima, non un contapassi; i dati di movimento arrivano dalla normale sincronizzazione della cronologia del WHOOP 5/MG."}}, "pl": {"stringUnit": {"state": "translated", "value": "Na WHOOP 5.0/MG kafelek Kroki pokazuje własny licznik kroków opaski (dostosujesz go kalibracją kroków w Profilu) lub liczbę kroków z telefonu. W dni bez żadnego z nich NOOP szacuje kroki na podstawie ruchu zapisanego przez WHOOP, kalibrując je liczbą kroków z telefonu. To właśnie ustawia ten ekran. To oszacowanie, a nie licznik kroków; dane o ruchu pochodzą ze zwykłej synchronizacji historii WHOOP 5/MG."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Num WHOOP 5.0/MG, o cartão de passos mostra o contador de passos da própria pulseira (ajustável com a calibração de passos no Perfil) ou a contagem do telemóvel. Nos dias sem nenhum dos dois, o NOOP estima os passos a partir do movimento guardado pelo WHOOP, calibrado com a contagem de passos do telemóvel. É isso que este ecrã ajusta. É uma estimativa, não um contador de passos; os dados de movimento vêm da sincronização normal do histórico do WHOOP 5/MG."}}, "ru": {"stringUnit": {"state": "translated", "value": "На WHOOP 5.0/MG плитка шагов показывает собственный счётчик шагов браслета (его можно настроить калибровкой шагов в Профиле) или счёт с телефона. В дни, где нет ни того, ни другого, NOOP оценивает шаги по сохранённому движению WHOOP, калибруя их по шагам телефона. Именно это настраивает данный экран. Это оценка, а не счётчик шагов; данные о движении приходят из обычной синхронизации истории WHOOP 5/MG."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "在 WHOOP 5.0/MG 上,“步数”卡片显示手环自带的计步器读数(可在“个人资料”中通过步数校准调整)或手机的计步数。对于两者都没有的日子,NOOP 会根据 WHOOP 存储的运动数据估算步数,并以手机步数进行校准,这正是本页面所调整的内容。这是估算值,而非计步器读数;运动数据来自正常的 WHOOP 5/MG 历史同步。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "在 WHOOP 5.0/MG 上,「步數」卡片顯示手環內建計步器的讀數(可在「個人資料」中透過步數校準調整)或手機的步數。對於兩者都沒有的日子,NOOP 會根據 WHOOP 儲存的運動資料估算步數,並以手機步數進行校準,這正是本頁面所調整的內容。這是估算值,而非計步器讀數;運動資料來自正常的 WHOOP 5/MG 歷史同步。"}}}}, "5/MG RAW DATA COLLECTOR": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"5/MG-ROHDATEN-COLLECTOR"}},"es":{"stringUnit":{"state":"translated","value":"RECOPILADOR DE DATOS 5/MG"}},"fr":{"stringUnit":{"state":"translated","value":"COLLECTEUR DE DONNÉES 5/MG"}},"pt-PT":{"stringUnit":{"state":"translated","value":"RECOLHA DE DADOS 5/MG"}},"it":{"stringUnit":{"state":"translated","value":"RACCOGLITORE DATI GREZZI 5/MG"}},"pl":{"stringUnit":{"state":"translated","value":"KOLEKTOR DANYCH SUROWYCH 5/MG"}},"ru":{"stringUnit":{"state":"translated","value":"СБОРЩИК СЫРЫХ ДАННЫХ 5/MG"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"5/MG 原始数据采集器"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"5/MG 原始資料收集器"}}}}, "Record, review, export, and delete bounded 100 Hz motion sessions. Normal sync is unchanged.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Begrenzte 100-Hz-Sessions aufnehmen, prüfen, exportieren und löschen. Normale Synchronisierung bleibt unverändert."}},"es":{"stringUnit":{"state":"translated","value":"Graba, revisa, exporta y elimina sesiones limitadas a 100 Hz. La sincronización normal no cambia."}},"fr":{"stringUnit":{"state":"translated","value":"Enregistrez, consultez, exportez et supprimez des sessions limitées à 100 Hz. La synchronisation normale ne change pas."}},"pt-PT":{"stringUnit":{"state":"translated","value":"Grave, reveja, exporte e elimine sessões limitadas a 100 Hz. A sincronização normal não muda."}},"it":{"stringUnit":{"state":"translated","value":"Registra, esamina, esporta ed elimina sessioni di movimento a 100 Hz delimitate. La sincronizzazione normale non cambia."}},"pl":{"stringUnit":{"state":"translated","value":"Nagrywaj, przeglądaj, eksportuj i usuwaj ograniczone sesje ruchu 100 Hz. Zwykła synchronizacja pozostaje bez zmian."}},"ru":{"stringUnit":{"state":"translated","value":"Записывайте, просматривайте, экспортируйте и удаляйте ограниченные сессии движения 100 Гц. Обычная синхронизация не меняется."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"记录、查看、导出和删除有时长限制的 100 Hz 运动会话。正常同步不受影响。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"記錄、檢視、匯出並刪除有時長限制的 100 Hz 運動工作階段。正常同步不受影響。"}}}}, "Open raw-data collector": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Rohdaten-Collector öffnen"}},"es":{"stringUnit":{"state":"translated","value":"Abrir recopilador de datos"}},"fr":{"stringUnit":{"state":"translated","value":"Ouvrir le collecteur de données"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Abrir recolha de dados"}},"it":{"stringUnit":{"state":"translated","value":"Apri il raccoglitore dati grezzi"}},"pl":{"stringUnit":{"state":"translated","value":"Otwórz kolektor danych surowych"}},"ru":{"stringUnit":{"state":"translated","value":"Открыть сборщик сырых данных"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"打开原始数据采集器"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"開啟原始資料收集器"}}}}, @@ -217542,7 +216049,7 @@ "5/MG PROTOCOL DIAGNOSTICS": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"5/MG-PROTOKOLLDIAGNOSE"}},"es":{"stringUnit":{"state":"translated","value":"DIAGNÓSTICO DEL PROTOCOLO 5/MG"}},"fr":{"stringUnit":{"state":"translated","value":"DIAGNOSTICS DU PROTOCOLE 5/MG"}},"pt-PT":{"stringUnit":{"state":"translated","value":"DIAGNÓSTICO DO PROTOCOLO 5/MG"}},"it":{"stringUnit":{"state":"translated","value":"DIAGNOSTICA PROTOCOLLO 5/MG"}},"pl":{"stringUnit":{"state":"translated","value":"DIAGNOSTYKA PROTOKOŁU 5/MG"}},"ru":{"stringUnit":{"state":"translated","value":"ДИАГНОСТИКА ПРОТОКОЛА 5/MG"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"5/MG 协议诊断"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"5/MG 協定診斷"}}}}, "Developer tools for unmapped protocol features. None of these are required for normal WHOOP 5/MG recording, history sync, or the bounded Raw Data Collector.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Entwicklerwerkzeuge für nicht zugeordnete Protokollfunktionen. Für normale Aufnahme, Verlauf und Rohdaten-Collector nicht erforderlich."}},"es":{"stringUnit":{"state":"translated","value":"Herramientas para funciones de protocolo sin asignar. No son necesarias para el uso normal."}},"fr":{"stringUnit":{"state":"translated","value":"Outils pour les fonctions de protocole non identifiées. Ils ne sont pas requis pour l’usage normal."}},"pt-PT":{"stringUnit":{"state":"translated","value":"Ferramentas para funções de protocolo não identificadas. Não são necessárias para o uso normal."}},"it":{"stringUnit":{"state":"translated","value":"Strumenti per sviluppatori per funzioni di protocollo non mappate. Nessuno è necessario per la normale registrazione WHOOP 5/MG, la sincronizzazione della cronologia o il Raccoglitore dati grezzi."}},"pl":{"stringUnit":{"state":"translated","value":"Narzędzia deweloperskie do niezmapowanych funkcji protokołu. Żadne z nich nie są wymagane do zwykłego nagrywania WHOOP 5/MG, synchronizacji historii ani Kolektora danych surowych."}},"ru":{"stringUnit":{"state":"translated","value":"Инструменты разработчика для неразобранных функций протокола. Ничего из этого не требуется для обычной записи WHOOP 5/MG, синхронизации истории или Сборщика сырых данных."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"用于未映射协议功能的开发者工具。正常的 WHOOP 5/MG 记录、历史同步和原始数据采集器都不需要这些。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"用於未對應協定功能的開發者工具。正常的 WHOOP 5/MG 記錄、歷史同步與原始資料收集器都不需要這些。"}}}}, "Protocol probes": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Protokolltests"}},"es":{"stringUnit":{"state":"translated","value":"Sondas de protocolo"}},"fr":{"stringUnit":{"state":"translated","value":"Sondes de protocole"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Sondas de protocolo"}},"it":{"stringUnit":{"state":"translated","value":"Sonde di protocollo"}},"pl":{"stringUnit":{"state":"translated","value":"Sondy protokołu"}},"ru":{"stringUnit":{"state":"translated","value":"Пробы протокола"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"协议探测"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"協定探測"}}}}, - "Sends experimental protocol queries and records replies in the strap log. Also enables the experimental 5/MG strap alarm.": {"shouldTranslate":true,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Sendet experimentelle Protokollabfragen und protokolliert die Antworten im Strap-Log. Aktiviert auch den experimentellen 5/MG-Strapalarm."}},"es":{"stringUnit":{"state":"translated","value":"Envía consultas de protocolo experimentales y registra las respuestas en el registro de la pulsera. También habilita la alarma experimental de la pulsera 5/MG."}},"fr":{"stringUnit":{"state":"translated","value":"Envoie des requêtes de protocole expérimentales et consigne les réponses dans le journal du bracelet. Active aussi l’alarme expérimentale du bracelet 5/MG."}},"pt-PT":{"stringUnit":{"state":"translated","value":"Envia consultas experimentais de protocolo e regista as respostas no diário da pulseira. Também ativa o alarme experimental da pulseira 5/MG."}},"it":{"stringUnit":{"state":"translated","value":"Invia richieste di protocollo sperimentali e registra le risposte nel log della fascia. Abilita anche la sveglia sperimentale della fascia 5/MG."}},"pl":{"stringUnit":{"state":"translated","value":"Wysyła eksperymentalne zapytania protokołu i zapisuje odpowiedzi w dzienniku opaski. Włącza też eksperymentalny alarm opaski 5/MG."}},"ru":{"stringUnit":{"state":"translated","value":"Отправляет экспериментальные запросы протокола и записывает ответы в журнал браслета. Также включает экспериментальный будильник браслета 5/MG."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"发送实验性协议查询并将回复记录到手环日志中。还会启用实验性的 5/MG 手环闹钟。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"傳送實驗性協定查詢並將回覆記錄到手環日誌中。也會啟用實驗性的 5/MG 手環鬧鐘。"}}}}, + "Sends experimental protocol queries and records replies in the strap log. Also allows the experimental 5/MG strap alarm: NOOP sends it the next time the strap connects or you change the alarm. Turning this off does not clear an alarm that is already on the strap.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Sendet experimentelle Protokollabfragen und protokolliert die Antworten im Strap-Log. Erlaubt außerdem den experimentellen 5/MG-Strapalarm: NOOP sendet ihn beim nächsten Verbinden des Straps oder wenn du den Alarm änderst. Das Ausschalten löscht keinen Alarm, der bereits auf dem Strap ist."}}, "es": {"stringUnit": {"state": "translated", "value": "Envía consultas de protocolo experimentales y registra las respuestas en el registro de la pulsera. También permite la alarma experimental de la pulsera 5/MG: NOOP la envía la próxima vez que la pulsera se conecte o cambies la alarma. Desactivar esto no borra una alarma que ya esté en la pulsera."}}, "fr": {"stringUnit": {"state": "translated", "value": "Envoie des requêtes de protocole expérimentales et consigne les réponses dans le journal du bracelet. Autorise aussi l’alarme expérimentale du bracelet 5/MG : NOOP l’envoie à la prochaine connexion du bracelet ou lorsque vous modifiez l’alarme. La désactiver n’efface pas une alarme déjà présente sur le bracelet."}}, "it": {"stringUnit": {"state": "translated", "value": "Invia richieste di protocollo sperimentali e registra le risposte nel log della fascia. Consente anche la sveglia sperimentale della fascia 5/MG: NOOP la invia alla prossima connessione della fascia o quando modifichi la sveglia. Disattivarlo non cancella una sveglia già presente sulla fascia."}}, "pl": {"stringUnit": {"state": "translated", "value": "Wysyła eksperymentalne zapytania protokołu i zapisuje odpowiedzi w dzienniku opaski. Zezwala też na eksperymentalny alarm opaski 5/MG: NOOP wysyła go przy następnym połączeniu opaski lub gdy zmienisz alarm. Wyłączenie tej opcji nie usuwa alarmu, który jest już na opasce."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "Envia consultas experimentais de protocolo e regista as respostas no diário da pulseira. Também permite o alarme experimental da pulseira 5/MG: o NOOP envia-o da próxima vez que a pulseira se ligar ou alterares o alarme. Desligar isto não apaga um alarme que já esteja na pulseira."}}, "ru": {"stringUnit": {"state": "translated", "value": "Отправляет экспериментальные запросы протокола и записывает ответы в журнал браслета. Также разрешает экспериментальный будильник браслета 5/MG: NOOP отправляет его при следующем подключении браслета или при изменении будильника. Выключение не удаляет будильник, уже находящийся на браслете."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "发送实验性协议查询并将回复记录到手环日志中。同时允许实验性的 5/MG 手环闹钟:NOOP 会在手环下次连接或你更改闹钟时发送。关闭此开关不会清除已在手环上的闹钟。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "傳送實驗性協定查詢並將回覆記錄到手環日誌中。同時允許實驗性的 5/MG 手環鬧鐘:NOOP 會在手環下次連線或你更改鬧鐘時傳送。關閉此開關不會清除已在手環上的鬧鐘。"}}}}, "Broadcast heart rate from the strap": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Herzfrequenz vom Band übertragen"}},"es":{"stringUnit":{"state":"translated","value":"Transmitir frecuencia cardíaca desde la pulsera"}},"fr":{"stringUnit":{"state":"translated","value":"Diffuser la fréquence cardiaque du bracelet"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Transmitir frequência cardíaca da bracelete"}},"it":{"stringUnit":{"state":"translated","value":"Trasmetti la frequenza cardiaca dalla fascia"}},"pl":{"stringUnit":{"state":"translated","value":"Nadawaj tętno z paska"}},"ru":{"stringUnit":{"state":"translated","value":"Транслировать пульс с браслета"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"从手环广播心率"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"從手環廣播心率"}}}}, "Writes the reversible 5/MG advertising flag for Garmin, Zwift, and compatible gym equipment.": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Setzt das umkehrbare 5/MG-Werbe-Flag für kompatible Geräte."}},"es":{"stringUnit":{"state":"translated","value":"Activa el indicador reversible 5/MG para equipos compatibles."}},"fr":{"stringUnit":{"state":"translated","value":"Active l’indicateur réversible 5/MG pour les appareils compatibles."}},"pt-PT":{"stringUnit":{"state":"translated","value":"Ativa o indicador reversível 5/MG para equipamento compatível."}},"it":{"stringUnit":{"state":"translated","value":"Scrive il flag di advertising 5/MG reversibile per Garmin, Zwift e attrezzature da palestra compatibili."}},"pl":{"stringUnit":{"state":"translated","value":"Zapisuje odwracalną flagę rozgłaszania 5/MG dla Garmina, Zwifta i zgodnego sprzętu na siłowni."}},"ru":{"stringUnit":{"state":"translated","value":"Записывает обратимый флаг вещания 5/MG для Garmin, Zwift и совместимых тренажёров."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"写入可撤销的 5/MG 广播标记,供 Garmin、Zwift 及兼容健身器材使用。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"寫入可撤銷的 5/MG 廣播標記,供 Garmin、Zwift 及相容健身器材使用。"}}}}, "Legacy R22 feature-flag experiment": {"shouldTranslate":false,"localizations":{"de":{"stringUnit":{"state":"translated","value":"Altes R22-Feature-Flag-Experiment"}},"es":{"stringUnit":{"state":"translated","value":"Experimento antiguo de indicadores R22"}},"fr":{"stringUnit":{"state":"translated","value":"Ancienne expérience d’indicateurs R22"}},"pt-PT":{"stringUnit":{"state":"translated","value":"Experiência antiga de indicadores R22"}},"it":{"stringUnit":{"state":"translated","value":"Vecchio esperimento con i flag R22"}},"pl":{"stringUnit":{"state":"translated","value":"Dawny eksperyment z flagami R22"}},"ru":{"stringUnit":{"state":"translated","value":"Старый эксперимент с флагами R22"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"旧的 R22 功能标记实验"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"舊的 R22 功能標記實驗"}}}}, @@ -217595,7 +216102,7 @@ "iCloud Drive": {"localizations":{"de":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"es":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"fr":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"it":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"pl":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"pt-PT":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"ru":{"stringUnit":{"state":"translated","value":"iCloud Drive"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"iCloud 云盘"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"iCloud 雲碟"}}}}, "iCloud Drive › %@": {"localizations":{"de":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"es":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"fr":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"it":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"pl":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"pt-PT":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"ru":{"stringUnit":{"state":"translated","value":"iCloud Drive › %@"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"iCloud 云盘 › %@"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"iCloud 雲碟 › %@"}}}}, "NOOP (in Files)": {"localizations":{"de":{"stringUnit":{"state":"translated","value":"NOOP (in Dateien)"}},"es":{"stringUnit":{"state":"translated","value":"NOOP (en Archivos)"}},"fr":{"stringUnit":{"state":"translated","value":"NOOP (dans Fichiers)"}},"it":{"stringUnit":{"state":"translated","value":"NOOP (in File)"}},"pl":{"stringUnit":{"state":"translated","value":"NOOP (w Plikach)"}},"pt-PT":{"stringUnit":{"state":"translated","value":"NOOP (em Ficheiros)"}},"ru":{"stringUnit":{"state":"translated","value":"NOOP (в Файлах)"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"NOOP(在“文件”中)"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"NOOP(在「檔案」中)"}}}}, - "Live heart rate is streaming, but your strap is not fully paired. The encrypted pairing is what carries motion, skin temperature, SpO₂ and respiratory rate — without it, sleep is staged from heart rate alone. Buzz, alarms and history sync need it too.": {"localizations":{"de":{"stringUnit":{"state":"translated","value":"Die Live-Herzfrequenz wird übertragen, aber dein Strap ist nicht vollständig gekoppelt. Die verschlüsselte Kopplung liefert Bewegung, Hauttemperatur, SpO₂ und Atemfrequenz — ohne sie wird der Schlaf allein aus der Herzfrequenz abgeleitet. Auch Buzz, Wecker und Verlaufssynchronisierung brauchen sie."}},"es":{"stringUnit":{"state":"translated","value":"La frecuencia cardíaca en vivo se está transmitiendo, pero tu correa no está totalmente emparejada. El emparejamiento cifrado es el que aporta movimiento, temperatura de la piel, SpO₂ y frecuencia respiratoria: sin él, el sueño se calcula solo a partir de la frecuencia cardíaca. El zumbido, las alarmas y la sincronización del historial también lo necesitan."}},"fr":{"stringUnit":{"state":"translated","value":"La fréquence cardiaque en direct est transmise, mais votre bracelet n'est pas entièrement appairé. C'est l'appairage chiffré qui transporte le mouvement, la température cutanée, la SpO₂ et la fréquence respiratoire — sans lui, le sommeil est estimé à partir de la seule fréquence cardiaque. Le buzz, les alarmes et la synchronisation de l'historique en ont besoin aussi."}},"it":{"stringUnit":{"state":"translated","value":"La frequenza cardiaca live viene trasmessa, ma il tuo strap non è completamente associato. È l'associazione cifrata a trasportare movimento, temperatura della pelle, SpO₂ e frequenza respiratoria — senza di essa il sonno viene stimato dalla sola frequenza cardiaca. Anche buzz, sveglie e sincronizzazione della cronologia ne hanno bisogno."}},"pl":{"stringUnit":{"state":"translated","value":"Tętno na żywo jest przesyłane, ale opaska nie jest w pełni sparowana. To szyfrowane parowanie przenosi ruch, temperaturę skóry, SpO₂ i częstość oddechów — bez niego sen jest wyznaczany wyłącznie z tętna. Wibracje, alarmy i synchronizacja historii też go wymagają."}},"pt-PT":{"stringUnit":{"state":"translated","value":"A frequência cardíaca em direto está a ser transmitida, mas a sua pulseira não está totalmente emparelhada. É o emparelhamento encriptado que transporta movimento, temperatura da pele, SpO₂ e taxa respiratória — sem ele, o sono é calculado apenas a partir da frequência cardíaca. O zumbido, os alarmes e a sincronização do histórico também precisam dele."}},"ru":{"stringUnit":{"state":"translated","value":"Пульс передаётся в реальном времени, но ремешок сопряжён не полностью. Именно зашифрованное сопряжение передаёт движение, температуру кожи, SpO₂ и частоту дыхания — без него сон определяется только по пульсу. Вибрация, будильники и синхронизация истории тоже требуют его."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"实时心率正在传输,但你的手环尚未完全配对。加密配对才能传输动作、皮肤温度、SpO₂ 和呼吸频率——没有它,睡眠只能依据心率推算。震动、闹钟和历史同步同样需要它。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"即時心率正在傳輸,但你的手環尚未完全配對。加密配對才能傳輸動作、皮膚溫度、SpO₂ 和呼吸頻率——沒有它,睡眠只能依據心率推算。震動、鬧鐘和歷史同步同樣需要它。"}}}}, + "Live heart rate is streaming, but your strap is not fully paired. The encrypted pairing is what carries the strap's stored history, including motion and skin temperature — without it, sleep is staged from heart rate alone. Buzz, alarms and history sync need it too.": {"localizations": {"de": {"stringUnit": {"state": "translated", "value": "Die Live-Herzfrequenz wird übertragen, aber dein Strap ist nicht vollständig gekoppelt. Die verschlüsselte Kopplung liefert den gespeicherten Verlauf des Straps, darunter Bewegung und Hauttemperatur — ohne sie wird der Schlaf allein aus der Herzfrequenz abgeleitet. Auch Buzz, Wecker und Verlaufssynchronisierung brauchen sie."}}, "es": {"stringUnit": {"state": "translated", "value": "La frecuencia cardíaca en vivo se está transmitiendo, pero tu correa no está totalmente emparejada. El emparejamiento cifrado es el que aporta el historial almacenado de la pulsera, incluidos el movimiento y la temperatura de la piel: sin él, el sueño se calcula solo a partir de la frecuencia cardíaca. El zumbido, las alarmas y la sincronización del historial también lo necesitan."}}, "fr": {"stringUnit": {"state": "translated", "value": "La fréquence cardiaque en direct est transmise, mais votre bracelet n'est pas entièrement appairé. C'est l'appairage chiffré qui transporte l'historique stocké du bracelet, y compris le mouvement et la température cutanée — sans lui, le sommeil est estimé à partir de la seule fréquence cardiaque. Le buzz, les alarmes et la synchronisation de l'historique en ont besoin aussi."}}, "it": {"stringUnit": {"state": "translated", "value": "La frequenza cardiaca live viene trasmessa, ma il tuo strap non è completamente associato. È l'associazione cifrata a trasportare la cronologia memorizzata dello strap, inclusi movimento e temperatura della pelle — senza di essa il sonno viene stimato dalla sola frequenza cardiaca. Anche buzz, sveglie e sincronizzazione della cronologia ne hanno bisogno."}}, "pl": {"stringUnit": {"state": "translated", "value": "Tętno na żywo jest przesyłane, ale opaska nie jest w pełni sparowana. To szyfrowane parowanie przenosi zapisaną historię opaski, w tym ruch i temperaturę skóry — bez niego sen jest wyznaczany wyłącznie z tętna. Wibracje, alarmy i synchronizacja historii też go wymagają."}}, "pt-PT": {"stringUnit": {"state": "translated", "value": "A frequência cardíaca em direto está a ser transmitida, mas a sua pulseira não está totalmente emparelhada. É o emparelhamento encriptado que transporta o histórico guardado da pulseira, incluindo movimento e temperatura da pele — sem ele, o sono é calculado apenas a partir da frequência cardíaca. O zumbido, os alarmes e a sincronização do histórico também precisam dele."}}, "ru": {"stringUnit": {"state": "translated", "value": "Пульс передаётся в реальном времени, но ремешок сопряжён не полностью. Именно зашифрованное сопряжение передаёт сохранённую историю браслета, включая движение и температуру кожи — без него сон определяется только по пульсу. Вибрация, будильники и синхронизация истории тоже требуют его."}}, "zh-Hans": {"stringUnit": {"state": "translated", "value": "实时心率正在传输,但你的手环尚未完全配对。加密配对才能传输手环存储的历史数据,包括动作和皮肤温度——没有它,睡眠只能依据心率推算。震动、闹钟和历史同步同样需要它。"}}, "zh-Hant": {"stringUnit": {"state": "translated", "value": "即時心率正在傳輸,但你的手環尚未完全配對。加密配對才能傳輸手環儲存的歷史資料,包括動作和皮膚溫度——沒有它,睡眠只能依據心率推算。震動、鬧鐘和歷史同步同樣需要它。"}}}}, "Clear conversation": {"localizations": { "en": {"stringUnit": {"state": "translated", "value": "Clear conversation"}}, "de": {"stringUnit": {"state": "translated", "value": "Unterhaltung löschen"}}, diff --git a/Strand/Screens/AddDeviceWizard.swift b/Strand/Screens/AddDeviceWizard.swift index 6f70fc91dc..a7d7cb3473 100644 --- a/Strand/Screens/AddDeviceWizard.swift +++ b/Strand/Screens/AddDeviceWizard.swift @@ -478,7 +478,7 @@ struct AddDeviceWizard: View { case .whoop5mg: return [ String(localized: "WHOOP 5.0 / MG bonds to one device at a time. Unpair it from the official WHOOP app first."), - String(localized: "Put the band into pairing mode, on your wrist and awake."), + String(localized: "Put the band into pairing mode: tap it repeatedly until its LEDs flash blue. Keep it on your wrist and awake."), String(localized: "NOOP will look for it nearby."), ] case .hrStrap: diff --git a/Strand/Screens/DataSourcesView.swift b/Strand/Screens/DataSourcesView.swift index 08dc40d5f2..0fc1e60132 100644 --- a/Strand/Screens/DataSourcesView.swift +++ b/Strand/Screens/DataSourcesView.swift @@ -839,9 +839,10 @@ struct DataSourcesView: View { // FI-2 (#490) — the 4.0-vs-5.0 explainer. Broadcast works for BOTH strap generations because it // re-shares whatever LIVE heart rate NOOP already has off the strap; it doesn't depend on the - // 5/MG-only deep-data path. The honest distinction is WHERE that live HR comes from (4.0 = the - // strap's standard HR characteristic; 5/MG = PPG-derived once connected), not whether broadcast - // works at all. Stated plainly so a 4.0 owner knows this is for them too. + // 5/MG-only deep-data path. Both generations re-share the strap's own live HR (the standard + // 0x2A37 characteristic / REALTIME_DATA); NOOP's PPG-derived HR only fills gaps in stored + // history and never reaches the broadcaster. Stated plainly so a 4.0 owner knows this is for + // them too. generationExplainer // Honest live status only while it's on: a warning note if the radio can't run, else either @@ -873,15 +874,13 @@ struct DataSourcesView: View { } /// FI-2 (#490) — a compact, honest "works with both strap generations" explainer under the broadcast - /// toggle. Two short lines (4.0 / 5.0·MG) frame WHERE the live HR comes from on each, so a WHOOP 4.0 - /// owner knows broadcast is for them and a 5/MG owner understands the PPG-derived source — without - /// over-promising. Plain copy, no claim that either generation is "better". + /// toggle. One short line frames that the live HR is the strap's own on both generations, so a WHOOP + /// 4.0 owner knows broadcast is for them — without over-promising. Plain copy, no claim that either + /// generation is "better". private var generationExplainer: some View { VStack(alignment: .leading, spacing: 6) { - generationRow(title: "WHOOP 4.0", + generationRow(title: "WHOOP 4.0, 5.0 & MG", detail: String(localized: "Broadcasts the strap's own live heart rate over Bluetooth.")) - generationRow(title: "WHOOP 5.0 & MG", - detail: String(localized: "Broadcasts the live heart rate NOOP derives from the strap once connected.")) } .padding(.top, 2) .padding(.horizontal, 10).padding(.vertical, 8) diff --git a/Strand/Screens/DevicesView.swift b/Strand/Screens/DevicesView.swift index c7ed8d96a6..0d001ecbf9 100644 --- a/Strand/Screens/DevicesView.swift +++ b/Strand/Screens/DevicesView.swift @@ -121,7 +121,7 @@ private struct DevicesContent: View { .foregroundStyle(StrandPalette.statusWarning) .accessibilityHidden(true) VStack(alignment: .leading, spacing: 3) { - Text("Can't connect: your strap's pairing was reset") + Text("Your strap needs help to reconnect: steps below") .font(StrandFont.subhead).foregroundStyle(StrandPalette.textPrimary) Text(guide) .font(StrandFont.footnote).foregroundStyle(StrandPalette.textSecondary) @@ -362,7 +362,7 @@ private struct DevicesContent: View { Button("Send probe (read-only)") { model.probeExtendedBatteryInfo(); batteryProbeTarget = nil } Button("Cancel", role: .cancel) { batteryProbeTarget = nil } } message: { _ in - Text("Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and shows the strap's full raw reply. A battery-style payload confirms 98 on your firmware; a short stub means it stays ambiguous. Nothing is written to the strap.") + Text("Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and shows the strap's full raw reply. On a WHOOP 4.0, a battery-style payload confirms 98 on your firmware and the result decodes the pack voltage; a short stub means it stays ambiguous. On a WHOOP 5/MG, NOOP decodes no value from the reply and the pack charge does not come from this command; read the \"Result code\" line instead: UNSUPPORTED means this firmware rejects 98. Nothing is written to the strap.") } // #592 probe result: the strap's reply (or a "waiting…" state), readable + copyable in place. .sheet(isPresented: Binding(get: { live.extendedBatteryProbe != nil }, @@ -1169,9 +1169,10 @@ private struct DeviceCard: View { /// /// Derived from brand/model/sourceKind, NOT from the stored capability `Set`. The stored set is generic /// across WHOOP models (it would render an identical "Heart rate · HRV · Blood oxygen · Skin temp · …" -/// line for a 4.0 and a 5/MG alike) and it mislabels: no SpO₂ **percentage** ever comes off any WHOOP -/// strap (raw red/IR only — a real % exists only from a WHOOP CSV / Apple Health import), skin temp is a -/// nightly ±°C sleep deviation rather than a live reading, steps are 5/MG-only and a raw motion count, +/// line for a 4.0 and a 5/MG alike) and it mislabels: no verified SpO₂ **percentage** comes off any WHOOP +/// strap (raw red/IR only on a 4.0 — a real % exists only from a WHOOP CSV / Apple Health import; a 5/MG's +/// @82 estimate is unverified and opt-in), skin temp is measured nightly rather than a live reading, steps +/// are 5/MG-only (the strap's walk/run motion counter, scaled by Step calibration), /// and Charge/Effort/Rest are NOOP-derived scores. Verdicts are source-verified against the decode + /// scoring paths (the device-capability audit). `*` in a label = an on-device estimate, not a raw sensor. struct DeviceCapabilityProfile { @@ -1250,13 +1251,13 @@ struct DeviceCapabilityProfile { } let whoopPowers = String(localized: "Powers Charge, Effort, Rest, Sleep + Health Monitor") let model = d.model.lowercased() - // WHOOP 5.0 / MG — adds a (raw) step count the 4.0 can't read over BLE. + // WHOOP 5.0 / MG — adds a step count (the strap's motion counter) the 4.0 can't read over BLE. if model.contains("5") || model.contains("mg") { return DeviceCapabilityProfile( displayModel: "WHOOP 5.0 / MG", - captures: String(localized: "Heart rate · HRV · Skin temp* · Resp rate* · Steps* · Sleep · Strain · Battery"), + captures: String(localized: "Heart rate · HRV · Skin temp · Resp rate* · Steps* · Sleep · Strain · Battery"), powers: whoopPowers, - footnote: String(localized: "* on-device estimate: skin temp is a nightly ±°C deviation, steps are a raw motion count (#78). No SpO₂ % off the strap; import a WHOOP CSV for a real %.")) + footnote: String(localized: "* on-device estimate: respiratory rate is derived from beat-to-beat data, and steps count the strap's motion counter only while it reports walking or running, scaled by your Step calibration. Skin temp is measured nightly (°C, or vs your baseline). No verified SpO₂ % off the strap: an unverified estimate is opt-in via “Blood Oxygen: strap estimate (WHOOP 5/MG, Oura)”; import a WHOOP CSV for a real %.")) } // WHOOP 4.0 — NOOP's primary band; no steps over BLE. if model.contains("4") { @@ -1264,7 +1265,7 @@ struct DeviceCapabilityProfile { displayModel: "WHOOP 4.0", captures: String(localized: "Heart rate · HRV · Skin temp* · Resp rate* · Sleep · Strain · Battery"), powers: whoopPowers, - footnote: String(localized: "* on-device estimate: skin temp is a nightly ±°C deviation (firmware-dependent); no steps over BLE on a 4.0. No SpO₂ % off the strap; import a WHOOP CSV for a real %.")) + footnote: String(localized: "* on-device estimate: skin temp is measured nightly (firmware-dependent; °C, or vs your baseline); no steps over BLE on a 4.0. No SpO₂ % off the strap; import a WHOOP CSV for a real %.")) } // Legacy / unknown WHOOP (the seeded device, model just "WHOOP") — show only the common-to-all set. return DeviceCapabilityProfile( @@ -1513,7 +1514,7 @@ private struct EcgProbeSheets: ViewModifier { Button("Set which wrist you wear it on…") { target = nil; wristTarget = device } Button("Cancel", role: .cancel) { target = nil } } message: { _ in - Text("NOOP is not a medical device and this is not an ECG test. It asks your MG to start its ECG subsystem and logs whatever comes back — unvalidated instrumentation for protocol research, never a measurement or a diagnosis, including any heart-rhythm classification the strap happens to send. Don't use it to make a health decision; see a doctor if you have symptoms.\n\nHold the two indents on the clasp with the fingers of your other hand for the whole capture. The MG measures across your wrist AND that clasp, so until you hold it the circuit is open, the strap has nothing to record, and you would see zero packets whatever the firmware did.\n\nNobody has confirmed a strap honours these commands, so the likely outcome is that nothing happens. Everything here is reversible: “Stop” turns the streams back off. Results land in the strap log.") + Text("NOOP is not a medical device and this is not an ECG test. It asks your MG to start its ECG subsystem and logs whatever comes back — unvalidated instrumentation for protocol research, never a measurement or a diagnosis, including any heart-rhythm classification the strap happens to send. Don't use it to make a health decision; see a doctor if you have symptoms.\n\nHold the two indents on the clasp with the fingers of your other hand for the whole capture. The MG measures across your wrist AND that clasp, so until you hold it the circuit is open, the strap has nothing to record, and you would see zero packets whatever the firmware did.\n\nResults vary between straps: some MG runs have streamed live ECG frames, others acknowledge every command and send nothing, so an empty capture is a common result. Everything here is reversible: “Stop” turns the streams back off. Results land in the strap log.") } // Wrist selection: its own step, with its own confirmation and its own warning. // @@ -1785,7 +1786,7 @@ struct DeviceCardCatalog: View { DeviceCard(device: Self.dev("whoop-5-refused", "WHOOP", "5.0 MG", Self.whoopCaps.union([.steps])), isActive: true, isLiveConnected: true, bondRefused: true, - pairingHint: "NOOP can see your strap but it's refusing to pair - it's likely still bonded to the official WHOOP app, or your phone is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) on a 5.0/MG, tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed under iPhone Settings → Bluetooth, tap it and choose Forget This Device, then reconnect in NOOP.", + pairingHint: "NOOP can see your strap but it's refusing to pair. It is likely still held by the official WHOOP app, or your iPhone is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed under iPhone Settings → Bluetooth, tap it and choose Forget This Device, then reconnect in NOOP.", onMakeActive: {}, onRename: {}, onRemove: {}) DeviceCard(device: Self.dev("strap-d", "Polar", "H10", [.hr, .hrv]), isActive: false, isLiveConnected: false, @@ -1841,7 +1842,7 @@ struct BondRefusedDemoScreen: View { capabilities: WhoopLiveCapabilities.metrics(forModel: "5.0 MG"), status: .active, addedAt: 0, lastSeenAt: 0), isActive: true, isLiveConnected: true, bondRefused: true, - pairingHint: "NOOP can see your strap but it's refusing to pair - it's likely still bonded to the official WHOOP app, or your phone is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) on a 5.0/MG, tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed under iPhone Settings → Bluetooth, tap it and choose Forget This Device, then reconnect in NOOP.", + pairingHint: "NOOP can see your strap but it's refusing to pair. It is likely still held by the official WHOOP app, or your iPhone is holding an old pairing. To fix it: (1) fully close the WHOOP app, (2) tap the band repeatedly until the LEDs flash blue (pairing mode), (3) if your strap is listed under iPhone Settings → Bluetooth, tap it and choose Forget This Device, then reconnect in NOOP.", onMakeActive: {}, onRename: {}, onRemove: {}) } } diff --git a/Strand/Screens/FullDayChartView.swift b/Strand/Screens/FullDayChartView.swift index 85b567ef17..87431e87dd 100644 --- a/Strand/Screens/FullDayChartView.swift +++ b/Strand/Screens/FullDayChartView.swift @@ -312,7 +312,7 @@ struct FullDayChartView: View { /// FullDayChartScreen.EmptyTimelineState. private var emptyReason: String { if ownedOnly, metricUnsupported, metric == .spo2 { - return String(localized: "This strap doesn’t send SpO₂ over Bluetooth. Import a WHOOP export or Health Connect to see it.") + return String(localized: "This strap doesn’t send an SpO₂ signal for this chart. Import a WHOOP export or Apple Health data to see it.") } if ownedOnly, metricUnsupported, metric == .respiration { return String(localized: "This strap sends no raw respiration stream. Your estimated respiratory rate appears on the Health screen.") diff --git a/Strand/Screens/HRVSnapshotView.swift b/Strand/Screens/HRVSnapshotView.swift index 110b143539..f85fe1f8d7 100644 --- a/Strand/Screens/HRVSnapshotView.swift +++ b/Strand/Screens/HRVSnapshotView.swift @@ -25,8 +25,8 @@ struct HRVSnapshotView: View { var onClose: (() -> Void)? = nil /// Where the live R-R is coming from, so the methodology caveat is honest (#537): a WHOOP 5/MG - /// derives R-R from the optical pulse signal (noisier) while a WHOOP 4 / chest strap is electrical - /// R-R. Defaults to `.unknown` for callers that do not pass a strap model, matching the Android twin. + /// derives R-R from the optical pulse signal (noisier), as does a WHOOP 4, unlike an electrical + /// chest strap. Defaults to `.unknown` for callers that do not pass a strap model, matching the Android twin. var source: SpotHrvReading.Source = .unknown // MARK: - Capture phase @@ -345,7 +345,7 @@ struct HRVSnapshotView: View { /// Source-aware methodology (#537): the first line states the spot RMSSD uses the SAME cleaned /// Task-Force math as the nightly HRV (so the number is comparable to your overnight figure), then /// `SpotHrvReading.caveatFor` adds the honest limits — including the noisier optical-PPG note on a - /// WHOOP 5/MG. Single-sourced with Android via the shared helper, no em-dashes. + /// WHOOP strap. Single-sourced with Android via the shared helper, no em-dashes. private var methodologyCard: some View { StrandCard(tint: StrandPalette.restColor) { VStack(alignment: .leading, spacing: 8) { diff --git a/Strand/Screens/HealthView.swift b/Strand/Screens/HealthView.swift index 6f42c24495..a907182f01 100644 --- a/Strand/Screens/HealthView.swift +++ b/Strand/Screens/HealthView.swift @@ -143,7 +143,7 @@ private struct SyncStatusSection: View { var body: some View { VStack(alignment: .leading, spacing: NoopMetrics.gap) { SectionHeader("Sync", overline: "Strap history", - trailing: live.connected ? (live.bonded ? String(localized: "Connected") : String(localized: "Pairing…")) : String(localized: "Offline")) + trailing: live.connected ? String(localized: "Connected") : String(localized: "Offline")) NoopCard(tint: StrandPalette.chargeColor) { VStack(alignment: .leading, spacing: NoopMetrics.cardInnerSpacing) { @@ -163,7 +163,8 @@ private struct SyncStatusSection: View { .accessibilityLabel("Sync now") .accessibilityHint(canSync ? "Pulls your strap's stored history immediately, without waiting for the next automatic sync." - : (live.backfilling ? "A sync is already in progress." : "Connect your strap first.")) + : (live.backfilling ? "A sync is already in progress." + : (live.connected ? "Available once the strap finishes pairing." : "Connect your strap first."))) Text(helperText) .font(StrandFont.footnote) @@ -192,7 +193,7 @@ private struct SyncStatusSection: View { } else { // Same condition as the button below it. Keyed on `bonded` this said "Ready to sync" directly // above a DISABLED Sync now, on exactly the strap that cannot sync. - StatePill(live.historyReady ? "Ready to sync" : "Pairing…", + StatePill(live.historyReady ? "Ready to sync" : "Not fully paired", tone: .accent, showsDot: true, pulsing: !live.historyReady) } } @@ -209,7 +210,7 @@ private struct SyncStatusSection: View { // handshake fell through to the "syncs right away" line, under a Sync-now button that had just // been disabled. Same condition as the button and the pill, so all three agree. if !live.historyReady { - return String(localized: "Finishing the pairing handshake. Sync now becomes available once the strap is paired.") + return String(localized: "Sync now isn't available on this connection yet. Pulling stored history needs the strap's full secure pairing, which hasn't completed.") } return String(localized: "Syncs your strap's stored history right away, instead of waiting for the next automatic sync.") } diff --git a/Strand/Screens/LiveView.swift b/Strand/Screens/LiveView.swift index d551081346..3eb1254514 100644 --- a/Strand/Screens/LiveView.swift +++ b/Strand/Screens/LiveView.swift @@ -37,13 +37,12 @@ struct LiveView: View { @AppStorage(CardAppearancePrefs.opacityKey) private var cardOpacityPercent = CardAppearancePrefs.defaultPercent private var cardOpacity: Double { max(0, min(1, Double(cardOpacityPercent) / 100)) } - /// Maps the picked strap model to the HRV-reading source so the spot caveat is honest (#537): a - /// WHOOP 5/MG's R-R is optical PPG (noisier), a WHOOP 4 is electrical R-R. Mirrors the Android - /// `LiveScreen` mapping. + /// Maps the picked strap model to the HRV-reading source so the spot caveat is honest (#537): + /// R-R from either WHOOP generation is optical PPG over 0x2A37 (noisier than a chest strap). Mirrors + /// the Android `LiveScreen` mapping. private var hrvSnapshotSource: SpotHrvReading.Source { switch selectedModel { - case .whoop5mg: return .opticalPPG - case .whoop4: return .chestStrap + case .whoop5mg, .whoop4: return .opticalPPG } } @@ -184,8 +183,8 @@ struct LiveView: View { // Manual HRV snapshot (#127) — a still, seated 60s R-R reading. .sheet(isPresented: $showHRVSnapshot) { // Tell the reading where its R-R is coming from so the caveat is honest (#537): a WHOOP 5/MG - // derives R-R from the optical pulse signal (noisier) while a WHOOP 4 / chest strap is - // electrical R-R. Driven off the picked strap model, mirroring the Android twin. + // derives R-R from the optical pulse signal (noisier), as does a WHOOP 4, unlike an + // electrical chest strap. Driven off the picked strap model, mirroring the Android twin. HRVSnapshotView(onClose: { showHRVSnapshot = false }, source: hrvSnapshotSource) .environmentObject(model) .environmentObject(live) @@ -466,7 +465,7 @@ struct LiveView: View { .foregroundStyle(StrandPalette.statusWarning) .accessibilityHidden(true) VStack(alignment: .leading, spacing: 3) { - Text("Can't connect: your strap's pairing was reset") + Text("Your strap needs help to reconnect: steps below") .font(StrandFont.subhead).foregroundStyle(StrandPalette.textPrimary) Text(guide) .font(StrandFont.footnote).foregroundStyle(StrandPalette.textSecondary) diff --git a/Strand/Screens/NoopLimitationsView.swift b/Strand/Screens/NoopLimitationsView.swift index b61bbfa73c..2566424af8 100644 --- a/Strand/Screens/NoopLimitationsView.swift +++ b/Strand/Screens/NoopLimitationsView.swift @@ -128,7 +128,7 @@ struct NoopLimitationsView: View { .foregroundStyle(StrandPalette.textTertiary) legendRow(.full, "Read live off the strap") legendRow(.partial, "On-device estimate, or experimental / firmware-gated") - legendRow(.none, "Not from the strap. SpO₂ can be filled by importing a WHOOP or Health export.") + legendRow(.none, "No verified value from the strap. A verified SpO₂ % comes from importing a WHOOP or Health export.") } .frame(maxWidth: .infinity, alignment: .leading) } diff --git a/Strand/Screens/SettingsView.swift b/Strand/Screens/SettingsView.swift index 48e3a5e8df..24e5c244b2 100644 --- a/Strand/Screens/SettingsView.swift +++ b/Strand/Screens/SettingsView.swift @@ -276,11 +276,11 @@ struct SettingsView: View { // Lower-frequency sections collapse behind a single default-closed disclosure so the // screen opens at ~6 sections instead of 11. Nothing is removed; every section here - // (Recovery / advanced scoring, Test Centre, the experimental probes + raw-capture, and + // (Recovery / advanced scoring, Test Centre (incl. the 5/MG protocol probes), the experimental toggles + raw-capture, and // Backup & restore) stays one tap away. Modelled on the Test Centre "Advanced" group. SettingsDisclosureGroup( title: "Advanced", - subtitle: "Recovery, HRV tuning, Test Centre, experimental probes, and backup. Tucked away to keep the everyday screen tidy.", + subtitle: "Recovery, HRV tuning, Test Centre (including the WHOOP 5/MG protocol probes), experimental features, and backup. Tucked away to keep the everyday screen tidy.", isExpanded: $advancedOpen ) { recoveryCard @@ -501,8 +501,8 @@ struct SettingsView: View { rowDivider // Step calibration (#139/#132): daily steps = @57 counter ticks ÷ this divisor. // 1.0 = raw pass-through until the true 5/MG tick rate is known. The divisor goes - // up to 30 because a 5/MG motion counter can overcount by ~24×; the stepper uses a - // variable increment (fine near 1.0, coarse up top) so high values stay reachable. + // up to 30; the stepper uses a variable increment (fine near 1.0, coarse up top) + // so high values stay reachable. FormRow(label: "Step calibration") { HStack(spacing: 10) { Text(String(format: "%.1f", profile.stepTicksPerStep)) @@ -518,7 +518,7 @@ struct SettingsView: View { .accessibilityLabel("Step calibration, \(String(format: "%.1f", profile.stepTicksPerStep)) counter ticks per step") } } - Text("Counter ticks per step. Leave at 1.0 unless your steps run high. On a WHOOP 5/MG they can run very high (10× or more), so this goes up to 30. Walk a known 1,000 steps and divide NOOP's count by the real count to get your value.") + Text("Counter ticks per step for a WHOOP 5/MG's own step counter (a WHOOP 4.0 uses the Steps estimate below instead). Leave at 1.0 unless your steps consistently read high or low. Walk a known 1,000 steps and divide NOOP's count by the real count to get your value.") .font(StrandFont.footnote) .foregroundStyle(StrandPalette.textTertiary) .fixedSize(horizontal: false, vertical: true) @@ -1538,7 +1538,7 @@ struct SettingsView: View { // Live HR over the UNBONDED standard profile (#69). True whenever the handshake is suppressed or // simply has not landed, and the honest description either way. if live.bonded && live.connected { - return String(localized: "Live heart rate is streaming, but your strap is not fully paired. The encrypted pairing is what carries motion, skin temperature, SpO₂ and respiratory rate — without it, sleep is staged from heart rate alone. Buzz, alarms and history sync need it too.") + return String(localized: "Live heart rate is streaming, but your strap is not fully paired. The encrypted pairing is what carries the strap's stored history, including motion and skin temperature — without it, sleep is staged from heart rate alone. Buzz, alarms and history sync need it too.") } if live.connected { return String(localized: "Connected. Finishing the secure pairing handshake…") } if live.bonded { return String(localized: "Previously paired but not currently connected. Re-scan to reconnect.") } @@ -1993,7 +1993,7 @@ struct SettingsView: View { // the HRV window toggle above (analyzeRecent → refresh). Task { await model.intelligence.analyzeRecent(); await model.repo.refresh() } } - Text("Your WHOOP 5.0/MG sends a strap-computed SpO₂ percentage (the @82 candidate byte) every second — an 8-night independent validation tracked it at corr +0.99 against the WHOOP app, but two nights on the original test device moved the OPPOSITE direction, so device/firmware variance is unresolved. An Oura ring's own SpO₂ reading runs high on the wire (over 100% on a fifth to a half of samples on a clean night); this instead surfaces the ring's mean with each sample capped at 100% first, which has matched the Oura app's own displayed value on every full night checked against it so far, though only a few nights. Turning this on surfaces whichever applies to your device as \"strap estimate (unverified)\" in the Blood Oxygen tile when no calibrated import exists. It never feeds recovery or illness scoring. WHOOP 4.0 has no @82 stream, so this does nothing there.") + Text("Your WHOOP 5.0/MG sends a strap-computed SpO₂ percentage (the @82 candidate byte) every second while you sleep — an 8-night independent validation tracked it at corr +0.99 against the WHOOP app, but two nights on the original test device moved the OPPOSITE direction, so device/firmware variance is unresolved. An Oura ring's own SpO₂ reading runs high on the wire (over 100% on a fifth to a half of samples on a clean night); this instead surfaces the ring's mean with each sample capped at 100% first, which has matched the Oura app's own displayed value on every full night checked against it so far, though only a few nights. Turning this on surfaces whichever applies to your device as \"strap estimate (unverified)\" in the Blood Oxygen tile when no calibrated import exists. It never feeds recovery or illness scoring. WHOOP 4.0 has no @82 stream, so this does nothing there.") .font(StrandFont.caption) .foregroundStyle(StrandPalette.textTertiary) .fixedSize(horizontal: false, vertical: true) @@ -3096,7 +3096,7 @@ struct StepsCalibrationSheet: View { .font(StrandFont.headline) .foregroundStyle(StrandPalette.textPrimary) Text(is5MG - ? String(localized: "NOOP estimates your steps from your WHOOP's stored motion, calibrated to your phone's step count. It's an estimate, not a hardware step counter; normal WHOOP 5/MG history sync supplies the motion data.") + ? String(localized: "On a WHOOP 5.0/MG, the Steps tile shows your strap's own step counter (adjust it with Step calibration in Profile) or your phone's count. On days that have neither, NOOP estimates steps from your WHOOP's stored motion, calibrated to your phone's step count. That's what this screen tunes. It's an estimate, not a step counter; normal WHOOP 5/MG history sync supplies the motion data.") : String(localized: "NOOP estimates your steps from your WHOOP's motion, calibrated to your phone's step count. It's an estimate, not a step counter. A WHOOP 4.0 doesn't transmit steps.")) .font(StrandFont.subhead) .foregroundStyle(StrandPalette.textSecondary) diff --git a/Strand/Screens/SmartAlarmView.swift b/Strand/Screens/SmartAlarmView.swift index 568b706aef..3ada4f9a70 100644 --- a/Strand/Screens/SmartAlarmView.swift +++ b/Strand/Screens/SmartAlarmView.swift @@ -184,6 +184,17 @@ struct SmartAlarmView: View { } } + /// Body of the honesty card. Split by platform because the backup notification only exists on iOS + /// (`scheduleSmartAlarmBackupNotification` is a no-op on macOS), and the strap buzz is conditional + /// on a 5/MG having Protocol probes on. + private var honestyBody: LocalizedStringKey { + #if os(iOS) + return "When it is armed, the wake-alarm above buzzes your wrist from the strap's own firmware. On a WHOOP 5/MG that needs Protocol probes on (Test Centre → 5/MG protocol diagnostics). It can't sound a loud alarm. NOOP also schedules a backup notification at your wake time, but a sideloaded app can't sound a guaranteed wake on this device (that needs a critical-alert permission this build doesn't have), so Focus or silent mode can still mute it. Keep your phone's built-in Clock alarm as your real backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app." + #else + return "When it is armed, the wake-alarm above buzzes your wrist from the strap's own firmware. On a WHOOP 5/MG that needs Protocol probes on (Test Centre → 5/MG protocol diagnostics). It can't sound a loud alarm, and NOOP on a Mac schedules no backup notification, so nothing else goes off at your wake time. Keep your phone's built-in Clock alarm as your real backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app." + #endif + } + // The up-front, honest note about the difference between the strap's silent buzz (above) and a loud // phone wake. The strap alarm is real, but it's a gentle wrist buzz, not a sound, so we say plainly // to keep a backup, and that the louder smart wake lives on Android. @@ -197,7 +208,7 @@ struct SmartAlarmView: View { Text("The strap alarm is a silent buzz, not a sound") .font(StrandFont.headline) .foregroundStyle(StrandPalette.textPrimary) - Text("The wake-alarm above buzzes your wrist from the strap's own firmware. It can't sound a loud alarm. We also schedule a backup notification at your wake time, but a sideloaded app can't sound a guaranteed wake on this device (that needs a critical-alert permission this build doesn't have), so Focus or silent mode can still mute it. Keep your phone's built-in Clock alarm as your real backup. NOOP's phone-based smart wake (light-sleep detection) is available on the Android app.") + Text(honestyBody) .font(StrandFont.footnote) .foregroundStyle(StrandPalette.textSecondary) .fixedSize(horizontal: false, vertical: true) @@ -231,7 +242,7 @@ struct SmartAlarmView: View { Text("Wake me with a strap buzz") .font(StrandFont.body) .foregroundStyle(StrandPalette.textPrimary) - Text("Arms the strap to buzz at your wake time, even if NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). Keep a backup alarm for anything you truly can't miss.") + Text("Arms the strap to buzz at your wake time, even if NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). On a WHOOP 5/MG this is experimental and only arms while Protocol probes is on (Test Centre → 5/MG protocol diagnostics). Keep a backup alarm for anything you truly can't miss.") .font(StrandFont.footnote) .foregroundStyle(StrandPalette.textTertiary) .fixedSize(horizontal: false, vertical: true) @@ -279,7 +290,7 @@ struct SmartAlarmView: View { // capture + on-device buzz by the capture author); 5/MG remains experimental, so this // gated branch keeps its backup-alarm wording. if model.whoop5Detected && !PuffinExperiment.isEnabled { - Text("WHOOP 5/MG strap alarms require Protocol probes (Test Centre → 5/MG protocol diagnostics). Your wake time is saved, but the strap is not armed yet. Keep a backup alarm.") + Text("WHOOP 5/MG strap alarms require Protocol probes (Test Centre → 5/MG protocol diagnostics). Your wake time is saved, but NOOP does not send it to the strap while Protocol probes is off. An alarm sent earlier may still be set on the strap. Keep a backup alarm.") .font(StrandFont.footnote) .foregroundStyle(StrandPalette.statusWarning) .frame(maxWidth: .infinity, alignment: .leading) @@ -287,7 +298,7 @@ struct SmartAlarmView: View { // 5/MG with Protocol probes ON: the rev-4 command arms the strap. One wake was // captured on an MG (#864) and one reported on a 5.0 without a log (#2464); // neither repeated, so the copy simplifies both to "reported" and promises none. - Text("Armed on the strap with an experimental 5/MG command. Strap-driven wakes have been reported on 5.0 and MG, but are not guaranteed. Keep a backup alarm for anything you cannot miss.") + Text("NOOP sets this on the strap with an experimental 5/MG command whenever the strap connects or you change the alarm. Strap-driven wakes have been reported on 5.0 and MG, but are not guaranteed. Keep a backup alarm for anything you cannot miss.") .font(StrandFont.footnote) .foregroundStyle(StrandPalette.textTertiary) .frame(maxWidth: .infinity, alignment: .leading) diff --git a/Strand/Screens/TestCentreView.swift b/Strand/Screens/TestCentreView.swift index c5adbb48b6..a84e07db1b 100644 --- a/Strand/Screens/TestCentreView.swift +++ b/Strand/Screens/TestCentreView.swift @@ -258,7 +258,7 @@ struct TestCentreView: View { Toggle("Protocol probes", isOn: $puffinExperiments) .toggleStyle(.switch).tint(StrandPalette.accent) - Text("Sends experimental protocol queries and records replies in the strap log. Also enables the experimental 5/MG strap alarm.") + Text("Sends experimental protocol queries and records replies in the strap log. Also allows the experimental 5/MG strap alarm: NOOP sends it the next time the strap connects or you change the alarm. Turning this off does not clear an alarm that is already on the strap.") .font(StrandFont.caption).foregroundStyle(StrandPalette.textTertiary) Divider().overlay(StrandPalette.hairline) diff --git a/Strand/Screens/TodayView.swift b/Strand/Screens/TodayView.swift index 4935abfd9c..b48f51a3f5 100644 --- a/Strand/Screens/TodayView.swift +++ b/Strand/Screens/TodayView.swift @@ -5917,7 +5917,7 @@ enum RecordingState: Equatable { case .recording: return "Your strap is connected and saving data." case .lastSynced: return "Reconnect to pull the latest." case .notRecording: return "Strap not connected. Tap to connect." - case .historyExperimental: return "History sync is experimental on 5.0." + case .historyExperimental: return "History sync is experimental on WHOOP 5.0/MG." case .connectedNoData: return "No live heart rate or synced history yet this session." } } @@ -5932,7 +5932,7 @@ enum RecordingState: Equatable { case .notRecording: return String(localized: "Not recording. Strap not connected. Tap to connect.") case .historyExperimental: - return String(localized: "Connected. History sync is experimental on 5.0.") + return String(localized: "Connected. History sync is experimental on WHOOP 5.0/MG.") case .connectedNoData: return String(localized: "Connected. No live heart rate or synced history yet this session.") } diff --git a/Strand/Screens/VitalSignsSummary.swift b/Strand/Screens/VitalSignsSummary.swift index 1ab041c33e..68c4e38f9f 100644 --- a/Strand/Screens/VitalSignsSummary.swift +++ b/Strand/Screens/VitalSignsSummary.swift @@ -59,7 +59,7 @@ struct BodyVitalReading: Identifiable { // #1636: the secondary reading leads, so it sits directly under the headline value. var parts = secondary.map { [$0] } ?? [] parts.append(Self.dayLabel(day)) - if let sourceText = Self.sourceLabel(source, key: key) { + if let sourceText = Self.sourceLabel(source, key: key, deviationLed: unit.hasPrefix("Δ")) { parts.append(sourceText) } parts.append(stateText) @@ -91,15 +91,17 @@ struct BodyVitalReading: Identifiable { } /// Short provenance word for the caption. The local-cache fallback stays unnamed (previews/tests), - /// and computed skin temp reads "vs baseline" (#622) since that figure is a ±°C nightly deviation. - private static func sourceLabel(_ source: DailyMetricSource?, key: String) -> String? { + /// and computed skin temp reads "vs baseline" (#622) only when the tile shows the ±°C nightly deviation; + /// an absolute-led tile (#1636) is a plain temperature and reads "NOOP computed" like other computed vitals. + private static func sourceLabel(_ source: DailyMetricSource?, key: String, deviationLed: Bool) -> String? { guard let source else { return nil } switch source { case .whoopImport: return String(localized: "WHOOP import") case .noopComputed: - // Live pipeline stores ±°C vs personal baseline (#622) — not absolute wrist °C. - if key == "skin" { return String(localized: "vs baseline") } + // #622: a deviation-led tile names its scale. The absolute °C is stored from night one (#1636), + // so an absolute-led tile has no baseline to name (none exists yet on a calibrating night). + if key == "skin" && deviationLed { return String(localized: "vs baseline") } return String(localized: "NOOP computed") case .appleHealth: return String(localized: "Apple Health") @@ -372,7 +374,7 @@ enum BodyVitalSigns { metricColor: StrandPalette.metricCyan, day: spo2rawRow?.day, source: spo2rawRow?.source, - missingCaption: String(localized: "No raw SpO₂ decode for the night"), + missingCaption: String(localized: "No raw SpO₂ counts (WHOOP 4.0 only)"), sparkline: trail(spo2rawPoints) ), BodyVitalReading( @@ -422,9 +424,10 @@ enum BodyVitalSigns { metricColor: StrandPalette.metricAmber, day: skinRow?.day, source: skinRow?.source, - // #548/#622: empty is often calibrating (needs ~4 nights for ±deviation) or import-less — - // not a silent "broken sensor". Absolute °C still arrives via WHOOP CSV import. - missingCaption: String(localized: "No nightly skin-temp yet — needs ~4 worn nights (or import a WHOOP CSV)"), + // #548/#622: empty means no scored night has a nightly mean yet (no worn, synced sleep) — + // not a silent "broken sensor". The absolute is stored from night one; only the + // ±deviation waits for the baseline. Absolute °C can also arrive via WHOOP CSV import. + missingCaption: String(localized: "No nightly skin-temp yet — wear the strap overnight and let it sync (or import a WHOOP CSV)"), // Keep the trail on the displayed value's kind — absolute °C and ±deviation must not // mix on one sparkline (matches the banding partition above). sparkline: trail(skinSeries.filter { VitalBands.isAbsoluteSkinTemp($0.value) == skinIsAbsolute }), diff --git a/Strand/System/AppChangelog.swift b/Strand/System/AppChangelog.swift index 639f890386..34ac377f97 100644 --- a/Strand/System/AppChangelog.swift +++ b/Strand/System/AppChangelog.swift @@ -2519,8 +2519,8 @@ enum AppChangelog { body: String(localized: "NOOP is a personal, open project: not the WHOOP app, and not affiliated with WHOOP. It reads a strap you own, on your own device. Treat it as a capable work-in-progress rather than a finished product.")), Expectation( icon: "checkmark.seal", - title: String(localized: "WHOOP 4.0 is the supported path"), - body: String(localized: "WHOOP 4.0 is tested and works end to end. WHOOP 5.0/MG is newer: live heart rate works today, but deeper metrics (recovery, strain, sleep) for 5/MG are still being figured out. NOOP always tells you what's live versus still building.")), + title: String(localized: "WHOOP 4.0 is the most tested path"), + body: String(localized: "WHOOP 4.0 is tested and works end to end. WHOOP 5.0/MG is newer: live heart rate and strap history work, and NOOP scores sleep, recovery and strain from them on your device. Some overnight inputs are still incomplete on 5/MG, so its sleep stages are approximate. NOOP always tells you what's live versus still building.")), Expectation( icon: "hourglass", title: String(localized: "Your scores build over a few nights"), diff --git a/Strand/System/DebugDataDiagnostics.swift b/Strand/System/DebugDataDiagnostics.swift index c453e44905..fbf7d36bd8 100644 --- a/Strand/System/DebugDataDiagnostics.swift +++ b/Strand/System/DebugDataDiagnostics.swift @@ -505,7 +505,7 @@ enum DebugDataDiagnostics { // and the refusal logs were corrected in #2484 / #2488 and this line was missed, so a wearer // reading their own strap log was still sent hunting for the old name. lines.append("Model: \(WhoopModel.whoop5mg.displayName) · Protocol probes (Test Centre): " - + (PuffinExperiment.isEnabled ? "on" : "off → firmware alarm NOT armed")) + + (PuffinExperiment.isEnabled ? "on" : "off → NOOP does not arm the firmware alarm (one sent earlier may still be set)")) case .whoop4: lines.append("Model: \(WhoopModel.whoop4.displayName)") case nil: diff --git a/Strand/System/SyncActivityCopy.swift b/Strand/System/SyncActivityCopy.swift index 44ca2efdd7..5a1302597c 100644 --- a/Strand/System/SyncActivityCopy.swift +++ b/Strand/System/SyncActivityCopy.swift @@ -20,7 +20,7 @@ enum SyncActivityCopy { } static func connecting() -> Line { - Line(phase: .connecting, chunks: 0, status: String(localized: "Connecting…"), detail: nil) + Line(phase: .connecting, chunks: 0, status: String(localized: "Waiting for your strap…"), detail: nil) } static func syncing(chunks: Int, pagesBehind: Int?) -> Line { diff --git a/StrandTests/HelloSuppressionTests.swift b/StrandTests/HelloSuppressionTests.swift index 2b036527cc..a7ddad8e4d 100644 --- a/StrandTests/HelloSuppressionTests.swift +++ b/StrandTests/HelloSuppressionTests.swift @@ -121,8 +121,8 @@ final class HelloSuppressionTests: XCTestCase { XCTAssertTrue(hint.contains("tap Connect")) // And it must NOT claim these are unavailable: since #1884 an HR-only night reports both. XCTAssertFalse(hint.contains("HRV and resting heart rate are unavailable")) - // The hint must name what an unbonded strap actually costs, not just history sync: motion, - // skin temperature, SpO2 and respiratory stop, so sleep falls to the HR-only stager. A field log + // The hint must name what an unbonded strap actually costs, not just history sync: motion + // and skin temperature stop, so sleep falls to the HR-only stager. A field log // showed a week of blank Recovery Vitals under the old wording, which pointed only at a feature // the user was not missing. (It used to end "and HRV + resting HR are nulled" — #1884 made that // false, and leaving it here would have contradicted the assertion four lines down.) diff --git a/StrandiOS/App/StrandiOSApp.swift b/StrandiOS/App/StrandiOSApp.swift index d505bc60d3..8cfdf9f1cb 100644 --- a/StrandiOS/App/StrandiOSApp.swift +++ b/StrandiOS/App/StrandiOSApp.swift @@ -354,7 +354,7 @@ struct StrandiOSApp: App { pushLiftActivity() // Only the foreground may start the live heart rate banner: offer it now. liveActivity.appBecameActive() - // End a "Connecting…" sync island whose sync never came, rather than leave it greyed. + // End a "Waiting for your strap…" sync island whose sync never came, rather than leave it greyed. SyncLiveActivityController.shared.reconcile(live: model.live) // Re-arm the strap's smart alarm on foreground: the firmware alarm is a single instant // and iOS can't re-arm it while suspended, so it would otherwise fire once and stop. diff --git a/StrandiOS/System/NOOPAppIntents.swift b/StrandiOS/System/NOOPAppIntents.swift index 41b23aecc8..861bd8d9fe 100644 --- a/StrandiOS/System/NOOPAppIntents.swift +++ b/StrandiOS/System/NOOPAppIntents.swift @@ -88,7 +88,7 @@ struct BuzzStrapIntent: AppIntent { /// The spoken/shown reply reports only what this path observed about the sync starting. /// /// `LiveActivityIntent`, not plain `AppIntent`: that is what lets it START the strap-sync Live Activity -/// (the Dynamic Island "Connecting… / Syncing… N chunks" readout) from the background. A plain intent +/// (the Dynamic Island "Waiting for your strap… / Syncing… N chunks" readout) from the background. A plain intent /// running in a background-launched app is refused by ActivityKit. struct SyncStrapIntent: LiveActivityIntent { static var title: LocalizedStringResource = "Sync Strap" @@ -100,7 +100,7 @@ struct SyncStrapIntent: LiveActivityIntent { switch await AppModel.startStrapSyncFromShortcut() { case .started: return .result(dialog: "Syncing your strap.") case .alreadyRunning: return .result(dialog: "Your strap is already syncing.") - case .willSyncWhenConnected: return .result(dialog: "NOOP is connecting to your strap and will sync as soon as it's ready.") + case .willSyncWhenConnected: return .result(dialog: "Your strap isn't ready to hand over its history yet, so the sync is waiting. It starts if the strap is connected and paired within the next 10 minutes. Open NOOP to see the strap's status.") case .strapNotReady: return .result(dialog: "Your strap isn't connected to NOOP yet, so the sync didn't start.") case .notStarted: return .result(dialog: "NOOP couldn't start the sync. Open NOOP to see the strap log.") } diff --git a/StrandiOS/Widgets/SyncLiveActivityController.swift b/StrandiOS/Widgets/SyncLiveActivityController.swift index ad2c1ad4be..c1702445e0 100644 --- a/StrandiOS/Widgets/SyncLiveActivityController.swift +++ b/StrandiOS/Widgets/SyncLiveActivityController.swift @@ -76,7 +76,7 @@ final class SyncLiveActivityController { } /// The Sync Strap shortcut's entry: may start the activity from the background because the intent is - /// a `LiveActivityIntent`. Shows "Connecting…" until the link is up, or the running sync's state if + /// a `LiveActivityIntent`. Shows "Waiting for your strap…" until the strap can serve history, or the running sync's state if /// one is already going. func startFromShortcut(live: LiveState) { adoptExisting() @@ -84,7 +84,7 @@ final class SyncLiveActivityController { request(state: live.backfilling ? state(syncing(live)) : state(SyncActivityCopy.connecting())) } - /// The shortcut found no model, or asked and nothing started: do not leave a "Connecting…" island up + /// The shortcut found no model, or asked and nothing started: do not leave a "Waiting for your strap…" island up /// for a sync that is not coming. func shortcutDidNotStart() { guard let activity else { return } diff --git a/Tools/i18n/ar_wip.json b/Tools/i18n/ar_wip.json index b649ca0906..e4af7abd22 100644 --- a/Tools/i18n/ar_wip.json +++ b/Tools/i18n/ar_wip.json @@ -1170,8 +1170,7 @@ "ar": "قد يوقف هاتفك (%1$s) التطبيقات العاملة في الخلفية لتوفير البطارية، مما قد يجعل NOOP يفوّت بيانات النوم والتعافي الليلية. اضغط «سماح» لإضافة NOOP إلى الاستثناءات.\\n\\nسيسأل Android «إيقاف تحسين استخدام البطارية؟» وينبّه إلى أن NOOP قد يستنزف البطارية — وهذه صياغته المعتادة لأي تطبيق يُسمح له بالعمل في الخلفية. اضغط «سماح». تُستهلك البطارية في المزامنة الليلية التي فعّلتها بالفعل أعلاه؛ وهذا يمنع Android فقط من قطعها." }, "l10n_add_device_wizard_a_whoop_strap_bonds_to_a_d39bdf4a": { - "en": "A WHOOP strap bonds to a single device. While it\\'s connected to NOOP it won\\'t stream ", - "ar": "يقترن سوار WHOOP بجهاز واحد فقط. وأثناء اتصاله بـ NOOP لن يبثّ " + "en": "A WHOOP strap bonds to a single device. Pairing it with NOOP can take it away from the official WHOOP app, and the other way round. It\\'s reversible: pair it in the other app whenever you want it back." }, "l10n_add_device_wizard_add_61cc55aa": { "en": "Add", @@ -1338,8 +1337,7 @@ "ar": "تعذّر الاستحواذ على هذا الخاتم." }, "l10n_add_device_wizard_whoop_5_0_mg_support_is_e452e686": { - "en": "WHOOP 5.0 / MG support is newer and still experimental in NOOP.", - "ar": "دعم WHOOP 5.0 / MG أحدث وما زال تجريبيًا في NOOP." + "en": "WHOOP 5.0 / MG supports live data and strap history. Protocol-research tools are available separately in Test Centre." }, "l10n_add_device_wizard_whoop_is_noop_s_primary_fully_ac6fa33b": { "en": "WHOOP is NOOP\\'s primary, fully-supported band. Other heart-rate straps stream live heart rate and HRV, but not WHOOP\\'s deeper sleep and recovery data.", @@ -2342,8 +2340,7 @@ "ar": "مراجعة الأسبوع صادقة بشأن أسبوع غير مكتمل" }, "l10n_app_changelog_whoop_4_0_is_the_supported_16893d9d": { - "en": "WHOOP 4.0 is the supported path", - "ar": "‏WHOOP 4.0 هو المسار المدعوم" + "en": "WHOOP 4.0 is the most tested path" }, "l10n_app_changelog_whoop_5_0_history_decoding_comes_a8848386": { "en": "WHOOP 5.0 history decoding comes to Android", @@ -3166,8 +3163,7 @@ "ar": "لا يتصل؟ راجع هذه الخطوات" }, "l10n_connection_help_your_strap_is_connected_and_we_8ab98ac6": { - "en": "Your strap is connected and we\\'re trying an experimental handshake to bring up live ", - "ar": "سوارك متصل ونحن نجرّب مصافحة تجريبية لتشغيل البث المباشر " + "en": "Your strap is connected and we\\'re trying an experimental handshake to bring up live heart rate from the standard profile. This isn\\'t verified on 5/MG hardware yet, so HR may or may not appear, and some 5/MG overnight inputs are still incomplete, so sleep stages are approximate. Nothing\\'s wrong with your strap - WHOOP 4.0 is fully supported." }, "l10n_coupled_screen_calibrating_calibrationnights_of_baselines_minnightsseed_nights_1a7e8f8e": { "en": "Calibrating, %1$s of %2$s nights", @@ -3370,8 +3366,7 @@ "ar": "نتيجة فحص البطارية (#592)" }, "l10n_devices_screen_battery_probe_explainer_2858bb6a": { - "en": "Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and dumps the strap\\'s full raw reply to the strap log. A battery-style payload confirms 98 on your firmware; a short stub means it stays ambiguous. Nothing is written to the strap. Please export and share the strap log afterwards.", - "ar": "تختلف جدولان مستقلان للبروتوكول حول رمز البطارية الممتد (98 مقابل 87). يرسل هذا الأمر 98 للقراءة فقط ويكتب رد السوار الخام الكامل في سجل السوار. الرد بصيغة بطارية يؤكد 98 على برنامجك الثابت؛ والرد المختصر يعني بقاء الأمر ملتبسًا. لا يُكتب شيء على السوار. يُرجى تصدير سجل السوار ومشاركته بعد ذلك." + "en": "Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and shows the strap\\'s full raw reply (also written to the strap log). On a WHOOP 4.0 a battery-style payload confirms 98 on your firmware and the result decodes the pack voltage; a short stub means it stays ambiguous. On a WHOOP 5/MG, 98 is not where the pack\\'s charge comes from (that is the battery-pack reading, command 151), NOOP decodes no value from the reply, and the line to read is \\'Result code\\': UNSUPPORTED means this firmware rejects 98. Nothing is written to the strap. Please export and share the strap log afterwards." }, "l10n_devices_screen_body_location_probe_690_re_7def8c39": { "en": "Body-location probe (#690 RE)…", @@ -3842,8 +3837,7 @@ "ar": "يخزّن سوارك القنوات الضوئية الخام، لكن NOOP لا يحوّلها إلى نسبة أكسجين في الدم، لذا يبقى هذا فارغًا مهما طال ارتداؤك له. استورد ملف تصدير WHOOP في «مصادر البيانات» لملئه من سجل حسابك." }, "l10n_health_screen_your_strap_reports_a_blood_oxygen_349fe34a": { - "en": "Your strap reports a blood oxygen estimate, but it is unverified and off by default. Turn on the strap estimate in Settings to see it, or import a WHOOP export in Data Sources for the calibrated value.", - "ar": "يسجّل سوارك تقديرًا لأكسجين الدم، لكنه غير متحقق منه ومعطّل افتراضيًا. فعّل تقدير السوار في الإعدادات لرؤيته، أو استورد ملف تصدير WHOOP في «مصادر البيانات» للقيمة المعايرة." + "en": "Your strap reports a blood oxygen estimate, but it is unverified and off by default. To see it, turn on \\\"Blood Oxygen: strap estimate\\\" in Settings → Advanced → Diagnostics, or import a WHOOP export in Data Sources for the calibrated value." }, "l10n_how_noop_works_screen_close_bbfa773e": { "en": "Close", @@ -4414,8 +4408,7 @@ "ar": "اهتزاز" }, "l10n_live_screen_can_t_connect_your_strap_s_cf78be83": { - "en": "Can\\'t connect - your strap\\'s pairing was reset", - "ar": "تعذّر الاتصال — أُعيد ضبط اقتران سوارك" + "en": "Your strap needs help to reconnect - steps below" }, "l10n_live_screen_charging_5f99fe21": { "en": "Charging", @@ -4506,8 +4499,7 @@ "ar": "المنطقة العليا" }, "l10n_live_screen_whoop_5_0_mg_pairs_with_b93143f2": { - "en": "WHOOP 5.0/MG pairs with one app at a time. If a scan finds nothing, unpair it in ", - "ar": "يقترن WHOOP 5.0/MG بتطبيق واحد في كل مرة. إذا لم يجد البحث شيئًا، فألغِ اقترانه في " + "en": "WHOOP 5.0/MG pairs with one app at a time. If a scan finds nothing, unpair it in the official WHOOP app and fully close that app, then Connect again." }, "l10n_live_screen_zone_zone_b8e9c0f9": { "en": "ZONE %1$s", diff --git a/Tools/i18n_audit_baseline.json b/Tools/i18n_audit_baseline.json index 0d2602780a..3cd3307f91 100644 --- a/Tools/i18n_audit_baseline.json +++ b/Tools/i18n_audit_baseline.json @@ -232,10 +232,6 @@ "android/app/src/main/java/com/noop/ui/HealthScreen.kt", "Live heart rate over time, no data" ], - [ - "android/app/src/main/java/com/noop/ui/HealthScreen.kt", - "Pairing…" - ], [ "android/app/src/main/java/com/noop/ui/HealthScreen.kt", "Ready to sync" @@ -1194,10 +1190,6 @@ "Strand/Screens/FullDayChartView.swift", "Pinch to zoom · drag to pan · hold to read" ], - [ - "Strand/Screens/FullDayChartView.swift", - "This strap doesn’t send SpO₂ over Bluetooth. Import a WHOOP export or Health Connect to see it." - ], [ "Strand/Screens/FullDayChartView.swift", "This strap sends no raw respiration stream. Your estimated respiratory rate appears on the Health screen." @@ -1440,7 +1432,7 @@ ], [ "Strand/Screens/SettingsView.swift", - "Your WHOOP 5.0/MG sends a strap-computed SpO₂ percentage (the @82 candidate byte) every second — an 8-night independent validation tracked it at corr +0.99 against the WHOOP app, but two nights on the original test device moved the OPPOSITE direction, so device/firmware variance is unresolved. An Oura ring's own SpO₂ reading runs high on the wire (over 100% on a fifth to a half of samples on a clean night); this instead surfaces the ring's mean with each sample capped at 100% first, which has matched the Oura app's own displayed value on every full night checked against it so far, though only a few nights. Turning this on surfaces whichever applies to your device as \\\"strap estimate (unverified)\\\" in the Blood Oxygen tile when no calibrated import exists. It never feeds recovery or illness scoring. WHOOP 4.0 has no @82 stream, so this does nothing there." + "Your WHOOP 5.0/MG sends a strap-computed SpO₂ percentage (the @82 candidate byte) every second while you sleep — an 8-night independent validation tracked it at corr +0.99 against the WHOOP app, but two nights on the original test device moved the OPPOSITE direction, so device/firmware variance is unresolved. An Oura ring's own SpO₂ reading runs high on the wire (over 100% on a fifth to a half of samples on a clean night); this instead surfaces the ring's mean with each sample capped at 100% first, which has matched the Oura app's own displayed value on every full night checked against it so far, though only a few nights. Turning this on surfaces whichever applies to your device as \\\"strap estimate (unverified)\\\" in the Blood Oxygen tile when no calibrated import exists. It never feeds recovery or illness scoring. WHOOP 4.0 has no @82 stream, so this does nothing there." ], [ "Strand/Screens/SettingsView.swift", @@ -1630,10 +1622,6 @@ "Strand/Screens/TrendsView.swift", "Opens the full \\(accessibilityTitle) metric." ], - [ - "Strand/Screens/VitalSignsSummary.swift", - "No raw SpO₂ decode for the night" - ], [ "Strand/Screens/VitalSignsSummary.swift", "Raw SpO₂" diff --git a/Tools/linux-capture/README.md b/Tools/linux-capture/README.md index 44c9afb08a..374368f8ba 100644 --- a/Tools/linux-capture/README.md +++ b/Tools/linux-capture/README.md @@ -459,12 +459,13 @@ $BIN --json capture.json # machine-readable, for piping into your own $BIN --family whoop5 --hex aa0108000001e67123019101363e5c8d # one frame ad hoc ``` -## Import into the noop Android app +## Android app import (not yet in the UI) -The noop Android app's **Data Sources → "Raw capture (.json)"** reads the same `capture.json` this -tool emits and decodes its frames on-device (HR / RR / gravity / …) through the *same* historical -decoder a live BLE offload uses — so history captured here on Linux lands in the app exactly as if the -phone had synced it. Produce one file per device: +The noop Android app contains an importer (`CaptureImporter`) for the same `capture.json` this tool +emits (WHOOP 4.0 or 5/MG frames). It decodes frames through the same historical decoder a live BLE +offload uses, but it is **not yet exposed in the app**: Data Sources has no raw-capture import, so +there is currently no in-app way to load the file. Until it is, decode a capture with `whoop-decode` +(above) or `whoop_sync.py decode`. The export command is (one file per device): ```bash .venv/bin/python whoop_sync.py export \ @@ -472,8 +473,7 @@ phone had synced it. Produce one file per device: ``` **What `capture.json` is.** It is simply your strap's history saved as one file. `sync` already pulled -the data off your strap and stored it; `export` just writes a copy of it for one strap into a file the -phone app can open. Your data isn't changed or re-processed on the way out — the app does all the +the data off your strap and stored it; `export` just writes a copy of it for one strap into a single file. Your data isn't changed or re-processed on the way out — the app does all the decoding (heart rate, sleep, and so on) itself, so the file works the same whether you make it here or the phone captured it directly. @@ -482,12 +482,10 @@ If you want a smaller file, two optional flags narrow it down: - `--only-type 47` — just the main once-per-second records. - `--since ` — only data newer than a given moment. -Then transfer `capture.json` to your phone (any file transfer works), open NOOP, and pick it from -**Data Sources → Raw capture**. Importing the same file twice is safe — NOOP skips anything it already -has — so you can re-run it without making duplicates. Export one file per strap; a file is normally a -single strap, but a mixed one still imports fine. The phone treats the file as untrusted input (size + -frame-count bounded, malformed rows skipped), so a stray or corrupt file is rejected cleanly rather -than crashing the import. +Once the app exposes the importer, the file can be transferred to the phone (any file transfer works) +and imported there. Until then, decode it on the desktop with `whoop-decode` (above). The importer is +written to treat the file as untrusted input (size and frame-count bounded, malformed rows skipped), +and importing the same file twice is designed to be safe (rows are natural-key deduped). ## Troubleshooting diff --git a/android/app/src/main/java/com/noop/analytics/SpotHrvReading.kt b/android/app/src/main/java/com/noop/analytics/SpotHrvReading.kt index e5b64d2113..271b9a3cb3 100644 --- a/android/app/src/main/java/com/noop/analytics/SpotHrvReading.kt +++ b/android/app/src/main/java/com/noop/analytics/SpotHrvReading.kt @@ -22,8 +22,8 @@ package com.noop.analytics * result is [Insufficient] with the surviving/needed counts so the UI can say so plainly (never a * fabricated value, unknown stays "—"). * - The caveat ([caveatFor]) is source-aware: a 60 s spot reading is not the overnight baseline, it - * needs enough beats, and R-R derived from a WHOOP 5/MG's optical PPG is noisier than a chest strap's - * electrical R-R. Pure strings, US-neutral, no em-dashes. + * needs enough beats, and R-R derived from a WHOOP strap's optical PPG (4.0, 5.0 or MG) is noisier than + * an electrical chest strap's R-R. Pure strings, US-neutral, no em-dashes. * * Pure arithmetic + small data holders, no I/O — fully unit-testable against a known RR series. */ @@ -31,10 +31,10 @@ object SpotHrvReading { /** Where the live R-R intervals came from — drives the honesty caveat (optical PPG is noisier). */ enum class Source { - /** WHOOP 5/MG: R-R is derived from the optical PPG waveform — beat-to-beat, but noisier. */ + /** Any WHOOP strap (4.0, 5.0, MG): R-R from the optical PPG via 0x2A37 — beat-to-beat, but noisier. */ OPTICAL_PPG, - /** WHOOP 4 or a chest strap (e.g. Polar H10) over the standard 0x2A37 profile — electrical R-R. */ + /** An electrical chest strap (e.g. Polar H10) over the standard 0x2A37 profile — electrical R-R. */ CHEST_STRAP, /** Source not known (generic / unspecified strap). */ @@ -104,8 +104,8 @@ object SpotHrvReading { "only a reading with enough clean beats is shown." return when (source) { Source.OPTICAL_PPG -> - base + " On a WHOOP 5.0/MG the intervals come from the optical pulse signal, which is " + - "noisier than a chest strap, so treat the number as a rough estimate." + base + " On a WHOOP strap (4.0, 5.0 or MG) the intervals come from the optical pulse signal, which is " + + "noisier than an electrical chest strap such as a Polar H10, so treat the number as a rough estimate." Source.CHEST_STRAP, Source.UNKNOWN -> base } } diff --git a/android/app/src/main/java/com/noop/ble/BondRefusalGiveUp.kt b/android/app/src/main/java/com/noop/ble/BondRefusalGiveUp.kt index 3accb9b4f9..48ea975be1 100644 --- a/android/app/src/main/java/com/noop/ble/BondRefusalGiveUp.kt +++ b/android/app/src/main/java/com/noop/ble/BondRefusalGiveUp.kt @@ -105,8 +105,8 @@ class BondRefusalGiveUp( fun helloSuppressedHint(): String = "The secure handshake with your strap never completes, and the attempt itself is what drops t" + "he link. NOOP has switched it off for this strap so live heart rate keeps streaming. History" + - " sync stays unavailable until it pairs, and so do motion, skin temperature, SpO₂ and respira" + - "tory rate, so sleep is staged from heart rate alone. Some straps have paired again after bei" + + " sync stays unavailable until it pairs, and so do motion and skin temperature, so sleep is " + + "staged from heart rate alone. Some straps have paired again after bei" + "ng put in pairing mode. Tap until the LEDs flash blue, then tap Connect." /** diff --git a/android/app/src/main/java/com/noop/ble/WhoopBleClient.kt b/android/app/src/main/java/com/noop/ble/WhoopBleClient.kt index 8fd7e63730..95d1c23ced 100644 --- a/android/app/src/main/java/com/noop/ble/WhoopBleClient.kt +++ b/android/app/src/main/java/com/noop/ble/WhoopBleClient.kt @@ -1160,14 +1160,16 @@ class WhoopBleClient( * to another app. Mirrors the iOS BLEManager streak>=2 gate. */ private const val BOND_REFUSAL_HINT_THRESHOLD = 2 - /** Concrete pairing-mode guidance for a WHOOP 5/MG that keeps refusing the encrypted bond because - * it's still bonded to the official WHOOP app (#78). Plain, country-neutral wording; Android - * settings path. Parity with the macOS pairingHint text. */ + /** Concrete pairing-mode guidance for a WHOOP 5/MG that keeps refusing the encrypted bond (#78). + * Names the two likely causes (held by the official WHOOP app, or this phone holding an old + * pairing) without asserting either, the same hedge as BondRefusalGiveUp.pausedHint. Plain, + * country-neutral wording; Android settings path. */ private const val PAIRING_HINT_TEXT = - "Your WHOOP won't pair because it's still bonded to the official WHOOP app. To fix it: " + + "NOOP can see your strap but it's refusing to pair. It is likely still held by the official " + + "WHOOP app, or your phone is holding an old pairing. To fix it: " + "1. Close the official WHOOP app (or turn off Bluetooth on that phone). " + - "2. Hold or tap the band until its LEDs flash blue (pairing mode). " + - "3. Open Settings > Bluetooth, find your WHOOP, and choose Forget This Device. " + + "2. Tap the band repeatedly until its LEDs flash blue (pairing mode). " + + "3. Open Settings → Bluetooth, find your WHOOP, and Forget / Unpair it. " + "Then come back and tap Connect." /** 5/MG raw-capture file (app filesDir; shared via Settings → "Share 5/MG capture"). */ @@ -1619,7 +1621,7 @@ class WhoopBleClient( } val verdict = when { resultCode == 3 -> "opcode 98 REJECTED by firmware (UNSUPPORTED) — evidence for the decompile's 87" - hasPayload -> "opcode 98 ACCEPTED — ${pay.size}-byte payload" + hasPayload -> "opcode 98 answered — ${pay.size}-byte payload (not a success verdict; see the bytes below)" else -> "opcode 98 answered with a bare stub — ambiguous" } @@ -1787,7 +1789,8 @@ class WhoopBleClient( sb.append("DID NOT DECODE as a 151 SUCCESS response at this offset.\n") sb.append("Either the reply is not a 151 response, or its result byte is not SUCCESS, or\n") sb.append("the frame is shorter than the candidate layout needs. The raw hex above is the\n") - sb.append("evidence — the opcode may be right and the OFFSETS wrong.") + sb.append("evidence — the opcode may be right and the OFFSETS wrong.\n") + sb.append("On WHOOP MG firmware 50.39.1.0 a FAILURE result here is the known answer, with or without a pack attached; on its own it does not mean the offsets are wrong.") return sb.toString() } if (!info.present) { @@ -1865,7 +1868,7 @@ class WhoopBleClient( } val verdict = when { resultCode == 3 -> "opcode 84 REJECTED by firmware (UNSUPPORTED)" - hasPayload -> "opcode 84 ACCEPTED — ${pay.size}-byte payload" + hasPayload -> "opcode 84 answered — ${pay.size}-byte payload (not a success verdict; see the bytes below)" else -> "opcode 84 answered with a bare stub — ambiguous" } @@ -4873,8 +4876,8 @@ class WhoopBleClient( // what settles whether the frame was accepted. if (connectedFamily == DeviceFamily.WHOOP5) { if (!testCentre.active(com.noop.testcentre.TestDomain.CONNECTION)) { - _state.update { it.copy(renameStatus = "5/MG renaming is experimental. Turn on Test Centre, Connection first.") } - log("Strap rename: 5/MG write refused, Test Centre Connection is off (#2338)") + _state.update { it.copy(renameStatus = "5/MG renaming is experimental. Turn on Connection & Sync in Test Centre first.") } + log("Strap rename: 5/MG write refused, Test Centre Connection & Sync is off (#2338)") return } if (!_state.value.connected || !_state.value.bonded) { @@ -5119,7 +5122,11 @@ class WhoopBleClient( val msg = "Advertising-name probe: no COMMAND_RESPONSE for opcode 141 within " + "${ADVERTISING_NAME_PROBE_TIMEOUT_MS / 1000}s — the strap served no reply. That is the " + "answer for now: renaming stays WHOOP 4.0 only (#2338)." - if (_advertisingNameProbe.compareAndSet(WAITING_ADVERTISING_NAME_PROBE, msg)) log(msg) + // The strap log keeps the opcode-level text; the Settings line gets plain wording that does not + // claim renaming is 4.0-only (it sits beside the 5/MG Rename button). + val shown = "No reply from the strap within ${ADVERTISING_NAME_PROBE_TIMEOUT_MS / 1000} s. " + + "This strap may not support reading its name yet." + if (_advertisingNameProbe.compareAndSet(WAITING_ADVERTISING_NAME_PROBE, shown)) log(msg) }, ADVERTISING_NAME_PROBE_TIMEOUT_MS) } @@ -5223,7 +5230,7 @@ class WhoopBleClient( */ private fun ecgGatesAllow(requiresOptIn: Boolean = true): Boolean { if (requiresOptIn && !puffinExperiment.ecgEnabled) { - log("ECG probe: ignored — the Experimental ECG opt-in is off") + log("ECG probe: ignored — turn on 'WHOOP MG ECG turn-on probe' in Test Centre → 5/MG protocol diagnostics first") return false } if (!whoop5Variant().isMG) { @@ -5517,7 +5524,7 @@ class WhoopBleClient( // this guard is not merely belt-and-braces on every family — for the family most likely to run // this first, it is the belt. if (!testCentre.active(com.noop.testcentre.TestDomain.CONNECTION)) { - log("Feature-flag probe (#761) ignored — Test Centre → Connection is off") + log("Feature-flag probe (#761) ignored — Test Centre → Connection & Sync is off") return } if (featureFlagReport != null) { @@ -5587,7 +5594,7 @@ class WhoopBleClient( // Defence in depth: the menu entry is already Test-Centre gated, but the sender re-checks so no // other path can start a probe on a default install (twin of the macOS guard). if (!testCentre.active(com.noop.testcentre.TestDomain.CONNECTION)) { - log("Device-config read probe (#103) ignored — Test Centre → Connection is off") + log("Device-config read probe (#103) ignored — Test Centre → Connection & Sync is off") return } if (deviceConfigReport != null) { @@ -7130,9 +7137,9 @@ class WhoopBleClient( if (_state.value.pairingHint == null) { log("WHOOP 5/MG: encrypted bond refused $bondRefusalStreak times — surfacing pairing guidance (#78)") } - // PAIRING_HINT_TEXT names a specific cause (still bonded to the official app). Only an auth - // refusal is evidence for that; an unanswered handshake is not, so it waits for the give-up's - // honest paused hint rather than being told to close an app that may be irrelevant. + // PAIRING_HINT_TEXT names two likely causes (held by the official app, or an old phone pairing). + // Only an auth refusal is evidence for that; an unanswered handshake is not, so it waits for the + // give-up's honest paused hint rather than being told to close an app that may be irrelevant. if (authRefusal) { _state.update { it.copy(pairingHint = PAIRING_HINT_TEXT, statusNote = PAIRING_HINT_TEXT) } } @@ -7591,8 +7598,9 @@ class WhoopBleClient( _state.update { it.copy( whoop5Detected = true, statusNote = "WHOOP 5/MG connected - experimental. After bonding, NOOP brings up live " + - "heart rate from the strap's realtime stream. Deeper metrics (recovery, strain, " + - "sleep) for 5/MG are still being figured out. WHOOP 4.0 is fully supported today.", + "heart rate from the strap's realtime stream and scores sleep, recovery and strain " + + "from what it syncs; 5/MG sleep stages are approximate while some overnight inputs " + + "are incomplete.", ) } cmdCharacteristic = whoop5.getCharacteristic(WHOOP5_CMD_WRITE_CHAR) // #1635: dump what the strap actually OFFERS, once per strap. Every characteristic in this @@ -9767,7 +9775,7 @@ class WhoopBleClient( log("ECG gate (#891): needs a WHOOP 5/MG strap — ignored."); return } if (!puffinExperiment.ecgRawData) { - log("ECG gate (#891): the experiment is off — enable it in Settings → Experimental first.") + log("ECG gate (#891): the experiment is off — turn on 'WHOOP MG ECG raw-data gate' in Test Centre → 5/MG protocol diagnostics first.") return } val variant = whoop5Variant() @@ -9860,7 +9868,7 @@ class WhoopBleClient( log("Deep-data: needs a WHOOP 5.0/MG strap — ignored."); return } if (!puffinExperiment.isDeepDataEnabled) { - log("Deep-data: the deep-data experiment is off — enable it in Settings first."); return + log("Deep-data: the deep-data experiment is off — turn on 'Legacy R22 feature-flag experiment' in Test Centre → 5/MG protocol diagnostics first."); return } val s = _state.value if (!s.connected || !s.encryptedBond) { diff --git a/android/app/src/main/java/com/noop/testcentre/AndroidDiagnostics.kt b/android/app/src/main/java/com/noop/testcentre/AndroidDiagnostics.kt index 9c289762fb..2bbd24ee7d 100644 --- a/android/app/src/main/java/com/noop/testcentre/AndroidDiagnostics.kt +++ b/android/app/src/main/java/com/noop/testcentre/AndroidDiagnostics.kt @@ -628,7 +628,7 @@ object AndroidDiagnostics { add( "Model: ${com.noop.ble.WhoopModel.WHOOP5_MG.displayName} · " + "Protocol probes (Test Centre): " + - if (exp) "on" else "off → firmware alarm NOT armed", + if (exp) "on" else "off → NOOP does not arm the firmware alarm (one sent earlier may still be set)", ) } com.noop.ble.WhoopModel.WHOOP4 -> add("Model: ${com.noop.ble.WhoopModel.WHOOP4.displayName}") diff --git a/android/app/src/main/java/com/noop/ui/AddDeviceWizard.kt b/android/app/src/main/java/com/noop/ui/AddDeviceWizard.kt index bf3d5a9c72..87bc02e634 100644 --- a/android/app/src/main/java/com/noop/ui/AddDeviceWizard.kt +++ b/android/app/src/main/java/com/noop/ui/AddDeviceWizard.kt @@ -923,7 +923,7 @@ private fun prepInstructions(type: DeviceType): List = when (type) { ) DeviceType.Whoop5MG -> listOf( "WHOOP 5.0 / MG bonds to one device at a time, so unpair it from the official WHOOP app first.", - "Put the band into pairing mode, on your wrist and awake.", + "Put the band into pairing mode: tap it repeatedly (firm taps on the sensor) until its LEDs flash blue. Keep it on your wrist and awake.", "NOOP will look for it nearby.", ) DeviceType.HrStrap -> listOf( diff --git a/android/app/src/main/java/com/noop/ui/DevicesScreen.kt b/android/app/src/main/java/com/noop/ui/DevicesScreen.kt index 1019df3dbb..e5028b4275 100644 --- a/android/app/src/main/java/com/noop/ui/DevicesScreen.kt +++ b/android/app/src/main/java/com/noop/ui/DevicesScreen.kt @@ -1821,10 +1821,13 @@ private fun deviceProfile(device: PairedDeviceRow): DeviceCapabilityProfile { if (model.contains("5") || model.contains("mg")) { return DeviceCapabilityProfile( displayModel = "WHOOP 5.0 / MG", - captures = "Heart rate · HRV · Skin temp* · Resp rate* · Steps* · Sleep · Strain · Battery", + captures = "Heart rate · HRV · Skin temp · Resp rate* · Steps* · Sleep · Strain · Battery", powers = whoopPowers, - footnote = "* on-device estimate: skin temp is a nightly ±°C deviation, steps are a raw " + - "motion count (#78). No SpO₂ % off the strap; import a WHOOP CSV for a real %.", + footnote = "* on-device estimate: respiratory rate is derived from beat-to-beat data, and steps " + + "count the strap's motion counter only while it reports walking or running, scaled by " + + "your Step calibration. Skin temp is measured nightly (°C, or vs your baseline). No " + + "verified SpO₂ % off the strap: an unverified estimate is opt-in via “Blood Oxygen: " + + "strap estimate”; import a WHOOP CSV for a real %.", ) } // WHOOP 4.0 — NOOP's primary band; no steps over BLE. @@ -1833,8 +1836,9 @@ private fun deviceProfile(device: PairedDeviceRow): DeviceCapabilityProfile { displayModel = "WHOOP 4.0", captures = "Heart rate · HRV · Skin temp* · Resp rate* · Sleep · Strain · Battery", powers = whoopPowers, - footnote = "* on-device estimate: skin temp is a nightly ±°C deviation (firmware-dependent); " + - "no steps over BLE on a 4.0. No SpO₂ % off the strap; import a WHOOP CSV for a real %.", + footnote = "* on-device estimate: skin temp is measured nightly (firmware-dependent; °C, or vs " + + "your baseline); no steps over BLE on a 4.0. No SpO₂ % off the strap; import a WHOOP " + + "CSV for a real %.", ) } // Legacy / unknown WHOOP (the seeded device, model just "WHOOP") — show only the common-to-all set. diff --git a/android/app/src/main/java/com/noop/ui/HealthScreen.kt b/android/app/src/main/java/com/noop/ui/HealthScreen.kt index 93aec86fe8..cae76eee82 100644 --- a/android/app/src/main/java/com/noop/ui/HealthScreen.kt +++ b/android/app/src/main/java/com/noop/ui/HealthScreen.kt @@ -285,7 +285,7 @@ private fun SyncStatusSection(vm: AppViewModel, onSyncNow: () -> Unit) { SectionHeader( "Sync", overline = "Strap history", - trailing = if (live.connected) (if (live.bonded) "Connected" else "Pairing…") else "Offline", + trailing = if (live.connected) "Connected" else "Offline", ) NoopCard(tint = Palette.chargeColor) { @@ -315,7 +315,7 @@ private fun SyncStatusSection(vm: AppViewModel, onSyncNow: () -> Unit) { // sync", not pulsing, directly above a DISABLED Sync now — on exactly the strap // that cannot sync. Before the button was gated the two agreed (both wrong); // gating one without the other is what made them contradict. - title = if (live.historyReady) "Ready to sync" else "Pairing…", + title = if (live.historyReady) "Ready to sync" else uiString(R.string.health_sync_pill_not_fully_paired), tone = StrandTone.Accent, showsDot = true, pulsing = !live.historyReady, @@ -339,6 +339,8 @@ private fun SyncStatusSection(vm: AppViewModel, onSyncNow: () -> Unit) { "for the next automatic sync." } else if (live.backfilling) { "Sync now. A sync is already in progress." + } else if (live.connected) { + uiString(R.string.health_sync_hint_needs_full_pairing) } else { "Sync now. Connect your strap first." } @@ -368,7 +370,8 @@ private fun syncHelperText(live: LiveState): String = when { // handshake fell through to the "syncs right away" line, directly under a Sync-now button that had // just been disabled. Same condition as the button and the card title, so all three agree. !live.historyReady -> - "Finishing the pairing handshake. Sync now becomes available once the strap is paired." + "Sync now needs the strap's full secure pairing, which hasn't completed. Until it does, the " + + "strap can't hand over its stored history." else -> "Syncs your strap's stored history right away, instead of waiting for the next automatic sync." } diff --git a/android/app/src/main/java/com/noop/ui/HealthVitalsLogic.kt b/android/app/src/main/java/com/noop/ui/HealthVitalsLogic.kt index c2d5e70c8c..74e94d30fe 100644 --- a/android/app/src/main/java/com/noop/ui/HealthVitalsLogic.kt +++ b/android/app/src/main/java/com/noop/ui/HealthVitalsLogic.kt @@ -395,7 +395,7 @@ internal fun vitalsFor( // full u16 span just keeps the tile cyan (never "off range"); `stateCaption` labels it // uncalibrated, so we never assert an in/out-of-range clinical judgment on raw sensor data. key = "spo2raw", label = uiString(R.string.l10n_health_screen_raw_spo_ccfe80c1), unit = "ADC", - missingCaption = "No raw SpO₂ decode for the night", + missingCaption = uiString(R.string.l10n_health_screen_no_raw_spo2_counts_4_0_only), value = d?.let(spo2RawMean), format = { String.format("%.0f", it) }, deltaText = deltaText(d?.let(spo2RawMean), previous(spo2RawMean), decimals = 0), readingDay = todayKey, @@ -444,7 +444,7 @@ internal fun vitalsFor( ), Vital( key = "skin", label = skinTitle, unit = skinUnitLabel, - // #548/#622: empty is often calibrating (~4 nights for ±deviation) or import-less — not a + // #548/#622: calibration only withholds the ± deviation; an empty tile means no worn, scored night yet or no import — not a // silent broken sensor. Absolute °C still arrives via WHOOP CSV / Health Connect import. missingCaption = uiString(R.string.skin_temp_missing_caption), value = skin, format = skinFormat, diff --git a/android/app/src/main/java/com/noop/ui/HrvSnapshotScreen.kt b/android/app/src/main/java/com/noop/ui/HrvSnapshotScreen.kt index 648608767b..0ed642d9a5 100644 --- a/android/app/src/main/java/com/noop/ui/HrvSnapshotScreen.kt +++ b/android/app/src/main/java/com/noop/ui/HrvSnapshotScreen.kt @@ -318,7 +318,7 @@ fun HrvSnapshotScreen( item { ResultCard(done) } } - // Methodology — source-aware caveat (a 5/MG's R-R is optical PPG, noisier than a chest strap). + // Methodology — source-aware caveat (a WHOOP strap's R-R is optical PPG, noisier than an electrical chest strap). // The same RMSSD math the nightly HRV uses (Task Force 1996, cleaned), so the spot number is // comparable to your overnight figure. item { diff --git a/android/app/src/main/java/com/noop/ui/LiveScreen.kt b/android/app/src/main/java/com/noop/ui/LiveScreen.kt index 8973835a8c..73f376a908 100644 --- a/android/app/src/main/java/com/noop/ui/LiveScreen.kt +++ b/android/app/src/main/java/com/noop/ui/LiveScreen.kt @@ -188,12 +188,11 @@ fun LiveScreen(viewModel: AppViewModel, onManageDevices: () -> Unit = {}) { onDismissRequest = { showHrvSnapshot = false }, properties = DialogProperties(usePlatformDefaultWidth = false), ) { - // Tell the reading where its R-R is coming from so the caveat is honest: a WHOOP 5/MG derives - // R-R from the optical pulse signal (noisier) while a WHOOP 4 / chest strap is electrical R-R. - // Driven off the picked strap model. + // Tell the reading where its R-R is coming from so the caveat is honest: every WHOOP strap + // (4.0, 5.0, MG) derives R-R from the optical pulse signal (noisier than an electrical chest + // strap). Driven off the picked strap model. val hrvSource = when (selectedModel) { - WhoopModel.WHOOP5_MG -> SpotHrvReading.Source.OPTICAL_PPG - WhoopModel.WHOOP4 -> SpotHrvReading.Source.CHEST_STRAP + WhoopModel.WHOOP5_MG, WhoopModel.WHOOP4 -> SpotHrvReading.Source.OPTICAL_PPG } HrvSnapshotScreen( viewModel = viewModel, diff --git a/android/app/src/main/java/com/noop/ui/LogExport.kt b/android/app/src/main/java/com/noop/ui/LogExport.kt index 76977d3a79..73b1220f72 100644 --- a/android/app/src/main/java/com/noop/ui/LogExport.kt +++ b/android/app/src/main/java/com/noop/ui/LogExport.kt @@ -453,7 +453,7 @@ object LogExport { !whoop5Connected -> "Raw capture records WHOOP 5/MG history syncs and doesn't apply to WHOOP 4.0 (already fully decoded).$tail" !captureEnabled -> - "No raw capture yet. Turn on \"Record 5/MG raw capture\" above, then let a history sync run.$tail" + "No raw capture yet. Turn on \"Passive history/protocol trace\" above, then let a history sync run.$tail" // #1635: do NOT tell someone to wait for a history sync their strap cannot reach. Without the // encrypted bond there is no puffin channel and no offload, so "let a sync run" names a remedy // that will never arrive — the same confidently-wrong guidance this issue kept producing. diff --git a/android/app/src/main/java/com/noop/ui/NoopLimitationsScreen.kt b/android/app/src/main/java/com/noop/ui/NoopLimitationsScreen.kt index fd3710ddb1..df7cd43740 100644 --- a/android/app/src/main/java/com/noop/ui/NoopLimitationsScreen.kt +++ b/android/app/src/main/java/com/noop/ui/NoopLimitationsScreen.kt @@ -110,7 +110,7 @@ private fun LegendCard() { Overline("Legend") LegendRow(LimitState.FULL, "Read live off the strap") LegendRow(LimitState.PARTIAL, "On-device estimate, or experimental / firmware-gated") - LegendRow(LimitState.NONE, "Not from the strap. SpO₂ can be filled by importing a WHOOP or Health export.") + LegendRow(LimitState.NONE, "No verified value from the strap. A verified SpO₂ % comes from importing a WHOOP or Health export.") } } } diff --git a/android/app/src/main/java/com/noop/ui/SettingsLogic.kt b/android/app/src/main/java/com/noop/ui/SettingsLogic.kt index 2e74b5ae14..810b66c398 100644 --- a/android/app/src/main/java/com/noop/ui/SettingsLogic.kt +++ b/android/app/src/main/java/com/noop/ui/SettingsLogic.kt @@ -69,7 +69,7 @@ internal fun strapStatusDetail( ): String = when { scanning -> "Searching for your WHOOP… make sure it's charged, on your wrist, and the official WHOOP app isn't connected to it." encryptedBond && connected -> "Your strap is paired and sending data. Open Live for a real-time heart rate." - bonded && connected -> "Live heart rate is streaming, but your strap is not fully paired. The encrypted pairing is what carries motion, skin temperature, SpO₂ and respiratory rate — without it, sleep is staged from heart rate alone. Buzz, alarms and history sync need it too." + bonded && connected -> "Live heart rate is streaming, but your strap is not fully paired. The encrypted pairing is what carries the strap's stored history, including motion and skin temperature — without it, sleep is staged from heart rate alone. Buzz, alarms and history sync need it too." connected -> "Connected. Finishing the secure pairing handshake…" bonded -> "Previously paired but not currently connected. Re-scan to reconnect." else -> "No strap connected. Put your WHOOP nearby and tap Re-scan to pair." diff --git a/android/app/src/main/java/com/noop/ui/SettingsScreen.kt b/android/app/src/main/java/com/noop/ui/SettingsScreen.kt index 5329b464e7..6bfcadcbad 100644 --- a/android/app/src/main/java/com/noop/ui/SettingsScreen.kt +++ b/android/app/src/main/java/com/noop/ui/SettingsScreen.kt @@ -2206,7 +2206,14 @@ fun SettingsScreen( onClick = { vm.ble.probeAdvertisingName() }, ) } - (live.renameStatus ?: advertisingNameProbe)?.let { + // The in-flight sentinel is a marker, not text: map it to the same translated + // wait line every other probe uses instead of printing "__waiting__". + val probeShown = if (advertisingNameProbe == WhoopBleClient.WAITING_ADVERTISING_NAME_PROBE) { + uiString(R.string.l10n_devices_screen_waiting_for_the_straps_reply_5a06e7ac) + } else { + advertisingNameProbe + } + (live.renameStatus ?: probeShown)?.let { Text(it, style = NoopType.footnote, color = Palette.textSecondary) } } @@ -2674,7 +2681,7 @@ fun SettingsScreen( // away. Mirrors the iOS SettingsView "Advanced" disclosure and the Test Centre Advanced group. SettingsDisclosureGroup( title = uiString(R.string.l10n_settings_screen_advanced_4d064726), - subtitle = "Experimental probes, diagnostics, raw-sensor export, and the Trends report. Tucked away to keep the everyday screen tidy.", + subtitle = "Self-hosted push, diagnostics, sleep-staging options, raw-sensor export, and the Trends report. Tucked away to keep the everyday screen tidy. The WHOOP 5/MG protocol probes are in Test Centre → 5/MG protocol diagnostics.", expanded = advancedOpen, onToggle = { advancedOpen = !advancedOpen; SettingsDisclosurePrefs.write(NoopPrefs.of(context), advancedOpen) }, ) { diff --git a/android/app/src/main/java/com/noop/ui/SmartAlarmScreen.kt b/android/app/src/main/java/com/noop/ui/SmartAlarmScreen.kt index 4dceba2f63..8b680e8629 100644 --- a/android/app/src/main/java/com/noop/ui/SmartAlarmScreen.kt +++ b/android/app/src/main/java/com/noop/ui/SmartAlarmScreen.kt @@ -228,10 +228,17 @@ fun SmartAlarmScreen(vm: AppViewModel) { RowDividerLocal() ToggleRowLocal( label = uiString(R.string.l10n_smart_alarm_screen_buzz_strapname_813772f4, strapName), - help = if (bonded) - "Also arms your $strapName to buzz at your earliest wake time, so the strap wakes you first and the phone alarm is the guaranteed backup." - else - "Connect your strap to use this. It arms the strap to buzz at your earliest wake time as a gentler first wake-up.", + help = when { + // Finding 1: a 5/MG strap alarm is only sent with Protocol probes on, and it is experimental. + liveState.whoop5Detected && !PuffinExperiment.from(context).isEnabled -> + uiString(R.string.l10n_smart_alarm_screen_your_whoop_5_mg_won_t_75029bae) + liveState.whoop5Detected && bonded -> + "Also arms your WHOOP 5/MG to buzz at your earliest wake time, using an experimental 5/MG command. Strap wakes have been reported on 5.0 and MG but are not guaranteed, so keep the phone alarm as your backup." + bonded -> + "Also arms your $strapName to buzz at your earliest wake time, so the strap wakes you first and the phone alarm is the guaranteed backup." + else -> + "Connect your strap to use this. It arms the strap to buzz at your earliest wake time as a gentler first wake-up." + }, checked = buzzWhoop4, onChange = { vm.setBuzzWhoop4Enabled(it) }, ) @@ -287,7 +294,7 @@ private fun StrapAlarmCard(vm: AppViewModel) { // 4.0 path experimental. The 5/MG Experimental-gate branch below is deliberately untouched. ToggleRowLocal( label = uiString(R.string.l10n_smart_alarm_screen_wake_me_with_a_strap_buzz_1681ba1d), - help = "Arms the strap to buzz at your wake time, even if NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). Keep a backup alarm for anything you truly can't miss.", + help = "Arms the strap to buzz at your wake time, even if NOOP is closed. Sends the exact alarm command the official app sends, confirmed buzzing on a real WHOOP 4.0 (community wire capture + on-device test, #535). On a WHOOP 5/MG this is experimental and only arms while Protocol probes is on (Test Centre → 5/MG protocol diagnostics). Keep a backup alarm for anything you truly can't miss.", checked = smartAlarm, onChange = { vm.setSmartAlarmEnabled(it) }, ) diff --git a/android/app/src/main/java/com/noop/ui/TestCentreScreen.kt b/android/app/src/main/java/com/noop/ui/TestCentreScreen.kt index d16935bd65..876f51bb9a 100644 --- a/android/app/src/main/java/com/noop/ui/TestCentreScreen.kt +++ b/android/app/src/main/java/com/noop/ui/TestCentreScreen.kt @@ -366,8 +366,10 @@ fun TestCentreScreen(vm: AppViewModel, onOpenGroundTruthCollector: () -> Unit = // consent given for a session probe. DeveloperToggleRow( title = stringResource(R.string.raw_diag_ecg_probe), - detail = "Sends the three MG ECG session toggles and listens for 30 s. Hold both " + - "clasp electrodes with your other hand for the whole window, or the trace is " + + detail = "Sends the three MG ECG session toggles and listens for up to about a minute: " + + "the run ends 10 s after the strap's final ECG frame (around 40 s in on the straps " + + "measured so far), or at 60 s if that frame never comes. Hold both clasp electrodes " + + "with your other hand until the verdict appears in the strap log, or the trace is " + "flat by design. Instrumentation, not a medical ECG feature.", checked = ecgProbe, onCheckedChange = { diff --git a/android/app/src/main/java/com/noop/ui/WhoopModelComparisonScreen.kt b/android/app/src/main/java/com/noop/ui/WhoopModelComparisonScreen.kt index c3498c538f..9033597e8c 100644 --- a/android/app/src/main/java/com/noop/ui/WhoopModelComparisonScreen.kt +++ b/android/app/src/main/java/com/noop/ui/WhoopModelComparisonScreen.kt @@ -40,7 +40,7 @@ import androidx.compose.ui.unit.dp // // A plain-English comparison of the WHOOP 4.0 and the WHOOP 5.0/MG, reached from Settings → Strap by // EITHER model owner. The point (issue #490): a 4.0 user wrongly believed broadcast-out was 5.0-only. -// In truth NOOP's OWN heart-rate re-broadcast (Data Sources → "Broadcast heart rate") works on ANY +// In truth NOOP's OWN heart-rate re-broadcast (Data Sources → "Broadcast HR from this phone") works on ANY // strap — it re-advertises whatever live HR NOOP is reading. What's genuinely 5/MG-only is the strap // WHOOP 4 uses its dedicated broadcast command while 5/MG uses the whoop_live_hr_in_adv_ind_pkt // firmware config. This screen draws that distinction and reassures either owner they're supported. @@ -71,7 +71,7 @@ private val CAPABILITIES: List = listOf( CapabilityRow( "NOOP re-broadcasts your HR (gym / Zwift / Garmin)", Support.YES, Support.YES, - "Data Sources → \"Broadcast heart rate\" turns your PHONE into a standard BLE HR sensor using " + + "Data Sources → \"Broadcast HR from this phone\" turns your PHONE into a standard BLE HR sensor using " + "whatever HR NOOP is reading, so this works on a 4.0 too. It's local Bluetooth; nothing leaves " + "your phone.", ), diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index 8399bc377c..26779da572 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -46,7 +46,7 @@ Mitteilungen Support Einstellungen - Testcenter + Testzentrum Mehr Einblicke @@ -194,7 +194,7 @@ 0123456789abcdef0123456789abcdef - Ein WHOOP-Riemen verbindet sich mit einem einzigen Gerät. Während es mit NOOP verbunden ist, wird es nicht streamen to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Ein WHOOP-Band verbindet sich nur mit einem einzigen Gerät. Wenn du es mit NOOP koppelst, kann es der offiziellen WHOOP-App entzogen werden – und umgekehrt. Das ist umkehrbar: Koppel es einfach in der anderen App, wann immer du es zurückhaben möchtest. Hinzufügen Erweitert: Ich habe den Schlüssel meines Rings bereits Beta. * ist eine On-Device-Schätzung. Skin Temp ist ein Trend gegen deine eigene Baseline, Schritte are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -227,7 +227,7 @@ Erneut versuchen Dateiimport verwenden Wir konnten diesen Ring nicht übernehmen. - Die Unterstützung für WHOOP 5.0 / MG ist neuer und in NOOP noch experimentell. + WHOOP 5.0 / MG unterstützt Live-Daten und Bandverlauf. Protokollwerkzeuge sind separat im Testzentrum. WHOOP ist NOOPs primäres, voll unterstütztes Band. Andere Herzfrequenzgurte streamen Live-Herzfrequenz und HRV, aber nicht WHOOPs tiefere Schlaf- und Erholungsdaten. Mehr moreGroupChevron @@ -452,7 +452,7 @@ Sendet den nur lesenden Körperpositions-Befehl (0x54) und schreibt die vollständige Rohantwort des Bands ins Strap-Log, wobei der Datensatz (Revision / Position / Konfidenz / Status) auf der WHOOP 4.0 dekodiert wird. Es wird nichts auf das Band geschrieben, und Trageerkennung oder Bewertung werden nie verändert. Akkupack-Test (151 RE)… Ergebnis des Akkupack-Tests (151) - Sendet den nur lesenden Akkupack-Befehl (151) und dekodiert die Antwort des Bands — Ladestand, Seriennummer und Bluetooth-Adresse des Akkupacks. Es wird nichts auf das Band geschrieben und nichts fließt in deine Daten. Eine WHOOP 4.0 hat keinen Akkupack-Befehl und bleibt erwartungsgemäß stumm; dieses Schweigen ist selbst ein nützliches Ergebnis. + Sendet den nur lesenden Akkupack-Befehl (151) und zeigt die Antwort des Bands. Eine SUCCESS-Antwort wird als Ladestand, Seriennummer und Bluetooth-Adresse des Akkupacks dekodiert. Bekanntes Ergebnis: Eine WHOOP MG mit Firmware 50.39.1.0 antwortet mit FAILURE, egal ob ein Pack angeschlossen ist – deshalb stammt der Pack-Ladestand auf der Geräte-Karte aus dem vom Band selbst gesendeten Pack-Ereignis und nicht aus diesem Befehl. Eine WHOOP 4.0 hat keinen Akkupack-Befehl und bleibt erwartungsgemäß stumm; dieses Schweigen ist selbst ein nützliches Ergebnis. Es wird nichts auf das Band geschrieben und nichts fließt in deine Daten. Daten dieses Geräts löschen… Trennen Feature-Flag-Test (#761 RE)… @@ -468,7 +468,7 @@ Geräte-Konfigurationsleseprobe (#103 RE)… Ergebnis der Geräte-Konfigurationsleseprobe (#103) Fragt das Band nach Konfigurations-WERTEN: GET_DEVICE_CONFIG_VALUE (0x79) und GET_FF_VALUE (0x80), ein Schlüssel pro Austausch. Beide Befehle existieren in dieser Firmware möglicherweise gar nicht — genau das soll herausgefunden werden. Nur lesend — es wird kein Wert geschrieben, und die SET-Befehle werden von dieser Probe nie gesendet. Das Ergebnis wird hier angezeigt und ins Band-Protokoll geschrieben. - Zwei unabhängige Protokolltabellen widersprechen sich beim Extended-Battery-Opcode (98 vs. 87). Dies sendet das kuratierte, nur lesende 98 und schreibt die vollständige Rohantwort des Bands ins Strap-Log. Eine batterieartige Nutzlast bestätigt 98 auf deiner Firmware; ein kurzer Stub bleibt mehrdeutig. Es wird nichts auf das Band geschrieben. Bitte exportiere und teile danach das Strap-Log. + Zwei unabhängige Protokolltabellen widersprechen sich beim Extended-Battery-Opcode (98 vs. 87). Dies sendet das kuratierte, nur lesende 98 und zeigt die vollständige Rohantwort des Bands (sie wird auch ins Strap-Log geschrieben). Bei einer WHOOP 4.0 bestätigt eine batterieartige Nutzlast 98 auf deiner Firmware, und das Ergebnis dekodiert die Pack-Spannung; ein kurzer Stub bleibt mehrdeutig. Bei einer WHOOP 5/MG stammt der Pack-Ladestand nicht aus 98 (das ist die Akkupack-Abfrage, Befehl 151), NOOP dekodiert aus der Antwort keinen Wert, und die maßgebliche Zeile ist „Result code“: UNSUPPORTED bedeutet, dass diese Firmware 98 ablehnt. Es wird nichts auf das Band geschrieben. Bitte exportiere und teile danach das Strap-Log. Abbrechen %1$s%% Schließen @@ -904,7 +904,7 @@ Runterkommen-Anstoß Fensterlänge %1$s min - WHOOP 5/MG-Strapalarme benötigen Protokolltests (Testcenter → 5/MG-Protokolldiagnose). Deine Weckzeit ist gespeichert, aber der Strap ist noch nicht scharfgestellt. Behalte einen Ersatzwecker. + WHOOP 5/MG-Strapalarme benötigen Protokolltests (Testzentrum → 5/MG-Protokolldiagnose). Deine Weckzeit ist gespeichert, aber NOOP sendet sie nicht an den Strap, solange Protokolltests aus sind. Ein früher gesendeter Alarm kann noch auf dem Strap eingestellt sein. Behalte einen Ersatzwecker. Deine Schritte kalibrieren Schließen Tag @@ -913,7 +913,7 @@ Wie das funktioniert Noch keine Tage, an denen sowohl NOOP als auch dein Telefon Schritte gezählt haben. Sobald dein Telefon protokolliert a few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Noch keine Bewegung synchronisiert - NOOP schätzt deine Schritte aus der Bewegung deines WHOOP, kalibriert an der Schrittzahl deines Telefons. Es ist eine Schätzung, kein Schrittzähler. Ein WHOOP 4.0 überträgt keine Schritte. + NOOP schätzt deine Schritte aus der gespeicherten Bewegung deines WHOOP, kalibriert an der Schrittzahl deines Telefons. Es ist eine Schätzung, kein Hardware-Schrittzähler. Ein WHOOP 4.0 sendet keine Schrittzahl. Bei einem WHOOP 5.0 / MG zeigen Tage, die der eigene Schrittzähler abdeckt, stattdessen dessen Zählung; um diese Zahl anzupassen, nutze in den Einstellungen die Schritt-Kalibrierung. Noch nicht kalibriert An den Tagen, an denen dein Telefon auch Schritte gezählt hat, erfährt NOOP, wie viel deine Motion Maps steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Öffne NOOP in der Nähe deines Riemens und lass es aufholen (eine vollständige Historiensynchronisierung kann eine Weile dauern) first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -925,7 +925,7 @@ Das sind die Tage, an denen dein Telefon ebenfalls Schritte gezählt hat, damit NOOP lernen kann, wie deine Bewegung auf Schritte abbildet. Oder lege den Koeffizienten unten manuell fest. Diese Tage sind von der Schätzung ausgenommen (stattdessen wird die echte Zählung deines Telefons gezeigt). Sie stehen hier nur, damit du die Genauigkeit der Schätzung beurteilen kannst. Wir sehen noch keine Bewegung von deinem Riemen. Schritte werden von deinem WHOOP geschätzt banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · Bewegung → Schritte + WHOOP · Bewegung → Schritte Nächster Tag Vorheriger Tag %1$s %2$s Stunden @@ -1350,7 +1350,7 @@ Updates überprüfen GitHub erneut v5 - die Rohsignalfreigabe: NOOP liest das Signal, auf deinem Gerät, kostenlos Week in Review ist ehrlich über eine halb fertige Woche - WHOOP 4.0 wird vollständig unterstützt + WHOOP 4.0 ist der am besten getestete Weg WHOOP 5.0 Geschichte Decodierung kommt zu Android WHOOP 5.0/MG buzz - der echte Befehl (passendes Byte für Byte) WHOOP 5.0/MG buzz - den richtigen Befehl ausprobieren (experimentell) @@ -1396,7 +1396,7 @@ Bluetooth einschalten WHOOP 5 / MG (experimentell) Willst du nicht verbinden? Laufe durch diese - Dein gurt ist verbunden und wir versuchen einen experimentellen händedruck, um live zu bringen. heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + Dein Band ist verbunden und wir versuchen einen experimentellen Handshake, um den Live-Puls über das Standardprofil zu starten. Das ist auf 5/MG-Hardware noch nicht verifiziert, deshalb erscheint der Puls möglicherweise nicht, und einige nächtliche 5/MG-Eingangsdaten sind noch unvollständig, sodass Schlafphasen nur Näherungen sind. Mit deinem Band ist alles in Ordnung – WHOOP 4.0 wird vollständig unterstützt. Tag Alle Daten dieses Geräts löschen? Geräteaktionen für %1$s @@ -1460,7 +1460,7 @@ liquidPressScale Ø Buzz - Kann nicht verbunden werden - die Paarung deines Bandes wurde zurückgesetzt + Dein Band braucht Hilfe beim Wiederverbinden – Schritte unten Lädt Distanz Anstrengung @@ -1477,7 +1477,7 @@ Strap HRV-Messung durchführen ● %1$s - WHOOP 5.0/MG paart sich mit jeweils einer App. Wenn ein Scan nichts findet, löse es in the official WHOOP app and fully close that app, then Connect again. + WHOOP 5.0/MG koppelt sich immer nur mit einer App. Wenn ein Scan nichts findet, entkopple es in der offiziellen WHOOP-App, schließe diese App vollständig und tippe dann erneut auf „Verbinden“. NoopButton.scale Änderungen speichern CountUpText @@ -1518,7 +1518,7 @@ Kontakt-Support bei %1$s Kontinuierliche HRV-Erfassung Prüfung fehlgeschlagen. Versuch es erneut. - Zählerticks pro Schritt. Lass es auf 1,0, außer deine Schritte fallen zu hoch aus. Auf einem WHOOP 5/MG können sie sehr hoch ausfallen (10× oder mehr), daher geht das hier bis 30. Geh bekannte 1.000 Schritte und teile NOOPs Zählung durch die echte Zahl, um deinen Wert zu erhalten. + Zählerticks pro Schritt für den eigenen Schrittzähler eines WHOOP 5/MG. Lass es bei 1,0, sofern deine Schritte nicht durchgehend zu hoch angezeigt werden. Gehe 1.000 bekannte Schritte und teile den Wert von NOOP durch die tatsächliche Anzahl, um deinen Wert zu erhalten. Zyklusbewusstsein anzeigen Zyklusbewusstsein Tageszyklus-Hintergrund @@ -1584,7 +1584,7 @@ Rezensiert jeden bewerteten Wake-Block auf echte Beweise für das Aufstehen (Walking Cadence, a) change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Rhythmus (experimentell) Läuft den kontinuierlichen HRV-Stream nur während deines ruhigen Stundenfensters (standardmäßig 22:00-07:00 Uhr) aus und halbiert damit die Batteriekosten. Tagesstresswerte werden sparsamer sein. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Speichert die letzten 24 Stunden dekodierter Sensorproben (Herzfrequenz, R-R, Bewegung, Schritte und alle 5 / MG tiefen Ströme, die du freigeschaltet hast) als einen CSV, den du teilen kannst, um mit deinen eigenen Daten zu basteln. Nichts verlässt das Telefon, es sei denn, du teilst es. + Speichert die letzten 24 Stunden dekodierter Sensorwerte (Herzfrequenz, R-R, Bewegung, Schritte, SpO₂, Hauttemperatur, Atmung und Ereignisse) als eine CSV-Datei, die du teilen kannst, um mit deinen eigenen Daten zu experimentieren. Nichts verlässt das Telefon, solange du es nicht teilst. Aktivierungssequenz an den Strap senden Automatische Backups einrichten Einstellungen @@ -1840,7 +1840,7 @@ %1$d Workout %1$d Workouts - Dieses Band sendet kein SpO₂ über Bluetooth. Importiere einen WHOOP-Export oder Health Connect, um es zu sehen. + Dieses Band sendet kein SpO₂-Signal für dieses Diagramm. Importiere einen WHOOP-Export oder Health-Connect-Daten, um es zu sehen. Dieses Band sendet keinen Rohdaten-Atemstrom. Deine geschätzte Atemfrequenz erscheint im Health-Bildschirm. Erweitert Reduziert @@ -1909,6 +1909,9 @@ Energiesparmodus beruhigt die Anzeigen, übersetzte Android-Benachrichtigungen und sofort geladene Diagramme Kein SpO₂-Import- oder Health-Wert Nur Rohwerte — Import erforderlich + Keine rohen SpO₂-Zählwerte (nur WHOOP 4.0) + Jetzt synchronisieren. Benötigt die vollständige sichere Kopplung des Bands, die noch nicht abgeschlossen ist. + Nicht vollständig gekoppelt Tiefe Daten wieder ausschalten Benötigt die vollständig verschlüsselte Kopplung: Schließe zuerst die offizielle WHOOP-App und koppele das Band mit NOOP (eine Verbindung nur für den Live-Puls kann den Schreibvorgang nicht übertragen). Schreibt den Aus-Wert in alle 16 Flags und liest jedes einzeln zurück, sodass du siehst, was das Band tatsächlich speichert — nicht nur, dass es bestätigt hat. Der Aus-Wert ist von dem Flag abgeleitet, das NOOP für die Garmin-Übertragung bereits so ausschaltet; auf einem R22-Flag wurde er noch nie beobachtet. Deshalb testet NOOP zuerst ein einzelnes Flag und bricht ab, wenn das Band es ablehnt. Gelöschte Flags sind nicht dasselbe wie tatsächlich versiegende Tiefendaten: prüfe das mit einer anschließenden Synchronisierung. @@ -1932,13 +1935,13 @@ Alles bleibt auf diesem Smartphone. Kein Konto, keine Synchronisierung, keine Cloud. Ein paar ehrliche Worte vorab – damit es keine Überraschungen gibt. NOOP ist ein persönliches, offenes Projekt – nicht die WHOOP-App und nicht mit WHOOP verbunden. Die App liest die Daten deines Straps direkt auf deinem Gerät aus. Sieh NOOP als leistungsfähiges, aber noch nicht fertiges Projekt. - WHOOP 4.0 ist getestet und funktioniert vollständig. Beim neueren WHOOP 5.0/MG funktioniert der Live-Puls bereits, an weiterführenden Messwerten wie Erholung, Belastung und Schlaf wird jedoch noch gearbeitet. NOOP zeigt dir immer, was bereits funktioniert und was sich noch in Entwicklung befindet. + WHOOP 4.0 ist getestet und funktioniert durchgängig. WHOOP 5.0/MG ist neuer: Live-Herzfrequenz und Bandverlauf funktionieren, und NOOP berechnet daraus auf deinem Gerät Schlaf, Erholung und Belastung. Einige nächtliche Eingangsdaten sind beim 5/MG noch unvollständig, daher sind seine Schlafphasen nur Näherungen. NOOP zeigt dir immer, was bereits live läuft und was noch im Aufbau ist. Der Live-Puls ist sofort verfügbar. Die Werte für Erholung, Belastung und Schlaf werden genauer, sobald NOOP in den ersten Nächten deine persönlichen Ausgangswerte kennenlernt. Du möchtest deinen bisherigen Verlauf direkt sehen? Importiere deinen WHOOP-Export unter „Datenquellen“ und deine bisherigen Daten stehen dir sofort in NOOP zur Verfügung. Kein Konto, keine Cloud, keine Synchronisierung. NOOP kommuniziert nur mit deinem Strap und speichert alles lokal. Deine Daten gehören dir – und nur dir. NOOP verwendet Bluetooth, um deinen Strap zu finden. Erlaube beim Fortfahren den Bluetooth-Zugriff, damit NOOP danach suchen kann. NOOP kommuniziert über Bluetooth Low Energy direkt mit deinem Strap. Es gibt keinen dazwischengeschalteten Server. Die Verbindung ist lokal – genau wie alle ausgelesenen Daten. Erlaube NOOP den Bluetooth-Zugriff, wenn Android danach fragt, damit die App nach deinem Strap suchen und sich damit verbinden kann. - Beim ersten Verbinden musst du dein WHOOP 5.0/MG möglicherweise in den Kopplungsmodus versetzen. Die offizielle WHOOP-App sollte dabei geschlossen sein. + Dein WHOOP 5.0/MG muss beim ersten Verbinden möglicherweise in den Kopplungsmodus: Schließe die offizielle WHOOP-App und tippe dann mehrmals auf das Band, bis die LEDs blau blinken. Erst bei Hautkontakt liefert der Sensor aussagekräftige Messwerte. Trage deinen Strap eng am Handgelenk oder Oberarm, sodass der Sensor direkt auf der Haut liegt. Wenn der Akku fast leer ist, lade deinen Strap zunächst einige Minuten auf. @@ -1987,7 +1990,7 @@ Dein Strap ist verbunden und speichert Daten. Verbinde neu, um das Neueste zu laden. Strap nicht verbunden. Tippe zum Verbinden. - Verlaufssynchronisierung ist auf 5.0 experimentell. + Verlaufssynchronisierung ist auf WHOOP 5.0/MG experimentell. Noch keine Live-Herzfrequenz und kein synchronisierter Verlauf in dieser Sitzung. Kalibrierung Wird morgens fortgesetzt @@ -2077,7 +2080,7 @@ Dein Muster wird gelernt · ~Tag %1$d · ~Tag %1$d–%2$d - Noch keine nächtliche Hauttemperatur — benötigt ~4 getragene Nächte (oder importiere eine WHOOP-CSV) + Noch keine nächtliche Hauttemperatur – erscheint, sobald eine getragene Nacht synchronisiert ist (oder importiere eine WHOOP-CSV) Hauttemperatur Δ ggü. Basiswert Mach NOOP zu deinem — Akzentfarben und eigene Hintergründe, vierzig weitere Sportarten mit GPS-Strecken und eine Kalorien-Heatmap @@ -2626,7 +2629,7 @@ Eine Effort-Skala nach Wahl, ein Ring, der schlafen darf, und weit weniger vergebliche Neuberechnungen Für dieses Vitalzeichen braucht NOOP mindestens zwei historische Messwerte, um es darzustellen. Die Sauerstoffsättigungs-Schätzung ist deaktiviert - Dein Strap liefert eine Schätzung der Sauerstoffsättigung, sie ist aber unbestätigt und standardmäßig aus. Aktiviere die Strap-Schätzung in den Einstellungen, oder importiere einen WHOOP-Export unter Datenquellen für den kalibrierten Wert. + Dein Strap meldet eine Schätzung der Blutsauerstoffsättigung, die aber ungeprüft und standardmäßig deaktiviert ist. Um sie zu sehen, aktiviere „Blood Oxygen: strap estimate“ unter Einstellungen → Erweitert → Diagnose, oder importiere in den Datenquellen einen WHOOP-Export für den kalibrierten Wert. Kein Sauerstoffsättigungswert von einem WHOOP 4.0 Dein Strap speichert die optischen Rohkanäle, aber NOOP rechnet sie nicht in einen Sauerstoffsättigungswert um - dies bleibt also leer, egal wie lange du ihn trägst. Importiere einen WHOOP-Export unter Datenquellen, um es aus deinem Kontoverlauf zu füllen. Android um Kopplung bitten (experimentell) @@ -2706,7 +2709,7 @@ Passive Verlaufs-/Protokollaufzeichnung Passive Rohaufzeichnung teilen Passive Aufzeichnung und Bandprotokoll exportieren - Rohdatenaufnahme und Protokollexporte befinden sich jetzt im Testcenter unter 5/MG-Protokolldiagnose. + Rohdatenaufnahme und Protokollexporte befinden sich jetzt im Testzentrum unter 5/MG-Protokolldiagnose. Hello trotz Kopplungsverweigerung senden (experimentell) Hello trotz Kopplungsverweigerung senden Automatisch prüfen @@ -2734,7 +2737,7 @@ Hauttemperatur Für diese Nächte liegt keine gemessene Temperatur vor — angezeigt wird die Abweichung von deinem Basiswert. Eine Synchronisierung bewertet die letzten Nächte neu und ergänzt sie. Es werden nur Nächte mit gemessener Temperatur angezeigt; für die übrigen wurde nur eine Abweichung vom Basiswert erfasst. - Diese Nacht wurde allein anhand der Herzfrequenz ausgewertet, ohne aufgezeichnete Bewegung, daher konnten Herzfrequenzvariabilität und Ruheherzfrequenz nicht gemessen werden. Ein nicht vollständig gekoppelter Strap ist die übliche Ursache. + Diese Nacht wurde allein anhand der Herzfrequenz erkannt, ohne aufgezeichnete Bewegung; Zeitpunkt und Phasen sind daher nur ungefähr. Ein leerer HRV- oder Ruheherzfrequenz-Wert bedeutet, dass die Nacht nicht genug brauchbare Herzfrequenzdaten dafür enthielt. Ein nicht vollständig gekoppelter Strap ist der übliche Grund, warum eine Nacht keine Bewegung hat. Tageszyklus Lege fest, wann Schritte und die laufende Anstrengung neu beginnen. Nickerchen starten keinen neuen Tag. Tagesbeginn @@ -2832,7 +2835,7 @@ Diese Nacht erreichte eine hohe Effizienz, aber sehr wenig Tief- oder REM-Schlaf. Das ist eher ein Schätzfehler der Schlafphasen als ein echtes Erholungsdefizit. Die Werte bleiben unverändert, lies die Aufteilung mit Bedacht. Meldet zu viele RR-Intervalle, daher kein Wert Aktuellen Namen abfragen (nur lesen) - Umbenennen wird bei einer WHOOP 5.0 oder MG noch nicht unterstützt. NOOP kann das Band nach seinem aktuellen Namen fragen. Das entscheidet, ob Umbenennen überhaupt möglich ist. + Umbenennen wird bei einer WHOOP 5.0 oder MG noch nicht unterstützt. Ein experimentelles Umbenennen und eine schreibgeschützte Namensabfrage erscheinen hier, solange Testzentrum → Connection & Sync eingeschaltet ist. Experimentell bei WHOOP 5.0 oder MG: Dieser Befehl wurde für diese Strap-Generation nie bestätigt. Er ist umkehrbar, benenne also erneut um, falls etwas schiefgeht, und prüfe mit Aktuellen Namen abfragen, ob es gewirkt hat. Wecker in %1$s Wecker in weniger als einer Minute @@ -2863,8 +2866,8 @@ Sync ausstehend · %1$s %1$s bpm%2$s %1$s, %2$s, in Benutzung - Der Alarm wurde mit einem experimentellen 5/MG-Befehl auf dem Strap aktiviert. Weckvorgänge durch den Strap wurden für 5.0 und MG gemeldet, sind aber nicht garantiert. Behalte für alles Wichtige einen Ersatzwecker. - Sendet experimentelle Protokollabfragen und aktiviert den 5/MG-Strapalarm. Für normale Synchronisierung, Schlaf, Erholung oder Schritte nicht erforderlich. + NOOP stellt den Alarm mit einem experimentellen 5/MG-Befehl auf dem Strap ein, sobald sich der Strap verbindet oder du den Alarm änderst. Weckvorgänge durch den Strap wurden für 5.0 und MG gemeldet, sind aber nicht garantiert. Behalte für alles Wichtige einen Ersatzwecker. + Sendet experimentelle Protokollabfragen und protokolliert die Antworten im Strap-Log. Erlaubt außerdem den experimentellen 5/MG-Strapalarm: NOOP sendet ihn, sobald sich der Strap das nächste Mal verbindet oder du den Alarm änderst. Das Ausschalten löscht keinen Alarm, der schon auf dem Strap liegt. Für normale Synchronisierung, Schlaf, Erholung oder Schritte nicht erforderlich. Schlafergebnis aktualisiert Die Schlafzeiten oder die Gesamtschlafdauer dieser Nacht haben sich um mindestens fünf Minuten geändert. WHOOP MG EKG-Einschaltprobe diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml index 20aed28131..23491f2cd9 100644 --- a/android/app/src/main/res/values-es/strings.xml +++ b/android/app/src/main/res/values-es/strings.xml @@ -12,7 +12,7 @@ 0123456789abcdef0123456789abcdef - Una correa WHOOP se une a un solo dispositivo. Mientras esté conectado a NOOP, no fluirá to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Una pulsera WHOOP se vincula a un solo dispositivo. Emparejarla con NOOP puede quitársela a la app oficial de WHOOP, y viceversa. Es reversible: empárejala en la otra app cuando quieras recuperarla. Añadir Avanzado: ya tengo la clave de mi anillo Beta. * es una estimación del dispositivo. La temperatura de la piel es una tendencia contra su propio nivel de base, pasos are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -45,7 +45,7 @@ Inténtalo de nuevo Usar importación de archivos No pudimos tomar el control de este anillo. - La compatibilidad con WHOOP 5.0 / MG es más nueva y sigue siendo experimental en NOOP. + WHOOP 5.0 / MG admite datos en directo e historial. Las herramientas de protocolo están aparte en el Centro de pruebas. WHOOP es la banda principal y totalmente compatible de NOOP. Otras bandas de frecuencia cardíaca transmiten frecuencia cardíaca y VFC en vivo, pero no los datos más profundos de sueño y recuperación de WHOOP. Más másGroupChevron @@ -252,7 +252,7 @@ Envía el comando de posición corporal de solo lectura (0x54) y vuelca la respuesta cruda completa de la banda al registro, decodificando el registro (revisión / posición / confianza / estado) en la WHOOP 4.0. No se escribe nada en la banda y nunca cambia la detección de uso ni la puntuación. Prueba del pack de batería (151 RE)… Resultado de la prueba del pack de batería (151) - Envía el comando de solo lectura del pack de batería (151) y descodifica la respuesta de la banda: carga, número de serie y dirección Bluetooth del pack. No se escribe nada en la banda y nada afecta a tus datos. Una WHOOP 4.0 no tiene comando de pack y se espera que no responda; ese silencio también es un resultado útil. + Envía el comando de solo lectura de la batería externa (151) y muestra la respuesta de la pulsera. Una respuesta SUCCESS se decodifica como la carga, el número de serie y la dirección Bluetooth de la batería. Resultado conocido: una WHOOP MG con firmware 50.39.1.0 responde FAILURE haya o no una batería conectada; por eso la carga de la batería en la tarjeta Dispositivos procede del evento de batería que envía la propia pulsera, no de este comando. Una WHOOP 4.0 no tiene comando de batería externa y se espera que permanezca en silencio; ese silencio es en sí un resultado útil. No se escribe nada en la pulsera y nada alimenta tus datos. Eliminar los datos de este dispositivo… Desconectar Sonda de indicadores de función (#761 RE)… @@ -268,7 +268,7 @@ Sonda de lectura de configuración del dispositivo (#103 RE)… Resultado de la sonda de lectura de configuración del dispositivo (#103) Pide a la banda los VALORES de configuración: GET_DEVICE_CONFIG_VALUE (0x79) y GET_FF_VALUE (0x80), una clave por intercambio. Puede que ambos comandos sencillamente no existan en este firmware; averiguarlo es el objetivo. Solo lectura: no se escribe ningún valor y los comandos SET nunca se envían desde esta sonda. El resultado se muestra aquí y se escribe en el registro de la banda. - Dos tablas de protocolo independientes discrepan sobre el opcode de batería extendida (98 vs 87). Esto envía el 98 curado y de solo lectura y vuelca la respuesta cruda completa de la banda al registro. Una carga tipo batería confirma 98 en tu firmware; un stub corto lo deja ambiguo. No se escribe nada en la banda. Exporta y comparte el registro después. + Dos tablas de protocolo independientes discrepan sobre el opcode de batería extendida (98 vs 87). Esto envía el 98 curado y de solo lectura y muestra la respuesta cruda completa de la pulsera (también se escribe en el registro de la pulsera). En una WHOOP 4.0, una carga tipo batería confirma 98 en tu firmware y el resultado decodifica el voltaje de la batería; un stub corto lo deja ambiguo. En una WHOOP 5/MG, la carga de la batería no sale de 98 (eso es la lectura de la batería externa, comando 151), NOOP no decodifica ningún valor de la respuesta y la línea que hay que leer es «Result code»: UNSUPPORTED significa que este firmware rechaza 98. No se escribe nada en la pulsera. Exporta y comparte el registro de la pulsera después. Cancelar %1$s%% Cerrar @@ -704,7 +704,7 @@ Recordatorio de relajación Longitud de ventana %1$s min - Las alarmas de la pulsera WHOOP 5/MG requieren Sondas de protocolo (Centro de pruebas → Diagnóstico del protocolo 5/MG). La hora de despertar está guardada, pero la pulsera aún no está armada. Mantén una alarma de respaldo. + Las alarmas de la pulsera WHOOP 5/MG requieren Sondas de protocolo (Centro de pruebas → Diagnóstico del protocolo 5/MG). La hora de despertar está guardada, pero NOOP no la envía a la pulsera mientras Sondas de protocolo esté desactivado. Una alarma enviada antes puede seguir configurada en la pulsera. Mantén una alarma de respaldo. Calibra tus pasos Cerrar Día @@ -713,7 +713,7 @@ Cómo funciona esto Todavía no hay días donde NOOP y su teléfono cuentan pasos. Una vez que el teléfono inicie sesión a few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Aún no hay movimiento sincronizado - NOOP estima tus pasos a partir del movimiento de tu WHOOP, calibrado con el recuento de pasos de tu teléfono. Es una estimación, no un podómetro. Una WHOOP 4.0 no transmite pasos. + NOOP estima tus pasos a partir del movimiento almacenado de tu WHOOP, calibrado con el recuento de pasos de tu teléfono. Es una estimación, no un podómetro de hardware. Una WHOOP 4.0 no envía recuento de pasos. En una WHOOP 5.0 / MG, los días que cubre su propio contador de pasos muestran ese recuento; para ajustar esa cifra, usa la Calibración de pasos en Ajustes. Aún sin calibrar En los días que su teléfono también cuenta pasos, NOOP aprende cuánto sus mapas de movimiento a steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Abrir NOOP cerca de su correa y dejar que se ponga al día (una sincronización de historia completa puede tomar un tiempo en first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -725,7 +725,7 @@ Estos son los días en los que tu teléfono también contó pasos, así NOOP puede aprender cómo tu movimiento se traduce en pasos. O ajusta el coeficiente manualmente abajo. Estos días quedan excluidos de la estimación (se muestra el conteo real de tu teléfono en su lugar). Están aquí solo para que juzgues la precisión de la estimación. Aún no estamos viendo ningún movimiento de tu correa. Los pasos son estimados de su WHOOP banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · movimiento → pasos + WHOOP · movimiento → pasos Día siguiente Día anterior %1$s %2$s hours @@ -1150,7 +1150,7 @@ Actualizaciones cheque GitHub de nuevo v5 - la liberación de la firma cruda: NOOP lee la señal, en el dispositivo, gratis Semana en Revisión es honesta sobre una semana de media final - WHOOP 4.0 es la vía compatible + WHOOP 4.0 es la vía más probada WHOOP 5.0 historia decodificación viene a Android WHOOP 5.0/MG buzz - el comando real (matched byte-for-byte) WHOOP 5.0/MG buzz - probar el comando correcto (experimental) @@ -1196,7 +1196,7 @@ Activar Bluetooth WHOOP 5 / MG (experimental) ¿No se conectará? Corran a través de estos - Tu correa está conectada y estamos intentando un apretón de manos experimental para subir en vivo heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + Tu pulsera está conectada y estamos probando un handshake experimental para activar la frecuencia cardíaca en vivo desde el perfil estándar. Esto aún no está verificado en hardware 5/MG, así que la FC puede aparecer o no, y algunos datos nocturnos del 5/MG aún están incompletos, por lo que las fases de sueño son aproximadas. No le pasa nada a tu pulsera: WHOOP 4.0 tiene soporte completo. Día ¿Eliminar todos los datos de este dispositivo? Acciones de dispositivos para %1$s @@ -1260,7 +1260,7 @@ líquidoPresiónScale Prom Buzz - No se puede conectar - el emparejamiento de la correa fue reajustado + Tu pulsera necesita ayuda para reconectarse: pasos abajo Cargando Distancia Esfuerzo @@ -1277,7 +1277,7 @@ Pulsera Tomar una lectura de VFC ● %1$s - WHOOP 5.0/MG pares con una aplicación a la vez. Si un escáner no encuentra nada, unpairlo the official WHOOP app and fully close that app, then Connect again. + WHOOP 5.0/MG se empareja con una sola app a la vez. Si el escaneo no encuentra nada, desvincúlalo en la app oficial de WHOOP y cierra esa app por completo; luego vuelve a pulsar Conectar. NoopButton.scale Guardar cambios CondeUpText @@ -1318,7 +1318,7 @@ Soporte de contacto en %1$s Captura continua de VFC No se pudo comprobar. Inténtalo de nuevo. - Pulsos del contador por paso. Déjalo en 1.0 salvo que tus pasos salgan altos. En una WHOOP 5/MG pueden salir muy altos (10× o más), por eso llega hasta 30. Camina 1.000 pasos conocidos y divide el conteo de NOOP entre el conteo real para obtener tu valor. + Ticks del contador por paso para el propio contador de pasos de un WHOOP 5/MG. Déjalo en 1,0 salvo que tus pasos salgan altos de forma constante. Camina 1.000 pasos conocidos y divide el recuento de NOOP entre el recuento real para obtener tu valor. Mostrar conciencia del ciclo Conciencia del ciclo Fondo según el ciclo del día @@ -1384,7 +1384,7 @@ Reseña cada bloque de vela puntuado para evidencia real de levantarse (cadencia caminante, un change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Rhythm (experimental) Ejecuta el flujo continuo de HRV sólo durante su ventana de horas tranquilas (22:00–07:00 por defecto), agitando aproximadamente el costo de la batería. Las lecturas de estrés diurno serán escasas. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Guarda las últimas 24h de muestras de sensores descodificadas (tasa de corazón, R-R, movimiento, pasos y cualquier flujos profundos de 5/MG que hayas desbloqueado) como un CSV que puedes compartir, para el tinkering con tus propios datos. Nada deja el teléfono a menos que lo compartas. + Guarda las últimas 24 h de muestras de sensor decodificadas (frecuencia cardíaca, R-R, movimiento, pasos, SpO₂, temperatura de la piel, respiración y eventos) en un único CSV que puedes compartir, para trastear con tus propios datos. Nada sale del teléfono a menos que lo compartas. Enviar secuencia de activación a la pulsera Configurar copias de seguridad automáticas Ajustes @@ -1808,7 +1808,7 @@ %1$d entrenamiento %1$d entrenamientos - Esta correa no envía SpO₂ por Bluetooth. Importa una exportación de WHOOP o Health Connect para verlo. + Esta pulsera no envía una señal de SpO₂ para este gráfico. Importa una exportación de WHOOP o datos de Health Connect para verlo. Esta correa no envía datos de respiración sin procesar. Tu frecuencia respiratoria estimada aparece en la pantalla Salud. Expandido Contraído @@ -1877,6 +1877,9 @@ El ahorro de batería calma los indicadores, notificaciones de Android traducidas y gráficos instantáneos Sin importación de SpO₂ ni valor de Health Solo valores brutos — requiere importación + Sin recuentos de SpO₂ sin procesar (solo WHOOP 4.0) + Sincronizar ahora. Necesita el emparejamiento seguro completo de la pulsera, que aún no se ha completado. + Emparejamiento incompleto Volver a desactivar los datos profundos Necesita el vínculo cifrado completo: cierra primero la app oficial de WHOOP y empareja la pulsera con NOOP (un enlace solo de FC en vivo no puede transportar la escritura). Escribe el valor de apagado en las 16 marcas y vuelve a leer cada una, para que veas lo que la pulsera guarda en vez de solo que confirmó. El valor de apagado se deduce de la marca que NOOP ya desactiva así para la difusión Garmin; nunca se ha visto en una marca R22, por eso NOOP prueba primero con una sola y se detiene si la pulsera la rechaza. Borrar las marcas no es lo mismo que ver parar los registros profundos: compruébalo sincronizando después. @@ -1900,13 +1903,13 @@ Todo se guarda en este teléfono. Sin cuenta, sin sincronización y sin nube. Unas palabras honestas para que nada te sorprenda. NOOP es un proyecto personal y abierto: no es la app de WHOOP ni está afiliado a WHOOP. Lee una pulsera que es tuya en tu propio dispositivo. Considéralo un proyecto capaz pero aún en desarrollo, no un producto terminado. - WHOOP 4.0 está probado y funciona de principio a fin. WHOOP 5.0/MG es más reciente: la frecuencia cardíaca en vivo ya funciona, pero las métricas más avanzadas (recuperación, esfuerzo y sueño) para 5/MG aún están en desarrollo. NOOP siempre te indica qué está disponible y qué sigue en desarrollo. + WHOOP 4.0 está probada y funciona de principio a fin. WHOOP 5.0/MG es más reciente: la frecuencia cardiaca en vivo y el historial de la pulsera funcionan, y NOOP calcula a partir de ellos el sueño, la recuperación y el esfuerzo en tu dispositivo. Algunos datos nocturnos aún están incompletos en la 5/MG, así que sus fases de sueño son aproximadas. NOOP siempre te dice qué está activo y qué sigue en desarrollo. La frecuencia cardíaca en vivo está disponible al instante. La recuperación, el esfuerzo y el sueño se afinan a medida que NOOP aprende tu línea base durante las primeras noches de uso. ¿Quieres ver tu historial ahora? Importa tu exportación de WHOOP en Fuentes de datos y se incorporará en aproximadamente un minuto. Sin cuenta, sin nube y sin sincronización. NOOP solo se comunica con tu pulsera y mantiene todo en local. Tus datos son solo tuyos. NOOP usa Bluetooth para encontrar tu pulsera. Cuando continúes, concede el permiso para que pueda buscarla. NOOP se comunica directamente con tu pulsera mediante Bluetooth Low Energy. No hay ningún servidor de por medio. La conexión es local, igual que cada lectura que recibe. Cuando Android te lo pida, permite el acceso a Bluetooth para que NOOP pueda buscar tu pulsera y conectarse. - Es posible que tengas que poner tu WHOOP 5.0/MG en modo de emparejamiento la primera vez, con la app oficial de WHOOP cerrada. + Puede que tu WHOOP 5.0/MG necesite el modo de emparejamiento la primera vez: cierra la app oficial de WHOOP y luego toca la pulsera varias veces hasta que los LED parpadeen en azul. El sensor necesita estar en contacto con la piel para que los datos empiecen a ser útiles. Llévala bien ajustada en la muñeca o el bíceps, con el sensor contra la piel. Si la batería está baja, cárgala durante unos minutos. @@ -1955,7 +1958,7 @@ Tu pulsera está conectada y guardando datos. Reconecta para extraer lo más reciente. Pulsera no conectada. Toca para conectar. - La sincronización del historial es experimental en la 5.0. + La sincronización del historial es experimental en WHOOP 5.0/MG. Aún no hay frecuencia cardíaca en vivo ni historial sincronizado en esta sesión. Calibrando Se reanuda por la mañana @@ -2045,7 +2048,7 @@ Aprendiendo tu patrón · ~día %1$d · ~día %1$d–%2$d - Aún no hay temperatura cutánea nocturna: necesita ~4 noches de uso (o importa un CSV de WHOOP) + Aún no hay temperatura de la piel nocturna: aparece cuando se sincroniza una noche con la pulsera puesta (o importa un CSV de WHOOP) Temp. de piel Δ vs. referencia Haz NOOP tuyo: colores de acento y fondos personalizados, cuarenta deportes más con rutas GPS y un mapa de calor de calorías @@ -2613,7 +2616,7 @@ Una escala de Effort a tu elección, un anillo que puede dormir y muchos menos recálculos en vano Esta constante necesita al menos dos lecturas históricas antes de que NOOP pueda representarla. La estimación de oxígeno en sangre está desactivada - Tu pulsera ofrece una estimación de oxígeno en sangre, pero no está verificada y viene desactivada. Actívala en Ajustes, o importa una exportación de WHOOP en Fuentes de datos para el valor calibrado. + Tu pulsera informa una estimación de oxígeno en sangre, pero no está verificada y viene desactivada de forma predeterminada. Para verla, activa \"Blood Oxygen: strap estimate\" en Ajustes → Avanzado → Diagnósticos, o importa una exportación de WHOOP en Fuentes de datos para obtener el valor calibrado. Sin porcentaje de oxígeno en sangre desde un WHOOP 4.0 Tu pulsera guarda los canales ópticos en bruto, pero NOOP no los convierte en un porcentaje de oxígeno en sangre, así que esto seguirá vacío por mucho que la lleves. Importa una exportación de WHOOP en Fuentes de datos para rellenarlo con tu historial. Pedir a Android que vincule (experimental) @@ -2721,7 +2724,7 @@ Temperatura cutánea No hay temperatura medida para estas noches: se muestra la diferencia respecto a tu referencia. Una sincronización vuelve a analizar las noches recientes y la completa. Solo se muestran las noches con temperatura medida; en las demás solo se registró la diferencia respecto a la referencia. - Esta noche se analizó solo a partir de la frecuencia cardíaca, sin movimiento registrado, por lo que no se pudieron medir la variabilidad de la frecuencia cardíaca ni la frecuencia cardíaca en reposo. La causa habitual es una correa que no está totalmente emparejada. + Esta noche se detectó solo a partir de la frecuencia cardíaca, sin movimiento registrado, así que su horario y sus fases son aproximados. Un HRV o una frecuencia cardíaca en reposo vacíos significan que esa noche no tenía suficientes datos de frecuencia cardíaca utilizables para medirlos. Una pulsera que no está totalmente emparejada es el motivo habitual de que una noche no tenga movimiento. Ciclo diario Elige cuándo se reinician los pasos y el Esfuerzo en curso. Las siestas nunca empiezan un nuevo día. El día empieza @@ -2819,7 +2822,7 @@ Esta noche obtuvo una eficiencia alta pero muy poco sueño profundo o REM. Es más probable que sea un fallo de estimación de las fases que un déficit real de sueño reparador. Los totales se mantienen; interpreta el reparto con cautela. Cuenta de más los intervalos R-R, por eso no se muestra Consultar el nombre actual (solo lectura) - Cambiar el nombre aún no es compatible con una WHOOP 5.0 o MG. NOOP puede preguntar a la banda su nombre actual, que es el paso que decide si cambiarlo es posible. + Aún no se admite cambiar el nombre en una WHOOP 5.0 o MG. Un cambio de nombre experimental y una comprobación de nombre de solo lectura aparecen aquí mientras Centro de pruebas → Connection & Sync esté activado. Experimental en una WHOOP 5.0 o MG: este comando nunca se ha confirmado en esta generación. Es reversible, así que vuelve a cambiar el nombre si se comporta mal, y usa Consultar el nombre actual para ver si se aplicó. Alarma en %1$s Alarma en menos de un minuto @@ -2850,8 +2853,8 @@ Sincronización pendiente · %1$s %1$s bpm%2$s %1$s, %2$s, en uso - La alarma se activó en la pulsera con un comando experimental 5/MG. Se han comunicado despertares desde pulseras 5.0 y MG, pero no están garantizados. Mantén una alarma de respaldo para lo que no puedas perderte. - Envía consultas de protocolo experimentales y habilita la alarma de la pulsera 5/MG. No se necesita para la sincronización, el sueño, la recuperación ni los pasos normales. + NOOP lo establece en la pulsera con un comando experimental 5/MG cada vez que la pulsera se conecta o cambias la alarma. Se han comunicado despertares desde pulseras 5.0 y MG, pero no están garantizados. Mantén una alarma de respaldo para lo que no puedas perderte. + Envía consultas de protocolo experimentales y registra las respuestas en el registro de la pulsera. También permite la alarma experimental de la pulsera 5/MG: NOOP la envía la próxima vez que la pulsera se conecte o cambies la alarma. Desactivarlo no borra una alarma que ya esté en la pulsera. No se necesita para la sincronización, el sueño, la recuperación ni los pasos normales. Resultado del sueño actualizado Las horas de sueño o el tiempo total dormido de esta noche cambiaron al menos cinco minutos. Sonda de activación de ECG WHOOP MG diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml index bd1c4cc3b1..8143683f54 100644 --- a/android/app/src/main/res/values-fr/strings.xml +++ b/android/app/src/main/res/values-fr/strings.xml @@ -12,7 +12,7 @@ 0123456789abcdef0123456789abcdef - Un bracelet WHOOP se lie à un seul appareil. Alors qu\'il est connecté à NOOP il ne va pas diffuser to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Un bracelet WHOOP ne s’associe qu’à un seul appareil. L’associer à NOOP peut l’enlever à l’application WHOOP officielle, et inversement. C’est réversible : associez-le dans l’autre application quand vous voulez le récupérer. Ajouter Avancé : j\'ai déjà la clé de mon anneau Beta. * est une estimation sur l\'appareil. La température de la peau est une tendance versus votre propre base, étapes are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -45,7 +45,7 @@ Réessayer Utiliser l\'import de fichier Nous n\'avons pas pu prendre le contrôle de cet anneau. - La prise en charge du WHOOP 5.0 / MG est plus récente et encore expérimentale dans NOOP. + WHOOP 5.0 / MG gère les données en direct et l’historique. Les outils de protocole sont séparés dans le Centre de test. WHOOP est le bracelet principal et entièrement pris en charge par NOOP. Les autres bracelets de fréquence cardiaque diffusent la fréquence cardiaque et la VFC en direct, mais pas les données plus poussées de sommeil et de récupération de WHOOP. Plus plus de GroupeChevron @@ -270,7 +270,7 @@ Envoie la commande de position corporelle en lecture seule (0x54) et consigne la réponse brute complète du bracelet dans le journal, en décodant l\'enregistrement (révision / position / confiance / état) sur la WHOOP 4.0. Rien n\'est écrit sur le bracelet, et la détection de port ou la notation ne sont jamais modifiées. Test du pack de batterie (151 RE)… Résultat du test du pack de batterie (151) - Envoie la commande en lecture seule du pack de batterie (151) et décode la réponse du bracelet : charge, numéro de série et adresse Bluetooth du pack. Rien n\'est écrit sur le bracelet et rien n\'alimente tes données. Une WHOOP 4.0 n\'a pas de commande de pack et devrait rester silencieuse ; ce silence est lui-même un résultat utile. + Envoie la commande en lecture seule de la batterie externe (151) et affiche la réponse du bracelet. Une réponse SUCCESS est décodée comme la charge, le numéro de série et l’adresse Bluetooth de la batterie. Résultat connu : un WHOOP MG avec le firmware 50.39.1.0 répond FAILURE, qu’une batterie soit connectée ou non ; c’est pourquoi la charge de la batterie sur la carte Appareils provient de l’événement batterie envoyé par le bracelet lui-même, et non de cette commande. Un WHOOP 4.0 n’a pas de commande de batterie externe et reste normalement silencieux ; ce silence est en soi un résultat utile. Rien n’est écrit sur le bracelet et rien n’alimente vos données. Supprimer les données de cet appareil… Déconnecter Sonde des indicateurs de fonction (#761 RE)… @@ -286,7 +286,7 @@ Sonde de lecture de configuration de l’appareil (#103 RE)… Résultat de la sonde de lecture de configuration de l’appareil (#103) Demande au bracelet les VALEURS de configuration : GET_DEVICE_CONFIG_VALUE (0x79) et GET_FF_VALUE (0x80), une clé par échange. Ces deux commandes n’existent peut-être tout simplement pas dans ce micrologiciel — le savoir est précisément le but. Lecture seule : aucune valeur n’est écrite et les commandes SET ne sont jamais envoyées par cette sonde. Le résultat est affiché ici et écrit dans le journal du bracelet. - Deux tables de protocole indépendantes divergent sur l\'opcode de batterie étendue (98 contre 87). Ceci envoie le 98 curé en lecture seule et consigne la réponse brute complète du bracelet dans le journal. Une charge de type batterie confirme 98 sur votre firmware ; un stub court le laisse ambigu. Rien n\'est écrit sur le bracelet. Exportez et partagez le journal ensuite. + Deux tables de protocole indépendantes divergent sur l’opcode de batterie étendue (98 contre 87). Ceci envoie le 98 curé en lecture seule et affiche la réponse brute complète du bracelet (également écrite dans le journal du bracelet). Sur un WHOOP 4.0, une charge de type batterie confirme 98 sur votre firmware et le résultat décode la tension de la batterie ; un stub court le laisse ambigu. Sur un WHOOP 5/MG, la charge de la batterie ne provient pas de 98 (c’est la lecture de la batterie externe, commande 151), NOOP ne décode aucune valeur de la réponse et la ligne à lire est « Result code » : UNSUPPORTED signifie que ce firmware rejette 98. Rien n’est écrit sur le bracelet. Exportez et partagez le journal du bracelet ensuite. Annuler %1$s%% Fermer @@ -722,7 +722,7 @@ Rappel de détente Longueur de la fenêtre %1$s min - Les alarmes du bracelet WHOOP 5/MG nécessitent Sondes de protocole (Centre de test → Diagnostics du protocole 5/MG). L’heure de réveil est enregistrée, mais le bracelet ne porte pas encore une alarme active. Gardez une alarme de secours. + Les alarmes du bracelet WHOOP 5/MG nécessitent Sondes de protocole (Centre de test → Diagnostics du protocole 5/MG). L’heure de réveil est enregistrée, mais NOOP ne l’envoie pas au bracelet tant que Sondes de protocole est désactivé. Une alarme envoyée plus tôt peut encore être programmée sur le bracelet. Gardez une alarme de secours. Calibrez vos pas Fermer Jour @@ -731,7 +731,7 @@ Comment ça fonctionne Pas encore de jours où NOOP et votre téléphone ont compté les étapes. Une fois que votre téléphone enregistre un few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Aucun mouvement synchronisé pour l\'instant - NOOP estime vos pas à partir du mouvement de votre WHOOP, calibré sur le nombre de pas de votre téléphone. C\'est une estimation, pas un podomètre. Un WHOOP 4.0 ne transmet pas de pas. + NOOP estime vos pas à partir du mouvement enregistré par votre WHOOP, calibré sur le nombre de pas de votre téléphone. C’est une estimation, pas un podomètre matériel. Un WHOOP 4.0 n’envoie aucun nombre de pas. Sur un WHOOP 5.0 / MG, les jours couverts par son propre compteur de pas affichent ce compte à la place ; pour ajuster ce nombre, utilisez la Calibration des pas dans Réglages. Pas encore calibré Les jours où votre téléphone a également compté les étapes, NOOP apprend combien votre carte de mouvement à steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Ouvrez NOOP près de votre bracelet et laissez-le rattraper (une synchronisation d\'historique complète peut prendre un certain temps sur first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -743,7 +743,7 @@ Ce sont les jours où votre téléphone a aussi compté les pas, afin que NOOP apprenne comment votre mouvement se traduit en pas. Ou définissez le coefficient manuellement ci-dessous. Ces jours sont exclus de l\'estimation (le comptage réel de votre téléphone est affiché à la place). Ils figurent ici uniquement pour que vous puissiez juger de la précision de l\'estimation. On ne voit aucun mouvement de votre bracelet. Les étapes sont estimées à partir de votre WHOOP banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · mouvement → pas + WHOOP · mouvement → pas Jour suivant Jour précédent %1$s %2$s heures @@ -1168,7 +1168,7 @@ Les mises à jour vérifient à nouveau GitHub v5 - la sortie du signal brut: NOOP lit le signal, sur votre appareil, libre Semaine en revue est honnête environ une demi-semaine finie - WHOOP 4.0 est la voie prise en charge + WHOOP 4.0 est la voie la plus testée WHOOP 5.0 histoire décodage vient à Android WHOOP 5.0/MG buzz - la commande réelle (octet-pour-octet) WHOOP 5.0/MG buzz - essayer la bonne commande (expérimentale) @@ -1214,7 +1214,7 @@ Activer Bluetooth WHOOP 5 / MG (expérimental) Vous ne vous connectez pas ? Passez à travers ces - Votre bracelet est connecté et nous essayons une poignée de main expérimentale pour obtenir le direct heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + Votre bracelet est connecté et nous essayons une poignée de main expérimentale pour activer la fréquence cardiaque en direct via le profil standard. Ce n’est pas encore vérifié sur du matériel 5/MG, donc la FC peut apparaître ou non, et certaines données nocturnes du 5/MG sont encore incomplètes, donc les phases de sommeil sont approximatives. Votre bracelet n’a aucun problème : WHOOP 4.0 est entièrement pris en charge. Jour Supprimer toutes les données de cet appareil ? Actions du périphérique pour %1$s @@ -1278,7 +1278,7 @@ liquidePressScale Moy. Buzz - Impossible de se connecter - le couplage de votre bracelet a été réinitialisé + Votre bracelet a besoin d’aide pour se reconnecter : étapes ci-dessous En charge Distance Effort @@ -1295,7 +1295,7 @@ Bracelet Effectuer une lecture de VFC ● %1$s - WHOOP 5.0/MG pair avec une application à la fois. Si un scan ne trouve rien, décompresser dans the official WHOOP app and fully close that app, then Connect again. + Le WHOOP 5.0/MG s’associe à une seule application à la fois. Si un scan ne trouve rien, dissociez-le dans l’application officielle WHOOP et fermez complètement cette application, puis touchez à nouveau Connecter. NoopButton.échelle Enregistrer les modifications Nombre de textes @@ -1336,7 +1336,7 @@ Assistance pour contacter %1$s Capture continue de la VFC Impossible de vérifier. Réessayez. - Impulsions du compteur par pas. Laissez à 1,0 sauf si vos pas sont très élevés. Sur un WHOOP 5/MG, ils peuvent être très élevés (10× ou plus), donc ceci va jusqu\'à 30. Marchez un nombre connu de 1 000 pas et divisez le comptage de NOOP par le comptage réel pour obtenir votre valeur. + Ticks du compteur par pas pour le compteur de pas propre à un WHOOP 5/MG. Laissez 1,0 sauf si vos pas sont constamment trop élevés. Marchez 1 000 pas connus et divisez le total de NOOP par le total réel pour obtenir votre valeur. Afficher la conscience du cycle Conscience du cycle Fond du cycle journalier @@ -1402,7 +1402,7 @@ Revues chaque bloc de réveil marqué pour de vraies preuves de se lever ( change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Rythme (expérimental) Exécute le flux continu de VFC seulement pendant votre fenêtre d\'heures tranquilles (22:00–07:00 par défaut), réduisant de moitié le coût de la batterie. Les lectures de stress diurne seront plus rares. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Enregistre les dernières 24h d\'échantillons de capteurs décodés (fréquence cardiaque, R-R, mouvement, étapes et tous les flux profonds 5/MG que vous avez débloqués) comme un seul CSV que vous pouvez partager, pour bricoler avec vos propres données. Rien ne laisse le téléphone à moins que vous le partagez. + Enregistre les dernières 24 h d’échantillons de capteurs décodés (fréquence cardiaque, R-R, mouvement, pas, SpO₂, température cutanée, respiration et événements) dans un seul CSV que vous pouvez partager, pour explorer vos propres données. Rien ne quitte le téléphone sauf si vous le partagez. Envoyer la séquence d\'activation au bracelet Configuration des sauvegardes automatiques Paramètres @@ -1826,7 +1826,7 @@ %1$d entraînement %1$d entraînements - Ce bracelet n\'envoie pas de SpO₂ par Bluetooth. Importez un export WHOOP ou Health Connect pour le voir. + Ce bracelet n’envoie pas de signal SpO₂ pour ce graphique. Importez un export WHOOP ou des données Health Connect pour le voir. Ce bracelet n\'envoie aucun flux de respiration brut. Votre fréquence respiratoire estimée apparaît sur l\'écran Santé. Développé Réduit @@ -1895,6 +1895,9 @@ L\'économiseur de batterie fige les jauges, notifications Android traduites et graphiques instantanés Aucune importation SpO₂ ni valeur Santé Valeurs brutes uniquement — importation requise + Aucun comptage brut de SpO₂ (WHOOP 4.0 uniquement) + Synchroniser maintenant. Nécessite l’association sécurisée complète du bracelet, qui n’est pas terminée. + Association incomplète Désactiver à nouveau les données détaillées Nécessite l’appairage chiffré complet : fermez d’abord l’app WHOOP officielle et appairez le bracelet à NOOP (une liaison limitée à la FC en direct ne peut pas transporter l’écriture). Écrit la valeur d’arrêt dans les 16 indicateurs et relit chacun d’eux, pour que vous voyiez ce que le bracelet enregistre réellement et pas seulement qu’il a accusé réception. La valeur d’arrêt est déduite de l’indicateur que NOOP désactive déjà ainsi pour la diffusion Garmin ; elle n’a jamais été observée sur un indicateur R22, c’est pourquoi NOOP en teste un seul d’abord et s’arrête si le bracelet le refuse. Effacer les indicateurs n’équivaut pas à voir cesser les enregistrements détaillés : vérifiez-le en synchronisant ensuite. @@ -1918,13 +1921,13 @@ Tout reste sur ce téléphone. Pas de compte, pas de synchronisation, pas de cloud. Quelques mots honnêtes, pour éviter toute surprise. NOOP est un projet personnel et ouvert : ce n\'est pas l\'application WHOOP et il n\'est pas affilié à WHOOP. Il lit un bracelet qui vous appartient sur votre propre appareil. Considérez-le comme un projet performant encore en développement, et non comme un produit fini. - WHOOP 4.0 est testé et fonctionne de bout en bout. WHOOP 5.0/MG est plus récent : la fréquence cardiaque en direct fonctionne déjà, mais les métriques plus avancées (récupération, effort et sommeil) pour 5/MG sont encore en développement. NOOP vous indique toujours ce qui est disponible et ce qui est encore en cours de développement. + Le WHOOP 4.0 est testé et fonctionne de bout en bout. Le WHOOP 5.0/MG est plus récent : la fréquence cardiaque en direct et l\'historique du bracelet fonctionnent, et NOOP en calcule le sommeil, la récupération et l\'effort sur votre appareil. Certaines données nocturnes sont encore incomplètes sur le 5/MG, ses phases de sommeil sont donc approximatives. NOOP vous indique toujours ce qui est actif et ce qui est encore en construction. La fréquence cardiaque en direct est disponible instantanément. La récupération, l\'effort et le sommeil gagnent en précision à mesure que NOOP apprend votre référence pendant les premières nuits de port. Vous voulez voir votre historique maintenant ? Importez votre export WHOOP dans Sources de données : il sera ajouté en une minute environ. Pas de compte, pas de cloud, pas de synchronisation. NOOP communique uniquement avec votre bracelet et conserve tout en local. Vos données n\'appartiennent qu\'à vous. NOOP utilise le Bluetooth pour trouver votre bracelet. Lorsque vous continuez, accordez l\'autorisation afin qu\'il puisse le rechercher. NOOP communique directement avec votre bracelet via Bluetooth Low Energy. Aucun serveur ne sert d\'intermédiaire. La connexion est locale, tout comme chaque mesure récupérée. Lorsque Android vous le demande, autorisez le Bluetooth afin que NOOP puisse rechercher votre bracelet et s\'y connecter. - Le WHOOP 5.0/MG peut devoir être placé en mode d\'association la première fois, avec l\'application WHOOP officielle fermée. + Le WHOOP 5.0/MG peut nécessiter le mode d’association la première fois : fermez l’application WHOOP officielle, puis tapotez le bracelet à plusieurs reprises jusqu’à ce que les LED clignotent en bleu. Le capteur doit être en contact avec la peau pour que les données commencent à être exploitables. Portez-le bien ajusté au poignet ou au biceps, le capteur contre la peau. Si la batterie est faible, laissez-le charger quelques minutes. @@ -1973,7 +1976,7 @@ Votre bracelet est connecté et enregistre les données. Reconnectez-vous pour récupérer les dernières données. Bracelet non connecté. Touchez pour vous connecter. - La synchronisation de l\'historique est expérimentale sur 5.0. + La synchronisation de l’historique est expérimentale sur WHOOP 5.0/MG. Aucune fréquence cardiaque en direct ni historique synchronisé durant cette session. Calibration en cours Reprend le matin @@ -2063,7 +2066,7 @@ Apprentissage de votre profil · ~jour %1$d · ~jour %1$d–%2$d - Pas encore de température cutanée nocturne — nécessite ~4 nuits portées (ou importez un CSV WHOOP) + Pas encore de température cutanée nocturne : elle apparaît dès qu’une nuit portée est synchronisée (ou importez un CSV WHOOP) Temp. cutanée Δ vs référence NOOP à votre image — couleurs d\'accent et fonds personnalisés, quarante sports de plus avec tracés GPS, et une carte de chaleur des calories @@ -2612,7 +2615,7 @@ Une échelle d\'Effort au choix, une bague qui peut dormir, et bien moins de recalculs inutiles Cette constante nécessite au moins deux relevés historiques avant que NOOP puisse la tracer. L\'estimation de l\'oxygène sanguin est désactivée - Votre bracelet fournit une estimation de l\'oxygène sanguin, mais elle n\'est pas vérifiée et désactivée par défaut. Activez-la dans Réglages, ou importez un export WHOOP dans Sources de données pour la valeur calibrée. + Votre bracelet fournit une estimation de l’oxygène sanguin, mais elle n’est pas vérifiée et désactivée par défaut. Pour la voir, activez \"Blood Oxygen: strap estimate\" dans Réglages → Avancé → Diagnostics, ou importez un export WHOOP dans Sources de données pour obtenir la valeur calibrée. Pas de pourcentage d\'oxygène sanguin depuis un WHOOP 4.0 Votre bracelet enregistre les canaux optiques bruts, mais NOOP ne les convertit pas en pourcentage d\'oxygène sanguin : cette section restera vide quel que soit le temps de port. Importez un export WHOOP dans Sources de données pour la remplir depuis votre historique. Demander à Android de s\'appairer (expérimental) @@ -2720,7 +2723,7 @@ Température cutanée Aucune température mesurée pour ces nuits — l\'écart par rapport à votre référence est affiché. Une synchronisation réévalue les nuits récentes et le complète. Seules les nuits avec une température mesurée sont affichées ; les autres n\'ont enregistré qu\'un écart par rapport à la référence. - Cette nuit a été analysée à partir de la seule fréquence cardiaque, sans mouvement enregistré, donc la variabilité de la fréquence cardiaque et la fréquence cardiaque au repos n\'ont pas pu être mesurées. La cause habituelle est un bracelet qui n\'est pas entièrement appairé. + Cette nuit a été détectée à partir de la seule fréquence cardiaque, sans mouvement enregistré ; son horaire et ses phases sont donc approximatifs. Une VFC ou une fréquence cardiaque au repos vide signifie que cette nuit ne contenait pas assez de données de fréquence cardiaque exploitables pour la mesurer. Un bracelet qui n’est pas entièrement appairé est la raison habituelle pour laquelle une nuit n’a pas de mouvement. Cycle journalier Choisissez quand les pas et l’Effort en cours repartent de zéro. Les siestes ne commencent jamais une nouvelle journée. Début de la journée @@ -2818,7 +2821,7 @@ Cette nuit a obtenu une efficacité élevée mais très peu de sommeil profond ou paradoxal. C\'est plus probablement une erreur d\'estimation des phases qu\'un vrai déficit de récupération. Les totaux sont conservés, lisez la répartition avec prudence. Surestime les intervalles R-R, donc aucune valeur Lire le nom actuel (lecture seule) - Le renommage n\'est pas encore pris en charge sur une WHOOP 5.0 ou MG. NOOP peut demander au bracelet son nom actuel, ce qui déterminera si le renommage est possible. + Le renommage n’est pas encore pris en charge sur une WHOOP 5.0 ou MG. Un renommage expérimental et une vérification du nom en lecture seule apparaissent ici lorsque Centre de test → Connection & Sync est activé. Expérimental sur une WHOOP 5.0 ou MG : cette commande n\'a jamais été confirmée sur cette génération. Elle est réversible, renommez donc à nouveau en cas de problème, et utilisez Lire le nom actuel pour vérifier. Alarme dans %1$s Alarme dans moins d\'une minute @@ -2849,8 +2852,8 @@ Synchronisation en attente · %1$s %1$s bpm%2$s %1$s, %2$s, en cours d\'utilisation - L’alarme est activée sur le bracelet avec une commande expérimentale 5/MG. Des réveils par le bracelet ont été signalés sur 5.0 et MG, sans être garantis. Gardez une alarme de secours pour tout réveil important. - Envoie des requêtes de protocole expérimentales et active l’alarme du bracelet 5/MG. Inutile pour la synchronisation, le sommeil, la récupération ou les pas ordinaires. + NOOP l’enregistre sur le bracelet avec une commande expérimentale 5/MG à chaque connexion du bracelet ou modification de l’alarme. Des réveils par le bracelet ont été signalés sur 5.0 et MG, sans être garantis. Gardez une alarme de secours pour tout réveil important. + Envoie des requêtes de protocole expérimentales et enregistre les réponses dans le journal du bracelet. Autorise aussi l’alarme expérimentale du bracelet 5/MG : NOOP l’envoie à la prochaine connexion du bracelet ou lorsque vous modifiez l’alarme. La désactiver n’efface pas une alarme déjà présente sur le bracelet. Inutile pour la synchronisation, le sommeil, la récupération ou les pas ordinaires. Résultat du sommeil mis à jour Les horaires de sommeil ou la durée totale de sommeil de cette nuit ont changé d’au moins cinq minutes. Sonde d\'activation ECG WHOOP MG diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml index 1a47561f99..aa8ca3687a 100644 --- a/android/app/src/main/res/values-it/strings.xml +++ b/android/app/src/main/res/values-it/strings.xml @@ -263,7 +263,7 @@ Sospendi acquisizione HRV Quando la batteria della fascia è scarica, interrompe il flusso HRV sempre attivo in background, il maggiore consumo continuo della fascia. La schermata In diretta mostra comunque la frequenza cardiaca, e il flusso si riattiva automaticamente quando la fascia è carica. 0123456789abcdef0123456789abcdef - Una fascia WHOOP si abbina a un solo dispositivo. Mentre è collegata a NOOP non trasmetterà to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Una fascia WHOOP si abbina a un solo dispositivo. Abbinarla a NOOP può sottrarla all’app ufficiale WHOOP, e viceversa. È reversibile: abbinala nell’altra app quando vuoi riaverla. Aggiungi Avanzato: ho già la chiave del mio anello Beta. * è una stima sul dispositivo. La temperatura della pelle è un andamento rispetto alla tua linea di base, i passi are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -296,7 +296,7 @@ Riprova Usa l\'importazione da file Non siamo riusciti a prendere il controllo di questo anello. - Il supporto per WHOOP 5.0 / MG è più recente e ancora sperimentale in NOOP. + WHOOP 5.0 / MG supporta i dati in tempo reale e la cronologia della fascia. Gli strumenti di ricerca sul protocollo sono separati nel Centro test. WHOOP è la fascia principale e pienamente supportata di NOOP. Le altre fasce per la frequenza cardiaca trasmettono la frequenza cardiaca in diretta e l\'HRV, ma non i dati più approfonditi sul sonno e sul recupero di WHOOP. Altro moreGroupChevron @@ -518,7 +518,7 @@ Risultato sonda info batteria (#592) Sonda battery pack (151 RE)… Risultato sonda battery pack (151) - Invia il comando di sola lettura del battery pack (151) e decodifica la risposta della fascia: carica, numero di serie e indirizzo Bluetooth del pack. Non viene scritto nulla sulla fascia e nulla finisce nei tuoi dati. Una WHOOP 4.0 non ha il comando del pack e dovrebbe restare in silenzio; quel silenzio è di per sé un risultato utile. + Invia il comando di sola lettura del battery pack (151) e mostra la risposta della fascia. Una risposta SUCCESS viene decodificata come carica, numero di serie e indirizzo Bluetooth del pack. Risultato noto: un WHOOP MG con firmware 50.39.1.0 risponde FAILURE che un pack sia collegato o meno; per questo la carica del pack sulla scheda Dispositivi proviene dall’evento del pack inviato dalla fascia stessa, non da questo comando. Un WHOOP 4.0 non ha un comando per il pack e dovrebbe restare in silenzio; quel silenzio è di per sé un risultato utile. Non viene scritto nulla sulla fascia e nulla alimenta i tuoi dati. Sonda posizione sul corpo (#690 RE)… Risultato sonda posizione sul corpo (#690) Invia il comando di sola lettura della posizione sul corpo (0x54) e scrive la risposta grezza completa della fascia nel log della fascia, decodificando il record (revisione / posizione / affidabilità / stato) su WHOOP 4.0. Non viene scritto nulla sulla fascia e non modifica mai il rilevamento di indossamento o i punteggi. @@ -529,7 +529,7 @@ Sonda di lettura della configurazione del dispositivo (#103 RE)… Risultato della sonda di lettura della configurazione del dispositivo (#103) Chiede alla fascia i VALORI di configurazione: GET_DEVICE_CONFIG_VALUE (0x79) e GET_FF_VALUE (0x80), una chiave per scambio. È possibile che entrambi i comandi semplicemente non esistano in questo firmware: scoprirlo è proprio lo scopo. Sola lettura: non viene scritto alcun valore e i comandi SET non vengono mai inviati da questa sonda. Il risultato è mostrato qui e scritto nel registro della fascia. - Due tabelle di protocollo indipendenti non concordano sull\'opcode della batteria estesa (98 contro 87). Questa sonda invia il comando curato di sola lettura 98 e scrive la risposta grezza completa della fascia nel log della fascia. Un payload di tipo batteria conferma 98 sul tuo firmware; una risposta breve lascia il dubbio. Non viene scritto nulla sulla fascia. Al termine esporta e condividi il log della fascia. + Due tabelle di protocollo indipendenti non concordano sull’opcode della batteria estesa (98 contro 87). Questa sonda invia il comando curato di sola lettura 98 e mostra la risposta grezza completa della fascia (scritta anche nel log della fascia). Su un WHOOP 4.0 un payload di tipo batteria conferma 98 sul tuo firmware e il risultato decodifica la tensione del pack; una risposta breve lascia il dubbio. Su un WHOOP 5/MG la carica del pack non proviene da 98 (è la lettura del battery pack, comando 151), NOOP non decodifica alcun valore dalla risposta e la riga da leggere è «Result code»: UNSUPPORTED significa che questo firmware rifiuta 98. Non viene scritto nulla sulla fascia. Al termine esporta e condividi il log della fascia. Annulla %1$s%% Chiudi @@ -967,7 +967,7 @@ Promemoria per il rilassamento Durata della finestra %1$s min - Le sveglie sulla fascia WHOOP 5/MG richiedono Sonde di protocollo (Centro test → Diagnostica protocollo 5/MG). L’ora di sveglia è salvata, ma la fascia non è ancora armata. Tieni una sveglia di riserva. + Le sveglie sulla fascia WHOOP 5/MG richiedono Sonde di protocollo (Centro test → Diagnostica protocollo 5/MG). L’ora di sveglia è salvata, ma NOOP non la invia alla fascia finché Sonde di protocollo è disattivato. Una sveglia inviata in precedenza potrebbe essere ancora impostata sulla fascia. Tieni una sveglia di riserva. Calibra i tuoi passi Chiudi Giorno @@ -976,7 +976,7 @@ Come funziona Ancora nessun giorno in cui sia NOOP sia il telefono abbiano contato i passi. Quando il telefono registra un few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Ancora nessun movimento sincronizzato - NOOP stima i tuoi passi dal movimento del tuo WHOOP, calibrato sul conteggio dei passi del tuo telefono. È una stima, non un contapassi. Un WHOOP 4.0 non trasmette i passi. + NOOP stima i tuoi passi dal movimento memorizzato del tuo WHOOP, calibrato sul conteggio dei passi del tuo telefono. È una stima, non un contapassi hardware. Un WHOOP 4.0 non invia alcun conteggio dei passi. Su un WHOOP 5.0 / MG, i giorni coperti dal suo contapassi mostrano invece quel conteggio; per regolare quel numero, usa la Calibrazione dei passi in Impostazioni. Non ancora calibrato Nei giorni in cui anche il telefono ha contato i passi, NOOP impara quanto il tuo movimento corrisponde a steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Apri NOOP vicino alla fascia e lascia che si aggiorni (una sincronizzazione completa della cronologia può richiedere un po\' di tempo su first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -988,7 +988,7 @@ Questi sono i giorni in cui anche il tuo telefono ha contato i passi, così NOOP può imparare come il tuo movimento si traduce in passi. Oppure imposta il coefficiente manualmente qui sotto. Questi giorni sono esclusi dalla stima (al loro posto è mostrato il conteggio reale del tuo telefono). Sono qui solo perché tu possa giudicare l\'accuratezza della stima. Non rileviamo ancora alcun movimento dalla tua fascia. I passi sono stimati dal banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · movimento → passi + WHOOP · movimento → passi Giorno successivo Giorno precedente %1$s %2$s ore @@ -1413,7 +1413,7 @@ La verifica aggiornamenti usa di nuovo GitHub v5 - la versione del segnale grezzo: NOOP legge il segnale, sul tuo dispositivo, gratis Settimana in rassegna è onesta su una settimana a metà - WHOOP 4.0 è il percorso supportato + WHOOP 4.0 è il percorso più testato La decodifica dello storico di WHOOP 5.0 arriva su Android Vibrazione di WHOOP 5.0/MG - il comando vero (identico byte per byte) Vibrazione di WHOOP 5.0/MG - prova del comando giusto (sperimentale) @@ -1459,7 +1459,7 @@ Attiva il Bluetooth WHOOP 5 / MG (sperimentale) Non si collega? Segui questi passaggi - La fascia è connessa e stiamo provando un handshake sperimentale per attivare i dati in diretta heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + La fascia è connessa e stiamo provando un handshake sperimentale per attivare la frequenza cardiaca in diretta dal profilo standard. Non è ancora verificato su hardware 5/MG, quindi la FC potrebbe comparire o no, e alcuni dati notturni del 5/MG sono ancora incompleti, quindi le fasi del sonno sono approssimative. Non c’è nulla che non vada nella tua fascia: WHOOP 4.0 è completamente supportato. Giorno Eliminare tutti i dati di questo dispositivo? Elimina i dati di questo dispositivo… @@ -1531,7 +1531,7 @@ liquidPressScale Media Vibra - Impossibile collegarsi - l\'abbinamento della fascia è stata reimpostata + La tua fascia ha bisogno di aiuto per riconnettersi: passaggi qui sotto In carica Distanza Sforzo @@ -1548,7 +1548,7 @@ Fascia Fai una lettura HRV ● %1$s - WHOOP 5.0/MG si abbina con un\'app alla volta. Se una scansione non trova nulla, dissociala in the official WHOOP app and fully close that app, then Connect again. + WHOOP 5.0/MG si associa a una sola app alla volta. Se una scansione non trova nulla, dissocialo nell’app ufficiale WHOOP e chiudi completamente quell’app, poi tocca di nuovo Collega. NoopButton.scale Salva modifiche CountUpText @@ -1592,7 +1592,7 @@ Contatta l\'assistenza a %1$s Acquisizione continua dell\'HRV Impossibile verificare. Riprova. - Conteggi del contatore per passo. Lascia a 1.0 a meno che i tuoi passi non risultino alti. Su un WHOOP 5/MG possono essere molto alti (10× o più), quindi questo arriva fino a 30. Cammina per 1.000 passi noti e dividi il conteggio di NOOP per quello reale per ottenere il tuo valore. + Tick del contatore per passo per il contapassi proprio di un WHOOP 5/MG. Lascia 1,0 a meno che i tuoi passi risultino costantemente alti. Cammina 1.000 passi noti e dividi il conteggio di NOOP per quello reale per ottenere il tuo valore. Mostra consapevolezza del ciclo Consapevolezza del ciclo Sfondo del ciclo giornaliero @@ -1658,7 +1658,7 @@ Esamina ogni blocco di veglia conteggiato cercando prove reali che ti sei alzato (cadenza di camminata, un change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Ritmo (sperimentale) Esegue il flusso HRV continuo solo durante la tua fascia oraria di quiete (22:00–07:00 per impostazione predefinita), dimezzando circa il consumo di batteria. Le letture dello Stress diurne saranno più rade. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Salva le ultime 24h di campioni del sensore decodificati (frequenza cardiaca, R-R, movimento, passi ed eventuali flussi approfonditi 5/MG che hai sbloccato) in un unico CSV da condividere, per sperimentare con i tuoi dati. Nulla lascia il telefono a meno che tu non lo condivida. + Salva le ultime 24 ore di campioni dei sensori decodificati (frequenza cardiaca, R-R, movimento, passi, SpO₂, temperatura cutanea, respirazione ed eventi) in un unico CSV che puoi condividere, per sperimentare con i tuoi dati. Nulla lascia il telefono a meno che tu non lo condivida. Invia la sequenza di attivazione alla fascia Configura i backup automatici Impostazioni @@ -1912,7 +1912,7 @@ %1$d allenamento %1$d allenamenti - Questa fascia non invia SpO₂ via Bluetooth. Importa un\'esportazione WHOOP o Health Connect per vederlo. + Questa fascia non invia un segnale SpO₂ per questo grafico. Importa un’esportazione WHOOP o dati di Health Connect per vederlo. Questa fascia non invia un flusso grezzo della respirazione. La tua frequenza respiratoria stimata compare nella schermata Salute. Espanso Compresso @@ -1965,6 +1965,9 @@ Il risparmio batteria attenua gli indicatori, notifiche Android tradotte e grafici che si caricano all\'istante Nessuna importazione SpO₂ o valore Health Solo valori grezzi — richiede un\'importazione + Nessun conteggio SpO₂ grezzo (solo WHOOP 4.0) + Sincronizza ora. Richiede l’abbinamento sicuro completo della fascia, che non è stato completato. + Abbinamento incompleto Disattiva di nuovo i dati approfonditi Richiede l\'abbinamento crittografata completa: chiudi l\'app ufficiale WHOOP e abbina prima la fascia a NOOP (un collegamento solo per la FC in diretta non può trasportare la scrittura). Scrive il valore di spegnimento su tutti e 16 i flag e li rilegge uno a uno, così vedi che cosa la fascia memorizza e non solo che ha confermato. Il valore di spegnimento è dedotto dal flag che NOOP già disattiva così per la trasmissione Garmin — non è mai stato osservato su un flag R22, perciò NOOP ne prova prima uno solo e si ferma se la fascia lo rifiuta. Cancellare i flag non equivale a vedere fermarsi le registrazioni approfondite: verificalo sincronizzando dopo. @@ -1987,13 +1990,13 @@ Tutto resta su questo telefono. Nessun account, nessuna sincronizzazione, nessun cloud. Qualche parola sincera, così niente sarà una sorpresa. NOOP è un progetto personale e aperto - non è l\'app WHOOP e non è affiliato a WHOOP. Legge una fascia di tua proprietà, sul tuo dispositivo. Consideralo un lavoro in corso già capace, piuttosto che un prodotto finito. - WHOOP 4.0 è testato e funziona da cima a fondo. WHOOP 5.0/MG è più recente: la frequenza cardiaca dal vivo funziona già, ma le metriche più profonde (recupero, carico, sonno) per 5/MG sono ancora in fase di studio. NOOP ti dice sempre cosa è attivo e cosa è ancora in costruzione. + WHOOP 4.0 è testato e funziona da capo a fondo. WHOOP 5.0/MG è più recente: frequenza cardiaca live e cronologia della fascia funzionano, e NOOP ne ricava sul tuo dispositivo sonno, recupero e sforzo. Alcuni dati notturni sono ancora incompleti sul 5/MG, quindi le sue fasi del sonno sono approssimative. NOOP ti dice sempre cosa è attivo e cosa è ancora in costruzione. La frequenza cardiaca in diretta è immediata. Recupero, carico e sonno si affinano man mano che NOOP impara la tua linea di base nelle prime notti in cui la indossi. Vuoi subito la tua cronologia? Importa la tua esportazione WHOOP in Sorgenti dati e viene recuperata in circa un minuto. Nessun account, nessun cloud, nessuna sincronizzazione. NOOP parla solo con la tua fascia e tiene tutto in locale. I tuoi dati sono solo tuoi. NOOP usa il Bluetooth per trovare la tua fascia. Quando continui, concedi l\'autorizzazione così può eseguire la scansione. NOOP parla con la tua fascia direttamente via Bluetooth Low Energy. Non c\'è nessun server in mezzo. La connessione è locale, e lo è anche ogni lettura che raccoglie. Quando Android lo chiede, consenti il Bluetooth così NOOP può eseguire la scansione e collegarsi. - WHOOP 5.0/MG potrebbe richiedere la modalità di abbinamento la prima volta, con l\'app ufficiale WHOOP chiusa. + WHOOP 5.0/MG potrebbe richiedere la modalità di abbinamento la prima volta: chiudi l’app ufficiale WHOOP, poi tocca più volte la fascia finché i LED non lampeggiano di blu. Il sensore deve essere a contatto con la pelle perché i dati abbiano senso. Indossala aderente al polso o al bicipite, con il sensore a contatto con la pelle. Se la batteria è scarica, mettila in carica per qualche minuto. @@ -2042,7 +2045,7 @@ La tua fascia è connessa e sta salvando i dati. Riconnettiti per recuperare i dati più recenti. Fascia non connessa. Tocca per connettere. - La sincronizzazione della cronologia è sperimentale su 5.0. + La sincronizzazione della cronologia è sperimentale su WHOOP 5.0/MG. Ancora nessuna frequenza cardiaca in diretta né cronologia sincronizzata in questa sessione. Calibrazione Riprende al mattino @@ -2132,7 +2135,7 @@ Sto imparando il tuo schema · ~giorno %1$d · ~giorno %1$d–%2$d - Ancora nessuna temperatura della pelle notturna — servono ~4 notti indossata (o importa un CSV WHOOP) + Ancora nessuna temperatura cutanea notturna: compare dopo la sincronizzazione di una notte indossata (o importa un CSV WHOOP) Temp. pelle Δ vs linea di base Rendi NOOP tuo — colori del tema e sfondi personalizzati, altri quaranta sport con percorsi GPS e una mappa di calore delle calorie @@ -2595,7 +2598,7 @@ Una scala di sforzo a tua scelta, un anello che arriva al sonno e molti meno ricalcoli sprecati Questo parametro vitale richiede almeno due letture storiche prima che NOOP possa mostrarlo in un grafico. La stima dell\'ossigeno nel sangue è disattivata - La tua fascia fornisce una stima dell\'ossigeno nel sangue, ma non è verificata ed è disattivata per impostazione predefinita. Attiva la stima della fascia in Impostazioni per vederla, oppure importa un\'esportazione WHOOP in Sorgenti dati per il valore calibrato. + La tua fascia segnala una stima dell’ossigeno nel sangue, ma non è verificata ed è disattivata per impostazione predefinita. Per vederla, attiva \"Blood Oxygen: strap estimate\" in Impostazioni → Avanzate → Diagnostica, oppure importa un’esportazione WHOOP in Fonti dati per il valore calibrato. Nessuna percentuale di ossigeno nel sangue da una WHOOP 4.0 La tua fascia memorizza i canali ottici grezzi, ma NOOP non li trasforma in una percentuale di ossigeno nel sangue, quindi questo campo resta vuoto per quanto a lungo tu la indossi. Importa un\'esportazione WHOOP in Sorgenti dati per riempirlo dalla cronologia del tuo account. Raccoglitore dati grezzi 5/MG @@ -2700,7 +2703,7 @@ Temperatura della pelle Nessuna temperatura misurata per queste notti — viene mostrata la differenza rispetto alla tua linea di base. Una sincronizzazione ricalcola le notti recenti e la completa. Sono mostrate solo le notti con una temperatura misurata; le altre hanno registrato solo una differenza rispetto alla linea di base. - Le fasi di questa notte sono state stimate solo dalla frequenza cardiaca, senza movimento registrato, quindi HRV e frequenza cardiaca a riposo non sono state misurate. La causa più comune è una fascia non completamente abbinata. + Questa notte è stata individuata solo dalla frequenza cardiaca, senza movimento registrato, quindi orari e fasi sono approssimativi. Un HRV o una frequenza cardiaca a riposo vuoti indicano che quella notte non conteneva abbastanza dati di frequenza cardiaca utilizzabili per misurarli. Una fascia non completamente associata è il motivo abituale per cui una notte non ha movimento. Ciclo giornaliero Scegli quando ripartono da zero i passi e lo sforzo in corso. I sonnellini non avviano mai un nuovo giorno. Inizio giornata @@ -2787,7 +2790,7 @@ Questa notte ha ottenuto un\'alta efficienza ma pochissimo sonno profondo o REM, più probabilmente un errore di stima delle fasi che una reale carenza di recupero. I totali sono mantenuti così come sono; leggi la suddivisione con cautela. Conta troppi intervalli R-R, quindi nessun valore Controlla il nome attuale (sola lettura) - La rinomina non è ancora supportata su una WHOOP 5.0 o MG. NOOP può chiedere alla fascia il suo nome attuale, che è il passaggio che decide se la rinomina sia possibile. + Rinominare non è ancora supportato su un WHOOP 5.0 o MG. Un rinomina sperimentale e un controllo del nome in sola lettura compaiono qui quando Centro test → Connection & Sync è attivo. Sperimentale su una WHOOP 5.0 o MG: questo comando non è mai stato confermato su questa generazione di fasce. È reversibile, quindi rinominala di nuovo se si comporta in modo anomalo e usa Controlla il nome attuale per verificare se ha funzionato. Sveglia tra %1$s Sveglia tra meno di un minuto @@ -2818,8 +2821,8 @@ Sincronizzazione in sospeso · %1$s %1$s bpm%2$s %1$s, %2$s, in uso - La sveglia è stata attivata sulla fascia con un comando sperimentale 5/MG. Sono stati segnalati risvegli dalla fascia su 5.0 e MG, ma non sono garantiti. Tieni una sveglia di riserva per gli impegni importanti. - Invia richieste di protocollo sperimentali e abilita la sveglia della fascia 5/MG. Non serve per la normale sincronizzazione, il sonno, il recupero o i passi. + NOOP la imposta sulla fascia con un comando sperimentale 5/MG ogni volta che la fascia si connette o modifichi la sveglia. Sono stati segnalati risvegli dalla fascia su 5.0 e MG, ma non sono garantiti. Tieni una sveglia di riserva per gli impegni importanti. + Invia richieste di protocollo sperimentali e registra le risposte nel registro della fascia. Consente anche la sveglia sperimentale della fascia 5/MG: NOOP la invia alla prossima connessione della fascia o quando modifichi la sveglia. Disattivarlo non cancella una sveglia già presente sulla fascia. Non serve per la normale sincronizzazione, il sonno, il recupero o i passi. Risultato del sonno aggiornato Gli orari del sonno o il tempo totale dormito di questa notte sono cambiati di almeno cinque minuti. Sonda di attivazione ECG WHOOP MG diff --git a/android/app/src/main/res/values-pl/strings.xml b/android/app/src/main/res/values-pl/strings.xml index b5e9c52de8..c565380f1d 100644 --- a/android/app/src/main/res/values-pl/strings.xml +++ b/android/app/src/main/res/values-pl/strings.xml @@ -177,7 +177,7 @@ Wstrzymaj przechwytywanie HRV Gdy bateria Twojego paska jest bliska wyczerpania, zatrzymaj zawsze włączony strumień HRV w tle — powoduje to największe ciągłe zużycie paska. Ekran na żywo nadal pokazuje tętno i ponownie się uzbraja po naładowaniu paska. 0123456789abcdef0123456789abcdef - Pasek WHOOP łączy się z jednym urządzeniem. Gdy jest podłączony do NOOP, nie będzie przesyłać strumieniowo to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Opaska WHOOP paruje się tylko z jednym urządzeniem. Sparowanie jej z NOOP może odebrać ją oficjalnej aplikacji WHOOP i odwrotnie. To odwracalne: sparuj ją w drugiej aplikacji, gdy tylko chcesz ją odzyskać. Dodać Zaawansowane: Mam już klucz do pierścionka Beta. * to wartość szacunkowa na urządzeniu. Temperatura skóry to trend w porównaniu do Twojej własnej wartości bazowej, czyli kroków are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -210,7 +210,7 @@ Spróbuj ponownie Użyj importu plików Nie mogliśmy przejąć tego pierścienia. - Obsługa WHOOP 5.0 / MG jest nowsza i wciąż eksperymentalna w NOOP. + WHOOP 5.0 / MG obsługuje dane na żywo i historię paska. Narzędzia badawcze protokołu są dostępne osobno w Centrum Testowym. WHOOP jest głównym, w pełni obsługiwanym pasmem NOOP. Inne paski do pomiaru tętna przesyłają na żywo tętno i dane HRV, ale nie dane dotyczące głębszego snu i regeneracji WHOOP. Więcej więcejGrupaChevron @@ -417,7 +417,7 @@ Wysyła polecenie lokalizacji ciała tylko do odczytu (0x54) i zrzuca pełną nieprzetworzoną odpowiedź paska do dziennika paska, dekodując zapis (wersja/lokalizacja/pewność/status) w WHOOP 4.0. Nic nie jest zapisane na pasku i nigdy nie zmienia sposobu wykrywania zużycia ani punktacji. Test pakietu baterii (151 RE)… Wynik testu pakietu baterii (151) - Wysyła tylko do odczytu polecenie pakietu baterii (151) i dekoduje odpowiedź opaski — poziom naładowania, numer seryjny i adres Bluetooth pakietu. Nic nie jest zapisywane na opasce i nic nie trafia do Twoich danych. WHOOP 4.0 nie ma polecenia pakietu i zgodnie z oczekiwaniami milczy; samo to milczenie jest użytecznym wynikiem. + Wysyła polecenie tylko do odczytu dla zewnętrznego akumulatora (151) i pokazuje odpowiedź opaski. Odpowiedź SUCCESS jest dekodowana jako poziom naładowania, numer seryjny i adres Bluetooth akumulatora. Znany wynik: WHOOP MG z oprogramowaniem 50.39.1.0 odpowiada FAILURE niezależnie od tego, czy akumulator jest podłączony, dlatego poziom naładowania akumulatora na karcie Urządzenia pochodzi ze zdarzenia akumulatora wysyłanego przez samą opaskę, a nie z tego polecenia. WHOOP 4.0 nie ma polecenia akumulatora i oczekuje się, że pozostanie cichy; to milczenie samo w sobie jest użytecznym wynikiem. Nic nie jest zapisywane na opasce i nic nie zasila Twoich danych. Sonda z flagą funkcji (#761 RE)… Zatrzymaj synchronizację Wynik sondy z flagą funkcji (nr 761) @@ -425,7 +425,7 @@ Sonda odczytu konfiguracji urządzenia (#103 RE)… Wynik sondy odczytu konfiguracji urządzenia (#103) Pyta pasek o WARTOŚCI konfiguracyjne: GET_DEVICE_CONFIG_VALUE (0x79) i GET_FF_VALUE (0x80), jeden klucz na podróż w obie strony. Obydwa polecenia mogą po prostu nie istnieć w tym oprogramowaniu — najważniejsze jest, aby się tego dowiedzieć. Tylko do odczytu — żadna wartość nie jest zapisywana, a polecenia SET nigdy nie są wysyłane z tej sondy. Wynik jest pokazywany tutaj i zapisywany w dzienniku paska. - Dwie niezależne tabele protokołów nie zgadzają się co do kodu operacji o rozszerzonej baterii (98 vs 87). Spowoduje to wysłanie wybranego numeru 98 w trybie tylko do odczytu i zrzucenie pełnej nieprzetworzonej odpowiedzi paska do dziennika paska. Ładunek przypominający baterię potwierdza 98 w oprogramowaniu sprzętowym; krótki odcinek oznacza, że ​​pozostaje niejednoznaczny. Na pasku nic nie jest zapisane. Następnie wyeksportuj i udostępnij dziennik paska. + Dwie niezależne tabele protokołów nie zgadzają się co do kodu operacji rozszerzonej baterii (98 vs 87). Wysyła wybrane polecenie 98 tylko do odczytu i pokazuje pełną surową odpowiedź opaski (zapisywaną również w dzienniku opaski). W WHOOP 4.0 ładunek przypominający baterię potwierdza 98 w Twoim oprogramowaniu, a wynik dekoduje napięcie akumulatora; krótki stub pozostaje niejednoznaczny. W WHOOP 5/MG poziom naładowania akumulatora nie pochodzi z 98 (to odczyt zewnętrznego akumulatora, polecenie 151), NOOP nie dekoduje żadnej wartości z odpowiedzi, a wiersz do przeczytania to „Result code”: UNSUPPORTED oznacza, że to oprogramowanie odrzuca 98. Na opasce nic nie jest zapisywane. Po zakończeniu wyeksportuj i udostępnij dziennik opaski. Anuluj %1$s%% Zamknij @@ -855,7 +855,7 @@ Odprężające szturchnięcie Długość okna %1$s min - Alarm na opasce WHOOP 5/MG wymaga włączenia Testów protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Godzina pobudki została zapisana, ale alarm na opasce nie jest jeszcze uzbrojony. Zachowaj alarm zapasowy. + Alarm na opasce WHOOP 5/MG wymaga włączenia Sond protokołu (Centrum Testowe → Diagnostyka protokołu 5/MG). Godzina pobudki została zapisana, ale NOOP nie wysyła jej na opaskę, gdy Sondy protokołu są wyłączone. Alarm wysłany wcześniej może nadal być ustawiony na opasce. Zachowaj alarm zapasowy. Skalibruj swoje kroki Zamknij Dzień @@ -864,7 +864,7 @@ Jak to działa Nie było jeszcze dni, w których zarówno NOOP, jak i Twój telefon liczyły kroki. Gdy telefon zarejestruje a few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Nie zsynchronizowano jeszcze żadnego ruchu - NOOP szacuje Twoje kroki na podstawie ruchu WHOOP, skalibrowanego do liczby kroków Twojego telefonu. To wartość szacunkowa, a nie licznik kroków. WHOOP 4.0 nie przesyła kroków. + NOOP szacuje Twoje kroki na podstawie zapisanego ruchu WHOOP, skalibrowanego do liczby kroków Twojego telefonu. To wartość szacunkowa, a nie sprzętowy licznik kroków. WHOOP 4.0 nie wysyła liczby kroków. W WHOOP 5.0 / MG dni objęte jego własnym licznikiem kroków pokazują zamiast tego ten licznik; aby dostosować tę wartość, użyj Kalibracji krokowej w Ustawieniach. Jeszcze nie skalibrowany W dni, w których Twój telefon również liczył kroki, NOOP dowiaduje się, na ile mapuje Twój ruch steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Otwórz NOOP w pobliżu paska i pozwól mu nadrobić zaległości (pełna synchronizacja historii może zająć trochę czasu first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -876,7 +876,7 @@ Są to dni, w których Twój telefon również liczy kroki, więc NOOP może dowiedzieć się, w jaki sposób Twój ruch jest mapowany na kroki. Lub ustaw współczynnik ręcznie poniżej. Te dni są wyłączone z szacunków (zamiast tego wyświetlana jest rzeczywista liczba Twojego telefonu). Są tu tylko po to, abyś mógł ocenić dokładność oszacowania. Nie widzimy jeszcze żadnego ruchu na Twoim pasku. Liczba kroków jest szacowana na podstawie Twoich WHOOP banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · ruch → kroki + WHOOP · ruch → kroki Następnego dnia Poprzedni dzień %1$s %2$s godz @@ -1299,7 +1299,7 @@ Aktualizacje ponownie sprawdź GitHub v5 - wydanie surowego sygnału: NOOP odczytuje sygnał na Twoim urządzeniu za darmo Week in Review szczerze opisuje w połowie ukończony tydzień - Obsługiwana ścieżka to WHOOP 4.0 + WHOOP 4.0 to najlepiej przetestowana ścieżka Dekodowanie historii WHOOP 5.0 przychodzi do Android WHOOP 5.0/MG buzz - prawdziwe polecenie (dopasowany bajt po bajcie) Buzz WHOOP 5.0/MG - próba prawidłowego polecenia (eksperymentalnie) @@ -1345,7 +1345,7 @@ Włącz Bluetooth WHOOP 5 / MG (eksperymentalny) Nie można się połączyć? Przebiegnij przez nie - Twój pasek jest podłączony i próbujemy uruchomić eksperymentalny uścisk dłoni, aby wywołać go na żywo heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + Twój pasek jest podłączony i próbujemy eksperymentalnego uzgadniania połączenia, aby uruchomić tętno na żywo ze standardowego profilu. Nie zostało to jeszcze zweryfikowane na sprzęcie 5/MG, więc tętno może się pojawić lub nie, a niektóre nocne dane z 5/MG są wciąż niepełne, więc fazy snu są przybliżone. Z Twoim paskiem wszystko w porządku – WHOOP 4.0 jest w pełni obsługiwany. Dzień Usunąć wszystkie dane tego urządzenia? Usuń dane tego urządzenia… @@ -1417,7 +1417,7 @@ płynPressScale Śr Brzęczeć - Nie można się połączyć – parowanie paska zostało zresetowane + Twój pasek potrzebuje pomocy z ponownym połączeniem – kroki poniżej Ładowanie Dystans Wysiłek @@ -1434,7 +1434,7 @@ Pasek Wykonaj odczyt HRV ● %1$s - WHOOP 5.0/MG można sparować z jedną aplikacją na raz. Jeśli skanowanie nic nie wykryje, rozłącz parę the official WHOOP app and fully close that app, then Connect again. + WHOOP 5.0/MG można sparować z jedną aplikacją na raz. Jeśli skanowanie nic nie wykryje, rozłącz parę w oficjalnej aplikacji WHOOP i całkowicie zamknij tę aplikację, a następnie ponownie naciśnij Połącz. NoopButton.scale Zapisz zmiany CountUpText @@ -1475,7 +1475,7 @@ Skontaktuj się z pomocą techniczną pod adresem %1$s Ciągłe przechwytywanie HRV Nie udało się sprawdzić. Spróbuj ponownie. - Licznik taktów na krok. Zostaw na 1,0, chyba że Twoje kroki będą wysokie. Na WHOOP 5/MG mogą biegać bardzo wysoko (10× lub więcej), więc liczba ta wzrasta do 30. Przejdź znane 1000 kroków i podziel liczbę NOOP przez liczbę rzeczywistą, aby otrzymać wartość. + Tyknięcia licznika na krok dla własnego licznika kroków WHOOP 5/MG. Zostaw 1,0, chyba że kroki konsekwentnie wychodzą zbyt wysokie. Przejdź znane 1000 kroków i podziel liczbę z NOOP przez rzeczywistą, aby uzyskać swoją wartość. Pokaż świadomość cyklu Świadomość rowerowa Tło cyklu dnia @@ -1541,7 +1541,7 @@ Przegląda każdy punktowany blok budzenia pod kątem rzeczywistych dowodów wstawania (rytm chodu, a change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Rytm (eksperymentalny) Uruchamia ciągły strumień HRV tylko w godzinach ciszy nocnej (domyślnie 22:00–07:00), co zmniejsza koszt baterii mniej więcej o połowę. Odczyty stresu w ciągu dnia będą rzadsze. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Zapisuje ostatnie 24 godziny zdekodowanych próbek czujnika (tętno, R-R, ruch, kroki i dowolne odblokowane głębokie strumienie 5/MG) jako jeden CSV, który możesz udostępnić, aby majstrować przy własnych danych. Nic nie opuszcza telefonu, chyba że go udostępnisz. + Zapisuje ostatnie 24 godziny zdekodowanych próbek z czujników (tętno, R-R, ruch, kroki, SpO₂, temperatura skóry, oddychanie i zdarzenia) w jednym pliku CSV, który możesz udostępnić, aby poeksperymentować na własnych danych. Nic nie opuszcza telefonu, dopóki go nie udostępnisz. Wyślij sekwencję włączającą do paska Skonfiguruj automatyczne kopie zapasowe Ustawienia @@ -1809,7 +1809,7 @@ %1$d treningów %1$d treningu - Ten pasek nie wysyła SpO₂ przez Bluetooth. Zaimportuj eksport WHOOP lub Health Connect, aby go zobaczyć. + Ten pasek nie wysyła sygnału SpO₂ dla tego wykresu. Zaimportuj eksport WHOOP lub dane z Health Connect, aby go zobaczyć. Ten pasek nie wysyła surowego strumienia oddechowego. Szacowana częstość oddechów pojawi się na ekranie Zdrowie. Rozszerzony Zwinięty @@ -1867,6 +1867,9 @@ Oszczędzanie baterii wycisza wskaźniki, przetłumaczone powiadomienia Android i natychmiastowe ładowanie wykresów Brak importu SpO₂ lub wartości kondycji Liczy się tylko surowy — wymaga importu + Brak surowych odczytów SpO₂ (tylko WHOOP 4.0) + Synchronizuj teraz. Wymaga pełnego bezpiecznego sparowania opaski, które nie zostało ukończone. + Niepełne parowanie Wyłącz ponownie głębokie dane Wymaga pełnego zaszyfrowanego połączenia: zamknij oficjalną aplikację WHOOP i najpierw sparuj pasek z NOOP (link na żywo tylko dla HR nie może przenosić zapisu). Zapisuje wartość wyłączenia do wszystkich 16 flag i odczytuje każdą z nich, dzięki czemu widzisz, co pasek przechowuje, a nie tylko to, co potwierdził. Wartość wyłączenia wynika z flagi NOOP, która jest już wyłączana w ten sposób dla transmisji Garmin — nigdy nie była widziana na fladze R22, więc NOOP najpierw próbuje jednej flagi i zatrzymuje się, jeśli pasek ją odrzuci. Usuwanie flag nie jest tym samym, co obserwowanie zatrzymania głębokich zapisów: sprawdź to, synchronizując później. @@ -1889,13 +1892,13 @@ Wszystko żyje w tym telefonie. Bez konta, bez synchronizacji, bez chmury. Kilka szczerych słów, żeby nic nie było niespodzianką. NOOP to osobisty, otwarty projekt - nie aplikacja WHOOP i niezwiązany z WHOOP. Odczytuje posiadany pasek na Twoim urządzeniu. Traktuj to jako wydajną pracę w toku, a nie gotowy produkt. - WHOOP 4.0 został przetestowany i działa kompleksowo. WHOOP 5.0/MG jest nowszy: tętno na żywo działa już dzisiaj, ale głębsze wskaźniki (regeneracja, wysiłek, sen) dla 5/MG wciąż są opracowywane. NOOP zawsze informuje Cię, co jest na żywo, a co jeszcze w budowie. + WHOOP 4.0 jest przetestowany i działa od początku do końca. WHOOP 5.0/MG jest nowszy: tętno na żywo i historia opaski działają, a NOOP wylicza z nich na Twoim urządzeniu sen, regenerację i wysiłek. Niektóre dane nocne na 5/MG są wciąż niepełne, więc jego fazy snu są przybliżone. NOOP zawsze mówi, co działa na żywo, a co jest jeszcze w budowie. Tętno na żywo jest natychmiastowe. Regeneracja, wytężaj siły i wyostrzaj sen, gdy NOOP uczy się Twojego poziomu bazowego podczas pierwszych nocy noszenia. Chcesz teraz swoją historię? Zaimportuj eksport WHOOP do źródeł danych, a jego uzupełnienie zajmie około minuty. Bez konta, bez chmury, bez synchronizacji. NOOP komunikuje się tylko z Twoim paskiem i utrzymuje wszystko lokalnie. Twoje dane są wyłącznie Twoje. NOOP używa Bluetooth do znalezienia paska. Kontynuując, zezwól na pozwolenie, aby mógł skanować. NOOP komunikuje się z Twoim paskiem bezpośrednio przez Bluetooth Low Energy. Pośrodku nie ma serwera. Połączenie jest lokalne i tak samo jest z każdym odczytem. Gdy Android zapyta, zezwól na Bluetooth, aby NOOP mógł skanować i łączyć się. - WHOOP 5.0/MG może wymagać trybu parowania za pierwszym razem, gdy oficjalna aplikacja WHOOP jest zamknięta. + WHOOP 5.0/MG może wymagać trybu parowania za pierwszym razem: zamknij oficjalną aplikację WHOOP, a następnie stukaj w pasek, aż diody LED zaczną migać na niebiesko. Czujnik potrzebuje kontaktu ze skórą, zanim dane zaczną mieć jakiekolwiek znaczenie. Noś go ściśle na nadgarstku lub bicepsie, tak aby czujnik przylegał do skóry. Ładuj go przez kilka minut, jeśli poziom naładowania akumulatora jest niski. @@ -1944,7 +1947,7 @@ Twój pasek jest podłączony i zapisuje dane. Połącz się ponownie, aby pobrać najnowsze. Pasek nie jest podłączony. Kliknij, aby się połączyć. - Synchronizacja historii jest eksperymentalna w wersji 5.0. + Synchronizacja historii jest eksperymentalna w WHOOP 5.0/MG. W tej sesji nie ma jeszcze tętna na żywo ani zsynchronizowanej historii. Kalibracja Wznowi się rano @@ -2038,7 +2041,7 @@ Nauka Twojego wzoru · ~dzień %1$d · ~dzień %1$d–%2$d - Nie ma jeszcze nocnej temperatury skóry — potrzeba ~4 przepracowanych nocy (lub zaimportuj WHOOP CSV) + Brak jeszcze nocnej temperatury skóry – pojawi się po zsynchronizowaniu nocy z założoną opaską (lub zaimportuj plik CSV z WHOOP) Temperatura skóry Δ vs wartość podstawowa Czas snu @@ -2623,7 +2626,7 @@ Wybierana skala Effort, pierścień, który może spać, i znacznie mniej zbędnych przeliczeń Ten parametr wymaga co najmniej dwóch historycznych odczytów, zanim NOOP go wykreśli. Szacowanie natlenienia krwi jest wyłączone - Twoja opaska podaje szacowane natlenienie krwi, ale jest ono niezweryfikowane i domyślnie wyłączone. Włącz szacowanie opaski w Ustawieniach lub zaimportuj eksport WHOOP w Źródłach danych, aby uzyskać wartość kalibrowaną. + Twoja opaska zgłasza szacunkową wartość tlenu we krwi, ale nie jest ona zweryfikowana i domyślnie jest wyłączona. Aby ją zobaczyć, włącz „Blood Oxygen: strap estimate” w Ustawienia → Zaawansowany → Diagnostyka lub zaimportuj eksport WHOOP w Źródłach danych, aby uzyskać skalibrowaną wartość. Brak wartości procentowej natlenienia krwi z WHOOP 4.0 Twoja opaska zapisuje surowe kanały optyczne, ale NOOP nie przelicza ich na wartość procentową natlenienia krwi, więc pozostanie to puste niezależnie od czasu noszenia. Zaimportuj eksport WHOOP w Źródłach danych, aby wypełnić to historią konta. Poproś Androida o sparowanie (eksperymentalne) @@ -2687,7 +2690,7 @@ %1$s · %2$s%3$s " · %1$s" Diagnostyka protokołu 5/MG - Testy protokołu + Sondy protokołu Transmituj tętno z opaski Poproś Androida o sparowanie Spróbuj synchronizacji historii bez parowania @@ -2731,7 +2734,7 @@ Temperatura skóry Brak zmierzonej temperatury dla tych nocy — pokazano różnicę względem Twojej wartości bazowej. Synchronizacja ponownie przelicza ostatnie noce i ją uzupełnia. Pokazywane są tylko noce ze zmierzoną temperaturą; w pozostałych zapisano jedynie różnicę względem wartości bazowej. - Ta noc została opracowana wyłącznie na podstawie tętna, bez zarejestrowanego ruchu, więc nie udało się zmierzyć zmienności rytmu serca ani tętna spoczynkowego. Zwykłą przyczyną jest opaska, która nie jest w pełni sparowana. + Ta noc została wykryta wyłącznie na podstawie tętna, bez zarejestrowanego ruchu, więc jej czas i fazy są przybliżone. Puste HRV lub tętno spoczynkowe oznacza, że ta noc nie zawierała wystarczającej ilości użytecznych danych o tętnie, aby je zmierzyć. Opaska, która nie jest w pełni sparowana, jest zwykłym powodem braku ruchu w danej nocy. Cykl dobowy Wybierz, kiedy kroki i bieżący Wysiłek zaczynają się od nowa. Drzemki nigdy nie rozpoczynają nowego dnia. Początek dnia @@ -2829,7 +2832,7 @@ Ta noc uzyskała wysoką wydajność, ale bardzo mało snu głębokiego lub REM. To raczej błąd oszacowania faz niż rzeczywisty niedobór snu regeneracyjnego. Sumy pozostają bez zmian, czytaj podział ostrożnie. Zawyża liczbę interwałów R-R, więc nie pokazujemy wartości Sprawdź bieżącą nazwę (tylko odczyt) - Zmiana nazwy nie jest jeszcze obsługiwana w WHOOP 5.0 ani MG. NOOP może zapytać opaskę o jej bieżącą nazwę, co rozstrzygnie, czy zmiana nazwy jest w ogóle możliwa. + Zmiana nazwy nie jest jeszcze obsługiwana w WHOOP 5.0 ani MG. Eksperymentalna zmiana nazwy i sprawdzenie nazwy tylko do odczytu pojawiają się tutaj, gdy włączone jest Centrum Testowe → Connection & Sync. Eksperymentalne na WHOOP 5.0 lub MG: to polecenie nigdy nie zostało potwierdzone na tej generacji. Jest odwracalne, więc zmień nazwę ponownie, jeśli coś pójdzie nie tak, i sprawdź wynik przez Sprawdź bieżącą nazwę. Alarm za %1$s Alarm za mniej niż minutę @@ -2866,8 +2869,8 @@ Oczekuje na synchronizację · %1$s %1$s bpm%2$s %1$s, %2$s, w użyciu - Alarm uzbrojono na opasce eksperymentalnym poleceniem 5/MG. Zgłaszano wybudzanie przez opaski 5.0 i MG, ale nie jest ono gwarantowane. Zachowaj alarm zapasowy na ważne okazje. - Wysyła eksperymentalne zapytania protokołu i włącza alarm opaski 5/MG. Nie jest potrzebne do zwykłej synchronizacji, snu, regeneracji ani kroków. + NOOP ustawia alarm na opasce eksperymentalnym poleceniem 5/MG za każdym razem, gdy opaska się połączy lub zmienisz alarm. Zgłaszano wybudzanie przez opaski 5.0 i MG, ale nie jest ono gwarantowane. Zachowaj alarm zapasowy na ważne okazje. + Wysyła eksperymentalne zapytania protokołu i zapisuje odpowiedzi w dzienniku opaski. Umożliwia też eksperymentalny alarm opaski 5/MG: NOOP wysyła go przy następnym połączeniu opaski lub gdy zmienisz alarm. Wyłączenie nie usuwa alarmu, który już jest na opasce. Nie jest potrzebne do zwykłej synchronizacji, snu, regeneracji ani kroków. Zaktualizowano wynik snu Godziny snu lub łączny czas snu tej nocy zmieniły się o co najmniej pięć minut. Sonda włączania EKG WHOOP MG diff --git a/android/app/src/main/res/values-pt-rPT/strings.xml b/android/app/src/main/res/values-pt-rPT/strings.xml index b64877aeb3..98a83d2148 100644 --- a/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/android/app/src/main/res/values-pt-rPT/strings.xml @@ -177,7 +177,7 @@ Pausar captura de HRV Enquanto a bateria da tua bracelete estiver fraca, interrompa o fluxo HRV de fundo sempre ativo – o maior consumo contínuo da bracelete. Um ecrã em direto ainda mostra a frequência cardíaca e é reativado automaticamente assim que a bracelete é carregada. 0123456789abcdef0123456789abcdef - Uma correia WHOOP liga-se a um único dispositivo. Enquanto estiver ligado ao NOOP, não transmitirá to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Uma pulseira WHOOP emparelha com um único dispositivo. Emparelhá-la com o NOOP pode retirá-la à aplicação oficial da WHOOP, e vice-versa. É reversível: emparelha-a na outra aplicação sempre que a quiseres de volta. Adicionar Avançado: já tenho a chave do meu anel Beta. * é uma estimativa no dispositivo. A temperatura da pele é uma tendência em relação à sua própria linha de base, passos are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -210,7 +210,7 @@ Tente novamente Usar importação de ficheiros Não poderíamos assumir este anel. - O suporte ao WHOOP 5.0/MG é mais recente e ainda experimental no NOOP. + WHOOP 5.0 / MG suporta dados em direto e histórico. As ferramentas de protocolo estão separadas no Centro de testes. WHOOP é a banda principal e totalmente suportada do NOOP. Outras gamas de frequência cardíaca transmitem a frequência cardíaca e a VFC em direto, mas não os dados de sono e recuperação mais profundos do WHOOP. Mais moreGroupChevron @@ -417,7 +417,7 @@ Envia o comando body-location de leitura apenas (0x54) e regista a resposta bruta completa do bracelete no registo da bracelete, descodificando o registo (revisão/localização/confiança/estado) no WHOOP 4.0. Nada é escrito na bracelete e nunca altera a deteção ou pontuação de desgaste. Teste do pack de bateria (151 RE)… Resultado do teste do pack de bateria (151) - Envia o comando só de leitura do pack de bateria (151) e descodifica a resposta da banda — carga, número de série e endereço Bluetooth do pack. Nada é escrito na banda e nada alimenta os teus dados. Uma WHOOP 4.0 não tem comando de pack e deverá permanecer silenciosa; esse silêncio é, em si, um resultado útil. + Envia o comando só de leitura da bateria externa (151) e mostra a resposta da pulseira. Uma resposta SUCCESS é descodificada como a carga, o número de série e o endereço Bluetooth da bateria. Resultado conhecido: um WHOOP MG com firmware 50.39.1.0 responde FAILURE com ou sem bateria ligada; por isso a carga da bateria no cartão Dispositivos vem do evento de bateria enviado pela própria pulseira, não deste comando. Um WHOOP 4.0 não tem comando de bateria externa e espera-se que fique em silêncio; esse silêncio é, por si só, um resultado útil. Nada é escrito na pulseira e nada alimenta os teus dados. Eliminar os dados deste dispositivo… Desconectar Sonda de sinalizadores de funcionalidade (#761 RE)… @@ -433,7 +433,7 @@ Sonda de leitura da configuração do dispositivo (#103 RE)… Resultado da sonda de leitura da configuração do dispositivo (#103) Pede à bracelete os VALORES de configuração: GET_DEVICE_CONFIG_VALUE (0x79) e GET_FF_VALUE (0x80), uma chave por troca. É possível que ambos os comandos simplesmente não existam neste firmware — descobri-lo é precisamente o objetivo. Apenas leitura: nenhum valor é escrito e os comandos SET nunca são enviados por esta sonda. O resultado é mostrado aqui e escrito no registo da bracelete. - Duas tabelas de protocolo independentes discordam quanto ao opcode de bateria alargada (98 vs 87). Isto envia o 98 de leitura, validado e regista a resposta bruta completa do bracelete no registo da bracelete. Uma carga útil tipo bateria confirma 98 no teu firmware; um esboço curto significa que permanece ambíguo. Nada é escrito na bracelete. Exporte e partilhe o registo da bracelete posteriormente. + Duas tabelas de protocolo independentes discordam quanto ao opcode de bateria alargada (98 vs 87). Isto envia o 98 curado, só de leitura, e mostra a resposta bruta completa da pulseira (também escrita no registo da pulseira). Num WHOOP 4.0, uma carga útil tipo bateria confirma 98 no teu firmware e o resultado descodifica a tensão da bateria; um stub curto mantém-se ambíguo. Num WHOOP 5/MG, a carga da bateria não vem do 98 (essa é a leitura da bateria externa, comando 151), o NOOP não descodifica nenhum valor da resposta e a linha a ler é «Result code»: UNSUPPORTED significa que este firmware rejeita 98. Nada é escrito na pulseira. Exporta e partilha o registo da pulseira depois. Cancelar %1$s%% Fechar @@ -869,7 +869,7 @@ Empurrãozinho para relaxar Comprimento da janela %1$s minutos - Os alarmes da pulseira WHOOP 5/MG requerem Sondas de protocolo (Centro de testes → Diagnóstico do protocolo 5/MG). A hora de despertar está guardada, mas a pulseira ainda não está armada. Mantém um alarme de reserva. + Os alarmes da pulseira WHOOP 5/MG requerem Sondas de protocolo (Centro de testes → Diagnóstico do protocolo 5/MG). A hora de despertar está guardada, mas o NOOP não a envia para a pulseira enquanto as Sondas de protocolo estiverem desativadas. Um alarme enviado antes pode continuar definido na pulseira. Mantém um alarme de reserva. Calibre os teus passos Fechar Dia @@ -878,7 +878,7 @@ Como funciona Ainda não há dias em que o NOOP e o teu telemóvel contem passos. Depois de o teu telemóvel registar um few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Nenhum movimento sincronizado ainda - O NOOP estima os teus passos a partir do movimento do WHOOP, calibrado para a contagem de passos do teu telemóvel. É uma estimativa, não um contador de passos. Um WHOOP 4.0 não transmite passos. + O NOOP estima os teus passos a partir do movimento guardado do WHOOP, calibrado para a contagem de passos do teu telemóvel. É uma estimativa, não um contador de passos de hardware. Um WHOOP 4.0 não envia contagem de passos. Num WHOOP 5.0 / MG, os dias cobertos pelo seu próprio contador de passos mostram essa contagem; para ajustar esse número, usa a Calibração de passos nas Definições. Ainda não calibrado Nos dias em que o teu telemóvel também contava passos, o NOOP fica a saber quanto o teu movimento mapeia steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Abra o NOOP junto à sua bracelete e deixe-o acompanhar (uma sincronização completa do histórico pode demorar um pouco first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -890,7 +890,7 @@ Estes são os dias em que o teu telemóvel também contava passos, pelo que o NOOP pode aprender como o teu movimento é mapeado para passos. Ou defina o coeficiente manualmente abaixo. Estes dias são excluídos da estimativa (em vez disso, é mostrada a contagem real do teu telemóvel). Estão aqui apenas para que possa avaliar a precisão da estimativa. Ainda não estamos a ver nenhum movimento da tua bracelete. As etapas são estimadas a partir do teu WHOOP banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · movimento → passos + WHOOP · movimento → passos Dia seguinte Dia anterior %1$s %2$s horas @@ -1313,7 +1313,7 @@ Atualizações, verifique novamente o GitHub v5 - a libertação do sinal em bruto: o NOOP lê o sinal, no teu dispositivo, gratuitamente Week in Review é honesto sobre uma semana a meio - WHOOP 4.0 é o caminho suportado + WHOOP 4.0 é o caminho mais testado A descodificação do histórico do WHOOP 5.0 chega ao Android WHOOP 5.0/MG buzz - o comando real (correspondência byte a byte) WHOOP 5.0/MG buzz - tentando o comando certo (experimental) @@ -1359,7 +1359,7 @@ Ativar o Bluetooth WHOOP 5/MG (experimental) Não liga? Percorra estes - A tua bracelete está ligada e estamos a tentar um aperto de mão experimental para tocar em direto heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + A tua pulseira está ligada e estamos a tentar um handshake experimental para ativar a frequência cardíaca em direto a partir do perfil padrão. Isto ainda não está verificado em hardware 5/MG, por isso a FC pode ou não aparecer, e alguns dados noturnos do 5/MG ainda estão incompletos, pelo que as fases do sono são aproximadas. Não há nada de errado com a tua pulseira — o WHOOP 4.0 é totalmente suportado. Dia Apagar todos os dados deste dispositivo? Ações do dispositivo para %1$s @@ -1423,7 +1423,7 @@ LiquidPressScale Média Zumbido - Não é possível ligar – o emparelhamento da tua bracelete foi redefinido + A tua pulseira precisa de ajuda para voltar a ligar – passos abaixo Carregando Distância Esforço @@ -1440,7 +1440,7 @@ Alça Faça uma leitura da VFC ● %1$s - O WHOOP 5.0/MG emparelha com uma aplicação de cada vez. Se uma verificação não encontrar nada, desemparelhe-o em the official WHOOP app and fully close that app, then Connect again. + O WHOOP 5.0/MG emparelha com uma aplicação de cada vez. Se uma verificação não encontrar nada, desemparelha-o na aplicação oficial WHOOP, fecha-a completamente e toca novamente em Ligar. Botão Noop. escala Guardar alterações ContagemUpText @@ -1481,7 +1481,7 @@ Contacte o suporte em %1$s Captura contínua de HRV Não foi possível verificar. Tente novamente. - Contador de ticks por etapa. Deixe em 1,0, a menos que os teus passos sejam altos. Num WHOOP 5/MG podem correr muito alto (10× ou mais), por isso isto vai até 30. Caminhe 1.000 passos conhecidos e divida a contagem do NOOP pela contagem real para obter o teu valor. + Ticks do contador por passo para o contador de passos próprio de um WHOOP 5/MG. Deixa em 1,0, a menos que os teus passos saiam sempre altos. Caminha 1000 passos conhecidos e divide a contagem do NOOP pela contagem real para obteres o teu valor. Mostrar consciência do ciclo Consciência do ciclo Histórico do ciclo diário @@ -1547,7 +1547,7 @@ Revê cada bloco de despertar marcado em busca de provas reais de que se levantou (cadência de marcha, change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Ritmo (experimental) Executa o fluxo contínuo de HRV apenas durante a janela de horário de silêncio (22h00 às 07h00 por defeito), reduzindo aproximadamente para metade o custo da bateria. As leituras de stress diurno serão mais esparsas. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Guarda as últimas 24 horas de amostras de sensores descodificadas (frequência cardíaca, RR, movimento, passos e quaisquer fluxos profundos de 5/MG que tenha desbloqueado) como um CSV que pode partilhar, para alterar os teus próprios dados. Nada sai do telefone a menos que o partilhe. + Guarda as últimas 24 h de amostras de sensores descodificadas (frequência cardíaca, R-R, movimento, passos, SpO₂, temperatura da pele, respiração e eventos) num único CSV que podes partilhar, para explorares os teus próprios dados. Nada sai do telemóvel a menos que o partilhes. Enviar sequência de ativação para bracelete Configure cópia de seguranças automáticos Definições @@ -1801,7 +1801,7 @@ %1$d treino %1$d treinos - Esta bracelete não envia SpO₂ por Bluetooth. Importe uma exportação WHOOP ou Health Connect para a ver. + Esta pulseira não envia um sinal de SpO₂ para este gráfico. Importa uma exportação WHOOP ou dados do Health Connect para o veres. Esta bracelete não envia qualquer fluxo respiratório bruto. A tua frequência respiratória estimada aparece no ecrã Saúde. "Última partilha "%1$s Partilha pausada: a permissão do Health Connect foi revogada. Toca para conceder novamente. @@ -1870,6 +1870,9 @@ A poupança de bateria acalma os indicadores, notificações Android traduzidas e gráficos instantâneos Sem importação de SpO₂ ou valor de saúde Apenas valores brutos — requer importação + Sem contagens brutas de SpO₂ (apenas WHOOP 4.0) + Sincronizar agora. Requer o emparelhamento seguro completo da pulseira, que ainda não foi concluído. + Emparelhamento incompleto Voltar a desativar os dados profundos Necessita da ligação encriptada completa: feche primeiro a app oficial da WHOOP e emparelhe a pulseira com o NOOP (uma ligação apenas de FC em direto não consegue transportar a escrita). Escreve o valor de desativação nas 16 marcas e lê cada uma de volta, para que veja o que a pulseira guarda e não apenas que confirmou. O valor de desativação é inferido da marca que o NOOP já desliga assim para a transmissão Garmin — nunca foi visto numa marca R22, por isso o NOOP testa primeiro uma só e pára se a pulseira a recusar. Limpar as marcas não é o mesmo que ver os registos profundos pararem: confirme isso sincronizando depois. @@ -1893,13 +1896,13 @@ Tudo fica guardado neste telemóvel. Sem conta, sem sincronização e sem cloud. Algumas palavras honestas, para que não haja surpresas. O NOOP é um projeto pessoal e aberto: não é a aplicação WHOOP nem está afiliado à WHOOP. Lê uma bracelete que te pertence no teu próprio dispositivo. Considera-o um projeto capaz, mas ainda em desenvolvimento, e não um produto acabado. - O WHOOP 4.0 foi testado e funciona de ponta a ponta. O WHOOP 5.0/MG é mais recente: a frequência cardíaca em direto já funciona, mas as métricas mais avançadas (recuperação, esforço e sono) para 5/MG ainda estão em desenvolvimento. O NOOP indica-te sempre o que está disponível e o que continua em desenvolvimento. + O WHOOP 4.0 está testado e funciona de ponta a ponta. O WHOOP 5.0/MG é mais recente: a frequência cardíaca em direto e o histórico da pulseira funcionam, e o NOOP calcula a partir deles o sono, a recuperação e o esforço no teu dispositivo. Alguns dados noturnos ainda estão incompletos no 5/MG, por isso as suas fases do sono são aproximadas. O NOOP diz-te sempre o que já está ativo e o que ainda está em construção. A frequência cardíaca em direto fica disponível de imediato. A recuperação, o esforço e o sono tornam-se mais precisos à medida que o NOOP aprende a tua linha de base nas primeiras noites de utilização. Queres ver já o teu histórico? Importa a tua exportação WHOOP em Fontes de dados e esta será adicionada em cerca de um minuto. Sem conta, sem cloud e sem sincronização. O NOOP comunica apenas com a tua bracelete e mantém tudo local. Os teus dados são só teus. O NOOP utiliza Bluetooth para encontrar a tua bracelete. Quando continuares, concede a permissão para que a possa procurar. O NOOP comunica diretamente com a tua bracelete através de Bluetooth Low Energy. Não há nenhum servidor intermediário. A ligação é local, tal como todas as leituras obtidas. Quando o Android pedir, permite o acesso ao Bluetooth para que o NOOP possa procurar a tua bracelete e estabelecer ligação. - O WHOOP 5.0/MG pode ter de ser colocado no modo de emparelhamento na primeira vez, com a aplicação oficial da WHOOP fechada. + O WHOOP 5.0/MG pode precisar do modo de emparelhamento na primeira vez: fecha a aplicação oficial da WHOOP e toca várias vezes na pulseira até os LED piscarem a azul. O sensor precisa de estar em contacto com a pele para que os dados comecem a ser úteis. Usa a bracelete bem ajustada no pulso ou no bíceps, com o sensor contra a pele. Se a bateria estiver fraca, deixa-a carregar durante alguns minutos. @@ -1948,7 +1951,7 @@ A tua bracelete está conectada e a guardar dados. Volte a ligar para obter o mais recente. Correia não ligada. Toque para ligar. - A sincronização do histórico é experimental na versão 5.0. + A sincronização do histórico é experimental no WHOOP 5.0/MG. Ainda não há frequência cardíaca em direto nem histórico sincronizado nesta sessão. A calibrar Retoma de manhã @@ -2038,7 +2041,7 @@ A aprender o teu padrão · ~dia %1$d · ~dia %1$d–%2$d - Ainda sem temperatura da pele noturna — precisa de ~4 noites de utilização (ou importe um CSV da WHOOP) + Ainda sem temperatura da pele noturna — aparece depois de sincronizar uma noite com a pulseira posta (ou importa um CSV da WHOOP) Temperatura da pele Δ vs referência Torna o NOOP teu — cores de destaque e fundos personalizados, mais quarenta desportos com percursos GPS e um mapa de calor de calorias @@ -2605,7 +2608,7 @@ Uma escala de Effort à sua escolha, um anel que pode dormir e muito menos recálculos em vão Este sinal vital precisa de pelo menos duas leituras históricas antes de o NOOP o poder representar. A estimativa de oxigénio no sangue está desligada - A sua bracelete fornece uma estimativa de oxigénio no sangue, mas não está verificada e vem desligada. Ative-a nas Definições, ou importe uma exportação WHOOP em Fontes de dados para o valor calibrado. + A tua pulseira comunica uma estimativa de oxigénio no sangue, mas não está verificada e vem desativada por predefinição. Para a ver, ativa \"Blood Oxygen: strap estimate\" em Definições → Avançado → Diagnóstico, ou importa uma exportação WHOOP em Fontes de dados para obter o valor calibrado. Sem percentagem de oxigénio no sangue a partir de um WHOOP 4.0 A sua bracelete guarda os canais óticos em bruto, mas o NOOP não os converte numa percentagem de oxigénio no sangue, por isso isto fica vazio por muito tempo que a use. Importe uma exportação WHOOP em Fontes de dados para preencher a partir do seu histórico. Pedir ao Android para emparelhar (experimental) @@ -2713,7 +2716,7 @@ Temperatura da pele Sem temperatura medida para estas noites — a mostrar a diferença em relação à sua referência. Uma sincronização reavalia as noites recentes e preenche-a. Só são mostradas as noites com temperatura medida; as restantes registaram apenas a diferença em relação à referência. - Esta noite foi analisada apenas a partir da frequência cardíaca, sem movimento registado, pelo que não foi possível medir a variabilidade da frequência cardíaca nem a frequência cardíaca em repouso. A causa habitual é uma pulseira que não está totalmente emparelhada. + Esta noite foi detetada apenas pela frequência cardíaca, sem movimento registado, pelo que o horário e as fases são aproximados. Uma VFC ou frequência cardíaca em repouso em branco significa que essa noite não tinha dados de frequência cardíaca utilizáveis suficientes para a medir. Uma pulseira que não está totalmente emparelhada é o motivo habitual de uma noite não ter movimento. Ciclo diário Escolhe quando os passos e o Esforço em curso recomeçam. As sestas nunca iniciam um novo dia. O dia começa @@ -2811,7 +2814,7 @@ Esta noite obteve uma eficiência alta mas muito pouco sono profundo ou REM. É mais provável que seja uma falha de estimativa das fases do que um défice real de sono reparador. Os totais mantêm-se; leia a distribuição com cuidado. Conta intervalos R-R a mais, por isso não há valor Consultar o nome atual (apenas leitura) - Mudar o nome ainda não é suportado numa WHOOP 5.0 ou MG. O NOOP pode perguntar à pulseira o nome atual, que é o passo que decide se mudar o nome é possível. + Mudar o nome ainda não é suportado num WHOOP 5.0 ou MG. Uma mudança de nome experimental e uma verificação de nome só de leitura aparecem aqui enquanto Centro de testes → Connection & Sync estiver ativado. Experimental numa WHOOP 5.0 ou MG: este comando nunca foi confirmado nesta geração. É reversível, por isso muda o nome outra vez se correr mal, e usa Consultar o nome atual para ver se resultou. Alarme daqui a %1$s Alarme daqui a menos de um minuto @@ -2842,8 +2845,8 @@ Sincronização pendente · %1$s %1$s bpm%2$s %1$s, %2$s, em uso - O alarme foi armado na pulseira com um comando experimental 5/MG. Foram comunicados despertares pela pulseira em 5.0 e MG, mas não são garantidos. Mantém um alarme de reserva para tudo o que não podes perder. - Envia consultas experimentais de protocolo e ativa o alarme da pulseira 5/MG. Não é necessário para a sincronização, o sono, a recuperação ou os passos normais. + O NOOP define o alarme na pulseira com um comando experimental 5/MG sempre que a pulseira se liga ou alteras o alarme. Foram comunicados despertares pela pulseira em 5.0 e MG, mas não são garantidos. Mantém um alarme de reserva para tudo o que não podes perder. + Envia consultas experimentais de protocolo e regista as respostas no registo da pulseira. Também permite o alarme experimental da pulseira 5/MG: o NOOP envia-o na próxima vez que a pulseira se ligar ou alteres o alarme. Desativar não apaga um alarme que já esteja na pulseira. Não é necessário para a sincronização, o sono, a recuperação ou os passos normais. Resultado do sono atualizado Os horários de sono ou o tempo total de sono desta noite mudaram pelo menos cinco minutos. Sonda de ativação de ECG WHOOP MG diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index 6fbec7268f..9979e62ac9 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -255,7 +255,7 @@ Включать при (заряде браслета) Приостановить сбор ВСР Пока заряд браслета низкий, останавливать постоянный фоновый поток ВСР — самый большой непрерывный расход для браслета. Живой экран по-прежнему показывает пульс, а поток включится сам, как только браслет зарядится. - Браслет WHOOP сопрягается только с одним устройством. Пока он подключён к NOOP, он не будет передавать to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + Браслет WHOOP сопрягается только с одним устройством. Сопряжение с NOOP может отнять его у официального приложения WHOOP, и наоборот. Это обратимо: сопрягите его в другом приложении, когда захотите вернуть. Добавить Дополнительно: у меня уже есть ключ моего кольца Бета. * — оценка на устройстве. Температура кожи — это тренд относительно вашей нормы, шаги are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -287,7 +287,7 @@ Повторить Использовать импорт файла Не удалось перехватить управление этим кольцом. - Поддержка WHOOP 5.0 / MG в NOOP новее и всё ещё экспериментальна. + WHOOP 5.0 / MG поддерживает данные в реальном времени и историю браслета. Инструменты исследования протокола вынесены в Тестовый центр. WHOOP — основной, полностью поддерживаемый браслет NOOP. Другие пульсометры передают живой пульс и ВСР, но не более глубокие данные WHOOP о сне и восстановлении. Ещё Пока нет записанных измерений. @@ -504,7 +504,7 @@ Проба чтения конфигурации устройства (#103 RE)… Результат пробы чтения конфигурации устройства (#103) Запрашивает у ремешка ЗНАЧЕНИЯ конфигурации: GET_DEVICE_CONFIG_VALUE (0x79) и GET_FF_VALUE (0x80), по одному ключу за обмен. Обеих команд в этой прошивке может просто не быть — выяснить это и есть цель пробы. Только чтение — никакое значение не записывается, а команды SET из этой пробы никогда не отправляются. Результат показан здесь и записан в журнал ремешка. - Две независимые таблицы протокола расходятся в коде расширенных данных о батарее (98 против 87). Здесь отправляется проверенная команда только для чтения 98, а полный сырой ответ браслета записывается в журнал. Ответ в формате батареи подтверждает 98 на вашей прошивке; короткая заглушка означает, что вопрос остаётся открытым. На браслет ничего не записывается. Пожалуйста, экспортируйте и пришлите журнал браслета после этого. + Две независимые таблицы протокола расходятся в коде расширенных данных о батарее (98 против 87). Здесь отправляется проверенная команда только для чтения 98 и показывается полный сырой ответ браслета (он также записывается в журнал браслета). На WHOOP 4.0 ответ в формате батареи подтверждает 98 на вашей прошивке, а результат раскодирует напряжение батареи; короткая заглушка оставляет вопрос открытым. На WHOOP 5/MG заряд батареи берётся не из 98 (это чтение внешней батареи, команда 151), NOOP не раскодирует из ответа никакого значения, а читать нужно строку «Result code»: UNSUPPORTED означает, что эта прошивка отклоняет 98. На браслет ничего не записывается. После этого экспортируйте и отправьте журнал браслета. Отмена Закрыть Копировать @@ -900,7 +900,7 @@ Напоминание о подготовке ко сну Длина окна %1$s мин - Для будильника на браслете WHOOP 5/MG включите Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Время пробуждения сохранено, но будильник на браслете ещё не активирован. Оставьте резервный будильник. + Для будильника на браслете WHOOP 5/MG включите Пробы протокола (Тестовый центр → Диагностика протокола 5/MG). Время пробуждения сохранено, но NOOP не отправляет его на браслет, пока Пробы протокола выключены. Ранее отправленный будильник может оставаться на браслете. Оставьте резервный будильник. Откалибруйте шаги Закрыть День @@ -909,7 +909,7 @@ Как это работает Пока нет дней, где шаги считали и NOOP, и ваш телефон. Как только телефон запишет few days alongside the strap, they\'ll appear here so you can see how close the estimate is. Данные о движении пока не синхронизированы - NOOP оценивает ваши шаги по движению вашего WHOOP, калибруя их по счётчику шагов телефона. Это оценка, а не шагомер. WHOOP 4.0 не передаёт шаги. + NOOP оценивает ваши шаги по сохранённому движению вашего WHOOP, калибруя их по счётчику шагов телефона. Это оценка, а не аппаратный шагомер. WHOOP 4.0 не передаёт число шагов. На WHOOP 5.0 / MG за дни, которые покрывает его собственный счётчик шагов, показывается его значение; чтобы скорректировать это число, используйте «Калибровка шагов» в Настройках. Пока не откалибровано В дни, когда телефон тоже считал шаги, NOOP выясняет, как ваше движение соотносится с steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Откройте NOOP рядом с браслетом и дайте ему догнать (полная синхронизация истории может занять время на first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -921,7 +921,7 @@ Это дни, когда телефон также считал шаги, поэтому NOOP может понять, как ваше движение соотносится с шагами. Либо задайте коэффициент вручную ниже. Эти дни исключены из оценки (вместо неё показан реальный счёт вашего телефона). Они здесь только для того, чтобы вы могли оценить точность. Мы пока не видим движения с вашего браслета. Шаги оцениваются по движению вашего WHOOP banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · движение → шаги + WHOOP · движение → шаги Следующий день Предыдущий день %1$s %2$s часов @@ -1325,7 +1325,7 @@ Обновления снова проверяются через GitHub v5 — выпуск о сыром сигнале: NOOP читает сигнал, на вашем устройстве, бесплатно Итоги недели честно говорят о незавершённой неделе - WHOOP 4.0 — поддерживаемый вариант + WHOOP 4.0 — наиболее проверенный вариант Декодирование истории WHOOP 5.0 приходит на Android Вибрация WHOOP 5.0/MG — настоящая команда (совпадение байт в байт) Вибрация WHOOP 5.0/MG — пробуем правильную команду (эксперимент) @@ -1413,7 +1413,7 @@ Включите Bluetooth WHOOP 5 / MG (эксперимент) Не подключается? Пройдите по этим пунктам - Ваш браслет подключён, и мы пробуем экспериментальное рукопожатие, чтобы включить живой heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + Ваш браслет подключён, и мы пробуем экспериментальное рукопожатие, чтобы включить живой пульс через стандартный профиль. Это ещё не проверено на оборудовании 5/MG, поэтому пульс может появиться или нет, а часть ночных данных 5/MG пока неполна, поэтому фазы сна приблизительны. С вашим браслетом всё в порядке — WHOOP 4.0 поддерживается полностью. День Удалить все данные этого устройства? Удалить данные этого устройства… @@ -1482,7 +1482,7 @@ Нажмите на день, чтобы наверстать Сред. Вибрация - Не удаётся подключиться — сопряжение браслета было сброшено + Браслету нужна помощь, чтобы переподключиться — шаги ниже Зарядка Расстояние Усилие @@ -1498,7 +1498,7 @@ Начать тренировку Браслет Сделать измерение ВСР - WHOOP 5.0/MG сопрягается с одним приложением за раз. Если поиск ничего не находит, отмените сопряжение в the official WHOOP app and fully close that app, then Connect again. + WHOOP 5.0/MG сопрягается только с одним приложением одновременно. Если поиск ничего не находит, отвяжите его в официальном приложении WHOOP и полностью закройте это приложение, затем снова нажмите «Подключить». Сохранить изменения Экспериментальная картина межударного ритма. Сначала прочитайте это. Перед включением Rhythm @@ -1537,7 +1537,7 @@ Связаться с поддержкой: %1$s Непрерывный захват ВСР Не удалось проверить. Попробуйте снова. - Тиков счётчика на шаг. Оставьте 1.0, если только шаги не завышены. На WHOOP 5/MG они могут быть очень завышены (в 10 раз и более), поэтому предел здесь до 30. Пройдите известные 1000 шагов и разделите счёт NOOP на реальное число, чтобы получить своё значение. + Тики счётчика на шаг для собственного счётчика шагов WHOOP 5/MG. Оставьте 1,0, если ваши шаги стабильно не завышены. Пройдите известные 1000 шагов и разделите значение NOOP на реальное, чтобы получить своё значение. Показывать осведомлённость о цикле Осведомлённость о цикле Фон суточного цикла @@ -1603,7 +1603,7 @@ Проверяет каждый оценённый блок бодрствования на реальные признаки подъёма (ритм шагов, change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Ритм (эксперимент) Запускает непрерывный поток ВСР только в ваши тихие часы (по умолчанию 22:00–07:00), примерно вдвое снижая расход батареи. Дневные измерения стресса станут реже. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Сохраняет последние 24 часа декодированных данных с датчиков (пульс, R-R, движение, шаги и любые глубокие потоки 5/MG, которые вы разблокировали) в один CSV, которым можно поделиться, чтобы поэкспериментировать со своими данными. Ничего не покидает телефон, пока вы сами не поделитесь. + Сохраняет последние 24 часа декодированных данных датчиков (пульс, R-R, движение, шаги, SpO₂, температура кожи, дыхание и события) в один CSV-файл, которым можно поделиться, чтобы изучать собственные данные. Ничто не покидает телефон, пока вы сами не поделитесь файлом. Отправить последовательность включения на браслет Настроить автоматические резервные копии Настройки @@ -1830,7 +1830,7 @@ последние 7 дней последние 30 дней последние 90 дней - Этот браслет не передаёт SpO₂ по Bluetooth. Импортируйте выгрузку WHOOP или Health Connect, чтобы увидеть его. + Этот браслет не передаёт сигнал SpO₂ для этого графика. Импортируйте выгрузку WHOOP или данные Health Connect, чтобы увидеть его. Этот браслет не передаёт сырой поток дыхания. Ваша расчётная частота дыхания показана на экране «Здоровье». Развёрнуто Свёрнуто @@ -1870,6 +1870,9 @@ Энергосбережение успокаивает индикаторы, переведённые уведомления Android и мгновенная загрузка графиков Нет импортированных данных SpO₂ или значения из Health Только сырые значения — нужен импорт + Нет необработанных значений SpO₂ (только WHOOP 4.0) + Синхронизировать сейчас. Требуется полное защищённое сопряжение браслета, которое не завершено. + Сопряжение не завершено Выключить глубокие данные обратно Требуется полное шифрованное сопряжение: сначала закройте официальное приложение WHOOP и сопрягите браслет с NOOP (канал только для пульса в реальном времени не может передать запись). Записывает значение выключения во все 16 флагов и читает каждый обратно, чтобы вы видели, что браслет хранит, а не только что он подтвердил. Значение выключения выведено из флага, который NOOP уже так отключает для трансляции на Garmin: на флаге R22 оно никогда не наблюдалось, поэтому NOOP сначала пробует один флаг и останавливается, если браслет его отвергнет. Очистка флагов — не то же самое, что увидеть остановку подробных записей: проверьте это последующей синхронизацией. @@ -1892,13 +1895,13 @@ Всё хранится на этом телефоне. Без аккаунта, без синхронизации, без облака. Несколько честных слов, чтобы ничто не стало сюрпризом. NOOP — личный открытый проект, а не приложение WHOOP, и он не связан с WHOOP. Он читает браслет, которым вы владеете, на вашем собственном устройстве. Относитесь к нему как к работающей, но незавершённой разработке, а не к готовому продукту. - WHOOP 4.0 протестирован и работает полностью. WHOOP 5.0/MG новее: живой пульс работает уже сегодня, но более глубокие метрики (восстановление, нагрузка, сон) для 5/MG всё ещё разбираются. NOOP всегда сообщает, что работает, а что ещё в разработке. + WHOOP 4.0 проверен и работает от начала до конца. WHOOP 5.0/MG новее: пульс в реальном времени и история браслета работают, а NOOP считает по ним сон, восстановление и нагрузку на вашем устройстве. Часть ночных данных на 5/MG пока неполна, поэтому фазы сна на нём приблизительны. NOOP всегда показывает, что уже работает, а что ещё в разработке. Пульс в реальном времени доступен сразу. Восстановление, нагрузка и сон становятся точнее по мере того, как NOOP изучает вашу норму за первые ночи ношения. Хотите получить историю прямо сейчас? Импортируйте экспорт WHOOP в разделе «Источники данных» — она подгрузится примерно за минуту. Ни аккаунта, ни облака, ни синхронизации. NOOP общается только с вашим браслетом и хранит всё локально. Ваши данные принадлежат только вам. NOOP использует Bluetooth, чтобы найти ваш браслет. Продолжив, выдайте разрешение, чтобы он мог выполнить поиск. NOOP общается с браслетом напрямую по Bluetooth Low Energy. Между вами нет сервера. Соединение локальное — как и каждое считанное показание. Когда Android спросит, разрешите Bluetooth, чтобы NOOP мог искать и подключаться. - WHOOP 5.0/MG может потребовать режим сопряжения в первый раз, при закрытом официальном приложении WHOOP. + WHOOP 5.0/MG в первый раз может потребовать режима сопряжения: закройте официальное приложение WHOOP, затем несколько раз коснитесь браслета, пока светодиоды не начнут мигать синим. Датчику нужен контакт с кожей, прежде чем данные начнут что-то значить. Наденьте плотно на запястье или бицепс, датчиком к коже. Дайте ему зарядиться несколько минут, если заряд низкий. @@ -1947,7 +1950,7 @@ Ваш браслет подключён и сохраняет данные. Переподключитесь, чтобы получить последние данные. Браслет не подключён. Нажмите, чтобы подключить. - Синхронизация истории экспериментальна на 5.0. + Синхронизация истории экспериментальна на WHOOP 5.0/MG. Пока нет ни пульса в реальном времени, ни синхронизированной истории в этой сессии. Калибровка Возобновится утром @@ -2035,7 +2038,7 @@ Изучаем ваш паттерн · ~день %1$d · ~день %1$d–%2$d - Пока нет ночной температуры кожи — нужно ~4 ночи ношения (или импортируйте CSV из WHOOP) + Ночной температуры кожи пока нет — она появится после синхронизации ночи, когда браслет был надет (или импортируйте CSV из WHOOP) Темп. кожи Δ относит. исходного Сделайте NOOP своим — цвета темы и свои фоны, ещё сорок видов спорта с GPS-маршрутами и тепловая карта калорий @@ -2457,7 +2460,7 @@ Шкала Усилия на ваш выбор, кольцо, которое засыпает, и намного меньше лишних пересчётов Этому показателю нужно минимум два измерения в истории, прежде чем NOOP сможет построить график. Оценка насыщения крови кислородом отключена - Ваш браслет сообщает оценку насыщения крови кислородом, но она не проверена и по умолчанию отключена. Включите оценку браслета в Настройках, чтобы увидеть её, или импортируйте выгрузку WHOOP в «Источниках данных» для калиброванного значения. + Ваш браслет сообщает оценку кислорода в крови, но она не проверена и по умолчанию выключена. Чтобы увидеть её, включите \"Blood Oxygen: strap estimate\" в Настройки → Дополнительно → Диагностика или импортируйте экспорт WHOOP в разделе «Источники данных», чтобы получить откалиброванное значение. WHOOP 4.0 не даёт процент насыщения крови кислородом Ваш браслет накапливает сырые оптические каналы, но NOOP не превращает их в процент насыщения крови кислородом, поэтому здесь будет пусто, сколько бы вы его ни носили. Импортируйте выгрузку WHOOP в разделе «Источники данных», чтобы заполнить это из истории вашего аккаунта. Сборщик сырых данных 5/MG @@ -2529,7 +2532,7 @@ Пассивная трассировка истории/протокола Поделиться пассивной сырой трассировкой Экспорт пассивной трассировки + журнала браслета - Сырой захват и его экспорт трассировки протокола теперь находятся в Центре тестирования → Диагностика протокола 5/MG. + Сырой захват и его экспорт трассировки протокола теперь находятся в Тестовом центре → Диагностика протокола 5/MG. Отправлять hello несмотря на отказ в сопряжении (эксперимент) Отправлять hello несмотря на отказ в сопряжении Проверять автоматически @@ -2647,7 +2650,7 @@ %1$s тренировок %1$s тренировки - Эта ночь определена только по пульсу, без записанного движения, поэтому вариабельность сердечного ритма и пульс в покое измерить не удалось. Обычная причина — ремешок, сопряжённый не полностью. + Эта ночь определена только по пульсу, без записанного движения, поэтому её время и фазы приблизительны. Пустое значение ВСР или пульса покоя означает, что за эту ночь не набралось достаточно пригодных данных о пульсе для измерения. Не полностью сопряжённый браслет — обычная причина того, что за ночь нет данных о движении. Суточный цикл Выберите, когда начинается новый отсчёт шагов и текущей нагрузки. Дневной сон не начинает новый день. Начало дня @@ -2668,7 +2671,7 @@ Как для параметров тела Проба батарейного блока (151 RE)… Результат пробы батарейного блока (151) - Отправляет команду батарейного блока только для чтения (151) и декодирует ответ браслета — заряд блока, серийный номер и Bluetooth-адрес. На браслет ничего не записывается, и это не влияет на ваши данные. У WHOOP 4.0 нет команды блока, и ожидается молчание; само это молчание — полезный результат. + Отправляет команду только для чтения внешней батареи (151) и показывает ответ браслета. Ответ SUCCESS декодируется как заряд, серийный номер и Bluetooth-адрес батареи. Известный результат: WHOOP MG с прошивкой 50.39.1.0 отвечает FAILURE независимо от того, подключена ли батарея, поэтому заряд батареи на карточке «Устройства» берётся из события батареи, которое присылает сам браслет, а не из этой команды. У WHOOP 4.0 нет команды для батареи, и ожидается, что он промолчит; это молчание само по себе полезный результат. На браслет ничего не записывается, и ничто не попадает в ваши данные. Ожидает синхронизации история браслета ещё передаётся Мин %1$d • Макс %2$d @@ -2708,7 +2711,7 @@ Этой ночью эффективность высокая, но глубокого сна и REM очень мало. Скорее всего, это ошибка определения фаз, а не реальная нехватка восстановительного сна. Итоги сохранены, читайте распределение с осторожностью. Завышает число интервалов R-R, поэтому значение не показано Запросить текущее имя (только чтение) - Переименование пока не поддерживается на WHOOP 5.0 и MG. NOOP может запросить у ремешка его текущее имя, и это решит, возможно ли переименование вообще. + Переименование пока не поддерживается на WHOOP 5.0 и MG. Экспериментальное переименование и проверка имени только для чтения появляются здесь, пока включён режим Тестовый центр → Connection & Sync. Экспериментально на WHOOP 5.0 и MG: эта команда никогда не подтверждалась на данном поколении. Она обратима, поэтому переименуйте ещё раз, если что-то пойдёт не так, и проверьте результат через Запросить текущее имя. Будильник через %1$s Будильник менее чем через минуту @@ -2745,8 +2748,8 @@ Ожидает синхронизации · %1$s %1$s уд/мин%2$s %1$s, %2$s, используется - Будильник установлен на браслете экспериментальной командой 5/MG. Сообщалось о срабатывании на 5.0 и MG, но оно не гарантировано. Оставьте резервный будильник для важных событий. - Отправляет экспериментальные запросы протокола и включает будильник браслета 5/MG. Не требуется для обычной синхронизации, сна, восстановления или подсчёта шагов. + NOOP устанавливает будильник на браслете экспериментальной командой 5/MG при каждом подключении браслета и при каждом изменении будильника. Сообщалось о срабатывании на 5.0 и MG, но оно не гарантировано. Оставьте резервный будильник для важных событий. + Отправляет экспериментальные запросы протокола и записывает ответы в журнал браслета. Также разрешает экспериментальный будильник браслета 5/MG: NOOP отправляет его при следующем подключении браслета или при изменении будильника. Выключение не удаляет будильник, уже установленный на браслете. Не требуется для обычной синхронизации, сна, восстановления или подсчёта шагов. Результат сна обновлён Время засыпания, пробуждения или общая продолжительность сна этой ночи изменились как минимум на пять минут. Проба включения ЭКГ WHOOP MG diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml index 75a9e8a04f..4947ded9a8 100644 --- a/android/app/src/main/res/values-zh/strings.xml +++ b/android/app/src/main/res/values-zh/strings.xml @@ -174,7 +174,7 @@ 低电量暂停 HRV 监测 当手环电量偏低时,自动停止全天候的后台 HRV (心率变异性) 数据流——这是手环最耗电的功能。实时界面依然会显示心率,且手环充电后,HRV 监测会自动恢复。 0123456789abcdef0123456789abcdef - WHOOP 手环会与单部手机绑定。要想在这里配对,您需要先在其他设备上解除它的绑定。 to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + WHOOP 手环只能与一台设备绑定。将其与 NOOP 配对可能会使其脱离官方 WHOOP 应用,反之亦然。此操作可逆:想换回时,在另一个应用中重新配对即可。 添加 高级:我已经有了戒指的密钥 (Key) 测试版:这是一项基于本地设备的离线心率估算。开启此项可能会增加耗电,请酌情使用。 are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -207,7 +207,7 @@ 重试 使用文件导入 抱歉,我们无法接管这枚戒指。 - 对 WHOOP 5.0 (MG) 的支持在 NOOP 中仍处于实验阶段。 + WHOOP 5.0 / MG 支持实时数据和手环历史。协议研究工具单独位于测试中心。 WHOOP 是 NOOP 首要且完全支持的核心设备。其他心率带只能提供基础的实时心率流。 更多 更多 @@ -847,7 +847,7 @@ 入睡准备提醒 唤醒窗口时长 %1$s 分钟 - WHOOP 5/MG 手环闹钟需要开启“协议探测”(测试中心 → 5/MG 协议诊断)。唤醒时间已保存,但手环闹钟尚未启用。请保留备用闹钟。 + WHOOP 5/MG 手环闹钟需要开启“协议探测”(测试中心 → 5/MG 协议诊断)。唤醒时间已保存,但在“协议探测”关闭期间,NOOP 不会将其发送到手环。此前已发送的闹钟可能仍保留在手环上。请保留备用闹钟。 校准您的步数 关闭 日期 @@ -856,7 +856,7 @@ 工作原理 尚未收集到 NOOP 和手机同时记录步数的日期。一旦您的手机记录了... few days alongside the strap, they\'ll appear here so you can see how close the estimate is. 暂未同步到体动数据 - NOOP 会根据你 WHOOP 的运动来估算步数,并以你手机的步数进行校准。这是一个估算值,而非计步器,WHOOP 4.0 不传输步数。 + NOOP 会根据你 WHOOP 存储的运动数据来估算步数,并以你手机的步数进行校准。这是估算值,而非硬件计步器。WHOOP 4.0 不发送步数。在 WHOOP 5.0 / MG 上,其自身计步器覆盖的日子会改为显示该计数;如需调整该数值,请在设置中使用“步数校准”。 尚未完成校准 在手机也计步的日子里,NOOP 会学习体动数据应该如何映射到实际步数,从而越来越精准。 steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. 请在手环附近打开 NOOP 并等待数据同步完成 (如果是全量历史数据同步,可能会花点时间)。 first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -868,7 +868,7 @@ 这些是你手机也统计了步数的日子,因此 NOOP 可以学习你的运动如何对应步数。或者在下方手动设置系数。 这些日子被排除在估算之外(改为显示你手机的真实计数), 它们出现在这里只是为了让你判断估算的准确性。 我们暂未接收到手环的体动数据。步数是根据 WHOOP 传来的体动信号推算的。 banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · 体动 → 步数换算 + WHOOP · 体动 → 步数换算 下一天 前一天 %1$s %2$s 小时 @@ -911,7 +911,7 @@ 在分享前先预览 分享 / 发送 分享手环连接日志 (用于排查 Bug) - 测试与极客中心 + 测试中心 测试模式 这就您的日志报告包含的全部内容。在您点击“分享”之前,没有任何数据会离开您的手机。 此操作将重新开始为期约 4 晚的基线学习,以校准您的充能与 HRV 基线。历史数据不会丢失。 @@ -1289,7 +1289,7 @@ 更新检查服务已重新对接至 GitHub v5 里程碑 - 拥抱原始信号:NOOP 现已完全在设备本地解析信号,并且免费 本周回顾:对于不完整的一周数据,现在会有更清晰的说明 - WHOOP 4.0 是官方建议的最佳设备 + WHOOP 4.0 是经过最多测试的路线 WHOOP 5.0 历史数据解码功能已登陆 Android WHOOP 5.0/MG 震动提醒 - 实现了真正的原生指令 (字节级对齐匹配) WHOOP 5.0/MG 震动提醒 - 正在尝试下发正确指令 (实验性功能) @@ -1335,7 +1335,7 @@ 开启蓝牙 WHOOP 5 / MG (实验性支持) 连不上?尝试排查以下几点 - 您的手环已连接,我们正在尝试使用一项实验性的握手协议来唤醒实时数据流... heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + 您的手环已连接,我们正在尝试通过标准配置文件使用实验性握手来启用实时心率。这在 5/MG 硬件上尚未验证,因此心率可能出现也可能不出现,且部分 5/MG 夜间输入仍不完整,睡眠分期只是近似值。您的手环没有问题 - WHOOP 4.0 已获得完整支持。 天 删除该设备产生的所有数据? 针对 %1$s 的设备操作 @@ -1399,7 +1399,7 @@ liquidPressScale 平均 震动测试 - 无法连接 - 您的手环配对信息已被重置 + 手环需要您协助重新连接 - 步骤见下方 充电中 距离 负荷(Effort) @@ -1416,7 +1416,7 @@ 手环设备 进行一次 HRV 测量 ● %1$s - WHOOP 5.0/MG 同时只能连接一个 App。如果扫描不到它,请先在官方 App 中取消配对 the official WHOOP app and fully close that app, then Connect again. + WHOOP 5.0/MG 同一时间只与一个应用配对。如果扫描没有找到任何东西,请在官方 WHOOP 应用中取消配对并完全关闭该应用,然后再次点击连接。 NoopButton.scale 保存更改 CountUpText @@ -1457,7 +1457,7 @@ 联系支持团队: %1$s 全天候 HRV 捕获 检查更新失败。请重试。 - 每一步对应的传感器计数(Tick)比例。除非您的计步数据偏高,否则请保持默认值 1.0。在 WHOOP 5/MG 上,传感器数据可能会非常高(是实际步数的 10 倍甚至更多),所以这里的上限可调至 30。您可以走一段已知的 1000 步,用 NOOP 统计出的数字除以 1000,就能得出您专属的比例值了。 + WHOOP 5/MG 自带计步器每一步对应的计数器刻度数。除非你的步数持续偏高,否则请保持 1.0。走已知的 1000 步,用 NOOP 的计数除以实际步数,即可得到你的值。 显示生理周期感知 生理周期感知 日夜交替背景 @@ -1523,7 +1523,7 @@ 审查每个被判定为“清醒”的睡眠片段,寻找您确实已经起床活动的真实证据(例如走路步频,或... change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. 心律 Rhythm (实验性功能) 仅在您设置的休息时间窗口(默认 22:00–07:00)内运行连续的 HRV 数据流捕获,这能省下大约一半的耗电量。代价是:白天的压力(Stress)读数会变得更加稀疏。 Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - 将过去 24 小时内解码后的传感器样本数据(包括心率、R-R间期、运动、步数,以及您解锁的任何 5.0/MG 深层数据流)保存为一个 CSV 文件,供您自己折腾和分析数据用。除非您主动分享,否则这些数据绝不会离开您的手机。 + 将最近 24 小时已解码的传感器样本(心率、R-R、体动、步数、SpO₂、皮肤温度、呼吸和事件)保存为一个可分享的 CSV,方便你研究自己的数据。除非你主动分享,否则数据不会离开手机。 向手环发送激活指令序列 设置自动备份 设置 @@ -1739,7 +1739,7 @@ 你当前的恢复水平,以 HRV 相对于你个人基线的表现为主导。 全天累积的心血管负荷,采用 0-100 分制(旧版为 0-21)。 你的睡眠质量与修复力:综合睡眠时长、睡眠效率、深睡+REM占比以及入睡时机等。 - 此设备不通过蓝牙发送 SpO₂。导入 WHOOP 数据或 Health Connect 即可查看。 + 此手环不会为此图表发送 SpO₂ 信号。导入 WHOOP 数据或 Health Connect 数据即可查看。 此设备不发送原始呼吸数据流。你的估算呼吸频率显示在“健康”屏幕上。 "上次分享 "%1$s 分享已暂停——Health Connect 权限已被撤销。点按以重新授予。 @@ -1799,6 +1799,9 @@ 省电模式让仪表静止、Android 通知已翻译、图表秒开 无 SpO₂ 导入或健康数值 仅原始计数 — 需导入 + 无原始 SpO₂ 计数(仅限 WHOOP 4.0) + 立即同步。需要手环完成完整的安全配对,但目前尚未完成。 + 配对未完成 ✓ 手环已接受全部 %1$d 个 R22 标记 手环已接受 %1$d/%2$d 个 R22 标记… 重新关闭深层数据 @@ -1822,13 +1825,13 @@ 所有内容都保存在这台手机上。无需账号、无需同步、无需云端。 几句实话,免得让你意外。 NOOP 是一个个人开放项目:它不是 WHOOP 应用,也与 WHOOP 无关。它只在你自己的设备上读取你拥有的手环。请将它视为一个功能强大但仍在开发中的项目,而不是成品。 - WHOOP 4.0 已经过测试,端到端可用。WHOOP 5.0/MG 较新:实时心率现已可用,但 5/MG 的深层指标(恢复、强度和睡眠)仍在研究中。NOOP 始终会告诉你哪些功能已可用、哪些仍在开发。 + WHOOP 4.0 经过测试,可完整使用。WHOOP 5.0/MG 较新:实时心率和手环历史数据均可使用,NOOP 会据此在你的设备上计算睡眠、恢复和负荷。5/MG 的部分夜间输入数据仍不完整,因此其睡眠分期只是近似值。NOOP 始终会告诉你哪些功能已可用、哪些仍在完善中。 实时心率可立即查看。随着 NOOP 在最初几晚的佩戴中了解你的基线,恢复、强度和睡眠数据会越来越准确。想立即查看历史数据?请在“数据来源”中导入 WHOOP 导出文件,大约一分钟即可回填。 无需账号、无需云端、无需同步。NOOP 只与你的手环通信,一切都保留在本地。你的数据只属于你。 NOOP 使用 Bluetooth 查找你的手环。继续时,请授予权限以便进行扫描。 NOOP 通过低功耗 Bluetooth 直接与你的手环通信,中间没有服务器。连接在本地进行,读取到的每条数据也都保留在本地。 当 Android 提示时,请允许使用 Bluetooth,以便 NOOP 扫描并连接你的手环。 - 首次连接 WHOOP 5.0/MG 时,可能需要在关闭官方 WHOOP 应用后让手环进入配对模式。 + 首次连接 WHOOP 5.0/MG 时可能需要进入配对模式:先关闭官方 WHOOP 应用,然后反复轻点手环,直到 LED 灯闪烁蓝色。 传感器需要接触皮肤,数据才开始具有参考意义。 将手环贴合地戴在手腕或上臂,确保传感器紧贴皮肤。 如果电量较低,请先充电几分钟。 @@ -1877,7 +1880,7 @@ 你的手环已连接并正在保存数据。 重新连接以拉取最新内容。 手环未连接。点击以连接。 - 历史同步在 5.0 上属实验性。 + 历史同步在 WHOOP 5.0/MG 上属实验性。 本次连接尚无实时心率或已同步的历史记录。 校准中 早晨恢复 @@ -1966,7 +1969,7 @@ 正在学习你的模式 · 约第 %1$d 天 · 约第 %1$d–%2$d 天 - 暂无夜间皮肤温度 — 需要约 4 个佩戴夜晚(或导入 WHOOP CSV) + 暂无夜间皮肤温度——佩戴过夜并同步后会显示(或导入 WHOOP CSV) 皮肤体温 Δ 相对基线 把 NOOP 变成你的——强调色与自定义背景、新增四十多项运动及 GPS 轨迹,还有卡路里热力图 @@ -2519,7 +2522,7 @@ 可自选的 Effort 计分方式、能安心睡觉的戒指,以及大幅减少的无谓重算 该项体征需要至少两条历史读数,NOOP 才能绘制图表。 血氧估算已关闭 - 你的手环会给出血氧估算值,但该值未经验证且默认关闭。可在“设置”中开启手环估算,或在“数据来源”导入 WHOOP 导出文件以获得校准值。 + 你的手环会报告血氧估算值,但该值未经验证,默认关闭。要查看它,请在 设置 → 高级选项 → 诊断信息 中开启 \"Blood Oxygen: strap estimate\",或在“数据源”中导入 WHOOP 导出文件以获得校准后的数值。 WHOOP 4.0 无法提供血氧百分比 你的手环会记录原始光学通道,但 NOOP 不会将其换算成血氧百分比,因此无论佩戴多久这里都会是空的。请在“数据来源”中导入 WHOOP 导出文件,以用账户历史填充。 请求 Android 配对(实验性) @@ -2627,7 +2630,7 @@ 皮肤温度 这些夜晚没有实测温度,显示的是与基线的差值。同步后会重新计算近期夜晚并补上。 仅显示有实测温度的夜晚;其余夜晚只记录了与基线的差值。 - 这一晚仅根据心率推算,没有记录到动作,因此无法测量心率变异性和静息心率。通常的原因是手环尚未完全配对。 + 这一晚仅根据心率识别,没有记录到活动,因此其时间和阶段只是近似值。HRV 或静息心率为空,表示这一晚没有足够可用的心率数据来测量。手环未完全配对,通常就是某一晚没有活动数据的原因。 每日周期 选择步数和进行中的体力消耗何时重新开始。小睡不会开始新的一天。 一天开始于 @@ -2688,7 +2691,7 @@ 跟随身体测量 电池盒探测 (151 RE)… 电池盒探测结果 (151) - 发送只读的电池盒命令 (151) 并解码手环的回复——电池盒的电量、序列号和蓝牙地址。不会向手环写入任何内容,也不会影响您的数据。WHOOP 4.0 没有电池盒命令,预期会保持静默;这种静默本身就是有用的结果。 + 发送只读的电池组命令 (151) 并显示手环的回复。SUCCESS 回复会被解码为电池组的电量、序列号和蓝牙地址。已知结果:固件为 50.39.1.0 的 WHOOP MG 无论是否连接电池组都会回复 FAILURE,因此设备卡片上的电池组电量来自手环自身推送的电池组事件,而不是此命令。WHOOP 4.0 没有电池组命令,预计会保持沉默;这种沉默本身就是一个有用的结果。不会向手环写入任何内容,也不会影响你的数据。 电池盒 %1$.1f%% 等待同步 手环历史记录仍在传输 @@ -2719,7 +2722,7 @@ 佩戴位置探测(#690 RE)… 佩戴位置探测结果(#690) 发送只读的佩戴位置命令(0x54),并将手环的完整原始回复转储到手环日志;在 WHOOP 4.0 上会解码该记录(版本/位置/置信度/状态)。不会向手环写入任何内容,也不会改变佩戴检测或评分。 - 两份独立的协议表对扩展电池操作码存在分歧(98 与 87)。此操作发送经整理的只读 98,并将手环的完整原始回复转储到手环日志。返回电池格式的负载即可确认你的固件使用 98;若只返回简短存根,则仍无法确定。不会向手环写入任何内容。请在之后导出并分享手环日志。 + 两份独立的协议表对扩展电池操作码存在分歧(98 与 87)。此操作发送经整理的只读 98,并显示手环的完整原始回复(同时写入手环日志)。在 WHOOP 4.0 上,返回电池格式的负载即可确认你的固件使用 98,并会解码出电池组电压;若只返回简短存根,则仍无法确定。在 WHOOP 5/MG 上,电池组电量并非来自 98(那是电池组读数,命令 151),NOOP 不会从回复中解码任何数值,需要查看的是“Result code”一行:UNSUPPORTED 表示此固件拒绝 98。不会向手环写入任何内容。请在之后导出并分享手环日志。 关闭 复制 %1$.2f V @@ -2792,7 +2795,7 @@ 这一晚睡眠效率很高,但深睡和快速眼动睡眠极少。这更可能是睡眠阶段判定的误差,而非真正的恢复不足。总计数值保持不变,请谨慎解读各阶段占比。 R-R 间期计数偏多,因此不显示数值 读取当前名称(只读) - WHOOP 5.0 或 MG 暂不支持重命名。NOOP 可以向手环查询当前名称,这一步决定重命名是否可行。 + WHOOP 5.0 或 MG 暂不支持重命名。当“测试中心 → Connection & Sync”开启时,此处会显示实验性重命名和只读的名称检查。 在 WHOOP 5.0 或 MG 上属实验功能:该命令从未在此代手环上得到确认。它可以撤销,若有异常请再次重命名,并用读取当前名称确认是否生效。 闹钟将在 %1$s 后响起 闹钟将在一分钟内响起 @@ -2820,8 +2823,8 @@ 等待同步 · %1$s %1$s bpm%2$s %1$s,%2$s,使用中 - 已通过实验性 5/MG 命令在手环上设置闹钟。有用户报告 5.0 和 MG 手环能够唤醒,但不保证每次生效。重要事项请保留备用闹钟。 - 发送实验性协议查询并启用 5/MG 手环闹钟。正常同步、睡眠、恢复和步数功能不需要开启。 + 每当手环连接或你更改闹钟时,NOOP 会通过实验性 5/MG 命令在手环上设置闹钟。有用户报告 5.0 和 MG 手环能够唤醒,但不保证每次生效。重要事项请保留备用闹钟。 + 发送实验性协议查询,并将回复记录到手环日志中。同时允许使用实验性 5/MG 手环闹钟:NOOP 会在手环下次连接或你更改闹钟时发送。关闭此项不会清除手环上已有的闹钟。正常同步、睡眠、恢复和步数功能不需要开启。 睡眠结果已更新 这晚的入睡时间、醒来时间或总睡眠时长变化了至少五分钟。 WHOOP MG 心电图启动探测 diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 5ae979343a..cd5ae91669 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -292,7 +292,7 @@ 0123456789abcdef0123456789abcdef - A WHOOP strap bonds to a single device. While it\'s connected to NOOP it won\'t stream to the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. + A WHOOP strap bonds to a single device. Pairing it with NOOP can take it away from the official WHOOP app, and the other way round. It\'s reversible: pair it in the other app whenever you want it back. Add Advanced: I already have my ring\'s key Beta. * is an on-device estimate. Skin temp is a trend versus your own baseline, steps are a raw motion count, and HRV needs you to be still. No Oura Readiness or SpO2 percentage comes off the ring (import an Oura file for those). @@ -325,7 +325,7 @@ Try again Use file import We could not take over this ring. - WHOOP 5.0 / MG support is newer and still experimental in NOOP. + WHOOP 5.0 / MG supports live data and strap history. Protocol-research tools are available separately in Test Centre. WHOOP is NOOP\'s primary, fully-supported band. Other heart-rate straps stream live heart rate and HRV, but not WHOOP\'s deeper sleep and recovery data. More moreGroupChevron @@ -547,7 +547,7 @@ Battery-info probe result (#592) Battery-pack probe (151 RE)… Battery-pack probe result (151) - Sends the read-only battery-pack command (151) and decodes the strap\'s reply — the pack\'s charge, serial and Bluetooth address. Nothing is written to the strap and nothing feeds your data. A WHOOP 4.0 has no pack command and is expected to stay silent; that silence is itself a useful result. + Sends the read-only battery-pack command (151) and shows the strap\'s reply. A SUCCESS reply is decoded as the pack\'s charge, serial and Bluetooth address. Known result: a WHOOP MG on firmware 50.39.1.0 answers FAILURE whether or not a pack is attached, which is why the pack charge on the Devices card comes from the strap\'s own pushed pack event, not from this command. A WHOOP 4.0 has no pack command and is expected to stay silent; that silence is itself a useful result. Nothing is written to the strap and nothing feeds your data. Body-location probe (#690 RE)… Body-location probe result (#690) Sends the read-only body-location command (0x54) and dumps the strap\'s full raw reply to the strap log, decoding the record (revision / location / confidence / status) on WHOOP 4.0. Nothing is written to the strap, and it never changes wear detection or scoring. @@ -558,7 +558,7 @@ Device-config read probe (#103 RE)… Device-config read probe result (#103) Asks the strap for config VALUES: GET_DEVICE_CONFIG_VALUE (0x79) and GET_FF_VALUE (0x80), one key per round-trip. Both commands may simply not exist in this firmware — finding that out is the point. Read-only — no value is written, and the SET commands are never sent from this probe. The result is shown here and written to the strap log. - Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and dumps the strap\'s full raw reply to the strap log. A battery-style payload confirms 98 on your firmware; a short stub means it stays ambiguous. Nothing is written to the strap. Please export and share the strap log afterwards. + Two independent protocol tables disagree on the extended-battery opcode (98 vs 87). This sends the curated read-only 98 and shows the strap\'s full raw reply (also written to the strap log). On a WHOOP 4.0 a battery-style payload confirms 98 on your firmware and the result decodes the pack voltage; a short stub means it stays ambiguous. On a WHOOP 5/MG, 98 is not where the pack\'s charge comes from (that is the battery-pack reading, command 151), NOOP decodes no value from the reply, and the line to read is \'Result code\': UNSUPPORTED means this firmware rejects 98. Nothing is written to the strap. Please export and share the strap log afterwards. Cancel %1$s%% Close @@ -996,7 +996,7 @@ Wind-down nudge Window length %1$s min - WHOOP 5/MG strap alarms require Protocol probes (Test Centre → 5/MG protocol diagnostics). Your wake time is saved, but the strap is not armed yet. Keep a backup alarm. + WHOOP 5/MG strap alarms require Protocol probes (Test Centre → 5/MG protocol diagnostics). Your wake time is saved, but NOOP does not send it to the strap while Protocol probes is off. An alarm sent earlier may still be set on the strap. Keep a backup alarm. Calibrate your steps Close Day @@ -1005,7 +1005,7 @@ How this works No days yet where both NOOP and your phone counted steps. Once your phone logs a few days alongside the strap, they\'ll appear here so you can see how close the estimate is. No motion synced yet - NOOP estimates your steps from your WHOOP\'s motion, calibrated to your phone\'s step count. It\'s an estimate, not a step counter. A WHOOP 4.0 doesn\'t transmit steps. + NOOP estimates your steps from your WHOOP\'s stored motion, calibrated to your phone\'s step count. It\'s an estimate, not a hardware step counter. A WHOOP 4.0 sends no step count. On a WHOOP 5.0 / MG, days its own step counter covers show that count instead; to adjust that number, use Step calibration in Settings. Not calibrated yet On the days your phone also counted steps, NOOP learns how much your motion maps to steps, then applies that to the strap-only days. The more matching days it has, the more it trusts the estimate. Open NOOP near your strap and let it catch up (a full history sync can take a while on first run). Once a day or two of motion lands, your step estimate and the calibration below will start to fill in. @@ -1017,7 +1017,7 @@ These are the days where your phone also counted steps, so NOOP can learn how your motion maps to steps. Or set the coefficient manually below. These days are excluded from the estimate (your phone\'s real count is shown instead). They\'re here only so you can judge the estimate\'s accuracy. We\'re not seeing any motion from your strap yet. Steps are estimated from your WHOOP\'s banked motion history, so your strap needs to sync that history before NOOP has anything to count. - WHOOP 4.0 · motion → steps + WHOOP · motion → steps Next day Previous day %1$s %2$s hours @@ -1444,7 +1444,7 @@ Updates check GitHub again v5 - the raw-signal release: NOOP reads the signal, on your device, free Week in Review is honest about a half-finished week - WHOOP 4.0 is the supported path + WHOOP 4.0 is the most tested path WHOOP 5.0 history decoding comes to Android WHOOP 5.0/MG buzz - the real command (matched byte-for-byte) WHOOP 5.0/MG buzz - trying the right command (experimental) @@ -1490,7 +1490,7 @@ Turn Bluetooth on WHOOP 5 / MG (experimental) Won\'t connect? Run through these - Your strap is connected and we\'re trying an experimental handshake to bring up live heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and deeper metrics (recovery, strain, sleep) aren\'t decoded for 5/MG yet. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. + Your strap is connected and we\'re trying an experimental handshake to bring up live heart rate from the standard profile. This isn\'t verified on 5/MG hardware yet, so HR may or may not appear, and some 5/MG overnight inputs are still incomplete, so sleep stages are approximate. Nothing\'s wrong with your strap - WHOOP 4.0 is fully supported. Day Delete all of this device\'s data? Delete this device\'s data… @@ -1562,7 +1562,7 @@ liquidPressScale Avg Buzz - Can\'t connect - your strap\'s pairing was reset + Your strap needs help to reconnect - steps below Charging Distance Effort @@ -1623,7 +1623,7 @@ Contact support at %1$s Continuous HRV capture Couldn\'t check. Try again. - Counter ticks per step. Leave at 1.0 unless your steps run high. On a WHOOP 5/MG they can run very high (10× or more), so this goes up to 30. Walk a known 1,000 steps and divide NOOP\'s count by the real count to get your value. + Counter ticks per step for a WHOOP 5/MG\'s own step counter. Leave at 1.0 unless your steps consistently read high. Walk a known 1,000 steps and divide NOOP\'s count by the real count to get your value. Show cycle awareness Cycle awareness Day-cycle background @@ -1689,7 +1689,7 @@ Reviews each scored wake block for real evidence of getting up (walking cadence, a change in body position) instead of just a heart-rate rise. A wake block with no locomotion and a stable posture -- a hot night, a brief turn-over -- is folded back into light sleep; a real get-up is left alone. Self-checks how much motion detail your strap actually recorded and stays off on a night that\'s too sparse to trust (older WHOOP 4.0 firmware, mainly). Off by default; takes effect on the next nights staged. Rhythm (experimental) Runs the continuous HRV stream only during your quiet hours window (22:00–07:00 by default), roughly halving the battery cost. Daytime Stress readings will be sparser. Note: continuous background HRV capture (including daytime naps) is paused outside this window. For on-demand daytime HRV readings (including naps), use the \"Take an HRV reading\" button on the Live screen. - Saves the last 24h of decoded sensor samples (heart rate, R-R, motion, steps and any 5/MG deep streams you\'ve unlocked) as one CSV you can share, for tinkering with your own data. Nothing leaves the phone unless you share it. + Saves the last 24h of decoded sensor samples (heart rate, R-R, motion, steps, SpO₂, skin temperature, respiration and events) as one CSV you can share, for tinkering with your own data. Nothing leaves the phone unless you share it. Send enable sequence to strap Set up automatic backups Settings @@ -1945,7 +1945,7 @@ %1$d workout %1$d workouts - This strap doesn\'t send SpO₂ over Bluetooth. Import a WHOOP export or Health Connect to see it. + This strap doesn\'t send an SpO₂ signal for this chart. Import a WHOOP export or Health Connect data to see it. This strap sends no raw respiration stream. Your estimated respiratory rate appears on the Health screen. Expanded Collapsed @@ -2016,6 +2016,9 @@ Battery saver quiets the gauges, translated Android notifications, and instant chart loads No SpO₂ import or Health value Raw counts only — needs an import + No raw SpO₂ counts (WHOOP 4.0 only) + Sync now. Needs the strap\'s full secure pairing, which hasn\'t completed. + Not fully paired Turn deep data back off Needs the full encrypted bond: close the official WHOOP app and pair the strap to NOOP first (a live-HR-only link can’t carry the write). Writes the off value to all 16 flags and reads each one back, so you see what the strap stores rather than just that it acked. The off value is inferred from the flag NOOP already turns off this way for Garmin broadcast — it has never been seen on an R22 flag, so NOOP tries one flag first and stops if the strap refuses it. Clearing the flags is not the same as watching the deep records stop: check that by syncing afterwards. @@ -2039,13 +2042,13 @@ Everything lives on this phone. No account, no sync, no cloud. A few honest words, so nothing is a surprise. NOOP is a personal, open project - not the WHOOP app, and not affiliated with WHOOP. It reads a strap you own, on your own device. Treat it as a capable work-in-progress rather than a finished product. - WHOOP 4.0 is tested and works end to end. WHOOP 5.0/MG is newer: live heart rate works today, but deeper metrics (recovery, strain, sleep) for 5/MG are still being figured out. NOOP always tells you what\'s live versus still building. + WHOOP 4.0 is tested and works end to end. WHOOP 5.0/MG is newer: live heart rate and strap history work, and NOOP scores sleep, recovery and strain from them on your device. Some overnight inputs are still incomplete on 5/MG, so its sleep stages are approximate. NOOP always tells you what\'s live versus still building. Live heart rate is instant. Recovery, strain and sleep sharpen as NOOP learns your baseline over your first nights of wear. Want your history now? Import your WHOOP export in Data Sources and it backfills in about a minute. No account, no cloud, no sync. NOOP talks only to your strap and keeps everything local. Your data is yours alone. NOOP uses Bluetooth to find your strap. When you continue, allow the permission so it can scan. NOOP talks to your strap directly over Bluetooth Low Energy. There\'s no server in the middle. The connection is local, and so is every reading it pulls in. When Android asks, allow Bluetooth so NOOP can scan and connect. - WHOOP 5.0/MG may need pairing mode the first time, with the official WHOOP app closed. + WHOOP 5.0/MG may need pairing mode the first time: close the official WHOOP app, then tap the band repeatedly until its LEDs flash blue. The sensor needs skin contact before data starts to mean anything. Wear it snug on your wrist or bicep, sensor against skin. Give it a few minutes of charge if the battery is low. @@ -2094,7 +2097,7 @@ Your strap is connected and saving data. Reconnect to pull the latest. Strap not connected. Tap to connect. - History sync is experimental on 5.0. + History sync is experimental on WHOOP 5.0/MG. No live heart rate or synced history yet this session. Calibrating Resumes in the morning @@ -2185,7 +2188,7 @@ Learning your pattern · ~day %1$d · ~day %1$d–%2$d - No nightly skin-temp yet — needs ~4 worn nights (or import a WHOOP CSV) + No nightly skin-temp yet — appears after a worn night syncs (or import a WHOOP CSV) Skin Temp Δ vs baseline Make NOOP yours — theme colours and custom backgrounds, forty more sports with GPS routes, and a calorie heatmap @@ -2651,7 +2654,7 @@ An Effort scale you choose, a ring that gets to sleep, and far fewer wasted re-scores This vital needs at least two historical readings before NOOP can chart it. The blood oxygen estimate is turned off - Your strap reports a blood oxygen estimate, but it is unverified and off by default. Turn on the strap estimate in Settings to see it, or import a WHOOP export in Data Sources for the calibrated value. + Your strap reports a blood oxygen estimate, but it is unverified and off by default. To see it, turn on \"Blood Oxygen: strap estimate\" in Settings → Advanced → Diagnostics, or import a WHOOP export in Data Sources for the calibrated value. No blood oxygen percentage from a WHOOP 4.0 Your strap banks the raw optical channels, but NOOP does not turn them into a blood oxygen percentage, so this stays empty however long you wear it. Import a WHOOP export in Data Sources to fill it from your account history. 5/MG Raw Data Collector @@ -2756,7 +2759,7 @@ Skin temperature No measured temperature for these nights — showing the difference from your baseline. A sync re-scores recent nights and fills it in. Only nights with a measured temperature are shown; the others recorded a baseline difference only. - This night was staged from heart rate alone, with no motion recorded, so HRV and resting heart rate could not be measured. A strap that is not fully paired is the usual cause. + This night was found from heart rate alone, with no motion recorded, so its timing and stages are approximate. A blank HRV or resting heart rate means that night did not carry enough usable heart-rate data to measure it. A strap that is not fully paired is the usual reason a night has no motion. Day cycle Choose when steps and in-progress Effort start over. Naps never start a new day. Day starts @@ -2848,7 +2851,7 @@ This night scored high efficiency but very little deep or REM, more likely a staging estimate miss than a real restorative shortfall. The totals are kept as-is; read the split with care. Over-reports R-R, so no value is shown Check current name (read-only) - Renaming is not supported on a WHOOP 5.0 or MG yet. NOOP can ask the strap for its current name, which is the step that decides whether renaming is possible at all. + Renaming is not supported on a WHOOP 5.0 or MG yet. An experimental rename and a read-only name check appear here while Test Centre → Connection & Sync is on. Experimental on a WHOOP 5.0 or MG: this command has never been confirmed on this strap generation. It is reversible, so rename again if it misbehaves, and use Check current name to see whether it took. Alarm in %1$s Alarm in less than a minute @@ -2879,8 +2882,8 @@ Pending sync · %1$s %1$s bpm%2$s %1$s, %2$s, in use - Armed on the strap with an experimental 5/MG command. Strap-driven wakes have been reported on 5.0 and MG, but are not guaranteed. Keep a backup alarm for anything you cannot miss. - Sends experimental protocol queries and enables the 5/MG strap alarm. Not needed for normal sync, sleep, recovery, or steps. + NOOP sets this on the strap with an experimental 5/MG command whenever the strap connects or you change the alarm. Strap-driven wakes have been reported on 5.0 and MG, but are not guaranteed. Keep a backup alarm for anything you cannot miss. + Sends experimental protocol queries and records replies in the strap log. Also allows the experimental 5/MG strap alarm: NOOP sends it the next time the strap connects or you change the alarm. Turning this off does not clear an alarm that is already on the strap. Not needed for normal sync, sleep, recovery, or steps. Sleep result updated This night\'s sleep times or total asleep changed by at least five minutes. WHOOP MG ECG turn-on probe diff --git a/android/app/src/test/java/com/noop/ble/BodyLocationProbeFormatTest.kt b/android/app/src/test/java/com/noop/ble/BodyLocationProbeFormatTest.kt index 1a4b565244..b914ff484d 100644 --- a/android/app/src/test/java/com/noop/ble/BodyLocationProbeFormatTest.kt +++ b/android/app/src/test/java/com/noop/ble/BodyLocationProbeFormatTest.kt @@ -22,7 +22,7 @@ class BodyLocationProbeFormatTest { @Test fun whoop4AcceptedDecodesTheFourFields() { val (text, payHex) = WhoopBleClient.formatBodyLocationProbe(hexToBytes(wristFrame), 6, false, null) assertTrue(text.contains("WHOOP 4.0")) - assertTrue(text.contains("opcode 84 ACCEPTED — 4-byte payload")) + assertTrue(text.contains("opcode 84 answered — 4-byte payload (not a success verdict; see the bytes below)")) assertTrue(text.contains(wristFrame)) assertTrue(text.contains(" @00 01 01 5a 00")) assertTrue(text.contains("revision: 1")) @@ -75,7 +75,7 @@ class BodyLocationProbeFormatTest { val (text, _) = WhoopBleClient.formatBodyLocationProbe(hexToBytes(wristFrame), 6, false, null) val golden = listOf( "#690 BODY-LOCATION PROBE — WHOOP 4.0", - "Verdict: opcode 84 ACCEPTED — 4-byte payload", + "Verdict: opcode 84 answered — 4-byte payload (not a success verdict; see the bytes below)", "", "Raw frame (15 B):", "aa09000024005401015a00deadbeef", diff --git a/android/app/src/test/java/com/noop/ble/ExtendedBatteryProbeFormatTest.kt b/android/app/src/test/java/com/noop/ble/ExtendedBatteryProbeFormatTest.kt index 0c9ad7270a..54876b1924 100644 --- a/android/app/src/test/java/com/noop/ble/ExtendedBatteryProbeFormatTest.kt +++ b/android/app/src/test/java/com/noop/ble/ExtendedBatteryProbeFormatTest.kt @@ -20,7 +20,7 @@ class ExtendedBatteryProbeFormatTest { @Test fun whoop4_realCapture_acceptedWithVoltageAndGrid() { val (text, payHex) = WhoopBleClient.formatExtendedBatteryProbe(hexToBytes(realFrame), cmdOff = 6, isWhoop5 = false, prevPayloadHex = null) assertTrue(text.contains("WHOOP 4.0")) - assertTrue(text.contains("opcode 98 ACCEPTED — 29-byte payload")) + assertTrue(text.contains("opcode 98 answered — 29-byte payload (not a success verdict; see the bytes below)")) assertTrue(text.contains(realFrame)) // full raw hex on one copyable line assertTrue(text.contains("Voltage: 3.97 V")) // pay[7..8] = 0x0f82 = 3970 mV assertTrue(text.contains("(mV=3970 @07)")) diff --git a/docs/ANALYTICS.md b/docs/ANALYTICS.md index 50e2b6031c..19fd22b681 100644 --- a/docs/ANALYTICS.md +++ b/docs/ANALYTICS.md @@ -217,7 +217,7 @@ Effort = 100 · ln(TRIMP + 1) / ln(D), D = strainDenominator = 7201 ### Steps / active-energy floor -A long walk with little cardio still counts: when cardio TRIMP is low but step / active-kcal load is high, Effort is raised to a movement-derived floor so non-cardio activity still registers. (5/MG continuity: Effort already reads `COALESCE(measured HR, ppg_hr)` via hrBuckets, so 5-series users get Effort from live + PPG HR.) +A long walk with little cardio still counts: when cardio TRIMP is low but step / active-kcal load is high, Effort is raised to a movement-derived floor so non-cardio activity still registers. (5/MG continuity: Effort reads HR measured-first, `COALESCE(measured HR, ppg_hr)`, through the same anti-join as `hrSamples` / `hrBuckets`. On a 5/MG day the measured part is live HR plus any per-second HR banked from a history offload, when the strap's firmware serves one. The v26 PPG-derived estimate only fills seconds that have no measured HR.) ### HRmax estimation (`estimateHRmax`) @@ -368,7 +368,7 @@ Source: assembled in `AnalyticsEngine` from the `SleepStager` outputs above. Res | Consistency (sleep/wake regularity) | 0.10 | how consistent your sleep and wake timing is | - **Personal sleep need:** 8 h default, refined by your recent average; the hours-vs-need term clamps at 100. -- Rest consumes whatever stages each device provides (v25 motion on 4.0; PPG/IMU on 5/MG as it unlocks) — the sleep-staging algorithm itself is unchanged. +- Rest consumes the stages the on-device stager produces from each strap's motion and heart rate (v25 motion on 4.0; the per-second v18 motion, HR and R-R on 5/MG). One staging algorithm serves both generations with no per-model branch, and the Rest composite does not change it. - The `sleep_performance` key now stores this 0–100 composite. The **Charge** "Rest quality" driver reads it (÷100) instead of raw efficiency. This composite is similar *in spirit* to WHOOP's Sleep Performance %, but the blend is our own. diff --git a/docs/ANDROID.md b/docs/ANDROID.md index 755940419b..a2f6889fbe 100644 --- a/docs/ANDROID.md +++ b/docs/ANDROID.md @@ -27,7 +27,8 @@ the same analytics so results match macOS.) > assembleDemoRelease`) — and is sideloaded by users (with features such as a **Sync-now** button). > The BLE pipeline, Compose UI, Room database, and importers are all present and working. It is > validated against a real **WHOOP 4.0** strap, and **live HR** is validated on **WHOOP 5.0 / MG**; -> deeper 5.0/MG scores are still being reverse-engineered from offload data. The +> deeper 5.0/MG scores depend on overnight inputs (history offload layouts, R-R coverage, motion) that +> are still being decoded across 5.0/MG firmware; see the README's "WHOOP 5.0 / MG analysis limits". The > [verification checklist](#verification-checklist) below tracks what's confirmed versus the > genuinely-open items (chiefly full 5.0/MG deep-score validation). @@ -63,7 +64,7 @@ re-implements the same observable behavior in idiomatic Kotlin: | `WhoopProtocol` — BLE framing, CRC, command/event/packet decode | `com.noop.protocol` (Kotlin) | shipped — framing/CRC, `parseFrame`, enums | | `WhoopStore` — GRDB/SQLite persistence | `com.noop.data` (Room) | shipped — entities, DAOs, database | | `StrandAnalytics` — HRV / recovery / strain / sleep math | `com.noop.analytics` | shipped — RMSSD / zones / illness-watch + scorers | -| `StrandImport` — WHOOP CSV + Apple Health importers | `com.noop.data` / `com.noop.ingest` importers | shipped — WHOOP CSV, Apple Health, Health Connect, raw `capture.json` (see [Raw capture import](#raw-capture-import-capturejson)) | +| `StrandImport` — WHOOP CSV + Apple Health importers | `com.noop.data` / `com.noop.ingest` importers | shipped — WHOOP CSV, Apple Health, Health Connect; raw `capture.json` importer present but not yet wired into the UI (see [Raw capture import](#raw-capture-import-capturejson)) | | `StrandDesign` — SwiftUI design system | Jetpack Compose theme | shipped — `Theme.NOOP` tokens + components | | `Strand/` macOS app (CoreBluetooth + UI) | `com.noop.ui` + `com.noop.ble` (Compose + `BluetoothGatt`) | shipped — Compose screens + BLE pipeline | @@ -161,11 +162,11 @@ This section maps the surface so contributors know where each piece lives. `res/xml/data_extraction_rules.xml`, `app/proguard-rules.pro` (R8 release), and the committed Gradle wrapper (`gradlew`, `gradlew.bat`, `gradle/wrapper/gradle-wrapper.{jar,properties}`). -**Still being reverse-engineered** (not a build gap — a data gap): +**Still open** (not a build gap): | Area | State | | --- | --- | -| WHOOP 5.0 / MG deep scores (recovery / strain / sleep depth) | live HR works on 5.0/MG; the derived scores are still being RE'd from offload data, so they build slowly without sustained wear | +| WHOOP 5.0 / MG overnight inputs for recovery / strain / sleep | live HR works on 5.0/MG; the scorers have no 5.0/MG gate, but the history-offload inputs they need are only decoded on some 5.0/MG layouts, so scores build slowly without sustained wear | | Remaining Swift tables not yet mirrored as Room entities (`rawBatch`, `cursors`, `journal`, `workout`, `appleDaily`) | add as the corresponding collector / journal / workout features are ported | --- @@ -546,10 +547,13 @@ optional exports are governed by the [network inventory](PRIVACY_SECURITY.md#11- ## Raw capture import (`capture.json`) -**Settings → Data Sources → "Raw capture (.json)"** imports a strap offload that was captured on -*another* device — most usefully the Linux `Tools/linux-capture/whoop_sync.py` tool, whose `export` -subcommand writes exactly this format. It lets you pull a strap's history on a laptop (no phone, no -WHOOP app) and then fold it into NOOP on the phone. Fully offline; nothing leaves the device. +The Android app contains a `capture.json` importer (`com.noop.ingest.CaptureImporter`) for a strap +offload captured on *another* device — most usefully the Linux `Tools/linux-capture/whoop_sync.py` +tool, whose `export` subcommand writes exactly this format (WHOOP 4.0 `6108…` or 5/MG `fd4b…` frames). +**It is not yet exposed in the app:** the Data Sources screen has no raw-capture import, so there is +currently no in-app way to import a `capture.json`. To read one today, use the `whoop-decode` CLI or +`whoop_sync.py decode` (see `Tools/linux-capture/README.md`). The pipeline below describes the importer +itself, ready to be wired to a picker. **File format.** A JSON array of frame objects, one per stored BLE notify frame: @@ -566,9 +570,9 @@ The format is identical to the macOS app's frame-export hook, so captures are in platforms and feed the one decoder of record. **Pipeline** (`com.noop.ingest.CaptureImporter`, a self-contained object with `CaptureImporterTest` -covering the pure parts). The Data Sources screen wires it with a single call — -`CaptureImporter.importCapture(context, uri, repo, RawHistoryArchive(context))`, then sizes the -post-import rescore via `CaptureImporter.analyzeWindowDays(firstDay, today)`: +covering the pure parts). Its entry point is +`CaptureImporter.importCapture(context, uri, repo, RawHistoryArchive(context))`, with the post-import +rescore sized by `CaptureImporter.analyzeWindowDays(firstDay, today)`; no screen calls it yet: 1. **Parse — streamed and bounded.** A `capture.json` for a multi-day offload is tens of MB and hundreds of thousands of frames; loading it whole into a `String` + `JSONArray` OOMs a phone. @@ -588,7 +592,7 @@ post-import rescore via `CaptureImporter.analyzeWindowDays(firstDay, today)`: `RawHistoryArchive`) so a future release can recover them — exactly as the live offload archives undecodable history before acking. 5. **Recompute.** Raw samples are stored, but the dashboard reads *computed* recovery / strain / sleep, - produced by `IntelligenceEngine`. The screen fires one scoring pass right after the import, widening + produced by `IntelligenceEngine`. A caller is expected to fire one scoring pass right after the import, widening the look-back via `analyzeWindowDays` to cover the import's oldest day so an old historical capture is scored, not just the recent window. @@ -621,8 +625,9 @@ See `Tools/linux-capture/README.md` for the capture/export side that produces th (`RecoveryScorer`, `StrainScorer`, `SleepStager`, `CorrelationEngine`, `Baselines`, …) is ported so the Android results match macOS; keep each module in parity against the Swift sources and extend the matching JVM unit tests as the math evolves. Strain computes from HR on **all** strap families — -there's no hard 5.0/MG gate — but because 5.0/MG HR is currently sparse, those scores build slowly -(and sit near 0 without sustained wear) until the deeper 5.0/MG offload is fully reverse-engineered. +there's no hard 5.0/MG gate. On 5.0/MG, how much HR the history offload supplies depends on the +firmware's record layout, so those scores can build slowly (and sit near 0 without sustained wear) +until more 5.0/MG layouts are decoded. --- @@ -717,7 +722,7 @@ should be re-verified against a real build, a real device, and a real strap befo (sorted keys, `event`/`event_timestamp` removed). **BLE on a real device with a real strap** — WHOOP 4.0 confirmed; WHOOP 5.0 / MG live-HR confirmed, -deeper scores still being reverse-engineered. +deep-score inputs still being decoded. - [x] Runtime permission flow: `BLUETOOTH_SCAN` + `BLUETOOTH_CONNECT` granted on API 31+. - [x] Scan finds the strap by the family service UUID (4.0 `61080001-…`, 5.0 `fd4b0001-…`). @@ -734,7 +739,7 @@ deeper scores still being reverse-engineered. - [x] Historical offload (`sendHistoricalData [0x00]`) streams HISTORY_START → type-47 → HISTORY_END (acked via `historicalDataResult [0x01]+endData`) → HISTORY_COMPLETE (WHOOP 4.0). - [ ] WHOOP 5.0 / MG: full offload + **deep-score** parity (recovery / strain / sleep) on a real - 5.0 strap — live HR confirmed; the derived scores are still being reverse-engineered. + 5.0 strap — live HR confirmed; the deep-score inputs are still being decoded. - [x] Foreground service keeps the link alive while backgrounded. - [x] Decoded rows land in Room and survive an app restart. diff --git a/docs/FAQ.md b/docs/FAQ.md index 397e48f4c0..9f64a1e7bd 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -72,8 +72,11 @@ switchable off in Settings → About, and the full detail is in ## Which numbers are measured, and which are NOOP's own estimates? -Measured from the strap: heart rate, R-R intervals, resting HR, skin temperature, respiratory rate, -sleep duration and stages. +Measured from the strap: heart rate, R-R intervals and, where the strap provides it, skin temperature. + +NOOP's own on-device estimates from those signals: resting HR (the night's lowest sustained level), +respiratory rate (from beat-to-beat variation on WHOOP straps; a WHOOP 5.0/MG sends no breathing +channel), and sleep detection, duration and stages. NOOP's own on-device scores, not clinical measures: Charge (recovery), Effort (strain), Rest (sleep performance), Stress, Fitness Age and Vitality. [docs/ANALYTICS.md](ANALYTICS.md) documents the diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 45f4d64426..18d5785179 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -42,7 +42,7 @@ Screens are grouped below by whether they need a connected strap: | Needs a connected strap (live BLE) | Works from imported data alone | | --- | --- | -| Live, Breathe (for haptics), Intervals (for haptics), Health Monitor (live HR), Automations (to act), Notifications (to buzz) | Control Center, Explore, Compare, Insights, Sleep, Trends, Workouts, Stress, Mind, Apple Health, Data Sources | +| Live, Breathe (for haptics), Intervals (for haptics), Health Monitor (live HR), Automations (to act), Alarms (to arm), Notifications (to buzz) | Control Center, Explore, Compare, Insights, Sleep, Trends, Workouts, Stress, Mind, Apple Health, Data Sources | Most of NOOP works the moment you import an export. The strap adds the *live* layer — real-time heart rate, haptic cues, and physical-input automations. @@ -57,8 +57,9 @@ Throughout the app the strap reports one of three states: - **Connecting** — found and connecting, finishing the secure pairing handshake (warning / amber). - **Bonded** — paired and streaming; haptics and live HR are available (positive / green). -> WHOOP straps do **not** appear in *System Settings → Bluetooth*. They advertise on a custom -> profile that only apps like NOOP can find — so there's nothing to pair in System Settings. +> You don't pair a WHOOP in *System Settings → Bluetooth*. It advertises on a custom profile that +> only apps like NOOP can find, so don't try to pair it there. A strap paired before may still be +> listed there, and that's expected. Commands that drive the strap motor (any wrist buzz) and the live realtime stream require a **bonded** connection. Where a feature needs this, it is noted below and the button is disabled @@ -78,7 +79,7 @@ The onboarding wizard (`OnboardingWizard.swift`) appears on first launch and run your Mac; the connection is local BLE with no server in the middle. 4. **Wear & wake** — put the strap on (snug, sensor on skin), charge it, keep it within ~1 m. 5. **Scan** — a radar sweep; tapping **Scan** calls the BLE engine. If it hasn't bonded after - ~12 seconds, a reassurance card appears explaining the strap won't show in System Settings, + ~12 seconds, a reassurance card appears explaining the strap isn't paired from System Settings, that only one host can hold it at a time (close the WHOOP phone app), etc. 6. **Bonded celebration** — a Charge ring blooms in when the strap bonds, with battery %. 7. **Profile** — age, sex, weight, height (feeds zones, calories and baselines). Shows your @@ -104,11 +105,13 @@ The home dashboard (`TodayView.swift`, titled "Control Center"). A tight, gaples **wake with Charge**, **spend it as Effort**, and **rebuild it with Rest**. - **Key Metrics** — a uniform tile grid, each with a 14-day sparkline: Charge, Effort (of 100), Rest (hours + efficiency), HRV, Resting HR, Blood Oxygen, Respiratory, - Steps (on-device only for WHOOP 5/MG; on a 4.0, NOOP shows your imported Apple Health / - Health Connect steps, because it can't yet read steps off the 4.0 strap over Bluetooth — - the 4.0 itself does count steps in the official WHOOP app — and approximate), - Weight, Calories. WHOOP metrics come from the `my-whoop` source; Steps/Weight/Calories/ - Respiratory pull from `apple-health`. Sparse series (e.g. weight) fall back to all history so + Steps (on a WHOOP 5/MG, read from the strap's own motion counter; on a 4.0, which sends no step + count over Bluetooth, NOOP shows your imported Apple Health / Health Connect steps for a day when + it has them, and otherwise an on-device estimate from strap motion calibrated against your phone's + steps, marked "est." — calibrate or set it by hand under Settings → Profile → Steps estimate; both + are approximate), + Weight, Calories. WHOOP metrics come from the `my-whoop` source; Weight/Calories/Respiratory + pull from `apple-health`, and Steps follows the rule above. Sparse series (e.g. weight) fall back to all history so a tile never shows empty when data exists. - **Last Workouts** — up to six recent sessions as tiles (duration, date, avg HR, kcal). - **Data Sources** — a footer showing whether WHOOP and Apple Health data are present, with day/ @@ -471,14 +474,23 @@ React when the strap comes off or goes on: - **Stress check-ins (haptic)** — offer a guided breathing check-in after a fresh HRV dip while you are still. Off by default, with optional auto-nudges, quiet hours, and your resonance pace. -### Smart alarm -Wake to a wrist buzz. This arms the strap's **own firmware alarm**, so it still fires even if the -Mac is asleep or NOOP is closed. Set your wake time — the strap buzzes at exactly that time. -NOOP does not currently do light-sleep early wake. - Mac side-effects are sandbox-friendly: screen lock uses macOS's own lock entry point, and Shortcuts run via the `shortcuts://` URL scheme — anything you can build in Shortcuts is reachable. +## Alarms + +**Sidebar: Alarms · needs a connected strap to arm; the wake time saves without one.** + +`SmartAlarmView.swift` — the strap wake-alarm and the wind-down reminder, in one place. + +### Strap wake-alarm +Wake to a wrist buzz. This arms the strap's **own firmware alarm**, so on a WHOOP 4.0 it still fires +even if the Mac is asleep or NOOP is closed, at the time you set. On a WHOOP 5.0 / MG the alarm is +experimental: it is only armed when **Protocol probes** is on (Test Centre → 5/MG protocol +diagnostics). Without it, your wake time is saved but the strap is not armed. With it on, a wake is +not guaranteed, so keep a backup alarm. NOOP does not currently do light-sleep early wake on Apple +platforms; the phone-based smart wake (light-sleep detection) is Android-only. + --- ## Illness early-warning @@ -515,12 +527,13 @@ of history. On-device and approximate — informational only, **not** a diagnosi normally. - **Siri & Shortcuts (iOS)** — a **Sync Strap** action ("Sync my NOOP strap") starts the same on-demand history sync as the Sync now button, from Siri, Spotlight, the Shortcuts app, a Back Tap or an - automation, **without opening NOOP**. If the strap link is already up (NOOP in the background) the - sync starts at once and the reply says so. If NOOP had to be launched for the shortcut and is still - connecting, the request is parked and runs the moment the connect handshake settles, and the reply - says NOOP is connecting and will sync when ready. + automation, **without opening NOOP**. If the strap is already ready for history (NOOP in the background, + handshake finished) the sync starts at once and the reply says so. Otherwise the reply says the sync + is waiting for the strap: the request runs only if the strap becomes ready within 10 minutes, and a + strap that is connected but whose handshake NOOP has switched off does not start it until you tap + Connect in the app. - **Strap-sync Live Activity (iOS)** — while history syncs, the Lock Screen and Dynamic Island show - the same read-out as the Today sync control: Connecting… / Syncing… with the chunk count, the elapsed + the same read-out as the Today sync control: Waiting for your strap… / Syncing… with the chunk count, the elapsed time, and the strap's connect-time backlog when it reported one; then "Synced · N chunks" or "Sync interrupted" for a few seconds. No progress bar, because the strap never says how much is pending. A sync started from the app or the Sync Strap shortcut shows it; an automatic background sync can only diff --git a/docs/OURA_PROTOCOL.md b/docs/OURA_PROTOCOL.md index d1616176be..0ab99ade9a 100644 --- a/docs/OURA_PROTOCOL.md +++ b/docs/OURA_PROTOCOL.md @@ -200,9 +200,8 @@ the paired phone's Bluetooth fully off. This matches CoreBluetooth's documented `connect()` has no built-in timeout (an unanswered connect just stays pending forever), so the practical symptom is a silent, permanent hang rather than an error. -This is a different (and apparently more total) failure surface than the already-known WHOOP 5.0/MG -macOS limitation (see `docs/WHOOP5_DEEP_DATA.md`, "iOS / Android only on real hardware") - WHOOP 5/MG -at least connects and discovers services, failing only at an authenticated characteristic write +This is a different (and apparently more total) failure surface than the known WHOOP 5.0/MG case, where +the strap at least connects and discovers services, failing only at an authenticated characteristic write (`CBATTError` "Encryption is insufficient"). Oura's connect doesn't get that far at all. The exact CoreBluetooth/bluetoothd mechanism isn't diagnosed further than this (would need a low-level HCI/SMP trace). diff --git a/docs/PROTOCOL_IMPLEMENTATION.md b/docs/PROTOCOL_IMPLEMENTATION.md index 935c7246e3..cda78572e3 100644 --- a/docs/PROTOCOL_IMPLEMENTATION.md +++ b/docs/PROTOCOL_IMPLEMENTATION.md @@ -50,7 +50,7 @@ checks that both continue to exist. | [WHOOP 5 command builder](PROTOCOL_TRANSPORT.md#format-1-framing) | [puffinCommandFrame(cmd:seq:payload:type:header:)](../Packages/WhoopProtocol/Sources/WhoopProtocol/Framing.swift) | [Framing.puffinCommandFrame](../android/app/src/main/java/com/noop/protocol/Framing.kt) | Pads the inner record before checksums | | [Clock 8/9-byte forms](PROTOCOL_COMMANDS.md#whoop-4) | [setClockPayload(now:)](../Strand/BLE/BLEManager.swift), [setClockPayloadLegacy(now:)](../Strand/BLE/BLEManager.swift) | [setClockPayload](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt), [setClockPayloadLegacy](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt) | WHOOP 4 sends both accepted lengths | | [Alarm 9-byte body](PROTOCOL_ALARMS.md#scheduled-alarm-lifecycle-on-whoop-4) | [WhoopCommand.setAlarmPayload(epochSec:)](../Strand/BLE/Commands.swift) | [whoop4AlarmPayload](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt) | Two trailing bytes remain explicit | -| [Advertising name](PROTOCOL_COMMANDS.md#whoop-4) | [WhoopCommand.advertisingNamePayload(_:)](../Strand/BLE/Commands.swift) | [renameStrap](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt) | WHOOP 4 only; client bytes are bounded | +| [Advertising name](PROTOCOL_COMMANDS.md#whoop-4) | [WhoopCommand.advertisingNamePayload(_:)](../Strand/BLE/Commands.swift) | [renameStrap](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt), [probeAdvertisingName](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt) | WHOOP 4 (77) on both platforms; client bytes are bounded. Android only, for 5/MG: an unconfirmed write (140, payload shape mirrored from WHOOP 4) and a read-only check (141), both only while Test Centre → Connection & Sync is on. Swift renames WHOOP 4 only. | | [Haptic preset](PROTOCOL_ALARMS.md#immediate-whoop-4-haptics) | [MaverickHaptics.notificationBuzz(loops:)](../Packages/WhoopProtocol/Sources/WhoopProtocol/HapticPayloads.swift) | [maverickHapticBody](../android/app/src/main/java/com/noop/ble/WhoopBleClient.kt) | Android remaps the common request to the family body | | [Wrist and ECG controls](PROTOCOL_ECG.md#commands-and-independent-output-gates) | [Whoop5Ecg.selectWristPayload(_:)](../Packages/WhoopProtocol/Sources/WhoopProtocol/Whoop5Ecg.swift), [Whoop5Ecg.togglePayload(on:)](../Packages/WhoopProtocol/Sources/WhoopProtocol/Whoop5Ecg.swift) | [Whoop5Ecg.selectWristPayload](../android/app/src/main/java/com/noop/protocol/Whoop5Ecg.kt), [Whoop5Ecg.togglePayload](../android/app/src/main/java/com/noop/protocol/Whoop5Ecg.kt) | MG capability gate is separate from framing | | [Feature-flag and device-config probes](PROTOCOL_CONFIGURATION.md#named-configuration-interface) | [FeatureFlagProbe](../Packages/WhoopProtocol/Sources/WhoopProtocol/FeatureFlagProbe.swift), [DeviceConfigReadProbe](../Packages/WhoopProtocol/Sources/WhoopProtocol/DeviceConfigReadProbe.swift) | [FeatureFlagProbe](../android/app/src/main/java/com/noop/protocol/FeatureFlagProbe.kt), [DeviceConfigReadProbe](../android/app/src/main/java/com/noop/protocol/DeviceConfigReadProbe.kt) | Read paths are bounded and namespace-aware | @@ -500,7 +500,7 @@ establish a feature gate or contradict the later version-bound mapping. See NOOP sends these only from the gated, hand-run MG ECG probe described in [ECG controls](PROTOCOL_ECG.md#commands-and-independent-output-gates) — never automatically, never on a plain WHOOP 5 or WHOOP 4, and only -behind the Experimental opt-in plus a positively-identified MG. Existing probe implementation and +behind a default-off ECG opt-in plus a positively-identified MG. On Android that opt-in is the "WHOOP MG ECG turn-on probe" switch in Test Centre → 5/MG protocol diagnostics; the Apple apps currently have no control that turns it on, so their Devices-screen ECG entry stays hidden unless the stored key was already set. Existing probe implementation and older observations must be distinguished from the expanded contract. On the wire, live IMU control is 106 and BLE UART control is 103; they are distinct @@ -545,7 +545,7 @@ both platforms; it was missing from this table, so nothing recorded that it must `WhoopBleClient.rebootStrap()`) (#166). - **`POWER_CYCLE_STRAP` (32)** — a harder restart, in the enum as `powerCycleStrap` **only** for the WHOOP 4 reboot probe variants `powerCycle32Empty` and `powerCycle32Payload1` (below). Each is gated - behind Test Centre → Connection + a confirmation, and WHOOP-4-only. Never on a default install. + behind Test Centre → Connection & Sync + a confirmation, and WHOOP-4-only. Never on a default install. Everything else in this table stays out of the enum entirely. @@ -555,7 +555,7 @@ Everything else in this table stays out of the enum entirely. The documented 41.17.6.0 contract does not evaluate the body for either restart command: empty, `00` and `01` are equivalent, and an accepted request returns result 1. -The NOOP probe (Test Centre → Connection, WHOOP 4 only) sends one candidate at a time: +The NOOP probe (Test Centre → Connection & Sync, WHOOP 4 only) sends one candidate at a time: `REBOOT_STRAP(29)` empty, `POWER_CYCLE_STRAP(32)` empty, `REBOOT_STRAP(29)` with `[0x01]`, `POWER_CYCLE_STRAP(32)` with `[0x01]`, or `REBOOT_STRAP(29)` with `[0x00]`. It reuses the reboot watchdog so the strap log shows @@ -568,7 +568,7 @@ show a response, disconnect or reboot for command 29, so that physical effect is This paragraph records the older client decoder; the [current response body](PROTOCOL_COMMANDS.md#ordinary-service-commands) is documented separately. -A read-only, user-triggered diagnostic (Test Centre → Connection, both +A read-only, user-triggered diagnostic (Test Centre → Connection & Sync, both families) that sends `GET_BODY_LOCATION_AND_STATUS` (84 / `0x54`) and dumps the strap's full raw COMMAND_RESPONSE to the strap log + a copyable dialog. The 4-byte inner-payload record is `revision · location · confidence · status`; `location` maps `0 UNKNOWN, 1 WRIST, 2 BICEP, 3 CALF, @@ -617,7 +617,7 @@ count plus 4, or a hard cap of 128 replies. Each next-record request is only sen lands. Both CRCs are verified before any field is read; a failed CRC, a non-COMMAND_RESPONSE type, or a short record ends the walk with a named reason instead of a decode, and the RAW record bytes of every reply are logged beside the fields decoded from them. Driven by `BLEManager.probeFeatureFlags()` / -`WhoopBleClient.probeFeatureFlags()` (user-triggered, Test Centre → Connection, both families) and +`WhoopBleClient.probeFeatureFlags()` (user-triggered, Test Centre → Connection & Sync, both families) and allowlisted for 5/MG framing **only while a probe is in flight**; parsed + rendered by the pure `FeatureFlagProbe` / `FeatureFlagProbeReport` twins (Swift↔Kotlin byte-parity, unit-tested on synthetic frames). Result goes to a copyable dialog + the strap log; no storage. The field diff --git a/docs/WHOOP5_OPTICAL_EXPERIMENT.md b/docs/WHOOP5_OPTICAL_EXPERIMENT.md index fb566ace8a..9e924377a2 100644 --- a/docs/WHOOP5_OPTICAL_EXPERIMENT.md +++ b/docs/WHOOP5_OPTICAL_EXPERIMENT.md @@ -35,8 +35,12 @@ replacement, covering, and pressure transitions out of the steady-state summarie Use a normal connected WHOOP 5/MG with its clock synchronized. Do not change R22/config flags during this experiment. If deep-history capture is not already working, establish that separately first. -1. In **Settings → Advanced → Experimental · WHOOP 5 / MG**, enable **Record puffin frames to a - file**. +1. In **Test Centre → 5/MG protocol diagnostics**, enable **Passive history/protocol trace** (it records + frames that already arrive, does not start sensors, and can create large files). + +> **Status:** the phase-marking and export controls described in steps 2–9 are not currently reachable +> from any screen: no code path opens the phase picker. The procedure below is the intended design and +> cannot be run from the app as written until those controls are wired. 2. Tap **Mark phase… → On wrist · still**. Sit still for 2 minutes. 3. Tap **On wrist · gentle pressure**. Apply only comfortable, steady pressure to the strap for 2 minutes; stop if there is discomfort.