feat(train): equipment by place and a plate calculator (ADR 0034)

The places a person trains at (home, a gym), each a sealed, synced
`training_place` row with its equipment: bars and handles with their own
weight, plates by weight and count, dumbbells and kettlebells, the rest
by count, the person's own by name. A new place starts from what a home
or a gym usually has. The place last chosen is remembered on the device,
never its location.

The plate calculator loads each weight both sides alike, the heaviest
load not above it with the fewest plates, heavier inside, and over a
series of sets picks the loads making the fewest plate moves, listing
what comes off and goes on. Equipment is in Settings; strength plans
are to build on it.

The migration only creates the table, its space index and its cascade
to the sync engine's spaces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-02 11:59:24 +01:00
commit 064b911aa2
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -734,5 +734,72 @@
"@bodyResting": {"placeholders": {"bpm": {"type": "int"}}},
"bodyMax": "max {bpm} bpm",
"@bodyMax": {"placeholders": {"bpm": {"type": "int"}}},
"homeToday": "Today"
"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"}}}
}