halkyon/apps/train/halkyon_train_flutter/lib/l10n/app_en.arb
Tizian 「ティツィアーン」 3bd49920db
feat(train): record a ride indoors, without GPS (ADR 0030, D66)
A home trainer's or an exercise bike's ride had no place: Cycling waits
for GPS and pauses by speed. Cycling indoors needs no GPS, route or
device: the time, then whichever strap, speed and cadence sensor or
power meter there is. It goes to Health Connect as stationary biking,
and another app's stationary ride comes in as one.

With no GPS, steps or device the recorder has no foreground service
type, which Android 14 on doesn't allow, so it asks for the physical
activity permission and doesn't start without it.

Whats-New: Record a ride on a home trainer or exercise bike with Cycling indoors, without GPS.
Whats-New-De: Zeichne eine Fahrt auf dem Heimtrainer mit Radfahren drinnen auf, ganz ohne GPS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-05 22:55:30 +01:00

2156 lines
67 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"@@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 Halkyon Train",
"homeRecordHint": "Record one from the Record tab.",
"recordBack": "Back to the recording",
"activityRunning": "Running",
"activityWalking": "Walking",
"activityHiking": "Hiking",
"activityCycling": "Cycling",
"activityStrength": "Strength training",
"activityIndoorCycling": "Cycling indoors",
"activityIndoorRowing": "Rowing indoors",
"activityOther": "Other workout",
"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",
"recordPlan": "Plan",
"recordNoPlan": "None",
"recordingLap": "Lap",
"recordingPlanDone": "Plan done",
"recordingStepOf": "Step {index} of {count}",
"@recordingStepOf": {
"placeholders": {
"index": {
"type": "int"
},
"count": {
"type": "int"
}
}
},
"recordingNextStep": "Next: {step}",
"@recordingNextStep": {
"placeholders": {
"step": {
"type": "String"
}
}
},
"recordingStepTapLap": "Until you tap Lap",
"recordLocationRefused": "Train needs your location to record this. You can allow it in the system's settings.",
"recordActivityRefused": "Train needs the physical activity permission to record a ride indoors. You can allow it in the system's settings.",
"recordingWaitingForGps": "Waiting for GPS",
"recordingGpsSilent": "No GPS for a minute. Is location on, and is Train allowed your precise location?",
"@recordingGpsSilent": {
"description": "No fix at all for a minute while recording: location off, or allowed only approximately."
},
"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_strength{Morning strength} afternoon_strength{Afternoon strength} evening_strength{Evening strength} night_strength{Night strength} morning_running{Morning run} morning_walking{Morning walk} morning_hiking{Morning hike} morning_cycling{Morning ride} morning_indoorCycling{Morning indoor ride} afternoon_indoorCycling{Afternoon indoor ride} evening_indoorCycling{Evening indoor ride} night_indoorCycling{Night indoor 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",
"workoutActivityLabel": "Activity",
"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",
"workoutSteps": "Steps of {plan}",
"@workoutSteps": {
"placeholders": {
"plan": {
"type": "String"
}
}
},
"workoutOnTarget": "On target",
"workoutOffTarget": "Off target",
"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"
}
}
},
"workoutMapOwn": "Map by your instance, {name}, from OpenStreetMap: it keeps nothing of the area shown.",
"@workoutMapOwn": {
"description": "Under a workout's map drawn from the instance's own tiles (D50): what it sees.",
"placeholders": {
"name": {
"type": "String",
"example": "train.halkyon.eu"
}
}
},
"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.",
"workoutMapAbout": "About the map",
"@workoutMapAbout": {
"description": "Title of the explanation behind the question mark on a workout's page (D63): what the map's source sees."
},
"workoutShowMap": "Show the map",
"@workoutShowMap": {
"description": "Tooltip of the chevron that lowers a workout's sheet, the page pulled up, so that the map shows again (D63)."
},
"mapCredits": "Map credits",
"@mapCredits": {
"description": "Tooltip of the button over a map that shows whose map and data it is."
},
"routeHelpTitle": "Planning a route",
"@routeHelpTitle": {
"description": "Title of the explanation behind the question mark over the route planner's map (D63)."
},
"workoutNotFound": "This workout is gone.",
"recordHeartRate": "Heart rate",
"recordNoStrap": "No strap",
"recordHeartLoop": "From the Polar Loop",
"recordHeartStrapThenLoop": "{strap}, the Loop while it is lost",
"@recordHeartStrapThenLoop": {
"placeholders": {
"strap": {
"type": "String",
"example": "Polar H10"
}
}
},
"@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",
"healthTakenBack": "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.",
"healthRead": "Read from other apps",
"healthReadHint": "Their workouts come into Train, from the apps you choose below",
"healthReadWeight": "Read my weight",
"healthReadWeightHint": "Weights other apps wrote, a scale's say, come into Train",
"healthRationaleWeight": "Train reads the weights other apps wrote only once you turn it on: each comes into Train once, sealed with your key before it's synced to your instance, which can't read it.",
"healthApps": "Apps",
"@healthApps": {
"description": "Over the apps that wrote workouts to Health Connect, each with its switch."
},
"healthAppsEmpty": "No app has written workouts to Health Connect yet.",
"workoutFromList": "from {app}",
"@workoutFromList": {
"description": "In the list, after when an imported workout was: the app it came from.",
"placeholders": {
"app": {
"type": "String",
"example": "Gadgetbridge"
}
}
},
"workoutFrom": "From {app}, through Health Connect",
"@workoutFrom": {
"description": "On an imported workout's page.",
"placeholders": {
"app": {
"type": "String",
"example": "Gadgetbridge"
}
}
},
"workoutBringTrack": "Bring in the track",
"@workoutBringTrack": {
"description": "On an imported workout's page: asks Health Connect for its route."
},
"workoutNoTrack": "Health Connect gave no track for it.",
"profileTitle": "Your body",
"profileHint": "What your band and your heart-rate zones work from",
"@profileHint": {
"description": "Under Your body in the account sheet."
},
"profileIntro": "Each figure is optional and sealed with your key, as your workouts are; your instance can't read them.",
"profileLocked": "Your profile is sealed with a key this device doesn't hold.",
"profileSex": "Sex",
"profileSexHint": "As Polar's formulas take it: the one your body's figures follow",
"profileSexFemale": "Female",
"profileSexMale": "Male",
"profileNotGiven": "Not given",
"profileBirthDate": "Birth date",
"profileHeight": "Height",
"profileHeightUnit": "cm",
"profileWeight": "Weight",
"profileWeightUnit": "kg",
"profileRestingHeartRate": "Resting heart rate",
"profileMaxHeartRate": "Highest heart rate",
"profileBpmUnit": "bpm",
"profileVo2Max": "VO2max",
"profileVo2MaxUnit": "ml/kg/min",
"profileTrainingBackground": "Training background",
"trainingOccasional": "Occasional",
"trainingRegular": "Regular",
"trainingFrequent": "Frequent",
"trainingHeavy": "Heavy",
"trainingSemiPro": "Semi-pro",
"trainingPro": "Pro",
"profileTypicalDay": "Typical day",
"typicalDaySitting": "Mostly sitting",
"typicalDayStanding": "Mostly standing",
"typicalDayMoving": "Mostly moving",
"profileSleepGoal": "Sleep goal",
"profileSave": "Save",
"profileSaved": "Saved",
"profileInvalid": "Check the figures marked.",
"profileNeeded": "Needed for your band",
"loopTitle": "Polar Loop",
"loopHint": "Your band: its setup, battery and clock",
"@loopHint": {
"description": "Under Polar Loop in the account sheet."
},
"loopNone": "Train sets up a Polar Loop and keeps it itself, without Polar Flow or a Polar account. A band used with Polar Flow needs a factory reset first.",
"loopSetUp": "Set up a Loop",
"loopSetUpAgain": "Set up again",
"loopLetGo": "Let the band go",
"loopLetGoTitle": "Let the band go?",
"loopLetGoText": "The band is reset to the factory's state, and what it holds that hasn't reached Train is lost. Afterwards it can be paired with another phone, or with Polar Flow.",
"loopLetGoConfirm": "Reset the band",
"loopConnected": "Connected",
"loopLastSeen": "Last seen {when}",
"@loopLastSeen": {
"placeholders": {
"when": {
"type": "String",
"example": "28 Oct 2026, 18:30"
}
}
},
"loopNotInReach": "Not in reach",
"loopBattery": "Battery {level} %",
"@loopBattery": {
"placeholders": {
"level": {
"type": "int"
}
}
},
"loopCharging": "Battery {level} %, charging",
"@loopCharging": {
"placeholders": {
"level": {
"type": "int"
}
}
},
"loopFirmware": "Firmware {version}",
"@loopFirmware": {
"placeholders": {
"version": {
"type": "String",
"example": "1.2.3"
}
}
},
"loopFirmwareCheck": "Check for a firmware update",
"loopFirmwareCurrent": "The band's firmware is up to date.",
"loopFirmwareOffered": "Firmware {version} available",
"@loopFirmwareOffered": {
"placeholders": {
"version": {
"type": "String",
"example": "2.1.0"
}
}
},
"loopFirmwareViaPolar": "Fetched from Polar directly: Polar learns this phone's address (or its VPN's), with the band's firmware version and hardware code.",
"loopFirmwareViaInstance": "Fetched through your instance: Polar learns the instance's address, not this phone's, with the band's firmware version and hardware code.",
"loopFirmwareErases": "The update erases the band. Train first keeps what is on it, then sets it up again with your profile.",
"loopFirmwareUpdate": "Update",
"loopFirmwareUpdateTitle": "Update the band's firmware?",
"loopFirmwareUpdateText": "Train first keeps what is on the band, as the update erases it. The band restarts, which takes a few minutes, and Train then sets it up again with your profile. Keep it near the phone until then.",
"loopFirmwareStage": "{stage, select, reading{Keeping what is on the band…} fetching{Fetching the firmware…} preparing{Preparing the band…} writing{Writing the firmware…} finalizing{Finishing the update…} done{Written} restarting{The band restarts…} other{Updating…}}",
"@loopFirmwareStage": {
"placeholders": {
"stage": {
"type": "String"
}
}
},
"loopFirmwareStageHint": "Keep the band near the phone, and Train open.",
"loopFirmwareUpdated": "Firmware updated; the band is set up again.",
"loopFirmwareThroughInstance": "Firmware through your instance",
"loopFirmwareThroughInstanceHint": "Polar then learns the instance's address rather than this phone's. Off, the phone asks Polar directly.",
"loopProfileChanged": "Your body changed since the band was set up",
"loopProfileChangedHint": "Sending sets the band up again with your figures as they are now.",
"loopSend": "Send to the band",
"loopSent": "Sent to the band.",
"loopFailed": "The band didn't answer. Keep it close, and try again.",
"loopSearching": "Looking for Loops nearby",
"loopSearchingHint": "Keep the band close; tap it to wake it up.",
"loopRefused": "Train can't look for your band without nearby devices. Allow them in Android's settings.",
"loopUnnamed": "Polar Loop",
"loopSettingUp": "Setting up the band…",
"loopSettingUpHint": "Android may ask you to pair it.",
"loopSetUpDone": "The band is set up.",
"loopFormTitle": "For your band",
"loopFormIntro": "Your band needs these. They're kept in Your body, sealed with your key. For a resting or highest heart rate or a VO2max you haven't given, the band takes Polar's defaults, and Your body stays as it is.",
"loopFormSave": "Set up the band",
"homeWorkouts": "Workouts",
"profileTabProgress": "Progress",
"homeDays": "Days",
"homePlans": "Plans",
"plansNew": "New plan",
"plansNewEmpty": "From nothing",
"plansEmptyTitle": "No plans yet",
"plansEmptyHint": "A plan's steps lead you through intervals as you record, with a tone, a vibration and a voice at each change. Start from a template, or from nothing.",
"planLocked": "A plan that doesn't open here",
"planTemplateFourByFour": "4×4 minutes",
"planTemplateTabata": "Tabata",
"planTemplateFourHundreds": "10×400 m",
"planTitle": "Plan",
"planNewTitle": "New plan",
"planName": "Name",
"planActivity": "For",
"planActivityAny": "Any activity",
"planOffTarget": "Tell me when I'm off target",
"planOffTargetHint": "A short cue at most every 30 seconds.",
"planSave": "Save",
"planNotSaved": "The plan wasn't saved.",
"planAddStep": "Add a step",
"planAddRepeat": "Add a repeat",
"planRepeat": "{count}×",
"@planRepeat": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"planFewer": "Fewer rounds",
"planMore": "More rounds",
"planBlockMenu": "More",
"planMoveUp": "Move up",
"planMoveDown": "Move down",
"planRemove": "Remove",
"planDelete": "Delete",
"planDeleteTitle": "Delete this plan?",
"planDeleteMessage": "It's deleted on all your devices; workouts recorded with it keep their steps.",
"planDeleted": "Plan deleted",
"planSteps": "{count, plural, =1{1 step} other{{count} steps}}",
"@planSteps": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"planSayRound": "{round} of {rounds}",
"@planSayRound": {
"placeholders": {
"round": {
"type": "int"
},
"rounds": {
"type": "int"
}
}
},
"planSayMinutes": "{count, plural, =1{1 minute} other{{count} minutes}}",
"@planSayMinutes": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"planSaySeconds": "{count, plural, =1{1 second} other{{count} seconds}}",
"@planSaySeconds": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"planSayMetres": "{count, plural, =1{1 metre} other{{count} metres}}",
"@planSayMetres": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"planSayKilometres": "{km} kilometres",
"@planSayKilometres": {
"placeholders": {
"km": {
"type": "String"
}
}
},
"planSayUntilLap": "until you tap Lap",
"planSayPace": "{from} to {to} a kilometre",
"@planSayPace": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"planSaySpeed": "{from} to {to} kilometres an hour",
"@planSaySpeed": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"planSayHeartRate": "{from} to {to} beats a minute",
"@planSayHeartRate": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"planSayZone": "zone {zone}",
"@planSayZone": {
"placeholders": {
"zone": {
"type": "int"
}
}
},
"planSaySplit": "{from} to {to} per 500 metres",
"@planSaySplit": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"planSayWatts": "{from} to {to} watts",
"@planSayWatts": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"planSayStrokeRate": "{from} to {to} strokes a minute",
"@planSayStrokeRate": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"planSayHarder": "Push a little",
"planSayEasier": "Ease off a little",
"planSayDone": "Plan done",
"stepTitle": "Step",
"stepKind": "Kind",
"stepWarmUp": "Warm-up",
"stepWork": "Work",
"stepRecovery": "Recovery",
"stepCoolDown": "Cool-down",
"stepEnds": "Ends",
"stepEndTime": "After a time",
"stepEndDistance": "After a distance",
"stepEndLap": "With a lap tap",
"stepTimeLabel": "Time (min:s)",
"stepMetresLabel": "Metres",
"stepTarget": "Target",
"stepZone": "Zone",
"stepDone": "Done",
"stepMinutes": "{minutes} min",
"@stepMinutes": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"stepSeconds": "{seconds} s",
"@stepSeconds": {
"placeholders": {
"seconds": {
"type": "int"
}
}
},
"stepMinutesSeconds": "{minutes} min {seconds} s",
"@stepMinutesSeconds": {
"placeholders": {
"minutes": {
"type": "int"
},
"seconds": {
"type": "int"
}
}
},
"stepMetres": "{metres} m",
"@stepMetres": {
"placeholders": {
"metres": {
"type": "int"
}
}
},
"stepKilometres": "{km} km",
"@stepKilometres": {
"placeholders": {
"km": {
"type": "String"
}
}
},
"stepUntilLap": "until a lap tap",
"targetNone": "None",
"targetFrom": "From",
"targetTo": "To",
"targetKindPace": "Pace (per km)",
"targetKindSpeed": "Speed (km/h)",
"targetKindHeartRate": "Heart rate (bpm)",
"targetKindHeartZone": "Heart-rate zone",
"targetKindSplit": "Split (per 500 m)",
"targetKindWatts": "Power (W)",
"targetKindStrokeRate": "Stroke rate (per min)",
"targetPace": "{from}–{to} per km",
"@targetPace": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"targetSpeed": "{from}–{to} km/h",
"@targetSpeed": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"targetHeartRate": "{from}–{to} bpm",
"@targetHeartRate": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"targetZone": "Zone {zone}",
"@targetZone": {
"placeholders": {
"zone": {
"type": "int"
}
}
},
"targetSplit": "{from}–{to} per 500 m",
"@targetSplit": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"targetWatts": "{from}–{to} W",
"@targetWatts": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"targetStrokeRate": "{from}–{to} strokes/min",
"@targetStrokeRate": {
"placeholders": {
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"daysEmptyTitle": "No days yet",
"daysEmptyHint": "The days and nights your Polar Loop counts show here.",
"daysSteps": "{steps, plural, =1{1 step} other{{steps} steps}}",
"@daysSteps": {
"placeholders": {
"steps": {
"type": "int"
}
}
},
"daysActive": "{time} active",
"@daysActive": {
"placeholders": {
"time": {
"type": "String",
"example": "1 h 20 min"
}
}
},
"daysAsleep": "{time} asleep",
"@daysAsleep": {
"placeholders": {
"time": {
"type": "String",
"example": "7 h 10 min"
}
}
},
"daysRecharge": "Recharge {level} of 6",
"@daysRecharge": {
"placeholders": {
"level": {
"type": "int"
}
}
},
"dayHoursMinutes": "{hours} h {minutes} min",
"@dayHoursMinutes": {
"placeholders": {
"hours": {
"type": "int"
},
"minutes": {
"type": "int"
}
}
},
"dayMinutes": "{minutes} min",
"@dayMinutes": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"dayCalories": "{calories} kcal",
"@dayCalories": {
"placeholders": {
"calories": {
"type": "int"
}
}
},
"dayGoal": "{percent} % of the day's goal",
"@dayGoal": {
"placeholders": {
"percent": {
"type": "int"
}
}
},
"dayNothing": "The band has given nothing for this day yet.",
"dayTimes": "The day's time",
"dayTimeNonWear": "Not worn",
"dayTimeSleep": "Asleep",
"dayTimeSedentary": "Sitting still",
"dayTimeLight": "Light activity",
"dayTimeModerate": "Moderate activity",
"dayTimeVigorous": "Vigorous activity",
"dayHeartRate": "Heart rate",
"dayBpm": "{bpm} bpm",
"@dayBpm": {
"placeholders": {
"bpm": {
"type": "int"
}
}
},
"dayNight": "The night",
"dayNightSpan": "{from} – {to}",
"@dayNightSpan": {
"placeholders": {
"from": {
"type": "String",
"example": "23:15"
},
"to": {
"type": "String",
"example": "07:05"
}
}
},
"daySleepWake": "Awake",
"daySleepRem": "REM",
"daySleepLight": "Light",
"daySleepDeep": "Deep",
"dayRatingPoorly": "You slept poorly",
"dayRatingSomewhatPoorly": "You slept somewhat poorly",
"dayRatingNeither": "You slept neither poorly nor well",
"dayRatingSomewhatWell": "You slept somewhat well",
"dayRatingWell": "You slept well",
"dayRecharge": "Nightly Recharge",
"dayRecovery": "Recovery",
"dayRecoveryOf": "{level} of 6",
"@dayRecoveryOf": {
"placeholders": {
"level": {
"type": "int"
}
}
},
"dayAns": "Autonomic nervous system",
"dayHrvName": "Heart rate variability",
"dayBreathingName": "Breathing",
"dayPerMinute": "{rate} a minute",
"@dayPerMinute": {
"placeholders": {
"rate": {
"type": "String",
"example": "13.7"
}
}
},
"dayMs": "{ms} ms",
"@dayMs": {
"placeholders": {
"ms": {
"type": "int"
}
}
},
"dayUsual": "usually {value}",
"@dayUsual": {
"description": "Below a figure of the night: the person's own usual, as Polar learnt it.",
"placeholders": {
"value": {
"type": "String",
"example": "45 ms"
}
}
},
"dayRechargeHelp": "Nightly Recharge is Polar's measure of how your body recovered in the first hours of sleep, against your own usual. Recovery runs from 1 to 6. The autonomic nervous system's status runs from −10 to +10: above 0, it settled better than usual. Heart rate variability is how much the time between heartbeats varies; higher than usual tends to mean a better recovery. Breathing counts your breaths a minute. A figure the band has none of yet is left out.",
"daySkin": "Skin temperature",
"dayCelsius": "{value} °C",
"@dayCelsius": {
"placeholders": {
"value": {
"type": "String",
"example": "33.4"
}
}
},
"daySkinDeviation": "{value} °C from your usual at night",
"@daySkinDeviation": {
"placeholders": {
"value": {
"type": "String",
"example": "−0.2"
}
}
},
"homeRoutes": "Routes",
"routesNew": "New route",
"routesEmptyTitle": "No routes yet",
"routesEmptyHint": "Tap the map to set waypoints, and your instance plans the way between them on paths and roads, with its climb and surfaces.",
"routeLocked": "A route that doesn't open here",
"routeTitle": "Route",
"routeNewTitle": "New route",
"routeName": "Name",
"routeActivity": "For",
"routeActivityAny": "Any activity",
"routeProfile": "Planned for",
"routeProfileRun": "Running",
"routeProfileHike": "Hiking",
"routeProfileRoadBike": "Road bike",
"routeProfileTrekkingBike": "Trekking bike",
"routeProfileGravel": "Gravel bike",
"routeProfileMtb": "Mountain bike",
"routeTapHint": "Tap the map to add a waypoint, tap one to take it off. Hold one to drag it, or hold the line to pull out another.",
"routeWaypointRemove": "Take this waypoint off",
"@routeWaypointRemove": {
"description": "The menu of a waypoint tapped on the planner's map (D59)."
},
"routeUndo": "Take the last waypoint off",
"routeSearchHint": "Search for a place",
"@routeSearchHint": {
"description": "The planner's search field over the map (D50)."
},
"routeSearchClear": "Clear the search",
"routeSearchNothing": "Nothing found.",
"@routeSearchNothing": {
"description": "Under the planner's search: the instance found no place."
},
"routeSearchTooOften": "Too many searches for now; try again in a minute.",
"routeSearchUnreachable": "The search can't be reached now.",
"routePlanning": "Planning…",
"routeRefusedInvalid": "A waypoint too many, or one off the map.",
"routeRefusedTooOften": "Planned too often: try again in a minute.",
"routeRefusedNoRoute": "No way found there: a waypoint may be off the paths, or outside the region your instance plans in.",
"routeRefusedUnreachable": "Your instance can't be reached to plan the way.",
"routeNotOffered": "Your instance doesn't plan routes.",
"routeAscent": "{metres} m up",
"@routeAscent": {
"placeholders": {
"metres": {
"type": "int"
}
}
},
"routeDescent": "{metres} m down",
"@routeDescent": {
"placeholders": {
"metres": {
"type": "int"
}
}
},
"routeSummary": "{distance} · {ascent}",
"@routeSummary": {
"description": "A route in the list: its distance and climb.",
"placeholders": {
"distance": {
"type": "String",
"example": "12.3 km"
},
"ascent": {
"type": "String",
"example": "120 m up"
}
}
},
"routesBringIn": "Bring in a GPX file",
"@routesBringIn": {
"description": "In the Routes tab: a route brought in from a GPX file (ADR 0030, D45)."
},
"routeBringInTitle": "Bring in {name}",
"@routeBringInTitle": {
"placeholders": {
"name": {
"type": "String",
"example": "Isar loop"
}
}
},
"routeBringInSnap": "Plan it along the paths",
"routeBringInSnapHint": "Through its points, with the profile you choose; its turns told",
"routeBringInDrawn": "Keep it as drawn",
"routeBringInDrawnHint": "Its way as the file has it, no turns told",
"routeNotGpx": "This file holds no route Train can read",
"routeShareGpx": "Share as GPX",
"routeSaveGpx": "Save as GPX",
"routeOffline": "Keep the map offline",
"@routeOffline": {
"description": "A switch on a saved route: its map kept on this device (ADR 0030, D45)."
},
"routeOfflineOff": "Its map along the way, 2 km either side, on this device for when there's no network",
"routeOfflineLoading": "Keeping the map: {done} of {total} tiles",
"@routeOfflineLoading": {
"placeholders": {
"done": {
"type": "int"
},
"total": {
"type": "int"
}
}
},
"routeOfflineKept": "Kept on this device: {size} MB",
"@routeOfflineKept": {
"placeholders": {
"size": {
"type": "String",
"example": "12.4"
}
}
},
"routeOfflineMissing": "{missing} of {total} tiles didn't come: asked for again when the app next opens online",
"@routeOfflineMissing": {
"placeholders": {
"missing": {
"type": "int"
},
"total": {
"type": "int"
}
}
},
"routeOfflineNoMap": "The map can't be reached now: try again online",
"routeOfflineSaveFirst": "Save the route to keep its map offline",
"routeKeptOffline": "Map kept offline",
"routeSurfaces": "Surfaces",
"surfacePaved": "Paved",
"surfaceCompacted": "Compacted",
"surfaceGravel": "Gravel",
"surfaceNatural": "Natural ground",
"surfaceUnknown": "Not known",
"routeSave": "Save",
"routeNotSaved": "The route wasn't saved.",
"routeDelete": "Delete",
"routeDeleteTitle": "Delete this route?",
"routeDeleteMessage": "It's deleted on all your devices.",
"routeDeleted": "Route deleted",
"turnStraight": "Go straight on",
"turnLeft": "Turn left",
"turnSlightLeft": "Bear left",
"turnSharpLeft": "Turn sharp left",
"turnRight": "Turn right",
"turnSlightRight": "Bear right",
"turnSharpRight": "Turn sharp right",
"turnKeepLeft": "Keep left",
"turnKeepRight": "Keep right",
"turnAround": "Turn around",
"turnRoundabout": "At the roundabout, take exit {exit}",
"@turnRoundabout": {
"placeholders": {
"exit": {
"type": "int"
}
}
},
"turnExitLeft": "Take the exit on the left",
"turnExitRight": "Take the exit on the right",
"routeSayIn": "In {metres} metres: {turn}",
"@routeSayIn": {
"description": "Spoken before a turn while following a route.",
"placeholders": {
"metres": {
"type": "int"
},
"turn": {
"type": "String",
"example": "Turn left"
}
}
},
"routeSayOff": "Off the route. It lies {metres} metres {direction}.",
"@routeSayOff": {
"description": "Spoken off the route; the recorder puts the figures in.",
"placeholders": {
"metres": {
"type": "String",
"example": "80"
},
"direction": {
"type": "String",
"example": "to the north-east"
}
}
},
"routeSayOn": "Back on the route",
"routeSayArrived": "End of the route",
"directionNorth": "to the north",
"directionNorthEast": "to the north-east",
"directionEast": "to the east",
"directionSouthEast": "to the south-east",
"directionSouth": "to the south",
"directionSouthWest": "to the south-west",
"directionWest": "to the west",
"directionNorthWest": "to the north-west",
"recordRoute": "Route",
"recordNoRoute": "None",
"recordingNextTurn": "In {distance}",
"@recordingNextTurn": {
"placeholders": {
"distance": {
"type": "String",
"example": "320 m"
}
}
},
"recordingOffRoute": "Off the route: {distance} {direction}",
"@recordingOffRoute": {
"placeholders": {
"distance": {
"type": "String",
"example": "80 m"
},
"direction": {
"type": "String",
"example": "to the north-east"
}
}
},
"recordingRouteEnd": "End of the route",
"recordingFollowRoute": "Following {name}",
"@recordingFollowRoute": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"recordingMapHint": "Swipe for the map",
"recordingFiguresHint": "Swipe back for the figures",
"recordingNorthUp": "North up",
"recordingHeadingUp": "Heading up",
"musicTitle": "Music",
"@musicTitle": {
"description": "The music screen's title, and its tile in the account sheet."
},
"musicHint": "Jellyfin playlists to run to",
"@musicHint": {
"description": "Under Music in the account sheet."
},
"musicIntro": "Train plays music from your Jellyfin server, choosing tracks whose beat fits your steps. Your account and music stay on this phone.",
"musicServer": "Jellyfin server",
"@musicServer": {
"description": "The label of the server's address."
},
"musicConnect": "Connect",
"musicBadAddress": "Enter the server's address, such as jellyfin.example.org.",
"musicInClear": "Train connects to Jellyfin over https only: http would send the password unencrypted. Use the server's https address.",
"musicUnreachable": "The server can't be reached. Check the address and the connection.",
"musicNotJellyfin": "There is no Jellyfin server at this address.",
"musicRefused": "Jellyfin refused. Check the user name and password.",
"musicCodeExpired": "The code has expired.",
"musicFailed": "Jellyfin answered with an error. Try again later.",
"musicQuickConnect": "To sign in to {server}, enter this code in Jellyfin on another device, under Settings, Quick Connect.",
"@musicQuickConnect": {
"placeholders": {
"server": {
"type": "String"
}
}
},
"musicNewCode": "New code",
"musicBack": "Back",
"musicUsePassword": "Use a password",
"musicPasswordIntro": "Sign in to {server} with your Jellyfin user name and password.",
"@musicPasswordIntro": {
"placeholders": {
"server": {
"type": "String"
}
}
},
"musicUserName": "User name",
"musicPassword": "Password",
"musicSignIn": "Sign in",
"musicSignedInAs": "Signed in as {name}",
"@musicSignedInAs": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"musicSignOut": "Sign out",
"musicPlaylists": "Playlists for running",
"musicPlaylistsHint": "Train chooses from the tracks of the playlists you mark, and keeps them on this phone.",
"musicNoPlaylists": "There are no music playlists on this server yet.",
"musicRetry": "Try again",
"musicTracks": "{count, plural, =1{1 track} other{{count} tracks}}",
"@musicTracks": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"musicKept": "On this phone",
"musicKeptWaiting": "{done} of {total} tracks: the rest waits for Wi-Fi",
"@musicKeptWaiting": {
"placeholders": {
"done": {
"type": "int"
},
"total": {
"type": "int"
}
}
},
"musicKeptLoading": "Downloading: {done} of {total} tracks",
"@musicKeptLoading": {
"placeholders": {
"done": {
"type": "int"
},
"total": {
"type": "int"
}
}
},
"musicKeptDone": "{count} tracks, {size} MB, {tempo} with a tempo",
"@musicKeptDone": {
"placeholders": {
"count": {
"type": "int"
},
"size": {
"type": "String",
"example": "230.4"
},
"tempo": {
"type": "int"
}
}
},
"musicKeptDelete": "Delete",
"musicKeptDeleteTitle": "Delete the music on this phone?",
"musicKeptDeleteText": "Every playlist is unmarked, and its tracks deleted from this phone. They stay on your Jellyfin server.",
"musicSmaller": "Smaller copies",
"musicSmallerHint": "Lossless files such as FLAC kept as Opus at 128 kbps, which your server makes. MP3 and AAC stay as they are.",
"recordMusic": "Music",
"recordMusicOn": "Music",
"@recordMusicOn": {
"description": "The segment playing the kept tracks by cadence."
},
"recordMetronome": "Metronome",
"recordMusicOff": "Off",
"recordAnnounce": "Announcements",
"recordAnnounceFoot": "Every kilometre: time, pace and heart rate",
"@recordAnnounceFoot": {
"description": "The switch's hint on foot (D49)."
},
"recordAnnounceBike": "Every 5 km: time, speed and heart rate",
"@recordAnnounceBike": {
"description": "The switch's hint on a bike (D49)."
},
"announceKilometres": "{count, plural, =1{1 kilometre} other{{count} kilometres}}",
"@announceKilometres": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"announceHours": "{count, plural, =1{1 hour} other{{count} hours}}",
"@announceHours": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"announceTime": "Time {time}",
"@announceTime": {
"placeholders": {
"time": {
"type": "String"
}
}
},
"announcePace": "Pace {pace} a kilometre",
"@announcePace": {
"placeholders": {
"pace": {
"type": "String"
}
}
},
"announceSpeed": "Speed {speed} kilometres an hour",
"@announceSpeed": {
"placeholders": {
"speed": {
"type": "String"
}
}
},
"announceHeartRate": "Heart rate {bpm}",
"@announceHeartRate": {
"placeholders": {
"bpm": {
"type": "String"
}
}
},
"workoutExport": "Export",
"workoutExportTitle": "Export the workout",
"workoutExportGpxHint": "The track, for maps and other apps",
"workoutExportTcxHint": "Laps, heart rate and cadence, for most training sites",
"workoutExportFitHint": "What Strava, Garmin and intervals.icu read best",
"recordSpeedSensor": "Speed and cadence sensor",
"recordNoSpeedSensor": "None chosen",
"recordPowerMeter": "Power meter",
"recordNoPowerMeter": "None chosen",
"speedSensorSheetTitle": "Speed and cadence sensor",
"speedSensorSearching": "Looking for speed and cadence sensors nearby…",
"speedSensorSearchingHint": "Turn the wheel or the crank to wake it. One another app holds can't be found: close that app first.",
"speedSensorUnnamed": "Unnamed sensor",
"speedSensorForget": "Forget sensor",
"speedSensorRefused": "Train needs nearby devices to find your sensor. You can allow it in the system's settings.",
"powerMeterSheetTitle": "Power meter",
"powerMeterSearching": "Looking for power meters nearby…",
"powerMeterSearchingHint": "Turn the crank to wake it. One another app holds can't be found: close that app first.",
"powerMeterUnnamed": "Unnamed power meter",
"powerMeterForget": "Forget power meter",
"powerMeterRefused": "Train needs nearby devices to find your power meter. You can allow it in the system's settings.",
"recordingCadence": "turns a minute",
"workoutPedalling": "Cadence",
"workoutAverageCadence": "average cadence",
"workoutNormalisedPower": "normalised power",
"workoutRpmValue": "{rpm} rpm",
"@workoutRpmValue": {
"placeholders": {
"rpm": {
"type": "int"
}
}
},
"recordWheel": "Wheel circumference",
"recordWheelMeasured": "{mm} mm, measured by GPS",
"@recordWheelMeasured": {
"placeholders": {
"mm": {
"type": "int"
}
}
},
"recordWheelTyped": "{mm} mm, as you typed it",
"@recordWheelTyped": {
"placeholders": {
"mm": {
"type": "int"
}
}
},
"recordWheelDefault": "{mm} mm until GPS has measured it on a ride of 2 km",
"@recordWheelDefault": {
"placeholders": {
"mm": {
"type": "int"
}
}
},
"recordWheelHint": "In millimetres, as the tyre says (700×25C: 2105); empty to have GPS measure it",
"recordWheelSave": "Save",
"shellTabHome": "Home",
"shellTabMaps": "Maps",
"shellTabRecord": "Record",
"shellTabGroups": "Groups",
"shellTabProfile": "Profile",
"groupsLaterTitle": "Groups come later",
"groupsLaterHint": "Training with others, in groups of your own, comes in a later version of Train.",
"settingsTitle": "Settings",
"settingsTraining": "Training",
"settingsVersion": "Version {version} (build {build})",
"@settingsVersion": {
"placeholders": {
"version": {
"type": "String"
},
"build": {
"type": "String"
}
}
},
"recordingBarStopped": "Stopped: save or discard it",
"recordingBarDistance": "{km} km",
"@recordingBarDistance": {
"placeholders": {
"km": {
"type": "String"
}
}
},
"homeWeekTitle": "This week",
"homeWeekTime": "Time",
"homeWeekDistance": "Distance",
"homeWeekWorkouts": "Workouts",
"recordPlansHeading": "Interval plans",
"profileWeeksTitle": "Last 12 weeks",
"profileWeekOf": "Week of {date}",
"@profileWeekOf": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"profileWorkouts": "{count, plural, =1{1 workout} other{{count} workouts}}",
"@profileWorkouts": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"profileYearEmpty": "No workouts this year yet.",
"bodyWeight": "{kg} kg",
"weightTitle": "Weight",
"weightAdd": "Add weight",
"weightAll": "All",
"weightEmpty": "Add your weight to follow it here; the latest is also your body's weight.",
"weightOverTime": "Over time",
"weightField": "Weight",
"weightInvalid": "A weight between 20 and 400 kg",
"weightWhen": "Measured",
"weightDelete": "Delete",
"weightFromHealth": "from {app}",
"@weightFromHealth": {
"description": "A weight read from Health Connect: the package of the app that wrote it.",
"placeholders": {
"app": {
"type": "String",
"example": "com.example.scale"
}
}
},
"@bodyWeight": {
"placeholders": {
"kg": {
"type": "String"
}
}
},
"bodyResting": "resting {bpm} bpm",
"@bodyResting": {
"placeholders": {
"bpm": {
"type": "int"
}
}
},
"bodyMax": "max {bpm} bpm",
"@bodyMax": {
"placeholders": {
"bpm": {
"type": "int"
}
}
},
"homeToday": "Today",
"equipmentTitle": "Equipment",
"@equipmentTitle": {
"description": "Settings' entry and the screen of the places the person trains at, with what each has (ADR 0034)."
},
"equipmentHint": "Where you train, and what's there",
"equipmentEmptyTitle": "No places yet",
"equipmentEmptyHint": "Add the places you train at, such as your home and your gym, with what each has. Start from what a home or a gym usually has, or from nothing.",
"equipmentAddPlace": "Add a place",
"equipmentItems": "{count, plural, =0{Nothing yet} =1{1 piece of equipment} other{{count} pieces of equipment}}",
"@equipmentItems": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"equipmentChosen": "Where you train now",
"@equipmentChosen": {
"description": "Marks the place chosen, which the plate calculator and plans use (ADR 0034, D4)."
},
"equipmentChoose": "Train here",
"equipmentLocked": "Can't be opened on this device",
"placeNewTitle": "New place",
"placeName": "Name",
"placeStartFrom": "Start from",
"placeStartHome": "A home",
"placeStartGym": "A gym",
"placeStartNothing": "Nothing",
"placeDefaultHome": "Home",
"placeDefaultGym": "Gym",
"placeAdd": "Add",
"placeRename": "Rename",
"placeSave": "Save",
"placeDelete": "Delete place",
"placeDeleteMessage": "The place and its equipment are deleted on all your devices.",
"placeAddEquipment": "Add equipment",
"placeEmptyHint": "Nothing here yet. Add the equipment this place has.",
"equipmentKind": "{kind, select, barbell{Barbell} ezBar{EZ bar} trapBar{Trap bar} dumbbellHandle{Dumbbell handles} plates{Weight plates} fixedDumbbells{Dumbbells} kettlebells{Kettlebells} bench{Bench} rack{Rack} pullUpBar{Pull-up bar} dipBars{Dip bars} cableMachine{Cable machine} bands{Resistance bands} other{Your own}}",
"@equipmentKind": {
"placeholders": {
"kind": {
"type": "String"
}
}
},
"itemName": "What it is",
"itemHowMany": "How many",
"itemOwnWeight": "Its own weight",
"itemWeights": "Weights",
"itemAddWeight": "Add a weight",
"itemDone": "Done",
"itemRemove": "Remove",
"itemWeightInvalid": "A weight in kilograms, above 0",
"weightKg": "{weight} kg",
"@weightKg": {
"placeholders": {
"weight": {
"type": "String"
}
}
},
"weightCount": "{count} × {weight} kg",
"@weightCount": {
"placeholders": {
"count": {
"type": "int"
},
"weight": {
"type": "String"
}
}
},
"plateCalculatorTitle": "Plate calculator",
"plateCalculatorHint": "What to load, and what changes between sets",
"platePlace": "Place",
"plateBar": "Bar",
"plateDumbbellPair": "Two dumbbell handles",
"plateTargets": "Weights, kg",
"plateTargetsHelper": "One for each set, such as 60, 80, 100",
"plateNoPlace": "Add a place you train at, with its plates, first.",
"plateNoBar": "This place has nothing that takes plates. Add a barbell or dumbbell handles to it.",
"plateBelowBar": "Below the bar's {weight} kg",
"@plateBelowBar": {
"placeholders": {
"weight": {
"type": "String"
}
}
},
"plateShort": "{weight} kg below what you asked for: the plates make no closer weight",
"@plateShort": {
"placeholders": {
"weight": {
"type": "String"
}
}
},
"plateSide": "Each side, from the inside: {plates}",
"@plateSide": {
"placeholders": {
"plates": {
"type": "String"
}
}
},
"plateBarAlone": "The bar alone",
"plateOff": "Take off {plates}",
"@plateOff": {
"placeholders": {
"plates": {
"type": "String"
}
}
},
"plateOn": "Put on {plates}",
"@plateOn": {
"placeholders": {
"plates": {
"type": "String"
}
}
},
"plateNoChange": "Nothing changes",
"plateMoves": "{count, plural, =0{No plate moves} =1{1 plate moves on each side} other{{count} plates move on each side}}",
"@plateMoves": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"plateSet": "Set {number}",
"@plateSet": {
"placeholders": {
"number": {
"type": "int"
}
}
},
"exerciseName": "{id, select, backSquat{Back squat} frontSquat{Front squat} gobletSquat{Goblet squat} kettlebellGobletSquat{Kettlebell goblet squat} bodyweightSquat{Bodyweight squat} lunge{Lunge} bulgarianSplitSquat{Bulgarian split squat} bodyweightLunge{Bodyweight lunge} deadlift{Deadlift} romanianDeadlift{Romanian deadlift} trapBarDeadlift{Trap bar deadlift} dumbbellRomanianDeadlift{Dumbbell Romanian deadlift} kettlebellSwing{Kettlebell swing} hipThrust{Hip thrust} gluteBridge{Glute bridge} benchPress{Bench press} inclineBenchPress{Incline bench press} dumbbellBenchPress{Dumbbell bench press} pushUp{Push-up} dip{Dip} overheadPress{Overhead press} dumbbellShoulderPress{Dumbbell shoulder press} pikePushUp{Pike push-up} barbellRow{Barbell row} dumbbellRow{One-arm dumbbell row} cableRow{Seated cable row} invertedRow{Inverted row} bandPullApart{Band pull-apart} facePull{Face pull} pullUp{Pull-up} chinUp{Chin-up} latPulldown{Lat pulldown} bandPulldown{Band pulldown} barbellCurl{Barbell curl} ezBarCurl{EZ bar curl} dumbbellCurl{Dumbbell curl} hammerCurl{Hammer curl} tricepsPushdown{Triceps pushdown} skullCrusher{Skull crusher} overheadTricepsExtension{Overhead triceps extension} benchDip{Bench dip} lateralRaise{Lateral raise} cableLateralRaise{Cable lateral raise} calfRaise{Calf raise} plank{Plank} sidePlank{Side plank} hangingLegRaise{Hanging leg raise} crunch{Crunch} farmersCarry{Farmer's carry} other{Exercise}}",
"@exerciseName": {
"placeholders": {
"id": {
"type": "String"
}
},
"description": "A catalogue exercise's name, by its id (ADR 0035, D1)."
},
"exerciseNeed": "{need, select, barbell{a barbell} ezBar{an EZ bar} trapBar{a trap bar} dumbbells{dumbbells} kettlebell{a kettlebell} bench{a bench} rack{a rack} pullUpBar{a pull-up bar} dipBars{dip bars} cableMachine{a cable machine} bands{bands} other{something}}",
"@exerciseNeed": {
"placeholders": {
"need": {
"type": "String"
}
},
"description": "What an exercise needs, as in \"Missing here: a rack, dip bars\"."
},
"exercisePattern": "{pattern, select, squat{Squats} lunge{Lunges} hinge{Hinges} horizontalPush{Pushes} verticalPush{Pushes overhead} horizontalPull{Rows} verticalPull{Pull-ups and pulldowns} curl{Curls} extension{Triceps} raise{Raises} calf{Calves} core{Core} carry{Carries} other{Other}}",
"@exercisePattern": {
"placeholders": {
"pattern": {
"type": "String"
}
}
},
"exerciseLoad": "{load, select, barbell{Barbell with plates} ezBar{EZ bar with plates} trapBar{Trap bar with plates} dumbbellPair{A dumbbell in each hand} dumbbell{One dumbbell} kettlebell{Kettlebell} cable{Cable stack} band{Band} body{Body weight} other{Other}}",
"@exerciseLoad": {
"placeholders": {
"load": {
"type": "String"
}
}
},
"activityStrengthCard": "Strength",
"strengthPlansHeading": "Strength plans",
"strengthPlansNew": "New strength plan",
"strengthPlansEmpty": "Strength plans list exercises with their sets, repetitions, weights and rests, alone or as supersets and circuits.",
"strengthPlanLocked": "Can't be opened on this device",
"strengthPlanDeleted": "Strength plan deleted",
"strengthStart": "Start",
"strengthChoosePlan": "Which plan?",
"strengthNoPlans": "Make a strength plan first: the list below has New strength plan.",
"strengthPlanTitle": "Strength plan",
"strengthPlanName": "Name",
"strengthPlanSave": "Save",
"strengthPlanDelete": "Delete",
"strengthAddExercise": "Add exercise",
"strengthAddToBlock": "Add an exercise to do in turn",
"strengthOwnExercise": "Your own exercise",
"strengthOwnExercises": "Your own",
"strengthExerciseName": "What it is",
"strengthExerciseNeeds": "What it needs",
"strengthExerciseLoad": "What it is done with",
"strengthExercisePattern": "How it moves",
"strengthExerciseTimed": "Held for a time",
"strengthExerciseDone": "Done",
"strengthAddSet": "Add a set",
"strengthReps": "Reps",
"strengthSeconds": "Seconds",
"strengthKg": "kg",
"strengthRemoveExercise": "Remove exercise",
"strengthRemoveSet": "Remove set",
"strengthMoveUp": "Move up",
"strengthMoveDown": "Move down",
"strengthRest": "Rest",
"strengthRestBetween": "Rest between exercises",
"strengthDiscardTitle": "Discard changes?",
"strengthDiscard": "Discard",
"strengthDiscardMessage": "What you changed in this plan is not kept.",
"strengthAbandon": "End without saving",
"strengthAbandonMessage": "The sets done so far are deleted from this device. This can't be undone.",
"strengthFinish": "Finish and save",
"strengthAllDone": "Every set is through.",
"strengthSetDone": "Done",
"strengthSkip": "Skip set",
"strengthSwap": "Swap exercise",
"strengthSwapTitle": "Do instead",
"strengthNoSwaps": "Nothing else here moves this way.",
"strengthRestSkip": "Skip rest",
"strengthResting": "Rest",
"strengthCarryOn": "A session is under way",
"strengthCarryOnAction": "Carry on",
"strengthWeightNotMadeUp": "Nothing here makes this weight up.",
"strengthFixed": "{weight} kg, nearest at or below",
"strengthNoPlace": "No place chosen: weights as planned.",
"strengthTrainsAt": "At {place}",
"strengthWorkoutVolume": "{weight} kg moved",
"strengthWorkoutSets": "{count, plural, =1{1 set} other{{count} sets}}",
"strengthMissing": "Missing here: {needs}",
"@strengthMissing": {
"placeholders": {
"needs": {
"type": "String"
}
}
},
"strengthPlanSummary": "{exercises, plural, =1{1 exercise} other{{exercises} exercises}} · {sets, plural, =1{1 set} other{{sets} sets}}",
"@strengthPlanSummary": {
"placeholders": {
"exercises": {
"type": "int"
},
"sets": {
"type": "int"
}
}
},
"strengthBlockKind": "{kind, select, superset{Superset} circuit{Circuit} other{Exercise}}",
"@strengthBlockKind": {
"placeholders": {
"kind": {
"type": "String"
}
}
},
"strengthSetOf": "Set {set} of {sets}",
"@strengthSetOf": {
"placeholders": {
"set": {
"type": "int"
},
"sets": {
"type": "int"
}
}
},
"strengthRoundOf": "Round {round} of {rounds}",
"@strengthRoundOf": {
"placeholders": {
"round": {
"type": "int"
},
"rounds": {
"type": "int"
}
}
},
"strengthTarget": "{reps} × {weight} kg",
"@strengthTarget": {
"placeholders": {
"reps": {
"type": "int"
},
"weight": {
"type": "String"
}
}
},
"strengthTargetReps": "{reps, plural, =1{1 rep} other{{reps} reps}}",
"@strengthTargetReps": {
"placeholders": {
"reps": {
"type": "int"
}
}
},
"strengthTargetSeconds": "{seconds} s",
"@strengthTargetSeconds": {
"placeholders": {
"seconds": {
"type": "int"
}
}
},
"strengthNextUp": "Next: {exercise}",
"@strengthNextUp": {
"placeholders": {
"exercise": {
"type": "String"
}
}
},
"strengthBarAndPlates": "{bar} kg bar, each side: {plates}",
"@strengthBarAndPlates": {
"placeholders": {
"bar": {
"type": "String"
},
"plates": {
"type": "String"
}
}
},
"strengthHandlesAndPlates": "{bar} kg handles, each side: {plates}",
"@strengthHandlesAndPlates": {
"placeholders": {
"bar": {
"type": "String"
},
"plates": {
"type": "String"
}
}
},
"strengthWeightShort": "{weight} kg below what was planned",
"@strengthWeightShort": {
"placeholders": {
"weight": {
"type": "String"
}
}
},
"weatherHeading": "Weather",
"weatherConditions": "{conditions, select, clear{Clear} partlyCloudy{Partly cloudy} cloudy{Overcast} fog{Fog} drizzle{Drizzle} rain{Rain} freezingRain{Freezing rain} snow{Snow} rainShowers{Showers} snowShowers{Snow showers} thunderstorm{Thunderstorm} other{Weather}}",
"@weatherConditions": {
"placeholders": {
"conditions": {
"type": "String"
}
},
"description": "What the sky did over a workout, from Open-Meteo's weather code."
},
"weatherTemperature": "{temperature} °C",
"@weatherTemperature": {
"placeholders": {
"temperature": {
"type": "String"
}
}
},
"weatherTemperatureRange": "{low}–{high} °C",
"@weatherTemperatureRange": {
"placeholders": {
"low": {
"type": "String"
},
"high": {
"type": "String"
}
}
},
"weatherFeelsLike": "Felt like {temperature} °C",
"@weatherFeelsLike": {
"placeholders": {
"temperature": {
"type": "String"
}
}
},
"weatherWind": "Wind {speed} km/h from the {direction}",
"@weatherWind": {
"placeholders": {
"speed": {
"type": "String"
},
"direction": {
"type": "String"
}
}
},
"weatherWindNoDirection": "Wind {speed} km/h",
"@weatherWindNoDirection": {
"placeholders": {
"speed": {
"type": "String"
}
}
},
"weatherCalm": "Hardly any wind",
"weatherGusts": "gusts up to {speed} km/h",
"@weatherGusts": {
"placeholders": {
"speed": {
"type": "String"
}
}
},
"weatherDirection": "{direction, select, n{north} ne{north-east} e{east} se{south-east} s{south} sw{south-west} w{west} nw{north-west} other{wind}}",
"@weatherDirection": {
"placeholders": {
"direction": {
"type": "String"
}
},
"description": "Where the wind came from, as in \"from the south-west\"."
},
"weatherPrecipitation": "{amount} mm fell",
"@weatherPrecipitation": {
"placeholders": {
"amount": {
"type": "String"
}
}
},
"weatherDry": "Nothing fell",
"weatherBy": "Weather data by Open-Meteo.com",
"movementTitle": "Moving more",
"movementHint": "Reminders to get up, and workouts suggested as you move",
"movementRemind": "Remind me to move",
"movementRemindHint": "When the phone counted hardly a step for a while; never while recording or in a car.",
"movementIdle": "After",
"movementIdleMinutes": "{minutes} min still",
"@movementIdleMinutes": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"movementHours": "Hours",
"movementBreak": "Break",
"movementBreakHint": "No reminders over it.",
"movementDays": "Days",
"movementSuggest": "Suggest workouts",
"movementSuggestHint": "When your steps look like a walk or a run and nothing records: tap to record the rest of it. Your Loop's own detection is on its screen.",
"movementUnavailable": "This phone doesn't count steps, so it can neither remind nor suggest.",
"movementRefused": "Train needs the physical activity and notification permissions for this.",
"movementLate": "The steps are counted every 15 minutes, so a reminder can come a little late.",
"movementChannel": "Moving more",
"movementRemindTitle": "Time to move",
"movementRemindText": "{minutes} minutes with hardly a step. Up for a short walk?",
"@movementRemindText": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"movementWalkingTitle": "Out for a walk?",
"movementRunningTitle": "Out for a run?",
"movementSuggestText": "Tap to record the rest of it.",
"loopDetection": "Detect training by itself",
"loopDetectionHint": "The band notices a session you didn't record, and it comes in as a workout.",
"loopDetectionMinimum": "Keeps sessions from",
"loopDetectionMinutes": "{minutes} min",
"@loopDetectionMinutes": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"bodyWeightPounds": "{lb} lb",
"@bodyWeightPounds": {
"placeholders": {
"lb": {
"type": "String"
}
}
},
"weightInvalidPounds": "A weight between 44 and 880 lb",
"profileWeightUnitPounds": "lb",
"profileWeightIn": "Weight in",
"@profileWeightIn": {
"description": "Above the choice between kilograms and pounds in Your body."
},
"profileWeightKilograms": "Kilograms",
"profileWeightPounds": "Pounds"
}