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

@ -3507,6 +3507,324 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Today'**
String get homeToday;
/// Settings' entry and the screen of the places the person trains at, with what each has (ADR 0034).
///
/// In en, this message translates to:
/// **'Equipment'**
String get equipmentTitle;
/// No description provided for @equipmentHint.
///
/// In en, this message translates to:
/// **'Where you train, and what\'s there'**
String get equipmentHint;
/// No description provided for @equipmentEmptyTitle.
///
/// In en, this message translates to:
/// **'No places yet'**
String get equipmentEmptyTitle;
/// No description provided for @equipmentEmptyHint.
///
/// In en, this message translates to:
/// **'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.'**
String get equipmentEmptyHint;
/// No description provided for @equipmentAddPlace.
///
/// In en, this message translates to:
/// **'Add a place'**
String get equipmentAddPlace;
/// No description provided for @equipmentItems.
///
/// In en, this message translates to:
/// **'{count, plural, =0{Nothing yet} =1{1 piece of equipment} other{{count} pieces of equipment}}'**
String equipmentItems(int count);
/// Marks the place chosen, which the plate calculator and plans use (ADR 0034, D4).
///
/// In en, this message translates to:
/// **'Where you train now'**
String get equipmentChosen;
/// No description provided for @equipmentChoose.
///
/// In en, this message translates to:
/// **'Train here'**
String get equipmentChoose;
/// No description provided for @equipmentLocked.
///
/// In en, this message translates to:
/// **'Can\'t be opened on this device'**
String get equipmentLocked;
/// No description provided for @placeNewTitle.
///
/// In en, this message translates to:
/// **'New place'**
String get placeNewTitle;
/// No description provided for @placeName.
///
/// In en, this message translates to:
/// **'Name'**
String get placeName;
/// No description provided for @placeStartFrom.
///
/// In en, this message translates to:
/// **'Start from'**
String get placeStartFrom;
/// No description provided for @placeStartHome.
///
/// In en, this message translates to:
/// **'A home'**
String get placeStartHome;
/// No description provided for @placeStartGym.
///
/// In en, this message translates to:
/// **'A gym'**
String get placeStartGym;
/// No description provided for @placeStartNothing.
///
/// In en, this message translates to:
/// **'Nothing'**
String get placeStartNothing;
/// No description provided for @placeDefaultHome.
///
/// In en, this message translates to:
/// **'Home'**
String get placeDefaultHome;
/// No description provided for @placeDefaultGym.
///
/// In en, this message translates to:
/// **'Gym'**
String get placeDefaultGym;
/// No description provided for @placeAdd.
///
/// In en, this message translates to:
/// **'Add'**
String get placeAdd;
/// No description provided for @placeRename.
///
/// In en, this message translates to:
/// **'Rename'**
String get placeRename;
/// No description provided for @placeSave.
///
/// In en, this message translates to:
/// **'Save'**
String get placeSave;
/// No description provided for @placeDelete.
///
/// In en, this message translates to:
/// **'Delete place'**
String get placeDelete;
/// No description provided for @placeDeleteMessage.
///
/// In en, this message translates to:
/// **'The place and its equipment are deleted on all your devices.'**
String get placeDeleteMessage;
/// No description provided for @placeAddEquipment.
///
/// In en, this message translates to:
/// **'Add equipment'**
String get placeAddEquipment;
/// No description provided for @placeEmptyHint.
///
/// In en, this message translates to:
/// **'Nothing here yet. Add the equipment this place has.'**
String get placeEmptyHint;
/// No description provided for @equipmentKind.
///
/// In en, this message translates to:
/// **'{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}}'**
String equipmentKind(String kind);
/// No description provided for @itemName.
///
/// In en, this message translates to:
/// **'What it is'**
String get itemName;
/// No description provided for @itemHowMany.
///
/// In en, this message translates to:
/// **'How many'**
String get itemHowMany;
/// No description provided for @itemOwnWeight.
///
/// In en, this message translates to:
/// **'Its own weight'**
String get itemOwnWeight;
/// No description provided for @itemWeights.
///
/// In en, this message translates to:
/// **'Weights'**
String get itemWeights;
/// No description provided for @itemAddWeight.
///
/// In en, this message translates to:
/// **'Add a weight'**
String get itemAddWeight;
/// No description provided for @itemDone.
///
/// In en, this message translates to:
/// **'Done'**
String get itemDone;
/// No description provided for @itemRemove.
///
/// In en, this message translates to:
/// **'Remove'**
String get itemRemove;
/// No description provided for @itemWeightInvalid.
///
/// In en, this message translates to:
/// **'A weight in kilograms, above 0'**
String get itemWeightInvalid;
/// No description provided for @weightKg.
///
/// In en, this message translates to:
/// **'{weight} kg'**
String weightKg(String weight);
/// No description provided for @weightCount.
///
/// In en, this message translates to:
/// **'{count} × {weight} kg'**
String weightCount(int count, String weight);
/// No description provided for @plateCalculatorTitle.
///
/// In en, this message translates to:
/// **'Plate calculator'**
String get plateCalculatorTitle;
/// No description provided for @plateCalculatorHint.
///
/// In en, this message translates to:
/// **'What to load, and what changes between sets'**
String get plateCalculatorHint;
/// No description provided for @platePlace.
///
/// In en, this message translates to:
/// **'Place'**
String get platePlace;
/// No description provided for @plateBar.
///
/// In en, this message translates to:
/// **'Bar'**
String get plateBar;
/// No description provided for @plateDumbbellPair.
///
/// In en, this message translates to:
/// **'Two dumbbell handles'**
String get plateDumbbellPair;
/// No description provided for @plateTargets.
///
/// In en, this message translates to:
/// **'Weights, kg'**
String get plateTargets;
/// No description provided for @plateTargetsHelper.
///
/// In en, this message translates to:
/// **'One for each set, such as 60, 80, 100'**
String get plateTargetsHelper;
/// No description provided for @plateNoPlace.
///
/// In en, this message translates to:
/// **'Add a place you train at, with its plates, first.'**
String get plateNoPlace;
/// No description provided for @plateNoBar.
///
/// In en, this message translates to:
/// **'This place has nothing that takes plates. Add a barbell or dumbbell handles to it.'**
String get plateNoBar;
/// No description provided for @plateBelowBar.
///
/// In en, this message translates to:
/// **'Below the bar\'s {weight} kg'**
String plateBelowBar(String weight);
/// No description provided for @plateShort.
///
/// In en, this message translates to:
/// **'{weight} kg below what you asked for: the plates make no closer weight'**
String plateShort(String weight);
/// No description provided for @plateSide.
///
/// In en, this message translates to:
/// **'Each side, from the inside: {plates}'**
String plateSide(String plates);
/// No description provided for @plateBarAlone.
///
/// In en, this message translates to:
/// **'The bar alone'**
String get plateBarAlone;
/// No description provided for @plateOff.
///
/// In en, this message translates to:
/// **'Take off {plates}'**
String plateOff(String plates);
/// No description provided for @plateOn.
///
/// In en, this message translates to:
/// **'Put on {plates}'**
String plateOn(String plates);
/// No description provided for @plateNoChange.
///
/// In en, this message translates to:
/// **'Nothing changes'**
String get plateNoChange;
/// No description provided for @plateMoves.
///
/// In en, this message translates to:
/// **'{count, plural, =0{No plate moves} =1{1 plate moves on each side} other{{count} plates move on each side}}'**
String plateMoves(int count);
/// No description provided for @plateSet.
///
/// In en, this message translates to:
/// **'Set {number}'**
String plateSet(int number);
}
class _AppLocalizationsDelegate