A Health Connect row in the account sheet opens its screen: Write my workouts, off until turned on, Health Connect asking as it is. Then every workout this phone holds is written there (its session with its pauses and route, heart rate, speed and the rower's watts as samples, distance and elevation gained), and written again or deleted as it changes, here or through a sync, and as the app opens. Client IDs come from the workout's ID, a version counts up with each change; what was written is kept in the person's health_connect.json, never synced. A permission taken back in Health Connect turns writing off and says so; Health Connect's link to Train's rationale opens a screen of its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
194 lines
13 KiB
Text
194 lines
13 KiB
Text
{
|
||
"@@locale": "en",
|
||
|
||
"appTitle": "Halkyon Train",
|
||
"@appTitle": {"description": "The app's name: the window's title, and where halkyon_app's texts name the app."},
|
||
"launchProduct": "Train",
|
||
"@launchProduct": {"description": "The app's word in its wordmark, under \"Halkyon\"."},
|
||
|
||
"instanceFirstStartSubtitle": "Choose the instance to keep your workouts on. Someone runs each one; you can add others later.",
|
||
|
||
"homeEmptyTitle": "No workouts yet",
|
||
"homeEmptyHint": "Workouts recorded on your phone show here.",
|
||
|
||
"accountTitle": "Account",
|
||
"accountDeleteMessage": "Your account is deleted on the server and on all your devices. This can't be undone.",
|
||
|
||
"aboutTitle": "About",
|
||
|
||
"homeRecordHint": "Record one with the button below.",
|
||
"recordAction": "Record",
|
||
"recordBack": "Back to the recording",
|
||
"recordSheetTitle": "Record a workout",
|
||
"activityRunning": "Running",
|
||
"activityWalking": "Walking",
|
||
"activityHiking": "Hiking",
|
||
"activityCycling": "Cycling",
|
||
"activityIndoorRowing": "Rowing indoors",
|
||
"recordAutoPause": "Pause by itself",
|
||
"@recordAutoPause": {"description": "The switch for auto-pause, as the recording starts."},
|
||
"recordAutoPauseHint": "When you stand still, and going on as you move again",
|
||
"recordStart": "Start",
|
||
"recordLocationRefused": "Train needs your location to record this. You can allow it in the system's settings.",
|
||
"recordingWaitingForGps": "Waiting for GPS",
|
||
"recordingWaitingForGpsAccuracy": "Waiting for GPS · ±{metres} m",
|
||
"@recordingWaitingForGpsAccuracy": {"description": "Before a fix precise enough: how far off the last one may be.", "placeholders": {"metres": {"type": "int"}}},
|
||
"recordingGpsAccuracy": "GPS ±{metres} m",
|
||
"@recordingGpsAccuracy": {"description": "How far off the last fix may be.", "placeholders": {"metres": {"type": "int"}}},
|
||
"recordingMovingTime": "moving time",
|
||
"@recordingMovingTime": {"description": "Under the time, lower case: the time moved, pauses left out."},
|
||
"recordingDistance": "distance",
|
||
"recordingPace": "pace",
|
||
"recordingSpeed": "speed",
|
||
"recordingDistanceValue": "{km} km",
|
||
"@recordingDistanceValue": {"placeholders": {"km": {"type": "String", "example": "5.12"}}},
|
||
"recordingPaceValue": "{pace} /km",
|
||
"@recordingPaceValue": {"description": "Minutes and seconds a kilometre takes.", "placeholders": {"pace": {"type": "String", "example": "6:18"}}},
|
||
"recordingSpeedValue": "{kmh} km/h",
|
||
"@recordingSpeedValue": {"placeholders": {"kmh": {"type": "String", "example": "24.3"}}},
|
||
"recordingPausedAuto": "Paused: not moving",
|
||
"@recordingPausedAuto": {"description": "Train paused the recording by itself (auto-pause)."},
|
||
"recordingPausedByHand": "Paused",
|
||
"recordingPause": "Pause",
|
||
"recordingResume": "Resume",
|
||
"recordingStop": "Stop",
|
||
"recordingHoldToStop": "Hold Stop to end the workout",
|
||
"recordingStoppedTitle": "Save this workout?",
|
||
"recordingSave": "Save",
|
||
"recordingDiscard": "Discard",
|
||
"recordingDiscardTitle": "Discard this workout?",
|
||
"recordingDiscardMessage": "Its time and track are deleted from this device. This can't be undone.",
|
||
"recordingSaveFailed": "It can't be saved on this device, which doesn't hold your account's keys. It stays here until it can be.",
|
||
"recordingCutOffTitle": "A recording was cut off",
|
||
"recordingCutOffMessage": "A recording from {start} was cut off. Save it up to {end}, or discard it?",
|
||
"@recordingCutOffMessage": {"description": "A recording found unfinished as the app opened: when it started and its last sample.", "placeholders": {"start": {"type": "String", "example": "07:30"}, "end": {"type": "String", "example": "08:02"}}},
|
||
"recordingNotificationChannel": "Recording",
|
||
"@recordingNotificationChannel": {"description": "The name of the recording's notification channel, in the system's settings."},
|
||
"recordingNotificationPaused": "{activity} · paused",
|
||
"@recordingNotificationPaused": {"description": "The notification's title while paused.", "placeholders": {"activity": {"type": "String", "example": "Running"}}},
|
||
|
||
"workoutName": "{when, select, morning_running{Morning run} morning_walking{Morning walk} morning_hiking{Morning hike} morning_cycling{Morning ride} morning_indoorRowing{Morning row} afternoon_running{Afternoon run} afternoon_walking{Afternoon walk} afternoon_hiking{Afternoon hike} afternoon_cycling{Afternoon ride} afternoon_indoorRowing{Afternoon row} evening_running{Evening run} evening_walking{Evening walk} evening_hiking{Evening hike} evening_cycling{Evening ride} evening_indoorRowing{Evening row} night_running{Night run} night_walking{Night walk} night_hiking{Night hike} night_cycling{Night ride} night_indoorRowing{Night row} other{Workout}}",
|
||
"@workoutName": {"description": "A workout's name where the person gave none: the time of day it started (morning 5–12, afternoon 12–17, evening 17–22, night) and its activity, as Strava names them.", "placeholders": {"when": {"type": "String"}}},
|
||
"workoutLocked": "Locked workout",
|
||
"workoutLockedHint": "This device doesn't hold the key it's sealed with.",
|
||
"@workoutLockedHint": {"description": "Under a workout this device can't open (its key is missing here)."},
|
||
"workoutEdit": "Edit",
|
||
"workoutEditTitle": "Edit workout",
|
||
"workoutNameLabel": "Name",
|
||
"workoutNotesLabel": "Notes",
|
||
"workoutSave": "Save",
|
||
"workoutDelete": "Delete",
|
||
"workoutDeleteTitle": "Delete this workout?",
|
||
"workoutDeleteMessage": "It's deleted on all your devices.",
|
||
"workoutDeleted": "Workout deleted",
|
||
"workoutMovingTime": "moving time",
|
||
"workoutTotalTime": "whole time",
|
||
"@workoutTotalTime": {"description": "Lower case, under a figure: from start to end, pauses included."},
|
||
"workoutDistance": "distance",
|
||
"workoutPace": "pace",
|
||
"workoutSpeed": "speed",
|
||
"workoutClimb": "climbed",
|
||
"@workoutClimb": {"description": "Lower case, under a figure: the elevation gained."},
|
||
"workoutClimbValue": "{metres} m",
|
||
"@workoutClimbValue": {"placeholders": {"metres": {"type": "int"}}},
|
||
"workoutSplits": "Splits",
|
||
"workoutSplitKm": "km {number}",
|
||
"@workoutSplitKm": {"description": "A kilometre's split, its number.", "placeholders": {"number": {"type": "int"}}},
|
||
"workoutSplitFiveKm": "{from}–{to} km",
|
||
"@workoutSplitFiveKm": {"description": "A cycling split of 5 km: where it starts and ends.", "placeholders": {"from": {"type": "int"}, "to": {"type": "int"}}},
|
||
"workoutPaceChart": "Pace",
|
||
"workoutSpeedChart": "Speed",
|
||
"workoutElevationChart": "Elevation",
|
||
"workoutMapSource": "Map by {name}: it sees your device's address and the area shown, not your track.",
|
||
"@workoutMapSource": {"description": "Under a workout's map: what the map's source sees.", "placeholders": {"name": {"type": "String", "example": "OpenFreeMap"}}},
|
||
"workoutMapSourceAbout": "What {name} keeps",
|
||
"@workoutMapSourceAbout": {"description": "A link to the map source's page about what it keeps.", "placeholders": {"name": {"type": "String", "example": "OpenFreeMap"}}},
|
||
"workoutMapUnavailable": "The map can't be loaded now.",
|
||
"workoutNotFound": "This workout is gone.",
|
||
|
||
"recordHeartRate": "Heart rate",
|
||
"recordNoStrap": "No strap",
|
||
"@recordNoStrap": {"description": "On the Record sheet, under Heart rate, where no strap is chosen."},
|
||
"strapSheetTitle": "Heart-rate strap",
|
||
"strapSearching": "Looking for straps nearby…",
|
||
"strapSearchingHint": "Put the strap on: most wake up only once they touch skin.",
|
||
"strapNear": "close by",
|
||
"@strapNear": {"description": "Under a strap found: its signal is strong."},
|
||
"strapFar": "further off",
|
||
"@strapFar": {"description": "Under a strap found: its signal is weak."},
|
||
"strapUnnamed": "Unnamed strap",
|
||
"@strapUnnamed": {"description": "A strap that sends no name."},
|
||
"strapForget": "Forget strap",
|
||
"strapRefused": "Train needs nearby devices to find your strap. You can allow it in the system's settings.",
|
||
"strapBluetoothOff": "Bluetooth is off. Turn it on to look for devices nearby.",
|
||
"recordingHeartRate": "heart rate",
|
||
"@recordingHeartRate": {"description": "Under the heart rate, lower case."},
|
||
"recordingStrapLost": "Strap lost",
|
||
"@recordingStrapLost": {"description": "While recording: the strap is out of reach or off; Train keeps asking for it."},
|
||
"workoutAverageHeartRate": "average heart rate",
|
||
"@workoutAverageHeartRate": {"description": "Lower case, under a figure."},
|
||
"workoutMaxHeartRate": "highest heart rate",
|
||
"@workoutMaxHeartRate": {"description": "Lower case, under a figure."},
|
||
"workoutBpmValue": "{bpm} bpm",
|
||
"@workoutBpmValue": {"placeholders": {"bpm": {"type": "int"}}},
|
||
"workoutHeartRateChart": "Heart rate",
|
||
|
||
"recordRower": "Rowing machine",
|
||
"recordNoRower": "Choose your rowing machine",
|
||
"recordRowerRefused": "Train needs nearby devices to record from your rowing machine. You can allow it in the system's settings.",
|
||
"rowerSheetTitle": "Rowing machine",
|
||
"rowerSearching": "Looking for rowing machines nearby…",
|
||
"rowerSearchingHint": "Wake the console: most show once you pull or press a button. One another app holds (Christopeit Connect, Kinomap) can't be found: close that app first.",
|
||
"rowerUnnamed": "Unnamed rowing machine",
|
||
"rowerForget": "Forget rowing machine",
|
||
"rowerRefused": "Train needs nearby devices to find your rowing machine. You can allow it in the system's settings.",
|
||
"recordingRowerConnecting": "Looking for the rowing machine",
|
||
"@recordingRowerConnecting": {"description": "While recording a row: the rower isn't connected yet. Another app may hold it."},
|
||
"recordingRowerLost": "Rowing machine lost",
|
||
"@recordingRowerLost": {"description": "While recording a row: the rower is out of reach or off; Train keeps asking for it."},
|
||
"recordingSplit": "split",
|
||
"@recordingSplit": {"description": "Lower case, under a figure: how long 500 m take now."},
|
||
"recordingStrokeRate": "strokes a minute",
|
||
"@recordingStrokeRate": {"description": "Lower case, under a figure."},
|
||
"recordingWatts": "watts",
|
||
"@recordingWatts": {"description": "Lower case, under a figure."},
|
||
"workoutSplitValue": "{split} /500 m",
|
||
"@workoutSplitValue": {"description": "Minutes and seconds 500 m take.", "placeholders": {"split": {"type": "String", "example": "2:04"}}},
|
||
"workoutAverageSplit": "average split",
|
||
"@workoutAverageSplit": {"description": "Lower case, under a figure."},
|
||
"workoutAverageStrokeRate": "average stroke rate",
|
||
"@workoutAverageStrokeRate": {"description": "Lower case, under a figure."},
|
||
"workoutStrokeRateValue": "{rate} /min",
|
||
"@workoutStrokeRateValue": {"description": "Strokes a minute.", "placeholders": {"rate": {"type": "String", "example": "24"}}},
|
||
"workoutAveragePower": "average power",
|
||
"@workoutAveragePower": {"description": "Lower case, under a figure."},
|
||
"workoutMaxPower": "highest power",
|
||
"@workoutMaxPower": {"description": "Lower case, under a figure."},
|
||
"workoutWattsValue": "{watts} W",
|
||
"@workoutWattsValue": {"placeholders": {"watts": {"type": "int"}}},
|
||
"workoutStrokes": "strokes",
|
||
"@workoutStrokes": {"description": "Lower case, under a figure: how many strokes."},
|
||
"workoutSplitMetres": "{from}–{to} m",
|
||
"@workoutSplitMetres": {"description": "A rowing split of 500 m: where it starts and ends.", "placeholders": {"from": {"type": "int"}, "to": {"type": "int"}}},
|
||
"workoutSplitChart": "Split",
|
||
"workoutStrokeRateChart": "Stroke rate",
|
||
"workoutPowerChart": "Power",
|
||
"recordAutoPauseRowingHint": "When you stop rowing, going on with the next stroke",
|
||
"recordingMetres": "metres",
|
||
|
||
"healthTitle": "Health Connect",
|
||
"healthHint": "Share workouts with other apps on this phone",
|
||
"@healthHint": {"description": "Under Health Connect in the account sheet."},
|
||
"healthUnavailable": "Health Connect isn't on this phone. Android 14 and later have it built in; before 14, it's an app of its own.",
|
||
"healthNeedsUpdate": "Update the Health Connect app to use it with Train.",
|
||
"healthWrite": "Write my workouts",
|
||
"healthWriteHint": "Every workout on this phone, kept up to date as you edit or delete it",
|
||
"healthWriteRefused": "Health Connect took this back. Allow it there to turn it on again.",
|
||
"healthRefused": "Health Connect didn't allow it. You can allow it in its settings.",
|
||
"healthOpenSettings": "Open Health Connect",
|
||
"healthWhy": "Why Train asks",
|
||
"healthRationaleTitle": "Train and Health Connect",
|
||
"healthRationaleWrite": "Train writes your workouts to Health Connect only once you turn it on: each one with its route, heart rate, speed, power, distance and climb, so that other apps on this phone can use them. A workout edited or deleted in Train is edited or deleted there too.",
|
||
"healthRationaleRead": "Train reads other apps' workouts only once you turn it on, and only from the apps you choose: their heart rate, distance and power come into Train as workouts, sealed with your key before they're synced to your instance, which can't read them.",
|
||
"healthRationaleNothingElse": "What Train reads there is shown to you and nobody else, and isn't used for anything else. Turning a switch off, or taking a permission back in Health Connect, stops it."
|
||
}
|