Commit cb157457139ed23aa0b7cbf4f3c1f4a318ad27d9

Authored by 常守达
1 parent 1e225e34

feat(l10n): 语言国际化及配置

... ... @@ -51,6 +51,10 @@ post_install do |installer|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
# Force all pods to match the app's minimum deployment target,
# fixing "ThinkingSDK requires a higher minimum iOS deployment version
# than the plugin's reported minimum version" errors.
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '17.0'
config.build_settings['ENABLE_USER_SCRIPT_SANDBOXING'] = 'NO'
# You can remove unused permissions here
# for more information: https://github.com/Baseflow/flutter-permission-handler/blob/main/permission_handler_apple/ios/Classes/PermissionHandlerEnums.h
... ...
... ... @@ -34,24 +34,24 @@ PODS:
- Flutter
- FlutterMacOS
- TAThirdParty (0.3.5)
- thinking_analytics (3.3.2):
- thinking_analytics (3.3.3):
- Flutter
- TAThirdParty (= 0.3.5)
- ThinkingSDK (= 3.1.6)
- ThinkingDataCore (1.2.3):
- ThinkingDataCore/Main (= 1.2.3)
- ThinkingDataCore/iOS (1.2.3)
- ThinkingDataCore/Main (1.2.3):
- ThinkingSDK (= 3.4.8)
- ThinkingDataCore (1.3.5):
- ThinkingDataCore/Main (= 1.3.5)
- ThinkingDataCore/iOS (1.3.5)
- ThinkingDataCore/Main (1.3.5):
- ThinkingDataCore/iOS
- ThinkingDataCore/OSX
- ThinkingDataCore/tvOS
- ThinkingDataCore/versionOS
- ThinkingDataCore/watchOS
- ThinkingSDK (3.1.6):
- ThinkingSDK/Main (= 3.1.6)
- ThinkingSDK/iOS (3.1.6):
- ThinkingDataCore (= 1.2.3)
- ThinkingSDK/Main (3.1.6):
- ThinkingSDK (3.4.8):
- ThinkingSDK/Main (= 3.4.8)
- ThinkingSDK/iOS (3.4.8):
- ThinkingDataCore (= 1.3.5)
- ThinkingSDK/Main (3.4.8):
- ThinkingSDK/iOS
- ThinkingSDK/OSX
- TOCropViewController (2.7.4)
... ... @@ -126,13 +126,13 @@ SPEC CHECKSUMS:
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
TAThirdParty: 65db0235cd209237781535f19f9d0eef706156e5
thinking_analytics: 07ba79674bc6813262e106d7c1ae6458d671e093
ThinkingDataCore: e87a6061d82d138d8b770d04cc84521547563884
ThinkingSDK: ccc9a8a901e2fb98a8e8b41e5084b8ab4a4c82ca
thinking_analytics: 6f254c030da8dfc3409c08d91929b6ad89c415be
ThinkingDataCore: 2bda656a0e68ad95542ab029450784d38ab50949
ThinkingSDK: 48c27bf8af8c2035f8fb80522add51f0b3c65284
TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654
video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140
webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2
PODFILE CHECKSUM: c36ebc7b37f7e0fe81fc21e1e8614dbc72dca7fa
PODFILE CHECKSUM: 9846d4e0a8198893058beb0df941f3d2ecdcca2c
COCOAPODS: 1.16.2
... ...
... ... @@ -67,7 +67,10 @@ class LoginView extends GetView<LoginController> {
),
// Welcome texts
Positioned(
bottom: bottom(253),
bottom: bottom(controller.environmentConfig.region.value ==
AppRegion.china
? 253
: 273),
left: 0,
right: 0,
child: Column(
... ...
import 'package:doublefeel_flutter/core/network/dio_client.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import '../constants/app_const.dart';
... ... @@ -19,9 +21,26 @@ class AppEnvironmentConfig {
Future<AppEnvironmentConfig> init() async {
environment.value = await _storage.readEnvironment();
_isNativeDebug = await _platformHostApi.isDebugEnvoriment();
final stored = await _storage.readRegion();
if (stored == null) {
final detected = _detectRegionFromLocale();
await setRegion(detected);
} else {
region.value = stored;
}
return this;
}
AppRegion _detectRegionFromLocale() {
final country = WidgetsBinding
.instance.platformDispatcher.locale.countryCode
?.toUpperCase();
return switch (country) {
'CN' => AppRegion.china,
_ => AppRegion.global,
};
}
Future<void> setEnvironment(AppEnvironment value) async {
environment.value = value;
await _storage.writeEnvironment(value);
... ... @@ -30,7 +49,22 @@ class AppEnvironmentConfig {
bool _isNativeDebug = false;
bool get isDebug => kDebugMode || _isNativeDebug;
String get serverBaseUrl => resolveServerUrl(AppConst.serverBaseUrl);
final Rx<AppRegion> region = AppRegion.global.obs;
Future<void> setRegion(AppRegion value) async {
region.value = value;
await _storage.writeRegion(value);
Get.find<DioClient>().refreshBaseUrl();
}
String get serverBaseUrl {
final regionUrl = switch (region.value) {
AppRegion.china => AppConst.serverBaseUrl,
AppRegion.global => AppConst.serverBaseUrlGlobal,
};
return resolveServerUrl(regionUrl);
}
String resolveServerUrl(String url) {
return resolveServerUrlFor(environment.value, url);
... ... @@ -64,3 +98,5 @@ class AppEnvironmentConfig {
static const environmentPrefsName = StorageConst.appEnvironmentPrefsName;
}
enum AppRegion { china, global }
... ...
... ... @@ -3,6 +3,8 @@ abstract final class AppConst {
static const String appName = 'DoubleFeel';
static const String serverBaseUrl = 'https://api.doublefeel.cn';
static const String serverBaseUrlGlobal = 'https://api.doublefeel.cn';
static const String prefixXlabServerHost = 'xlab';
static const String prefixDevServerHost = 'dev';
... ...
... ... @@ -3,7 +3,7 @@ abstract final class StorageConst {
static const String appEnvironmentPrefsName =
'double_feel_environment_config';
static const String appEnvironmentKey = 'environment';
static const String appRegionKey = 'region';
static const String appSettingsPrefsName = 'app_settings';
static const String termsAgreedKey = 'terms_agreed';
static const String lastLoginMethodKey = 'last_login_method';
... ...
import 'package:doublefeel_flutter/core/config/app_environment_config.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../core/config/app_environment.dart';
... ... @@ -31,6 +32,18 @@ class LocalStorage {
);
}
Future<AppRegion?> readRegion() async {
final ordinal = sharedPreferences.getInt(StorageConst.appRegionKey);
if (ordinal == null) {
return null;
}
return AppRegion.values[ordinal];
}
Future<void> writeRegion(AppRegion region) async {
await sharedPreferences.setInt(StorageConst.appRegionKey, region.index);
}
// ─── App Settings Storage ──────────────────────────────────────────────────
bool get termsAgreed =>
... ...
... ... @@ -105,8 +105,8 @@
"phoneLoginCodeSentSuccess": "Code sent",
"phoneLoginInvalidCode": "Invalid verification code",
"todayHealthDataAuthTitle": "Syncing Health Data",
"todayHealthDataAuthDescription": "DoubleFeel needs access to your Apple Health data to provide stress analysis, sleep insights, and health reminders. Please complete health data authorization. If already authorized, the first sync may take a few minutes.\nIf your Apple Watch hasn't been worn long enough, there may not be sufficient data yet. Please continue wearing your watch to complete data collection.",
"todayHealthDataAuthAction": "Allow Health Access",
"todayHealthDataAuthDescription": "DoubleFeel needs access to your Apple Health data to provide stress insights, Live Stress tracking, and health recommendations.\nIf you haven’t granted access, please allow permissions below. If you have already granted access, syncing your health data may take a few minutes. Please try again later.",
"todayHealthDataAuthAction": "Continue",
"measureYourHrvNow": "How to take a measurement",
"todayBottomSheetGotIt": "Got it",
"todayFaqTitle": "FAQ",
... ... @@ -119,9 +119,9 @@
"todayFaqLinkWatchFaceBlackScreen": "Why does the watch face turn black?",
"todayStressStatusTitle": "Overall stress status",
"todayHrvPrincipleTitle": "How HRV is measured",
"todayRealtimeStressTitle": "How real-time stress works",
"todayStressStatusOverload": "Stress overload",
"todayStressStatusCaution": "Stress warning",
"todayRealtimeStressTitle": "How Live Stress works",
"todayStressStatusOverload": "Overload",
"todayStressStatusCaution": "Pay Attention",
"todayStressStatusNormal": "Normal",
"todayStressStatusExcellent": "Excellent",
"todayStressStatusInsufficientData": "Insufficient data",
... ... @@ -130,15 +130,15 @@
"todayStressStatusNormalDescription": "Your current body state is within your normal fluctuation range.",
"todayStressStatusExcellentDescription": "Your current HRV is higher than your recent average, indicating better recovery and overall state.",
"todayStressStatusInsufficientDataDescription": "There is not enough available data to accurately assess your stress state yet.",
"todayHrvMeasurementIntro": "Apple Watch measures HRV every 2-5 hours by default. If you want to measure it manually right now, follow these steps:",
"todayHrvMeasurementStep1": "1. Wear your Apple Watch snugly, sit down, and stay calm",
"todayHrvMeasurementStep2": "2. Open Mindfulness on Apple Watch and start Breathe",
"todayHrvMeasurementStep3": "3. Keep breathing steadily and wait 1-3 minutes",
"todayHrvMeasurementStep4": "4. After breathing is complete, lock and unlock your iPhone once",
"todayHrvMeasurementStep5": "5. Wait about one minute. DoubleFeel will receive and display your data",
"todayHrvMeasurementHint": "Tip: Data comes from Apple Watch. After measurement, there may be delays or data may not sync immediately. If this happens, measure again and wait for the data to be read.",
"todayHrvMeasurementIntro": "Apple Watch measures HRV automatically every 2–5 hours. If you’d like to take a manual measurement, follow these steps:",
"todayHrvMeasurementStep1": "1. Wear your Apple Watch, sit down, and stay relaxed.",
"todayHrvMeasurementStep2": "2. Open the “Mindfulness” app on your Apple Watch and start a “Breathe” session.",
"todayHrvMeasurementStep3": "3. Keep your breathing steady and wait for 1–3 minutes.",
"todayHrvMeasurementStep4": "4. After the breathing session ends, lock your Apple Watch and unlock your iPhone once.",
"todayHrvMeasurementStep5": "5. Wait about one minute. DoubleFeel will receive and display your data.",
"todayHrvMeasurementHint": "Tip: Your data comes from Apple Watch. There may be a delay after measurement, or the data may not sync immediately. If this happens, please try measuring again and wait for the data to sync.",
"todayHrvMeasurementWarning": "Note: Health permissions must be enabled, and Low Power Mode must be turned off.",
"todayStressStatusWhatTitle": "What is overall stress status?",
"todayStressStatusWhatTitle": "What is Overall Stress Status?",
"todayStressStatusWhatDescription1": "DoubleFeel combines your HRV (heart rate variability), resting heart rate, and body-state changes from the past 30 days to assess your overall stress level.",
"todayStressStatusWhatDescription2": "Because HRV fluctuates with emotions, exercise, sleep, and fatigue, a single reading has limited value. We recommend focusing on your overall stress status across the day, which is more stable and useful. It helps you understand your body state and helps close contacts notice changes in time.",
"todayStressStatusWhyHrvTitle": "Why use HRV (heart rate variability)?",
... ... @@ -149,7 +149,7 @@
"todayStressStatusHrvChangesFast": "· HRV changes quickly, making it useful for short-term body-state changes.",
"todayStressStatusAppWatchDifferenceTitle": "How are stress statuses on the phone app and Apple Watch different?",
"todayStressStatusAppWatchDifferenceApp": "The phone app home page shows the day's overall stress status, combining HRV, resting heart rate, and overall trends.",
"todayStressStatusAppWatchDifferenceWatch": "Apple Watch shows the most recent real-time stress status, which is better for quickly checking your current body changes.",
"todayStressStatusAppWatchDifferenceWatch": "Apple Watch shows the most recent Live Stress status, which is better for quickly checking your current body changes.",
"todayStressStatusWaitingDataTitle": "Why does Waiting for data appear?",
"todayStressStatusWaitingDataDescription1": "Waiting for data means the current amount of collected data is not enough to generate a reliable stress assessment.",
"todayStressStatusWaitingDataDescription2": "Please keep wearing your Apple Watch and wait for the system to collect data automatically.",
... ... @@ -163,36 +163,36 @@
"todayHrvPrincipleHowMeasureDescription2": "DoubleFeel calculates HRV (heart rate variability) indicators based on this data to assess your body stress and recovery state.",
"todayHrvPrincipleHowMeasureDescription3": "HRV is sensitive to stress, fatigue, sleep, emotions, and recovery, so it helps us notice body-state changes earlier.",
"todayHrvPrincipleHowMeasureDescription4": "To make results more accurate, DoubleFeel compares your current HRV state with your own 30-day average instead of comparing it directly with other people.",
"todayRealtimeStressWhatTitle": "What is real-time stress?",
"todayRealtimeStressWhatDescription1": "Real-time stress is a body stress indicator dynamically generated by DoubleFeel based on your current HRV, heart rate state, and changes in your personal history.",
"todayRealtimeStressWhatTitle": "What is Live Stress?",
"todayRealtimeStressWhatDescription1": "Live Stress is a body stress indicator dynamically generated by DoubleFeel based on your current HRV, heart rate state, and changes in your personal history.",
"todayRealtimeStressWhatDescription2": "A higher stress value means your body state is deviating more from your usual baseline and may reflect fatigue, insufficient recovery, or high stress.",
"todayRealtimeStressWhatDescription3": "It helps you notice body changes faster and adjust rest, exercise, and daily rhythm in time.",
"todayRealtimeStressDivisionTitle": "How is real-time stress divided?",
"todayRealtimeStressDivisionIntro": "Real-time stress is shown as a percentage:",
"todayRealtimeStressDivisionTitle": "How is Live Stress Scored?",
"todayRealtimeStressDivisionIntro": "Live stress is displayed as a percentage:",
"todayRealtimeStressExcellentRange": "Excellent: 1%-20%",
"todayRealtimeStressNormalRange": "Normal: 21%-60%",
"todayRealtimeStressCautionRange": "Stress warning: 61%-80%",
"todayRealtimeStressOverloadRange": "Stress overload: 81%-100%",
"todayRealtimeStressExcellentDescription": "Your recovery state is good and you are generally relaxed.",
"todayRealtimeStressNormalDescription": "Your body is within the normal fluctuation range.",
"todayRealtimeStressCautionDescription": "Your body may be accumulating stress and needs proper rest and recovery.",
"todayRealtimeStressOverloadDescription": "Your body stress is clearly high. Reduce load and pay attention to sleep and recovery.",
"todayRealtimeStressDivisionBaseline": "These ranges are adjusted dynamically based on your personal baseline and should not be directly compared between users.",
"todayRealtimeStressDivisionAwake": "Real-time stress mainly reflects body stress changes while awake.",
"todayRealtimeStressLowBetterTitle": "Is lower real-time stress always better?",
"todayRealtimeStressCautionRange": "Pay Attention: 61%-80%",
"todayRealtimeStressOverloadRange": "Overload: 81%-100%",
"todayRealtimeStressExcellentDescription": "Your body is in a good recovery state and feels more relaxed.",
"todayRealtimeStressNormalDescription": "Your body is within a normal fluctuation range.",
"todayRealtimeStressCautionDescription": "Your body may be accumulating stress. Consider taking breaks and recovering.",
"todayRealtimeStressOverloadDescription": "Your body may be under significant stress. Consider reducing your workload and prioritizing sleep and recovery.",
"todayRealtimeStressDivisionBaseline": "These ranges are adjusted based on your personal baseline and activity patterns. Results are not directly comparable between different users.",
"todayRealtimeStressDivisionAwake": "Live Stress mainly reflects changes in your body’s stress level while you are awake.",
"todayRealtimeStressLowBetterTitle": "Is lower Live Stress always better?",
"todayRealtimeStressLowBetterNo": "Not necessarily.",
"todayRealtimeStressLowBetterType": "Body stress can be normal or abnormal.",
"todayRealtimeStressLowBetterExample": "For example, real-time stress rising briefly during or after exercise is a normal recovery response. It can also rise temporarily during focused work or emotional excitement, which are normal body adjustments.",
"todayRealtimeStressLowBetterHighStress": "But if stress remains high while resting, sitting for a long time, or after poor sleep, it may indicate physical fatigue, mental stress, insufficient sleep recovery, incomplete exercise recovery, too much caffeine, alcohol, stimulants, or possible discomfort.",
"todayRealtimeStressLowBetterTrend": "DoubleFeel focuses more on your long-term trend than on a single fluctuation.",
"todayRealtimeStressScenarioTitle": "When should HRV and real-time stress be used?",
"todayRealtimeStressScenarioTitle": "When should HRV and Live Stress be used?",
"todayRealtimeStressScenarioHrvDefault": "With Apple Watch default settings, HRV updates every 2-5 hours.",
"todayRealtimeStressScenarioRegionLimit": "In some regions, Apple Watch breathing features may be limited, which can affect HRV update frequency. Turning on breathing features may also consume more battery.",
"todayRealtimeStressScenarioIntro": "To address the long interval between HRV updates, DoubleFeel designed real-time stress:",
"todayRealtimeStressScenarioUpdateEvery6Min": "· Real-time stress updates every 6 minutes (Friend status updates rely on Apple Health sync and may experience brief delays due to system mechanisms. If your friend uses DoubleFeel frequently, their health status will be updated more promptly)",
"todayRealtimeStressScenarioIntro": "To address the long interval between HRV updates, DoubleFeel designed Live Stress:",
"todayRealtimeStressScenarioUpdateEvery6Min": "· Live Stress updates every 6 minutes (Friend status updates rely on Apple Health sync and may experience brief delays due to system mechanisms. If your friend uses DoubleFeel frequently, their health status will be updated more promptly)",
"todayRealtimeStressScenarioTimely": "· It can reflect body-state changes more promptly",
"todayRealtimeStressScenarioConsistentTrend": "· In most cases, the real-time stress trend is consistent with the HRV trend",
"todayRealtimeStressScenarioSummary": "This lets users see long-term HRV trends while also using real-time stress as a short-term body-state reference.",
"todayRealtimeStressScenarioConsistentTrend": "· In most cases, the Live Stress trend is consistent with the HRV trend",
"todayRealtimeStressScenarioSummary": "This lets users see long-term HRV trends while also using Live Stress as a short-term body-state reference.",
"todayFaqNoDataTitle": "What if the app or watch face has no data?",
"todayFaqNoDataDescription1": "1. Confirm that Apple Watch is on watchOS 10.0 or above and iPhone is on iOS 14 or above. You can check system versions in About.",
"todayFaqNoDataDescription2": "2. Confirm all permissions are enabled: iPhone Health > Sharing > Apps > DoubleFeel > Turn On All Permissions.",
... ... @@ -225,19 +225,19 @@
"today": "Today",
"yesterday": "Yesterday",
"backToToday": "Back to Today",
"redeemOffer": "Redeem Offer",
"redeemOffer": "Claim Offer",
"allPlans": "All Plans",
"clickToAddTheHrvThemedWatchFace": "Click to add the HRV-themed watch face",
"stayOnTopOfYourHealthFluctuations": "Stay on top of your health fluctuations",
"addACloseContact": "Add a close contact",
"oneMorePersonLookingOutForYourHealth": "One more person looking out for your health",
"addAFriend": "Add a friend",
"averageHrvForTheDay": "Average HRV for the day",
"restingHeartRate": "Resting heart rate",
"todaySHrvTrend": "Today's HRV Trend",
"clickToAddTheHrvThemedWatchFace": "Add HRV Watch Face",
"stayOnTopOfYourHealthFluctuations": "Stay on top of your health",
"addACloseContact": "Add a Close Contact",
"oneMorePersonLookingOutForYourHealth": "Have someone care about your health",
"addAFriend": "Add",
"averageHrvForTheDay": "Avg. Hrv",
"restingHeartRate": "RHR",
"todaySHrvTrend": "HRV Trend",
"more": "More",
"noDataAvailableForToday": "No data available for today",
"realTimePressure": "Real-time pressure",
"realTimePressure": "Live Stress",
"accountInformation": "Account Information",
"help": "Help",
"changeNickname": "Change Nickname",
... ... @@ -259,33 +259,33 @@
"mobilePhoneNumber": "Mobile phone number",
"logOut": "Log Out",
"confirmLogoutPrompt": "Are you sure you want to log out?",
"confirmLogout": "Log Out",
"confirmLogout": "Yes, I’m sure",
"loggedOutSuccessfully": "Logged out successfully",
"accountDeletedSuccessfully": "Account deleted successfully",
"deleteAccountWarningTitle": "Once deleted, the account cannot be recovered! Please proceed with caution.",
"deleteAccountWarningPrompt": "Note: Deleting the account will remove all information in this account, including but not limited to\npersonal profile, mood records, and statistical data.",
"deleteAccountWarningNote1": "Note 1: Your health data will be saved in Apple Health, and we will not delete data from Apple Health.",
"deleteAccountWarningNote2": "Note 2: Deleting the account will not affect your subscription status in the App Store. If you need to cancel the subscription, please cancel it manually in the App Store -> Profile -> Subscriptions.",
"confirmDeletion": "Confirm Deletion",
"iLlThinkAboutItSomeMore": "I'll think about it some more.",
"deleteAccountWarningTitle": "Account deletion cannot be undone. Please proceed carefully.",
"deleteAccountWarningPrompt": "1. Deleting your account will permanently remove all your data, including health records, statistics, and account information.",
"deleteAccountWarningNote1": "2. To protect your privacy, we cannot recover deleted accounts or data.",
"deleteAccountWarningNote2": "3. If you have an active subscription through the App Store, please cancel it in App Store → Subscriptions before deleting your account.",
"confirmDeletion": "Delete Account",
"iLlThinkAboutItSomeMore": "Keep My Account",
"sleep": "Sleep",
"viewSleepReport": "View Sleep Report",
"viewSleepReport": "View Details",
"duration": "Duration",
"quality": "Quality",
"averageHeartRate": "Average heart rate",
"averageHeartRate": "Avg HR",
"fitness": "Fitness",
"viewFitnessReport": "View Fitness Report",
"event": "Event",
"viewFitnessReport": "View Details",
"event": "Move",
"exercise": "Exercise",
"standing": "Standing",
"dailyActions": "Daily Actions",
"trendHrvHeartRate": "HRV",
"standing": "Stand",
"dailyActions": "Actions",
"trendHrvHeartRate": "HRV & HR",
"trendActivityBurn": "Activity",
"trendSleepReport": "Sleep",
"reportPeriodDay": "Day",
"reportPeriodWeek": "Week",
"reportPeriodMonth": "Month",
"reportPeriodYear": "Year",
"reportPeriodDay": "D",
"reportPeriodWeek": "W",
"reportPeriodMonth": "M",
"reportPeriodYear": "Y",
"reportDateYear": "{year}",
"reportDateMonth": "Month {month}",
"reportDateMonthDay": "{month}/{day}",
... ... @@ -295,7 +295,7 @@
"reportDatePickerYearOption": "{year}",
"reportDatePickerMonthOption": "{month}",
"reportDatePickerDayOption": "{day}",
"reportWaitingForData": "Waiting for data",
"reportWaitingForData": "Waiting for Data",
"reportWaitingForOtherData": "Waiting for their data",
"reportNoData": "No data",
"reportNoDataToday": "No data for today",
... ... @@ -350,7 +350,7 @@
"hrvSameAsLastMonth": "Same as last month",
"hrvMoreDaysThanLastMonth": "{count} more days than last month",
"hrvFewerDaysThanLastMonth": "{count} fewer days than last month",
"hrvUnlockNow": "Unlock Now",
"hrvUnlockNow": "Unlock",
"hrvTrendTitle": "HRV Trend",
"hrvPeriodAverage": "This {period} average",
"hrvComparedPreviousPeriod": "vs previous {period}",
... ... @@ -416,8 +416,8 @@
"sleepQualityExcellentRange": ">85 pts",
"friendsAddCloseContactDescription": "Add a close contact so someone else can look out for your health",
"friendsLimitReached": "You can add up to 10 friends",
"friendsAddCloseContact": "Add a close contact",
"friendsAddCloseContactWithCount": "Add a close contact ({count}/{max})",
"friendsAddCloseContact": "Add Loved One",
"friendsAddCloseContactWithCount": "Add Loved One ({count}/{max})",
"friendsMe": "Me",
"friendsRemarkedDisplayName": "{remark} ({name})",
"friendsRemarkSuffix": " ({remark})",
... ... @@ -434,11 +434,11 @@
"friendsSleepQualityNormal": "Slept well",
"friendsSleepQualityAttention": "Slept poorly",
"friendsRemove": "Remove",
"friendsEditRemark": "Edit nickname",
"friendsShowOnWatchFace": "Show on watch",
"friendsShownOnWatchFace": "Shown on watch",
"friendsEditRemark": "Edit Note",
"friendsShowOnWatchFace": "Show on Watch",
"friendsShownOnWatchFace": "Shown on Watch",
"friendsSelect": "Select a friend",
"friendsSelectAndSync": "Select and sync to watch",
"friendsSelectAndSync": "Select and sync to Watch",
"friendsBack": "Back",
"friendsTrendTitle": "{name}'s Trends",
"friendsAddAction": "Add",
... ... @@ -450,21 +450,21 @@
"friendsPromptIdNotFoundMessage": "This ID doesn't exist. Check it and try again.",
"friendsPromptAlreadyFriendMessage": "You're already close contacts.",
"friendsPromptSelfIdMessage": "Enter your close contact's ID.",
"friendsEditRemarkTitle": "Edit friend nickname",
"friendsEditRemarkHint": "Enter a nickname",
"friendsEditRemarkTitle": "Edit Note",
"friendsEditRemarkHint": "Enter a note",
"friendsSave": "Save",
"friendsDeleteConfirmTitle": "Remove {name} from your friends?",
"friendsDeleteConfirmMessage": "You will no longer be able to view their mood or health status.",
"friendsDeleteConfirmTitle": "Remove this friend?",
"friendsDeleteConfirmMessage": "You’ll no longer receive their wellness updates after removal.",
"friendsDeleteConfirmAction": "Remove",
"privacySettingsTitle": "Privacy Settings",
"privacySettingsDisableAddById": "Don't allow others to add me by ID",
"privacySettingsDisableAddById": "Block Friend Requests",
"privacySettingsShowRealtimeStress": "Show real-time stress",
"premiumActivatedTitle": "DoubleFeel Pro is now active",
"premiumActivatedTitle": "Congratulations! You’re now a DoubleFeel Pro member.",
"premiumActivatedDescription": "You can now monitor stress, sleep, and HRV in real time, build healthier habits, and share health updates with close contacts so the people who matter can stay informed.",
"premiumActivatedContinue": "Continue",
"purchaseHeroTitle": "Unlock Pro for more timely care",
"purchaseBenefitsTitle": "Enjoy all premium benefits",
"purchaseUnlockNow": "Unlock Now",
"purchaseHeroTitle": "Unlock Pro, Care Better",
"purchaseBenefitsTitle": "Unlock All Pro Benefits",
"purchaseUnlockNow": "Unlock",
"purchaseRestore": "Restore",
"purchaseTermsOfService": "Terms of Service",
"purchasePrivacyPolicy": "Privacy Policy",
... ... @@ -483,15 +483,15 @@
"purchaseApplePaymentCancelled": "The user cancelled the payment.",
"purchaseApplePaymentVerificationFailed": "Payment verification failed.",
"purchaseApplePaymentFailed": "Unknown error.",
"purchaseBenefitRealtimeStress": "Real-time stress monitoring",
"purchaseBenefitStressTrends": "Weekly, monthly, and yearly stress trends",
"purchaseBenefitActivityTrends": "Weekly, monthly, and yearly activity trends",
"purchaseBenefitSleepReports": "Weekly, monthly, and yearly sleep reports",
"purchaseBenefitHealthSync": "Real-time health data sync",
"purchaseBenefitContactNotifications": "Real-time health updates for close contacts",
"purchaseBenefitCustomWatchFace": "Exclusive custom watch faces",
"purchaseBenefitRealtimeStress": "Live Stress Monitoring",
"purchaseBenefitStressTrends": "Daily / Monthly / Yearly HRV Trends",
"purchaseBenefitActivityTrends": "Daily / Monthly / Yearly Activity Trends",
"purchaseBenefitSleepReports": "Daily / Monthly / Yearly Sleep Reports",
"purchaseBenefitHealthSync": "Real-Time Health Data Sync",
"purchaseBenefitContactNotifications": "Real-Time Health Updates to Loved Ones",
"purchaseBenefitCustomWatchFace": "Exclusive Custom Watch Faces",
"purchaseBenefitSleepAnalysis": "Sleep analysis",
"purchaseBenefitFutureFeatures": "Free access to future premium features",
"purchaseBenefitFutureFeatures": "More Pro Benefits Coming Soon",
"purchaseNotesTitle": "Notes",
"purchaseNoteSubscription": "After you confirm and pay, the subscription will renew automatically through your iTunes account. Your Apple account will be charged within 24 hours before the current period ends, and the subscription will renew for another period. To cancel, turn off auto-renewal in your iTunes/Apple ID subscription settings at least 24 hours before the current period ends.\n\nDoubleFeel Pro is a virtual product. Purchases are non-refundable except through the App Store refund process. Tap ",
"purchaseLinkLearnMore": "Learn More",
... ... @@ -531,33 +531,33 @@
"refundHelpDescription": "If you have questions about refunds or experience payment errors, duplicate charges, or a missing order, contact DoubleFeel Support and we will do our best to assist.",
"refundFaqTitle": "DoubleFeel FAQs",
"appReviewPromptTitle": "Enjoying DoubleFeel?",
"appReviewPromptMessage": "Hi! Is DoubleFeel helping you better understand\nyour stress and sleep? 💜",
"appReviewPromptMessage": "We'd love to know if DoubleFeel is helping you better understand your stress and sleep. 💜",
"appReviewPromptLikeActionEmoji": "😍",
"appReviewPromptLikeAction": "Love it",
"appReviewPromptFeedbackAction": "I have feedback",
"appReviewFeedbackTitle": "We're sorry DoubleFeel didn't give you\na good experience",
"appReviewFeedbackMessage": "Would you tell us what went wrong?\nYour feedback helps us improve the stress and health experience. 💜",
"appReviewPromptFeedbackAction": "Not Really",
"appReviewFeedbackTitle": "Sorry DoubleFeel Didn't Meet Your Expectations",
"appReviewFeedbackMessage": "Tell us what happened and how we can improve. Your feedback helps make DoubleFeel better for everyone. 💜",
"appReviewFeedbackSendAction": "Send Feedback",
"appReviewFeedbackLaterAction": "Maybe Later",
"appReviewIllustrationPlaceholder": "Illustration Placeholder",
"overallStressLevelToday": "Overall Stress Level Today",
"stressLevelsOnThatDay": "Stress Levels on That Day",
"noPressureDataAvailableAtThisTime": "No pressure data available at this time",
"membersCanViewTheCompleteData": "Members can view the complete data",
"unlockNow": "Unlock Now",
"membersCanViewTheCompleteData": "Unlock Pro to view",
"unlockNow": "Unlock",
"pressureOverload": "Pressure Overload",
"beMindfulOfStress": "Be Aware of Stress",
"statusNormal": "Status: Normal",
"inExcellentCondition": "In excellent condition",
"waitingForData": "Waiting for data",
"pressure": "Pressure",
"mostRecent": "Most recent",
"mostRecent": "Latest Reading",
"theDayBeforeYesterday": "The day before yesterday",
"uploadPhotos": "Upload Photos",
"filming": "Filming",
"unlockTheProVersion": "Unlock the Pro Version",
"embarkOnAJourneyOfStressAwarenessAndWellnessSupport": "Embark on a Journey of Stress Awareness and Wellness Support",
"sharePartnerCodeTemplate": "My friend ID: {inviteCode}. Hey ❤️ Come and use DoubleFeel with me! It helps us care for each other—track stress and sleep, view HRV and body status, and stay updated on each other's health in real-time. Come join me 👉 https://apps.apple.com/cn/app/doublefeel-%E5%8F%8C%E4%BA%BA%E6%83%85%E7%BB%AA%E5%85%B1%E4%BA%ABhrv%E5%8E%8B%E5%8A%9B%E6%B0%B4%E5%B9%B3%E8%87%AA%E6%B5%8B%E7%9D%A1%E7%9C%A0%E8%AE%B0%E5%BD%95/id6747254434",
"sharePartnerCodeTemplate": "My friend ID: {inviteCode}. Hey❤! Come and use DoubleFeel with me! It helps us care for each other—track stress and sleep, view HRV and body status, and stay updated on each other's health in real-time. Come join me 👉 https://apps.apple.com/cn/app/doublefeel-%E5%8F%8C%E4%BA%BA%E6%83%85%E7%BB%AA%E5%85%B1%E4%BA%ABhrv%E5%8E%8B%E5%8A%9B%E6%B0%B4%E5%B9%B3%E8%87%AA%E6%B5%8B%E7%9D%A1%E7%9C%A0%E8%AE%B0%E5%BD%95/id6747254434",
"@sharePartnerCodeTemplate": {
"description": "Share partner code template",
"placeholders": {
... ... @@ -566,13 +566,13 @@
}
}
},
"bindPartnerIdNotExistTitle": "ID does not exist",
"bindPartnerIdNotExistMessage": "This ID does not exist. Please check and try again",
"bindPartnerIdNotExistTitle": "User not found",
"bindPartnerIdNotExistMessage": "This user ID doesn’t exist. Please check and try again.",
"bindPartnerDialogGotIt": "Got it",
"bindPartnerAddFailedTitle": "Failed to add",
"bindPartnerAddFailedMessage": "This user does not allow adding friends, cannot add them",
"bindPartnerAlreadyFriendTitle": "They are already your friend",
"bindPartnerAlreadyFriendMessage": "Please do not add again",
"bindPartnerAddFailedTitle": "Unable to add friend",
"bindPartnerAddFailedMessage": "This user doesn’t allow friend requests.",
"bindPartnerAlreadyFriendTitle": "You’re already friends",
"bindPartnerAlreadyFriendMessage": "No need to add them again",
"friendStatusTitle": "{remarkName}'s Status",
"@friendStatusTitle": {
"description": "Friend status title",
... ... @@ -582,10 +582,10 @@
}
}
},
"annualMemberDiscounts": "Annual Member Discounts",
"specialOffers": "Special Offers",
"currentPrice": "Current Price",
"originalPrice": "Original price {price}",
"annualMemberDiscounts": "Special Offer",
"specialOffers": "OFF",
"currentPrice": "Now",
"originalPrice": "Was {price}",
"@originalPrice": {
"description": "Original price label",
"placeholders": {
... ... @@ -594,11 +594,11 @@
}
}
},
"freeRedemptionOffer": "Free Redemption Offer",
"freeRedemptionOffer": "Claim now",
"cellPhoneNumber": "Cell phone number",
"todayOnWeeklyCalendar": "today",
"hrvTrendForThatDay": "HRV Trend for That Day",
"todaySAverageHrv": "Today's Average HRV",
"hrvTrendForThatDay": "Avg. Hrv",
"todaySAverageHrv": "Avg. Hrv Today",
"helpNoDataReason1": "1. Ensure your Apple Watch is on watchOS 10.0+ and iPhone is on iOS 14+. The system version can be checked in [Settings] -> [General] -> [About].",
"helpNoDataReason2": "2. Confirm if all permissions are enabled: iPhone [Health] -> [Sharing] -> [Apps] -> [DoubleFeel] -> [Turn On All].",
"helpNoDataReason3": "3. Confirm if devices are in power-saving mode, low battery status, or if the watch is not worn snugly, as these conditions affect watch data collection.",
... ... @@ -613,7 +613,7 @@
"noHealthDataError2Body": "DoubleFeel requires access to Apple Health data to provide stress stats, alerts, and recommendations. If not authorized, some features may not work properly.\n\nRest assured, all health data is only stored locally and will not be uploaded.\n\nTo enable permissions, follow the prompt and select Allow All -> Health -> DoubleFeel in iOS Settings.",
"noHealthDataError3Title": "Error 3: System Issue",
"noHealthDataError3Body": "Based on user feedback, we found two reasons why HRV or heart rate data might be missing:\n\n1. Apple Watch not connected\n · If your Apple Watch has not been worn for a long time, heart rate data may not be collected.\n · Please check iOS Health App -> 'My Watch' to confirm if recent heart rate data was recorded while wearing the Apple Watch.\n · If not, please try wearing your Apple Watch for data collection and turn on the heart rate feature supported by Apple.\n\n2. Heart rate or HRV data missing in the past 30 days\n · Open iOS Health App -> Browse -> 'Heart Rate' or 'HRV' -> 'No Data Found' to confirm if it's missing.\n · If data is missing, please wear the watch again, restart your iPhone and Apple Watch, then open DoubleFeel again.",
"noHealthDataGoToSettings": "Go to Settings",
"noHealthDataGoToSettings": "Enable Now",
"watchThemeDefaultTheme": "Default Theme",
"watchThemeNoWatchTitle": "Apple Watch Not Found",
"watchThemeNoWatchMessage": "Pair an Apple Watch and try again",
... ... @@ -621,17 +621,17 @@
"watchThemeSelectFriend": "Select Friend",
"watchThemeSelectAndSync": "Select and Sync to Watch",
"watchThemeCustomTheme": "Custom Themes",
"watchThemeCustomDescription": "Capture every mood with your creativity and make a watch face that's uniquely yours.",
"watchThemeCreateTheme": "Create Theme",
"watchThemeCustomDescription": "Turn your emotions into a watch face that's uniquely yours. ⭐",
"watchThemeCreateTheme": "Create a Theme",
"watchThemeOfficialTheme": "Official Themes",
"watchThemeRenameStatus": "Rename Status",
"watchThemeEnterNickname": "Enter a name",
"watchThemeSave": "Save",
"watchThemeContentUnavailable": "This content is unavailable. Try another one.",
"watchThemeDialPreview": "Watch Face Preview",
"watchThemeDialPreview": "Watch Preview",
"watchThemeSwitchFriend": "Switch Friend",
"watchThemeStatusPreview": "Status Preview",
"watchThemeAddWatchFace": "Add Watch Face",
"watchThemeAddWatchFace": "Add to Watch",
"watchThemeInUse": "In Use",
"watchThemeUseNow": "Use Now",
"watchThemeSyncIntro": "Open the DoubleFeel app on your Apple Watch, then tap Next below.",
... ... @@ -647,7 +647,7 @@
}
}
},
"watchThemePreview": "Preview",
"watchThemePreview": "Watch Themes",
"watchThemeDelete": "Delete",
"watchThemePageTitle": "Watch Themes",
"watchThemeImagesOnly": "Images only",
... ...
... ... @@ -343,10 +343,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get todayHealthDataAuthDescription =>
'DoubleFeel needs access to your Apple Health data to provide stress analysis, sleep insights, and health reminders. Please complete health data authorization. If already authorized, the first sync may take a few minutes.\nIf your Apple Watch hasn\'t been worn long enough, there may not be sufficient data yet. Please continue wearing your watch to complete data collection.';
'DoubleFeel needs access to your Apple Health data to provide stress insights, Live Stress tracking, and health recommendations.\nIf you haven’t granted access, please allow permissions below. If you have already granted access, syncing your health data may take a few minutes. Please try again later.';
@override
String get todayHealthDataAuthAction => 'Allow Health Access';
String get todayHealthDataAuthAction => 'Continue';
@override
String get measureYourHrvNow => 'How to take a measurement';
... ... @@ -390,13 +390,13 @@ class AppLocalizationsEn extends AppLocalizations {
String get todayHrvPrincipleTitle => 'How HRV is measured';
@override
String get todayRealtimeStressTitle => 'How real-time stress works';
String get todayRealtimeStressTitle => 'How Live Stress works';
@override
String get todayStressStatusOverload => 'Stress overload';
String get todayStressStatusOverload => 'Overload';
@override
String get todayStressStatusCaution => 'Stress warning';
String get todayStressStatusCaution => 'Pay Attention';
@override
String get todayStressStatusNormal => 'Normal';
... ... @@ -429,38 +429,38 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get todayHrvMeasurementIntro =>
'Apple Watch measures HRV every 2-5 hours by default. If you want to measure it manually right now, follow these steps:';
'Apple Watch measures HRV automatically every 2–5 hours. If you’d like to take a manual measurement, follow these steps:';
@override
String get todayHrvMeasurementStep1 =>
'1. Wear your Apple Watch snugly, sit down, and stay calm';
'1. Wear your Apple Watch, sit down, and stay relaxed.';
@override
String get todayHrvMeasurementStep2 =>
'2. Open Mindfulness on Apple Watch and start Breathe';
'2. Open the “Mindfulness” app on your Apple Watch and start a “Breathe” session.';
@override
String get todayHrvMeasurementStep3 =>
'3. Keep breathing steadily and wait 1-3 minutes';
'3. Keep your breathing steady and wait for 1–3 minutes.';
@override
String get todayHrvMeasurementStep4 =>
'4. After breathing is complete, lock and unlock your iPhone once';
'4. After the breathing session ends, lock your Apple Watch and unlock your iPhone once.';
@override
String get todayHrvMeasurementStep5 =>
'5. Wait about one minute. DoubleFeel will receive and display your data';
'5. Wait about one minute. DoubleFeel will receive and display your data.';
@override
String get todayHrvMeasurementHint =>
'Tip: Data comes from Apple Watch. After measurement, there may be delays or data may not sync immediately. If this happens, measure again and wait for the data to be read.';
'Tip: Your data comes from Apple Watch. There may be a delay after measurement, or the data may not sync immediately. If this happens, please try measuring again and wait for the data to sync.';
@override
String get todayHrvMeasurementWarning =>
'Note: Health permissions must be enabled, and Low Power Mode must be turned off.';
@override
String get todayStressStatusWhatTitle => 'What is overall stress status?';
String get todayStressStatusWhatTitle => 'What is Overall Stress Status?';
@override
String get todayStressStatusWhatDescription1 =>
... ... @@ -503,7 +503,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get todayStressStatusAppWatchDifferenceWatch =>
'Apple Watch shows the most recent real-time stress status, which is better for quickly checking your current body changes.';
'Apple Watch shows the most recent Live Stress status, which is better for quickly checking your current body changes.';
@override
String get todayStressStatusWaitingDataTitle =>
... ... @@ -557,11 +557,11 @@ class AppLocalizationsEn extends AppLocalizations {
'To make results more accurate, DoubleFeel compares your current HRV state with your own 30-day average instead of comparing it directly with other people.';
@override
String get todayRealtimeStressWhatTitle => 'What is real-time stress?';
String get todayRealtimeStressWhatTitle => 'What is Live Stress?';
@override
String get todayRealtimeStressWhatDescription1 =>
'Real-time stress is a body stress indicator dynamically generated by DoubleFeel based on your current HRV, heart rate state, and changes in your personal history.';
'Live Stress is a body stress indicator dynamically generated by DoubleFeel based on your current HRV, heart rate state, and changes in your personal history.';
@override
String get todayRealtimeStressWhatDescription2 =>
... ... @@ -572,12 +572,11 @@ class AppLocalizationsEn extends AppLocalizations {
'It helps you notice body changes faster and adjust rest, exercise, and daily rhythm in time.';
@override
String get todayRealtimeStressDivisionTitle =>
'How is real-time stress divided?';
String get todayRealtimeStressDivisionTitle => 'How is Live Stress Scored?';
@override
String get todayRealtimeStressDivisionIntro =>
'Real-time stress is shown as a percentage:';
'Live stress is displayed as a percentage:';
@override
String get todayRealtimeStressExcellentRange => 'Excellent: 1%-20%';
... ... @@ -586,38 +585,38 @@ class AppLocalizationsEn extends AppLocalizations {
String get todayRealtimeStressNormalRange => 'Normal: 21%-60%';
@override
String get todayRealtimeStressCautionRange => 'Stress warning: 61%-80%';
String get todayRealtimeStressCautionRange => 'Pay Attention: 61%-80%';
@override
String get todayRealtimeStressOverloadRange => 'Stress overload: 81%-100%';
String get todayRealtimeStressOverloadRange => 'Overload: 81%-100%';
@override
String get todayRealtimeStressExcellentDescription =>
'Your recovery state is good and you are generally relaxed.';
'Your body is in a good recovery state and feels more relaxed.';
@override
String get todayRealtimeStressNormalDescription =>
'Your body is within the normal fluctuation range.';
'Your body is within a normal fluctuation range.';
@override
String get todayRealtimeStressCautionDescription =>
'Your body may be accumulating stress and needs proper rest and recovery.';
'Your body may be accumulating stress. Consider taking breaks and recovering.';
@override
String get todayRealtimeStressOverloadDescription =>
'Your body stress is clearly high. Reduce load and pay attention to sleep and recovery.';
'Your body may be under significant stress. Consider reducing your workload and prioritizing sleep and recovery.';
@override
String get todayRealtimeStressDivisionBaseline =>
'These ranges are adjusted dynamically based on your personal baseline and should not be directly compared between users.';
'These ranges are adjusted based on your personal baseline and activity patterns. Results are not directly comparable between different users.';
@override
String get todayRealtimeStressDivisionAwake =>
'Real-time stress mainly reflects body stress changes while awake.';
'Live Stress mainly reflects changes in your body’s stress level while you are awake.';
@override
String get todayRealtimeStressLowBetterTitle =>
'Is lower real-time stress always better?';
'Is lower Live Stress always better?';
@override
String get todayRealtimeStressLowBetterNo => 'Not necessarily.';
... ... @@ -640,7 +639,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get todayRealtimeStressScenarioTitle =>
'When should HRV and real-time stress be used?';
'When should HRV and Live Stress be used?';
@override
String get todayRealtimeStressScenarioHrvDefault =>
... ... @@ -652,11 +651,11 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get todayRealtimeStressScenarioIntro =>
'To address the long interval between HRV updates, DoubleFeel designed real-time stress:';
'To address the long interval between HRV updates, DoubleFeel designed Live Stress:';
@override
String get todayRealtimeStressScenarioUpdateEvery6Min =>
Real-time stress updates every 6 minutes (Friend status updates rely on Apple Health sync and may experience brief delays due to system mechanisms. If your friend uses DoubleFeel frequently, their health status will be updated more promptly)';
Live Stress updates every 6 minutes (Friend status updates rely on Apple Health sync and may experience brief delays due to system mechanisms. If your friend uses DoubleFeel frequently, their health status will be updated more promptly)';
@override
String get todayRealtimeStressScenarioTimely =>
... ... @@ -664,11 +663,11 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get todayRealtimeStressScenarioConsistentTrend =>
'· In most cases, the real-time stress trend is consistent with the HRV trend';
'· In most cases, the Live Stress trend is consistent with the HRV trend';
@override
String get todayRealtimeStressScenarioSummary =>
'This lets users see long-term HRV trends while also using real-time stress as a short-term body-state reference.';
'This lets users see long-term HRV trends while also using Live Stress as a short-term body-state reference.';
@override
String get todayFaqNoDataTitle =>
... ... @@ -792,37 +791,35 @@ class AppLocalizationsEn extends AppLocalizations {
String get backToToday => 'Back to Today';
@override
String get redeemOffer => 'Redeem Offer';
String get redeemOffer => 'Claim Offer';
@override
String get allPlans => 'All Plans';
@override
String get clickToAddTheHrvThemedWatchFace =>
'Click to add the HRV-themed watch face';
String get clickToAddTheHrvThemedWatchFace => 'Add HRV Watch Face';
@override
String get stayOnTopOfYourHealthFluctuations =>
'Stay on top of your health fluctuations';
String get stayOnTopOfYourHealthFluctuations => 'Stay on top of your health';
@override
String get addACloseContact => 'Add a close contact';
String get addACloseContact => 'Add a Close Contact';
@override
String get oneMorePersonLookingOutForYourHealth =>
'One more person looking out for your health';
'Have someone care about your health';
@override
String get addAFriend => 'Add a friend';
String get addAFriend => 'Add';
@override
String get averageHrvForTheDay => 'Average HRV for the day';
String get averageHrvForTheDay => 'Avg. Hrv';
@override
String get restingHeartRate => 'Resting heart rate';
String get restingHeartRate => 'RHR';
@override
String get todaySHrvTrend => 'Today\'s HRV Trend';
String get todaySHrvTrend => 'HRV Trend';
@override
String get more => 'More';
... ... @@ -831,7 +828,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get noDataAvailableForToday => 'No data available for today';
@override
String get realTimePressure => 'Real-time pressure';
String get realTimePressure => 'Live Stress';
@override
String get accountInformation => 'Account Information';
... ... @@ -900,7 +897,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get confirmLogoutPrompt => 'Are you sure you want to log out?';
@override
String get confirmLogout => 'Log Out';
String get confirmLogout => 'Yes, I’m sure';
@override
String get loggedOutSuccessfully => 'Logged out successfully';
... ... @@ -910,31 +907,31 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get deleteAccountWarningTitle =>
'Once deleted, the account cannot be recovered! Please proceed with caution.';
'Account deletion cannot be undone. Please proceed carefully.';
@override
String get deleteAccountWarningPrompt =>
'Note: Deleting the account will remove all information in this account, including but not limited to\npersonal profile, mood records, and statistical data.';
'1. Deleting your account will permanently remove all your data, including health records, statistics, and account information.';
@override
String get deleteAccountWarningNote1 =>
'Note 1: Your health data will be saved in Apple Health, and we will not delete data from Apple Health.';
'2. To protect your privacy, we cannot recover deleted accounts or data.';
@override
String get deleteAccountWarningNote2 =>
'Note 2: Deleting the account will not affect your subscription status in the App Store. If you need to cancel the subscription, please cancel it manually in the App Store -> Profile -> Subscriptions.';
'3. If you have an active subscription through the App Store, please cancel it in App Store → Subscriptions before deleting your account.';
@override
String get confirmDeletion => 'Confirm Deletion';
String get confirmDeletion => 'Delete Account';
@override
String get iLlThinkAboutItSomeMore => 'I\'ll think about it some more.';
String get iLlThinkAboutItSomeMore => 'Keep My Account';
@override
String get sleep => 'Sleep';
@override
String get viewSleepReport => 'View Sleep Report';
String get viewSleepReport => 'View Details';
@override
String get duration => 'Duration';
... ... @@ -943,28 +940,28 @@ class AppLocalizationsEn extends AppLocalizations {
String get quality => 'Quality';
@override
String get averageHeartRate => 'Average heart rate';
String get averageHeartRate => 'Avg HR';
@override
String get fitness => 'Fitness';
@override
String get viewFitnessReport => 'View Fitness Report';
String get viewFitnessReport => 'View Details';
@override
String get event => 'Event';
String get event => 'Move';
@override
String get exercise => 'Exercise';
@override
String get standing => 'Standing';
String get standing => 'Stand';
@override
String get dailyActions => 'Daily Actions';
String get dailyActions => 'Actions';
@override
String get trendHrvHeartRate => 'HRV';
String get trendHrvHeartRate => 'HRV & HR';
@override
String get trendActivityBurn => 'Activity';
... ... @@ -973,16 +970,16 @@ class AppLocalizationsEn extends AppLocalizations {
String get trendSleepReport => 'Sleep';
@override
String get reportPeriodDay => 'Day';
String get reportPeriodDay => 'D';
@override
String get reportPeriodWeek => 'Week';
String get reportPeriodWeek => 'W';
@override
String get reportPeriodMonth => 'Month';
String get reportPeriodMonth => 'M';
@override
String get reportPeriodYear => 'Year';
String get reportPeriodYear => 'Y';
@override
String reportDateYear(int year) {
... ... @@ -1026,7 +1023,7 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get reportWaitingForData => 'Waiting for data';
String get reportWaitingForData => 'Waiting for Data';
@override
String get reportWaitingForOtherData => 'Waiting for their data';
... ... @@ -1207,7 +1204,7 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get hrvUnlockNow => 'Unlock Now';
String get hrvUnlockNow => 'Unlock';
@override
String get hrvTrendTitle => 'HRV Trend';
... ... @@ -1438,11 +1435,11 @@ class AppLocalizationsEn extends AppLocalizations {
String get friendsLimitReached => 'You can add up to 10 friends';
@override
String get friendsAddCloseContact => 'Add a close contact';
String get friendsAddCloseContact => 'Add Loved One';
@override
String friendsAddCloseContactWithCount(int count, int max) {
return 'Add a close contact ($count/$max)';
return 'Add Loved One ($count/$max)';
}
@override
... ... @@ -1506,19 +1503,19 @@ class AppLocalizationsEn extends AppLocalizations {
String get friendsRemove => 'Remove';
@override
String get friendsEditRemark => 'Edit nickname';
String get friendsEditRemark => 'Edit Note';
@override
String get friendsShowOnWatchFace => 'Show on watch';
String get friendsShowOnWatchFace => 'Show on Watch';
@override
String get friendsShownOnWatchFace => 'Shown on watch';
String get friendsShownOnWatchFace => 'Shown on Watch';
@override
String get friendsSelect => 'Select a friend';
@override
String get friendsSelectAndSync => 'Select and sync to watch';
String get friendsSelectAndSync => 'Select and sync to Watch';
@override
String get friendsBack => 'Back';
... ... @@ -1558,22 +1555,22 @@ class AppLocalizationsEn extends AppLocalizations {
String get friendsPromptSelfIdMessage => 'Enter your close contact\'s ID.';
@override
String get friendsEditRemarkTitle => 'Edit friend nickname';
String get friendsEditRemarkTitle => 'Edit Note';
@override
String get friendsEditRemarkHint => 'Enter a nickname';
String get friendsEditRemarkHint => 'Enter a note';
@override
String get friendsSave => 'Save';
@override
String friendsDeleteConfirmTitle(String name) {
return 'Remove $name from your friends?';
return 'Remove this friend?';
}
@override
String get friendsDeleteConfirmMessage =>
'You will no longer be able to view their mood or health status.';
'You’ll no longer receive their wellness updates after removal.';
@override
String get friendsDeleteConfirmAction => 'Remove';
... ... @@ -1582,14 +1579,14 @@ class AppLocalizationsEn extends AppLocalizations {
String get privacySettingsTitle => 'Privacy Settings';
@override
String get privacySettingsDisableAddById =>
'Don\'t allow others to add me by ID';
String get privacySettingsDisableAddById => 'Block Friend Requests';
@override
String get privacySettingsShowRealtimeStress => 'Show real-time stress';
@override
String get premiumActivatedTitle => 'DoubleFeel Pro is now active';
String get premiumActivatedTitle =>
'Congratulations! You’re now a DoubleFeel Pro member.';
@override
String get premiumActivatedDescription =>
... ... @@ -1599,13 +1596,13 @@ class AppLocalizationsEn extends AppLocalizations {
String get premiumActivatedContinue => 'Continue';
@override
String get purchaseHeroTitle => 'Unlock Pro for more timely care';
String get purchaseHeroTitle => 'Unlock Pro, Care Better';
@override
String get purchaseBenefitsTitle => 'Enjoy all premium benefits';
String get purchaseBenefitsTitle => 'Unlock All Pro Benefits';
@override
String get purchaseUnlockNow => 'Unlock Now';
String get purchaseUnlockNow => 'Unlock';
@override
String get purchaseRestore => 'Restore';
... ... @@ -1668,36 +1665,35 @@ class AppLocalizationsEn extends AppLocalizations {
String get purchaseApplePaymentFailed => 'Unknown error.';
@override
String get purchaseBenefitRealtimeStress => 'Real-time stress monitoring';
String get purchaseBenefitRealtimeStress => 'Live Stress Monitoring';
@override
String get purchaseBenefitStressTrends =>
'Weekly, monthly, and yearly stress trends';
'Daily / Monthly / Yearly HRV Trends';
@override
String get purchaseBenefitActivityTrends =>
'Weekly, monthly, and yearly activity trends';
'Daily / Monthly / Yearly Activity Trends';
@override
String get purchaseBenefitSleepReports =>
'Weekly, monthly, and yearly sleep reports';
'Daily / Monthly / Yearly Sleep Reports';
@override
String get purchaseBenefitHealthSync => 'Real-time health data sync';
String get purchaseBenefitHealthSync => 'Real-Time Health Data Sync';
@override
String get purchaseBenefitContactNotifications =>
'Real-time health updates for close contacts';
'Real-Time Health Updates to Loved Ones';
@override
String get purchaseBenefitCustomWatchFace => 'Exclusive custom watch faces';
String get purchaseBenefitCustomWatchFace => 'Exclusive Custom Watch Faces';
@override
String get purchaseBenefitSleepAnalysis => 'Sleep analysis';
@override
String get purchaseBenefitFutureFeatures =>
'Free access to future premium features';
String get purchaseBenefitFutureFeatures => 'More Pro Benefits Coming Soon';
@override
String get purchaseNotesTitle => 'Notes';
... ... @@ -1843,7 +1839,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get appReviewPromptMessage =>
'Hi! Is DoubleFeel helping you better understand\nyour stress and sleep? 💜';
'We\'d love to know if DoubleFeel is helping you better understand your stress and sleep. 💜';
@override
String get appReviewPromptLikeActionEmoji => '😍';
... ... @@ -1852,15 +1848,15 @@ class AppLocalizationsEn extends AppLocalizations {
String get appReviewPromptLikeAction => 'Love it';
@override
String get appReviewPromptFeedbackAction => 'I have feedback';
String get appReviewPromptFeedbackAction => 'Not Really';
@override
String get appReviewFeedbackTitle =>
'We\'re sorry DoubleFeel didn\'t give you\na good experience';
'Sorry DoubleFeel Didn\'t Meet Your Expectations';
@override
String get appReviewFeedbackMessage =>
'Would you tell us what went wrong?\nYour feedback helps us improve the stress and health experience. 💜';
'Tell us what happened and how we can improve. Your feedback helps make DoubleFeel better for everyone. 💜';
@override
String get appReviewFeedbackSendAction => 'Send Feedback';
... ... @@ -1882,11 +1878,10 @@ class AppLocalizationsEn extends AppLocalizations {
'No pressure data available at this time';
@override
String get membersCanViewTheCompleteData =>
'Members can view the complete data';
String get membersCanViewTheCompleteData => 'Unlock Pro to view';
@override
String get unlockNow => 'Unlock Now';
String get unlockNow => 'Unlock';
@override
String get pressureOverload => 'Pressure Overload';
... ... @@ -1907,7 +1902,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get pressure => 'Pressure';
@override
String get mostRecent => 'Most recent';
String get mostRecent => 'Latest Reading';
@override
String get theDayBeforeYesterday => 'The day before yesterday';
... ... @@ -1927,31 +1922,31 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String sharePartnerCodeTemplate(String inviteCode) {
return 'My friend ID: $inviteCode. Hey ❤️ Come and use DoubleFeel with me! It helps us care for each other—track stress and sleep, view HRV and body status, and stay updated on each other\'s health in real-time. Come join me 👉 https://apps.apple.com/cn/app/doublefeel-%E5%8F%8C%E4%BA%BA%E6%83%85%E7%BB%AA%E5%85%B1%E4%BA%ABhrv%E5%8E%8B%E5%8A%9B%E6%B0%B4%E5%B9%B3%E8%87%AA%E6%B5%8B%E7%9D%A1%E7%9C%A0%E8%AE%B0%E5%BD%95/id6747254434';
return 'My friend ID: $inviteCode. Hey❤! Come and use DoubleFeel with me! It helps us care for each other—track stress and sleep, view HRV and body status, and stay updated on each other\'s health in real-time. Come join me 👉 https://apps.apple.com/cn/app/doublefeel-%E5%8F%8C%E4%BA%BA%E6%83%85%E7%BB%AA%E5%85%B1%E4%BA%ABhrv%E5%8E%8B%E5%8A%9B%E6%B0%B4%E5%B9%B3%E8%87%AA%E6%B5%8B%E7%9D%A1%E7%9C%A0%E8%AE%B0%E5%BD%95/id6747254434';
}
@override
String get bindPartnerIdNotExistTitle => 'ID does not exist';
String get bindPartnerIdNotExistTitle => 'User not found';
@override
String get bindPartnerIdNotExistMessage =>
'This ID does not exist. Please check and try again';
'This user ID doesn’t exist. Please check and try again.';
@override
String get bindPartnerDialogGotIt => 'Got it';
@override
String get bindPartnerAddFailedTitle => 'Failed to add';
String get bindPartnerAddFailedTitle => 'Unable to add friend';
@override
String get bindPartnerAddFailedMessage =>
'This user does not allow adding friends, cannot add them';
'This user doesn’t allow friend requests.';
@override
String get bindPartnerAlreadyFriendTitle => 'They are already your friend';
String get bindPartnerAlreadyFriendTitle => 'You’re already friends';
@override
String get bindPartnerAlreadyFriendMessage => 'Please do not add again';
String get bindPartnerAlreadyFriendMessage => 'No need to add them again';
@override
String friendStatusTitle(String remarkName) {
... ... @@ -1959,21 +1954,21 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get annualMemberDiscounts => 'Annual Member Discounts';
String get annualMemberDiscounts => 'Special Offer';
@override
String get specialOffers => 'Special Offers';
String get specialOffers => 'OFF';
@override
String get currentPrice => 'Current Price';
String get currentPrice => 'Now';
@override
String originalPrice(String price) {
return 'Original price $price';
return 'Was $price';
}
@override
String get freeRedemptionOffer => 'Free Redemption Offer';
String get freeRedemptionOffer => 'Claim now';
@override
String get cellPhoneNumber => 'Cell phone number';
... ... @@ -1982,10 +1977,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get todayOnWeeklyCalendar => 'today';
@override
String get hrvTrendForThatDay => 'HRV Trend for That Day';
String get hrvTrendForThatDay => 'Avg. Hrv';
@override
String get todaySAverageHrv => 'Today\'s Average HRV';
String get todaySAverageHrv => 'Avg. Hrv Today';
@override
String get helpNoDataReason1 =>
... ... @@ -2039,7 +2034,7 @@ class AppLocalizationsEn extends AppLocalizations {
'Based on user feedback, we found two reasons why HRV or heart rate data might be missing:\n\n1. Apple Watch not connected\n · If your Apple Watch has not been worn for a long time, heart rate data may not be collected.\n · Please check iOS Health App -> \'My Watch\' to confirm if recent heart rate data was recorded while wearing the Apple Watch.\n · If not, please try wearing your Apple Watch for data collection and turn on the heart rate feature supported by Apple.\n\n2. Heart rate or HRV data missing in the past 30 days\n · Open iOS Health App -> Browse -> \'Heart Rate\' or \'HRV\' -> \'No Data Found\' to confirm if it\'s missing.\n · If data is missing, please wear the watch again, restart your iPhone and Apple Watch, then open DoubleFeel again.';
@override
String get noHealthDataGoToSettings => 'Go to Settings';
String get noHealthDataGoToSettings => 'Enable Now';
@override
String get watchThemeDefaultTheme => 'Default Theme';
... ... @@ -2064,10 +2059,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get watchThemeCustomDescription =>
'Capture every mood with your creativity and make a watch face that\'s uniquely yours.';
'Turn your emotions into a watch face that\'s uniquely yours. ⭐';
@override
String get watchThemeCreateTheme => 'Create Theme';
String get watchThemeCreateTheme => 'Create a Theme';
@override
String get watchThemeOfficialTheme => 'Official Themes';
... ... @@ -2086,7 +2081,7 @@ class AppLocalizationsEn extends AppLocalizations {
'This content is unavailable. Try another one.';
@override
String get watchThemeDialPreview => 'Watch Face Preview';
String get watchThemeDialPreview => 'Watch Preview';
@override
String get watchThemeSwitchFriend => 'Switch Friend';
... ... @@ -2095,7 +2090,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get watchThemeStatusPreview => 'Status Preview';
@override
String get watchThemeAddWatchFace => 'Add Watch Face';
String get watchThemeAddWatchFace => 'Add to Watch';
@override
String get watchThemeInUse => 'In Use';
... ... @@ -2125,7 +2120,7 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get watchThemePreview => 'Preview';
String get watchThemePreview => 'Watch Themes';
@override
String get watchThemeDelete => 'Delete';
... ...
... ... @@ -804,10 +804,10 @@ packages:
dependency: transitive
description:
name: posix
sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07"
sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e
url: "https://pub.dev"
source: hosted
version: "6.5.0"
version: "6.5.2"
pretty_dio_logger:
dependency: "direct main"
description:
... ... @@ -974,26 +974,26 @@ packages:
dependency: transitive
description:
name: sqflite_android
sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40"
sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3"
url: "https://pub.dev"
source: hosted
version: "2.4.2+3"
version: "2.4.0"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465"
sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
url: "https://pub.dev"
source: hosted
version: "2.5.8"
version: "2.5.4+6"
sqflite_darwin:
dependency: transitive
description:
name: sqflite_darwin
sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "2.4.1+1"
sqflite_ohos:
dependency: transitive
description:
... ... @@ -1055,10 +1055,10 @@ packages:
dependency: "direct main"
description:
name: table_calendar
sha256: "0c0c6219878b363a2d5f40c7afb159d845f253d061dc3c822aa0d5fe0f721982"
sha256: f276347cad425ef837a41e8d9ad43f3ee7d59227aa4c36d7430607a5a18fa3b3
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.1"
term_glyph:
dependency: transitive
description:
... ... @@ -1079,10 +1079,10 @@ packages:
dependency: "direct main"
description:
name: thinking_analytics
sha256: "0ef269a8469ff5795f581505e34af67af3d6ef9be1ce9ce80ca2269694ebb282"
sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02
url: "https://pub.dev"
source: hosted
version: "3.3.2"
version: "3.3.3"
timing:
dependency: transitive
description:
... ... @@ -1103,10 +1103,10 @@ packages:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a
url: "https://pub.dev"
source: hosted
version: "3.2.1"
version: "3.2.2"
url_launcher_platform_interface:
dependency: transitive
description:
... ... @@ -1119,18 +1119,18 @@ packages:
dependency: transitive
description:
name: url_launcher_web
sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.3"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
version: "3.1.5"
uuid:
dependency: transitive
description:
... ... @@ -1244,10 +1244,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e
sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba"
url: "https://pub.dev"
source: hosted
version: "5.10.1"
version: "5.13.0"
xdg_directories:
dependency: transitive
description:
... ...