From 6db3dd2babe51745bed4254ee655bd284f40f789 Mon Sep 17 00:00:00 2001 From: Ben <100231093+ben-tsk@users.noreply.github.com> Date: Sun, 2 Aug 2026 03:07:33 +0200 Subject: [PATCH] Localize Android onboarding flow --- .../src/main/java/com/noop/ui/AppChangelog.kt | 8 +- .../main/java/com/noop/ui/OnboardingScreen.kt | 152 +++++++++--------- .../app/src/main/res/values-de/strings.xml | 109 ++++++++++--- .../app/src/main/res/values-es/strings.xml | 59 +++++++ .../app/src/main/res/values-fr/strings.xml | 59 +++++++ .../src/main/res/values-pt-rPT/strings.xml | 59 +++++++ .../app/src/main/res/values-zh/strings.xml | 59 +++++++ android/app/src/main/res/values/strings.xml | 59 +++++++ 8 files changed, 463 insertions(+), 101 deletions(-) diff --git a/android/app/src/main/java/com/noop/ui/AppChangelog.kt b/android/app/src/main/java/com/noop/ui/AppChangelog.kt index 0ccee1e881..4af561da4f 100644 --- a/android/app/src/main/java/com/noop/ui/AppChangelog.kt +++ b/android/app/src/main/java/com/noop/ui/AppChangelog.kt @@ -2564,22 +2564,22 @@ object AppChangelog { Expectation( icon = Icons.Outlined.Science, title = uiString(R.string.l10n_app_changelog_independent_and_experimental_f9b65317), - body = "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.", + body = uiString(R.string.onboarding_expectation_independent_body), ), Expectation( icon = Icons.Outlined.VerifiedUser, title = uiString(R.string.l10n_app_changelog_whoop_4_0_is_the_supported_16893d9d), - body = "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.", + body = uiString(R.string.onboarding_expectation_whoop_support_body), ), Expectation( icon = Icons.Outlined.HourglassEmpty, title = uiString(R.string.l10n_app_changelog_your_scores_build_over_a_few_41388c54), - body = "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.", + body = uiString(R.string.onboarding_expectation_scores_body), ), Expectation( icon = Icons.Outlined.Shield, title = uiString(R.string.l10n_app_changelog_everything_stays_on_your_device_575125e9), - body = "No account, no cloud, no sync. NOOP talks only to your strap and keeps everything local. Your data is yours alone.", + body = uiString(R.string.onboarding_expectation_local_body), ), ) } diff --git a/android/app/src/main/java/com/noop/ui/OnboardingScreen.kt b/android/app/src/main/java/com/noop/ui/OnboardingScreen.kt index c8a2ce51d5..681bf7c799 100644 --- a/android/app/src/main/java/com/noop/ui/OnboardingScreen.kt +++ b/android/app/src/main/java/com/noop/ui/OnboardingScreen.kt @@ -198,7 +198,7 @@ fun OnboardingScreen(viewModel: AppViewModel, onFinished: () -> Unit) { OnboardingFooter( canGoBack = pageIndex > 0, - cta = page.cta, + cta = uiString(page.ctaRes), onBack = { var target = pageIndex - 1 // Skip the bonded celebration going back when nothing is bonded. @@ -218,19 +218,19 @@ fun OnboardingScreen(viewModel: AppViewModel, onFinished: () -> Unit) { } } -private enum class OnboardingPage(val cta: String) { - Welcome("Begin"), - WhatItDoes("Continue"), - Expectations("Continue"), - Bluetooth("Continue"), - Wear("Continue"), - Connect("Continue"), - Bonded("Continue"), - Profile("Save & continue"), - Import("Continue"), - Notifications("Continue"), - Appearance("Continue"), - Done("Enter NOOP"); +private enum class OnboardingPage(val ctaRes: Int) { + Welcome(R.string.onboarding_cta_begin), + WhatItDoes(R.string.onboarding_cta_continue), + Expectations(R.string.onboarding_cta_continue), + Bluetooth(R.string.onboarding_cta_continue), + Wear(R.string.onboarding_cta_continue), + Connect(R.string.onboarding_cta_continue), + Bonded(R.string.onboarding_cta_continue), + Profile(R.string.onboarding_cta_save_continue), + Import(R.string.onboarding_cta_continue), + Notifications(R.string.onboarding_cta_continue), + Appearance(R.string.onboarding_cta_continue), + Done(R.string.onboarding_cta_enter); } // MARK: - Shell @@ -394,26 +394,26 @@ private fun WelcomeStep() { private fun WhatItDoesStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_what_noop_does_b25b362d), - subtitle = "Three quiet promises.", + subtitle = uiString(R.string.onboarding_three_promises), ) { Column(verticalArrangement = Arrangement.spacedBy(Metrics.gap)) { FeatureRow( icon = Icons.Filled.AutoGraph, tint = Palette.accent, title = uiString(R.string.l10n_onboarding_screen_see_recovery_clearly_d8db34a9), - body = "A calm ring rolls HRV, resting heart rate and sleep into one read on whether to push or rest.", + body = uiString(R.string.onboarding_recovery_body), ) FeatureRow( icon = Icons.Filled.MonitorHeart, tint = Palette.accent, title = uiString(R.string.l10n_onboarding_screen_watch_your_heart_live_8c9c1267), - body = "Connect a WHOOP, a heart-rate strap or a gym machine and watch each beat in real time, with zones that match your profile. Already have history elsewhere? Import it from WHOOP, Apple Health, Oura, Fitbit or Garmin.", + body = uiString(R.string.onboarding_live_hr_body), ) FeatureRow( icon = Icons.Filled.Lock, tint = Palette.statusPositive, title = uiString(R.string.l10n_onboarding_screen_own_your_data_offline_997fe15e), - body = "Everything lives on this phone. No account, no sync, no cloud.", + body = uiString(R.string.onboarding_local_data_body), ) } } @@ -423,7 +423,7 @@ private fun WhatItDoesStep() { private fun ExpectationsStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_what_to_expect_ed98f851), - subtitle = "A few honest words, so nothing is a surprise.", + subtitle = uiString(R.string.onboarding_expectations_subtitle), ) { Column(verticalArrangement = Arrangement.spacedBy(Metrics.gap)) { AppChangelog.expectations.forEach { e -> @@ -437,7 +437,7 @@ private fun ExpectationsStep() { private fun BluetoothStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_a_quick_word_before_you_connect_5a29015a), - subtitle = "NOOP uses Bluetooth to find your strap. When you continue, allow the permission so it can scan.", + subtitle = uiString(R.string.onboarding_bluetooth_subtitle), ) { Column( modifier = Modifier.fillMaxWidth(), @@ -449,10 +449,10 @@ private fun BluetoothStep() { icon = Icons.Filled.Lock, tint = Palette.statusPositive, title = uiString(R.string.l10n_onboarding_screen_nothing_leaves_your_phone_502d5d0c), - message = "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.", + message = uiString(R.string.onboarding_bluetooth_local_body), ) - Checkline("When Android asks, allow Bluetooth so NOOP can scan and connect.") - Checkline("WHOOP 5.0/MG may need pairing mode the first time, with the official WHOOP app closed.") + Checkline(uiString(R.string.onboarding_bluetooth_permission)) + Checkline(uiString(R.string.onboarding_whoop_pairing_mode)) } } } @@ -461,7 +461,7 @@ private fun BluetoothStep() { private fun WearStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_put_your_strap_on_031d4807), - subtitle = "The sensor needs skin contact before data starts to mean anything.", + subtitle = uiString(R.string.onboarding_wear_subtitle), ) { Column( modifier = Modifier.fillMaxWidth(), @@ -471,9 +471,9 @@ private fun WearStep() { IconBadge(icon = Icons.Filled.Sensors, tint = Palette.accent, size = 86) NoopCard(padding = 18.dp) { Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { - Checkline("Wear it snug on your wrist or bicep, sensor against skin.") - Checkline("Give it a few minutes of charge if the battery is low.") - Checkline("Keep it near this phone while pairing and during the first sync.") + Checkline(uiString(R.string.onboarding_wear_snug)) + Checkline(uiString(R.string.onboarding_wear_charge)) + Checkline(uiString(R.string.onboarding_wear_nearby)) } } } @@ -509,9 +509,9 @@ private fun ConnectStep(viewModel: AppViewModel) { StepShell( title = uiString(R.string.l10n_onboarding_screen_find_your_strap_fe460461), subtitle = when { - live.bonded -> "Bonded. You can keep going." - bleGranted -> "NOOP starts looking as soon as this step appears. You can keep going while it bonds." - else -> "Allow Bluetooth and tap Scan to find your strap, or keep going and connect later." + live.bonded -> uiString(R.string.onboarding_connect_bonded_subtitle) + bleGranted -> uiString(R.string.onboarding_connect_searching_subtitle) + else -> uiString(R.string.onboarding_connect_permission_subtitle) }, ) { Column( @@ -526,11 +526,11 @@ private fun ConnectStep(viewModel: AppViewModel) { ) val (label, tone, pulsing) = when { - live.encryptedBond -> Triple("Bonded · streaming", StrandTone.Positive, true) - live.bonded -> Triple("Live HR · not fully paired", StrandTone.Warning, true) - live.connected -> Triple("Connected · pairing", StrandTone.Warning, true) - live.scanning -> Triple("Searching", StrandTone.Accent, true) - else -> Triple("Ready to scan", StrandTone.Neutral, false) + live.encryptedBond -> Triple(uiString(R.string.onboarding_state_bonded_streaming), StrandTone.Positive, true) + live.bonded -> Triple(uiString(R.string.onboarding_state_live_hr_unpaired), StrandTone.Warning, true) + live.connected -> Triple(uiString(R.string.onboarding_state_connected_pairing), StrandTone.Warning, true) + live.scanning -> Triple(uiString(R.string.onboarding_state_searching), StrandTone.Accent, true) + else -> Triple(uiString(R.string.onboarding_state_ready_scan), StrandTone.Neutral, false) } StatePill(label, tone = tone, pulsing = pulsing, showsDot = true) @@ -577,7 +577,7 @@ private fun ConnectStep(viewModel: AppViewModel) { ) { Icon(Icons.Filled.Bluetooth, contentDescription = null, modifier = Modifier.size(18.dp)) Spacer(Modifier.width(6.dp)) - Text(if (live.connected || live.scanning) "Re-scan" else "Scan again", style = NoopType.body) + Text(uiString(R.string.onboarding_rescan), style = NoopType.body) } OutlinedButton( onClick = { viewModel.disconnect() }, @@ -596,7 +596,7 @@ private fun ConnectStep(viewModel: AppViewModel) { icon = Icons.Filled.Lock, tint = Palette.statusPositive, title = uiString(R.string.l10n_onboarding_screen_this_can_run_while_you_finish_cd7ef783), - message = "If the strap is nearby, NOOP will keep the BLE link alive in the background. You can continue through profile and import while it bonds.", + message = uiString(R.string.onboarding_connect_background_body), ) // WHOOP is NOOP's primary band, so onboarding leads with it — but it isn't required. @@ -604,9 +604,7 @@ private fun ConnectStep(viewModel: AppViewModel) { // they can continue now and pair a heart-rate strap or import data afterwards. if (!live.bonded) { Text( - uiString(R.string.l10n_onboarding_screen_no_whoop_you_can_still_continue_ec58d88d) + - "or a gym machine under Devices, or import from WHOOP, Apple Health, Oura, Fitbit, Garmin " + - "and more under Data Sources. You can do either any time.", + uiString(R.string.l10n_onboarding_screen_no_whoop_you_can_still_continue_ec58d88d), style = NoopType.footnote, color = Palette.textTertiary, textAlign = TextAlign.Center, @@ -647,8 +645,8 @@ private fun BondedStep(viewModel: AppViewModel) { ) Spacer(Modifier.height(10.dp)) Text( - live.batteryPct?.let { "Your strap is bonded · ${it.toInt()}% battery." } - ?: "Your strap is bonded and ready to stream.", + live.batteryPct?.let { uiString(R.string.onboarding_strap_bonded_battery, it.toInt()) } + ?: uiString(R.string.onboarding_strap_bonded_ready), style = NoopType.body, color = Palette.textSecondary, textAlign = TextAlign.Center, @@ -685,30 +683,30 @@ private fun ProfileStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_about_you_5c4698b6), - subtitle = "So your zones, calories and on-device scoring start from the right numbers.", + subtitle = uiString(R.string.onboarding_profile_subtitle), ) { NoopCard(padding = 18.dp) { Column(verticalArrangement = Arrangement.spacedBy(14.dp)) { ProfileFieldRow(label = uiString(R.string.l10n_onboarding_screen_age_ff9f1ff3)) { WheelPickerField( value = "${profile.age}", - unit = "yrs", - accessibility = "Age, ${profile.age} years", + unit = uiString(R.string.onboarding_years), + accessibility = uiString(R.string.onboarding_age_accessibility, profile.age), options = ageOptions, selectedIndex = ageSteps.indexOf(profile.age).coerceAtLeast(0), - dialogTitle = "Age", + dialogTitle = uiString(R.string.l10n_onboarding_screen_age_ff9f1ff3), // #146: age derives from a stored date of birth; setAge re-anchors it (clamped 13..100). onSelected = { mutate { profile.setAge(ageSteps[it]) } }, ) } ThinDivider() Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { - Overline("Sex", color = Palette.textTertiary) + Overline(uiString(R.string.onboarding_sex), color = Palette.textTertiary) SegmentedPillControl( items = ONBOARDING_SEX_OPTIONS, selection = ONBOARDING_SEX_OPTIONS.firstOrNull { it.tag == profile.sex } ?: ONBOARDING_SEX_OPTIONS[0], - label = { it.label }, + label = { uiString(it.labelRes) }, onSelect = { mutate { profile.sex = it.tag } }, modifier = Modifier.fillMaxWidth(), ) @@ -719,11 +717,11 @@ private fun ProfileStep() { // Units. Mirror the Sex picker idiom; the stored profile stays SI either way, only the // displayed labels re-format (lb / ft-in). Same key Settings → Units writes. Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { - Overline("Units", color = Palette.textTertiary) + Overline(uiString(R.string.onboarding_units), color = Palette.textTertiary) SegmentedPillControl( items = listOf(UnitSystem.METRIC, UnitSystem.IMPERIAL), selection = unitSystem, - label = { if (it == UnitSystem.METRIC) "Metric" else "Imperial" }, + label = { if (it == UnitSystem.METRIC) uiString(R.string.onboarding_metric) else uiString(R.string.onboarding_imperial) }, onSelect = { unitSystem = it NoopPrefs.setUnitSystem(context, it) @@ -736,10 +734,10 @@ private fun ProfileStep() { WheelPickerField( // Full re-labelled string (e.g. "74.5 kg" / "164.2 lb"); unit folded into value. value = UnitFormatter.massFromKilograms(profile.weightKg, unitSystem), - accessibility = "Weight", + accessibility = uiString(R.string.l10n_onboarding_screen_weight_69c0b815), options = weightOptions, selectedIndex = weightSteps.indices.minByOrNull { kotlin.math.abs(weightSteps[it] - profile.weightKg) } ?: 0, - dialogTitle = "Weight", + dialogTitle = uiString(R.string.l10n_onboarding_screen_weight_69c0b815), onSelected = { mutate { profile.weightKg = weightSteps[it] } }, ) } @@ -747,10 +745,10 @@ private fun ProfileStep() { ProfileFieldRow(label = uiString(R.string.l10n_onboarding_screen_height_3f608b49)) { WheelPickerField( value = UnitFormatter.heightFromCentimeters(profile.heightCm, unitSystem), - accessibility = "Height", + accessibility = uiString(R.string.l10n_onboarding_screen_height_3f608b49), options = heightOptions, selectedIndex = heightSteps.indices.minByOrNull { kotlin.math.abs(heightSteps[it] - profile.heightCm) } ?: 0, - dialogTitle = "Height", + dialogTitle = uiString(R.string.l10n_onboarding_screen_height_3f608b49), onSelected = { mutate { profile.heightCm = heightSteps[it].toDouble() } }, ) } @@ -780,13 +778,17 @@ private fun ImportStep(viewModel: AppViewModel) { // so a persisted busy=true would strand the buttons disabled with nothing running. var busy by remember { mutableStateOf(false) } var status by rememberSaveable { mutableStateOf(null) } + val importingText = uiString(R.string.onboarding_importing) + val importLabel = uiString(R.string.onboarding_import_label) + val importFailed = uiString(R.string.onboarding_failed) + val healthConnectDenied = uiString(R.string.onboarding_health_connect_denied) fun runImport(block: suspend () -> ImportSummary) { busy = true - status = "Importing…" + status = importingText scope.launch { val summary = withContext(Dispatchers.IO) { - runCatching { block() }.getOrElse { ImportSummary.failure("Import", it.message ?: "failed") } + runCatching { block() }.getOrElse { ImportSummary.failure(importLabel, it.message ?: importFailed) } } // Import & Data Ingest test mode (Test Centre): emit the parser / per-stage / day-delta trace, // tagged IMPORT, iff the mode is on. Gated zero-cost when off; shared with the Data Sources flow. @@ -811,7 +813,7 @@ private fun ImportStep(viewModel: AppViewModel) { if (granted.any { it in HealthConnectImporter.PERMISSIONS }) { runImport { HealthConnectImporter.import(context, viewModel.repo, ProfileStore.from(context).heightCm) } } else { - val message = "Health Connect access not granted." + val message = healthConnectDenied status = message Toast.makeText(context, message, Toast.LENGTH_LONG).show() } @@ -841,7 +843,7 @@ private fun ImportStep(viewModel: AppViewModel) { StepShell( title = uiString(R.string.l10n_onboarding_screen_bring_your_history_5b8775c9), - subtitle = "Optional: import now, or skip and return to Data Sources later.", + subtitle = uiString(R.string.onboarding_import_subtitle), ) { Column( modifier = Modifier.fillMaxWidth(), @@ -853,7 +855,7 @@ private fun ImportStep(viewModel: AppViewModel) { icon = Icons.Filled.AutoGraph, tint = Palette.accent, title = uiString(R.string.l10n_onboarding_screen_history_fills_the_dashboard_immediately_9728dde5), - message = "A WHOOP export backfills recovery, strain, sleep and workouts. Health Connect can add steps, HR, HRV, sleep and weight from Android sources.", + message = uiString(R.string.onboarding_import_history_body), ) NoopCard(padding = 16.dp) { @@ -900,7 +902,7 @@ private fun ImportStep(viewModel: AppViewModel) { private fun NotificationsStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_stay_in_the_loop_f54254af), - subtitle = "NOOP keeps your strap connected in the background. When you continue, allow notifications so it can show that link and reach your wrist.", + subtitle = uiString(R.string.onboarding_notifications_subtitle), ) { Column( modifier = Modifier.fillMaxWidth(), @@ -912,10 +914,10 @@ private fun NotificationsStep() { icon = Icons.Filled.Bluetooth, tint = Palette.statusPositive, title = uiString(R.string.l10n_onboarding_screen_a_quiet_ongoing_status_97bf2a44), - message = "NOOP holds the Bluetooth link open in the background so your data stays current. One low-priority notification shows it's connected. Nothing noisy.", + message = uiString(R.string.onboarding_notifications_status_body), ) - Checkline("Wrist alerts (strain nudges and your smart alarm) arrive as notifications too.") - Checkline("When Android asks, allow notifications so NOOP can keep you informed.") + Checkline(uiString(R.string.onboarding_notifications_alerts)) + Checkline(uiString(R.string.onboarding_notifications_permission)) } } } @@ -931,7 +933,7 @@ private fun AppearanceStep() { StepShell( title = uiString(R.string.l10n_onboarding_screen_make_it_yours_54135155), - subtitle = "NOOP follows your system by default, or pick Light or Dark. You can change this any time in Settings → Appearance.", + subtitle = uiString(R.string.onboarding_appearance_subtitle), ) { Column( modifier = Modifier.fillMaxWidth(), @@ -965,7 +967,13 @@ private fun AppearanceStep() { SegmentedPillControl( items = listOf(AppearanceMode.SYSTEM, AppearanceMode.LIGHT, AppearanceMode.DARK), selection = mode, - label = { it.label }, + label = { appearance -> + when (appearance) { + AppearanceMode.SYSTEM -> uiString(R.string.onboarding_system) + AppearanceMode.LIGHT -> uiString(R.string.l10n_onboarding_screen_light_a36ef8ab) + AppearanceMode.DARK -> uiString(R.string.l10n_onboarding_screen_dark_ae1ef014) + } + }, onSelect = { mode = it // Persist + flip live — the rest of the onboarding (and the app) re-themes @@ -986,9 +994,9 @@ private fun AppearanceStep() { ) Text( when (mode) { - AppearanceMode.SYSTEM -> "Following your phone's light/dark setting." - AppearanceMode.LIGHT -> "Deep blue accent on warm paper." - AppearanceMode.DARK -> "Deep blue accent on a dark blue-grey canvas." + AppearanceMode.SYSTEM -> uiString(R.string.onboarding_theme_follow_system) + AppearanceMode.LIGHT -> uiString(R.string.onboarding_theme_light_description) + AppearanceMode.DARK -> uiString(R.string.onboarding_theme_dark_description) }, style = NoopType.footnote, color = Palette.textTertiary, @@ -1239,10 +1247,10 @@ private fun ThinDivider() { ) } -private data class OnboardingSexOption(val tag: String, val label: String) +private data class OnboardingSexOption(val tag: String, val labelRes: Int) private val ONBOARDING_SEX_OPTIONS = listOf( - OnboardingSexOption("male", "Male"), - OnboardingSexOption("female", "Female"), - OnboardingSexOption("nonbinary", "Other"), + OnboardingSexOption("male", R.string.onboarding_male), + OnboardingSexOption("female", R.string.onboarding_female), + OnboardingSexOption("nonbinary", R.string.onboarding_other), ) diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index 5a6fcc44b4..49ace3d244 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -691,45 +691,45 @@ VoIP-Anrufe Handgelenk-Hinweise Handgelenklieferung benötigt Benachrichtigungszugriff, damit NOOP lesen kann, welche Apps benachrichtigen - Ein privates Fenster in Ihre Genesung, Schlaf und Belastung. Lesen Sie direkt von Ihrem Riemen, nur auf diesem Telefon. - Ein kurzes Wort, bevor Sie verbinden - Ein ruhiger, andauernder Status + Dein privater Einblick in Erholung, Schlaf und Belastung. Direkt von deinem Strap ausgelesen – und nur auf diesem Smartphone gespeichert. + Bevor du dein Strap verbindest + Unauffälliger Verbindungsstatus Über dich Alter - all deine Daten, nichts in der Cloud + All deine Daten. Ganz ohne Cloud. Zurück - Bring deinen Verlauf mit + Nimm deine bisherigen Daten mit Dunkel Geschätzte maximale Herzfrequenz · %1$s bpm Geschätzte maximale Herzfrequenz %1$s bpm - Jeder Schlag, jede Nacht, jeder Tag, verwoben zu einem ruhigen Bild von dir. Willkommen bei NOOP. - Finde deinen Strap + Jeder Herzschlag, jede Nacht und jeder Tag ergeben ein persönliches Gesamtbild. Willkommen bei NOOP. + Finde dein Strap Health Connect ist auf diesem Gerät nicht verfügbar. Größe - Der Verlauf füllt das Dashboard sofort + Deine bisherigen Daten erscheinen sofort im Dashboard Apple-Health-Export importieren - Import von Health Connect - Import WHOOP Export (.zip) - Leicht - Mach es zu deinem - Kein WHOOP? Du kannst noch weitermachen. Kombinieren Sie einen Herzfrequenzgurt (Polar, Wahoo, Coospo, Garmin HRM ...) - Nichts verlässt Ihr Telefon + Aus Health Connect importieren + WHOOP-Export (.zip) importieren + Hell + Mach NOOP zu deinem + Kein WHOOP? Du kannst trotzdem fortfahren. Verbinde später unter „Geräte“ einen Herzfrequenzgurt von Polar, Wahoo, Coospo oder Garmin oder ein Fitnessgerät. Alternativ kannst du unter „Datenquellen“ Daten aus WHOOP, Apple Health, Oura, Fitbit, Garmin und weiteren Diensten importieren. Beides ist jederzeit möglich. + Deine Daten bleiben lokal Onboarding Fortschritt - Besitze deine Daten, offline + Deine Daten bleiben bei dir %1$s / %2$s - Leg deinen Strap an - Siehe Erholung, klar + Leg dein Strap an + Deine Erholung auf einen Blick Bleib auf dem Laufenden - Stopp + Stoppen Strap Design - Dies kann ausgeführt werden, während Sie die Einrichtung beenden - Sieh deinem Herzen zu, live + Du kannst währenddessen fortfahren + Dein Puls in Echtzeit Gewicht - Was NOOP macht + Was NOOP kann Was dich erwartet - Du bist verbunden. - Dein Verlauf beginnt hier. + Verbindung hergestellt + Dein Weg mit NOOP beginnt hier. Beat-to-Beat Beats lesen Rhythmus schließen @@ -1275,7 +1275,7 @@ Updates überprüfen GitHub erneut v5 - die Rohsignalfreigabe: NOOP liest das Signal, auf Ihrem Gerät, kostenlos Week in Review ist ehrlich über eine halb fertige Woche - WHOOP 4.0 ist der unterstützte Weg + WHOOP 4.0 wird vollständig unterstützt 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) @@ -1299,7 +1299,7 @@ Ihr Fitnessalter, Vitalität und Körperalter Ihre importierten Schritte werden jetzt auf dem Bildschirm Heute angezeigt (Android) Ihre macOS-Daten sind zurück - und voll Französisch - Deine Werte bauen sich über ein paar Nächte auf + Deine Werte werden über mehrere Nächte genauer Die Herzfrequenz des ganzen Tages, auf dem Armaturenbrett Ihr WHOOP-Journal in Insights, klarere metrische Taps Dieser Abschnitt ist auf dem Weg. @@ -1813,4 +1813,63 @@ Band hat %1$d/%2$d R22-Flags akzeptiert… Auf einer WHOOP 5/MG vibriert jedes Muster gleich — die Wiederholungszahl wird an dieses Band nicht gesendet. Deine Auswahl wird gespeichert und gilt für eine WHOOP 4.0. Wasser und Koffein aus Apple Health, ein genaueres Effort-Ergebnis und ein Oura-Ruhepuls-Fix + + Loslegen + Weiter + Speichern und weiter + NOOP starten + Drei klare Versprechen. + Ein übersichtlicher Ring bündelt HRV, Ruhepuls und Schlaf und zeigt dir, ob heute Leistung oder Erholung angesagt ist. + Verbinde dein WHOOP, einen Herzfrequenzgurt oder ein Fitnessgerät und verfolge jeden Herzschlag in Echtzeit – mit Herzfrequenzzonen, die zu deinem Profil passen. Du hast bereits Daten aus anderen Quellen? Importiere sie aus WHOOP, Apple Health, Oura, Fitbit oder Garmin. + 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. + 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 dein 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. + Erst bei Hautkontakt liefert der Sensor aussagekräftige Messwerte. + Trage dein Strap eng am Handgelenk oder Oberarm, sodass der Sensor direkt auf der Haut liegt. + Wenn der Akku fast leer ist, lade dein Strap zunächst einige Minuten auf. + Halte dein Strap während der Kopplung und der ersten Synchronisierung in der Nähe dieses Smartphones. + Dein Strap ist gekoppelt. Du kannst fortfahren. + NOOP beginnt automatisch mit der Suche. Während dein Strap gekoppelt wird, kannst du bereits fortfahren. + Erlaube den Bluetooth-Zugriff und starte die Suche, um dein Strap zu finden. Du kannst es auch später verbinden. + Gekoppelt · Datenübertragung läuft + Live-Puls · nicht vollständig gekoppelt + Verbunden · Kopplung läuft + Suche läuft + Bereit zur Suche + Erneut suchen + Wenn dein Strap in der Nähe ist, hält NOOP die Bluetooth-Verbindung im Hintergrund aufrecht. Während die Kopplung läuft, kannst du bereits dein Profil einrichten und Daten importieren. + Dein Strap ist gekoppelt · %1$d %% Akku + Dein Strap ist gekoppelt und bereit zur Datenübertragung. + Damit deine Herzfrequenzzonen, dein Kalorienverbrauch und die Auswertungen auf deinem Gerät von Anfang an stimmen. + Jahre + Alter, %1$d Jahre + Geschlecht + Männlich + Weiblich + Divers + Einheiten + Metrisch + Imperial + Import läuft … + Import + fehlgeschlagen + Der Zugriff auf Health Connect wurde nicht gewährt. + Optional: Importiere deine Daten jetzt oder hole das später unter „Datenquellen“ nach. + Mit einem WHOOP-Export kannst du bisherige Daten zu Erholung, Belastung, Schlaf und Workouts übernehmen. Über Health Connect kannst du Schritte, Herzfrequenz, HRV, Schlaf und Gewicht aus Android-Datenquellen importieren. + NOOP hält die Verbindung zu deinem Strap im Hintergrund aufrecht. Erlaube beim Fortfahren Benachrichtigungen, damit NOOP den Verbindungsstatus anzeigen und dich über dein Strap informieren kann. + NOOP hält die Bluetooth-Verbindung im Hintergrund aufrecht, damit deine Daten aktuell bleiben. Eine einzelne, lautlose Statusbenachrichtigung zeigt dir, dass dein Strap verbunden ist – ohne dich zu stören. + Auch Hinweise zu deinem Strap und deinen Daten – etwa zu deiner Belastung oder vom smarten Wecker – werden als Benachrichtigungen auf deinem Smartphone angezeigt. + Erlaube Benachrichtigungen, wenn Android danach fragt, damit NOOP dich auf dem Laufenden halten kann. + Standardmäßig übernimmt NOOP die Hell-/Dunkel-Einstellung deines Smartphones. Du kannst aber auch selbst „Hell“ oder „Dunkel“ wählen. Das lässt sich jederzeit unter „Einstellungen → Erscheinungsbild“ ändern. + System + Die Hell-/Dunkel-Einstellung deines Smartphones wird übernommen. + Tiefblaue Akzente auf einem warmen, hellen Hintergrund. + Tiefblaue Akzente auf einem dunklen, blaugrauen Hintergrund. diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml index ea2735f572..c5d87a25a9 100644 --- a/android/app/src/main/res/values-es/strings.xml +++ b/android/app/src/main/res/values-es/strings.xml @@ -1798,4 +1798,63 @@ La pulsera aceptó %1$d/%2$d marcas R22… En una WHOOP 5/MG todos los patrones vibran igual: el número de repeticiones no se envía a esa correa. Tu elección se guarda y se aplica a una WHOOP 4.0. Agua y cafeína desde Apple Health, una puntuación de Effort más precisa y una corrección del pulso en reposo de Oura + + Empezar + Continuar + Guardar y continuar + Entrar en NOOP + Tres promesas discretas. + Un anillo sereno combina la VFC, la frecuencia cardíaca en reposo y el sueño en una sola lectura para saber si conviene esforzarte o descansar. + Conecta un WHOOP, una banda de frecuencia cardíaca o una máquina de gimnasio y observa cada latido en tiempo real, con zonas adaptadas a tu perfil. ¿Ya tienes un historial en otro servicio? Impórtalo desde WHOOP, Apple Health, Oura, Fitbit o Garmin. + 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. + 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. + 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. + Mantén la pulsera cerca de este teléfono durante el emparejamiento y la primera sincronización. + Emparejada. Puedes continuar. + NOOP empieza a buscar en cuanto aparece este paso. Puedes continuar mientras se empareja. + Permite el acceso a Bluetooth y toca Buscar para encontrar tu pulsera, o continúa y conéctala más tarde. + Emparejada · transmitiendo + FC en vivo · emparejamiento incompleto + Conectada · emparejando + Buscando + Lista para buscar + Buscar de nuevo + Si la pulsera está cerca, NOOP mantendrá activa la conexión Bluetooth en segundo plano. Puedes continuar con el perfil y la importación mientras se empareja. + Tu pulsera está emparejada · %1$d%% de batería. + Tu pulsera está emparejada y lista para transmitir datos. + Para que tus zonas, calorías y puntuaciones en el dispositivo partan de los valores correctos. + años + Edad, %1$d años + Sexo + Masculino + Femenino + Otro + Unidades + Métrico + Imperial + Importando… + Importar + error + No se ha concedido acceso a Health Connect. + Opcional: importa tus datos ahora u omite este paso y vuelve a Fuentes de datos más tarde. + Una exportación de WHOOP incorpora datos anteriores de recuperación, esfuerzo, sueño y entrenamientos. Health Connect puede añadir pasos, FC, VFC, sueño y peso desde fuentes de Android. + NOOP mantiene tu pulsera conectada en segundo plano. Cuando continúes, permite las notificaciones para que pueda mostrar el estado de la conexión y avisarte en la muñeca. + NOOP mantiene abierta la conexión Bluetooth en segundo plano para que tus datos estén actualizados. Una sola notificación de baja prioridad indica que la pulsera está conectada, sin molestarte. + Los avisos para la muñeca, como los recordatorios de esfuerzo y tu alarma inteligente, también llegan como notificaciones. + Cuando Android te lo pida, permite las notificaciones para que NOOP pueda mantenerte informado. + De forma predeterminada, NOOP sigue el tema del sistema, pero también puedes elegir Claro u Oscuro. Puedes cambiarlo en cualquier momento en Ajustes → Apariencia. + Sistema + Se usa el ajuste claro u oscuro de tu teléfono. + Acentos azul oscuro sobre un fondo cálido y claro. + Acentos azul oscuro sobre un fondo azul grisáceo oscuro. diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml index 9b74f996e3..3ae82ba8a8 100644 --- a/android/app/src/main/res/values-fr/strings.xml +++ b/android/app/src/main/res/values-fr/strings.xml @@ -1798,4 +1798,63 @@ Le bracelet a accepté %1$d/%2$d indicateurs R22… Sur un WHOOP 5/MG, tous les motifs vibrent de la même façon — le nombre de répétitions n\'est pas envoyé à ce bracelet. Votre choix est enregistré et s\'applique à un WHOOP 4.0. L\'eau et la caféine depuis Apple Santé, un score Effort plus précis et un correctif de la FC au repos Oura + + Commencer + Continuer + Enregistrer et continuer + Entrer dans NOOP + Trois promesses discrètes. + Un anneau épuré réunit la VFC, la fréquence cardiaque au repos et le sommeil en une seule indication pour savoir s\'il vaut mieux faire un effort ou se reposer. + Connectez un WHOOP, une ceinture cardio ou une machine de sport et suivez chaque battement en temps réel, avec des zones adaptées à votre profil. Vous avez déjà un historique ailleurs ? Importez-le depuis WHOOP, Apple Santé, Oura, Fitbit ou Garmin. + 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. + 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 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. + Gardez-le près de ce téléphone pendant l\'association et la première synchronisation. + Associé. Vous pouvez continuer. + NOOP commence la recherche dès que cette étape apparaît. Vous pouvez continuer pendant l\'association. + Autorisez le Bluetooth et appuyez sur Rechercher pour trouver votre bracelet, ou continuez et connectez-le plus tard. + Associé · transmission en cours + FC en direct · association incomplète + Connecté · association en cours + Recherche en cours + Prêt pour la recherche + Relancer la recherche + Si le bracelet est à proximité, NOOP maintient la connexion Bluetooth active en arrière-plan. Vous pouvez poursuivre la configuration du profil et l\'importation pendant l\'association. + Votre bracelet est associé · batterie à %1$d%%. + Votre bracelet est associé et prêt à transmettre des données. + Pour que vos zones, vos calories et les scores calculés sur l\'appareil partent des bonnes valeurs. + ans + Âge, %1$d ans + Sexe + Masculin + Féminin + Autre + Unités + Métrique + Impérial + Importation… + Importer + échec + L\'accès à Health Connect n\'a pas été accordé. + Facultatif : importez vos données maintenant ou ignorez cette étape et revenez à Sources de données plus tard. + Un export WHOOP ajoute les anciennes données de récupération, d\'effort, de sommeil et d\'entraînement. Health Connect peut ajouter les pas, la FC, la VFC, le sommeil et le poids depuis des sources Android. + NOOP maintient votre bracelet connecté en arrière-plan. Lorsque vous continuez, autorisez les notifications afin qu\'il puisse afficher l\'état de la connexion et vous avertir au poignet. + NOOP maintient la connexion Bluetooth ouverte en arrière-plan pour que vos données restent à jour. Une seule notification de faible priorité indique que le bracelet est connecté, sans vous déranger. + Les alertes au poignet, comme les rappels d\'effort et votre alarme intelligente, arrivent également sous forme de notifications. + Lorsque Android vous le demande, autorisez les notifications afin que NOOP puisse vous tenir informé. + Par défaut, NOOP suit le thème du système, mais vous pouvez aussi choisir Clair ou Sombre. Vous pouvez modifier ce réglage à tout moment dans Paramètres → Apparence. + Système + Le réglage clair ou sombre de votre téléphone est utilisé. + Des accents bleu profond sur un fond clair et chaleureux. + Des accents bleu profond sur un fond bleu-gris sombre. 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 9405665b9a..f4671ef627 100644 --- a/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/android/app/src/main/res/values-pt-rPT/strings.xml @@ -1792,4 +1792,63 @@ A pulseira aceitou %1$d/%2$d marcas R22… Numa WHOOP 5/MG todos os padrões vibram igual — a contagem de repetições não é enviada para essa bracelete. A tua escolha fica guardada e aplica-se a uma WHOOP 4.0. Água e cafeína a partir do Apple Health, uma pontuação de Effort mais precisa e uma correção da FC em repouso do Oura + + Começar + Continuar + Guardar e continuar + Entrar no NOOP + Três promessas discretas. + Um anel simples combina a VFC, a frequência cardíaca em repouso e o sono numa única indicação para saber se deves fazer esforço ou descansar. + Liga um WHOOP, uma cinta de frequência cardíaca ou uma máquina de ginásio e acompanha cada batimento em tempo real, com zonas adaptadas ao teu perfil. Já tens histórico noutro serviço? Importa-o do WHOOP, Apple Health, Oura, Fitbit ou Garmin. + 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. + 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 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. + Mantém a bracelete perto deste telemóvel durante o emparelhamento e a primeira sincronização. + Emparelhada. Podes continuar. + O NOOP começa a procurar assim que este passo aparece. Podes continuar enquanto a bracelete é emparelhada. + Permite o acesso ao Bluetooth e toca em Procurar para encontrar a tua bracelete, ou continua e liga-a mais tarde. + Emparelhada · a transmitir + FC em direto · emparelhamento incompleto + Ligada · a emparelhar + A procurar + Pronta para procurar + Procurar novamente + Se a bracelete estiver por perto, o NOOP mantém a ligação Bluetooth ativa em segundo plano. Podes continuar com o perfil e a importação enquanto é emparelhada. + A tua bracelete está emparelhada · %1$d%% de bateria. + A tua bracelete está emparelhada e pronta para transmitir dados. + Para que as tuas zonas, calorias e pontuações no dispositivo partam dos valores corretos. + anos + Idade, %1$d anos + Sexo + Masculino + Feminino + Outro + Unidades + Métrico + Imperial + A importar… + Importar + erro + O acesso ao Health Connect não foi concedido. + Opcional: importa os teus dados agora ou ignora este passo e regressa a Fontes de dados mais tarde. + Uma exportação WHOOP adiciona dados anteriores de recuperação, esforço, sono e treinos. O Health Connect pode adicionar passos, FC, VFC, sono e peso a partir de fontes Android. + O NOOP mantém a tua bracelete ligada em segundo plano. Quando continuares, permite as notificações para que possa mostrar o estado da ligação e avisar-te no pulso. + O NOOP mantém a ligação Bluetooth aberta em segundo plano para que os teus dados se mantenham atualizados. Uma única notificação de baixa prioridade indica que a bracelete está ligada, sem te incomodar. + Os alertas no pulso, como os lembretes de esforço e o teu alarme inteligente, também chegam como notificações. + Quando o Android pedir, permite as notificações para que o NOOP te possa manter informado. + Por predefinição, o NOOP segue o tema do sistema, mas também podes escolher Claro ou Escuro. Podes alterar esta opção a qualquer momento em Definições → Aspeto. + Sistema + É utilizada a definição de tema claro ou escuro do teu telemóvel. + Destaques em azul-escuro sobre um fundo claro e acolhedor. + Destaques em azul-escuro sobre um fundo azul-acinzentado escuro. diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml index 1359924939..41544bb184 100644 --- a/android/app/src/main/res/values-zh/strings.xml +++ b/android/app/src/main/res/values-zh/strings.xml @@ -1726,4 +1726,63 @@ 仅停止发送 在 WHOOP 5/MG 上所有模式的震动都相同——重复次数不会发送到该手环。你的选择会被保存,并在 WHOOP 4.0 上生效。 从 Apple 健康导入饮水与咖啡因、更精确的 Effort 分数,以及 Oura 静息心率修复 + + 开始 + 继续 + 保存并继续 + 进入 NOOP + 三个安静的承诺。 + 一个简洁的圆环将 HRV、静息心率和睡眠汇总成直观结果,帮助你判断该加把劲还是该休息。 + 连接 WHOOP、心率带或健身器械,即可实时查看每一次心跳,并使用与你的个人资料相匹配的心率区间。其他服务中已有历史数据?可从 WHOOP、Apple 健康、Oura、Fitbit 或 Garmin 导入。 + 所有内容都保存在这台手机上。无需账号、无需同步、无需云端。 + 几句实话,免得让你意外。 + NOOP 是一个个人开放项目:它不是 WHOOP 应用,也与 WHOOP 无关。它只在你自己的设备上读取你拥有的手环。请将它视为一个功能强大但仍在开发中的项目,而不是成品。 + WHOOP 4.0 已经过测试,端到端可用。WHOOP 5.0/MG 较新:实时心率现已可用,但 5/MG 的深层指标(恢复、强度和睡眠)仍在研究中。NOOP 始终会告诉你哪些功能已可用、哪些仍在开发。 + 实时心率可立即查看。随着 NOOP 在最初几晚的佩戴中了解你的基线,恢复、强度和睡眠数据会越来越准确。想立即查看历史数据?请在“数据来源”中导入 WHOOP 导出文件,大约一分钟即可回填。 + 无需账号、无需云端、无需同步。NOOP 只与你的手环通信,一切都保留在本地。你的数据只属于你。 + NOOP 使用 Bluetooth 查找你的手环。继续时,请授予权限以便进行扫描。 + NOOP 通过低功耗 Bluetooth 直接与你的手环通信,中间没有服务器。连接在本地进行,读取到的每条数据也都保留在本地。 + 当 Android 提示时,请允许使用 Bluetooth,以便 NOOP 扫描并连接你的手环。 + 首次连接 WHOOP 5.0/MG 时,可能需要在关闭官方 WHOOP 应用后让手环进入配对模式。 + 传感器需要接触皮肤,数据才开始具有参考意义。 + 将手环贴合地戴在手腕或上臂,确保传感器紧贴皮肤。 + 如果电量较低,请先充电几分钟。 + 配对和首次同步期间,请让手环靠近这台手机。 + 已配对。你可以继续。 + 此步骤出现后,NOOP 会立即开始查找。配对期间你可以继续设置。 + 允许使用 Bluetooth 并点按“扫描”来查找手环,也可以先继续,稍后再连接。 + 已配对 · 传输中 + 实时心率 · 尚未完全配对 + 已连接 · 配对中 + 搜索中 + 可以开始扫描 + 重新扫描 + 如果手环在附近,NOOP 会在后台保持 Bluetooth 连接。配对期间,你可以继续设置个人资料和导入数据。 + 你的手环已配对 · 电量 %1$d%%。 + 你的手环已配对,可以开始传输数据。 + 确保心率区间、卡路里和设备端评分从正确的数据开始计算。 + + 年龄,%1$d 岁 + 性别 + 男性 + 女性 + 其他 + 单位 + 公制 + 英制 + 正在导入… + 导入 + 失败 + 未授予 Health Connect 访问权限。 + 可选:现在导入数据,或跳过并稍后返回“数据来源”。 + WHOOP 导出文件可回填恢复、强度、睡眠和锻炼数据。Health Connect 可从 Android 数据来源添加步数、心率、HRV、睡眠和体重。 + NOOP 会在后台保持手环连接。继续时,请允许通知,以便显示连接状态并在手腕上提醒你。 + NOOP 会在后台保持 Bluetooth 连接,让数据持续更新。一条低优先级通知会显示手环已连接,不会打扰你。 + 手腕提醒(例如强度提示和智能闹钟)也会以通知形式送达。 + 当 Android 提示时,请允许通知,以便 NOOP 及时向你提供信息。 + NOOP 默认跟随系统主题,你也可以选择浅色或深色。之后可随时在“设置 → 外观”中更改。 + 系统 + 跟随手机的浅色或深色设置。 + 深蓝色点缀搭配温暖的浅色背景。 + 深蓝色点缀搭配深色蓝灰背景。 diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 7e0f160705..5981bfce08 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1824,4 +1824,63 @@ Strap accepted %1$d/%2$d R22 flags… Every pattern buzzes the same on a WHOOP 5/MG — the repeat count isn\'t sent to that strap. Your choice is saved and applies to a WHOOP 4.0. Water and caffeine from Apple Health, a sharper Effort score, and an Oura resting-heart-rate fix + + Begin + Continue + Save & continue + Enter NOOP + Three quiet promises. + A calm ring rolls HRV, resting heart rate and sleep into one read on whether to push or rest. + Connect a WHOOP, a heart-rate strap or a gym machine and watch each beat in real time, with zones that match your profile. Already have history elsewhere? Import it from WHOOP, Apple Health, Oura, Fitbit or Garmin. + 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. + 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. + 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. + Keep it near this phone while pairing and during the first sync. + Bonded. You can keep going. + NOOP starts looking as soon as this step appears. You can keep going while it bonds. + Allow Bluetooth and tap Scan to find your strap, or keep going and connect later. + Bonded · streaming + Live HR · not fully paired + Connected · pairing + Searching + Ready to scan + Scan again + If the strap is nearby, NOOP will keep the BLE link alive in the background. You can continue through profile and import while it bonds. + Your strap is bonded · %1$d%% battery. + Your strap is bonded and ready to stream. + So your zones, calories and on-device scoring start from the right numbers. + yrs + Age, %1$d years + Sex + Male + Female + Other + Units + Metric + Imperial + Importing… + Import + failed + Health Connect access not granted. + Optional: import now, or skip and return to Data Sources later. + A WHOOP export backfills recovery, strain, sleep and workouts. Health Connect can add steps, HR, HRV, sleep and weight from Android sources. + NOOP keeps your strap connected in the background. When you continue, allow notifications so it can show that link and reach your wrist. + NOOP holds the Bluetooth link open in the background so your data stays current. One low-priority notification shows it\'s connected. Nothing noisy. + Wrist alerts (strain nudges and your smart alarm) arrive as notifications too. + When Android asks, allow notifications so NOOP can keep you informed. + NOOP follows your system by default, or pick Light or Dark. You can change this any time in Settings → Appearance. + System + Following your phone\'s light/dark setting. + Deep blue accent on warm paper. + Deep blue accent on a dark blue-grey canvas.