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
5 changed files with 24759 additions and 7 deletions

View file

@ -580,5 +580,59 @@
"bodyWeight": "{kg} kg",
"bodyResting": "Ruhepuls {bpm}",
"bodyMax": "Maximalpuls {bpm}",
"homeToday": "Heute"
"homeToday": "Heute",
"equipmentTitle": "Ausrüstung",
"equipmentHint": "Wo du trainierst und was es dort gibt",
"equipmentEmptyTitle": "Noch keine Orte",
"equipmentEmptyHint": "Füge die Orte hinzu, an denen du trainierst, etwa dein Zuhause und dein Studio, mit dem, was es dort gibt. Beginne mit dem, was ein Zuhause oder ein Studio meist hat, oder mit nichts.",
"equipmentAddPlace": "Ort hinzufügen",
"equipmentItems": "{count, plural, =0{Noch nichts} =1{1 Ausrüstungsstück} other{{count} Ausrüstungsstücke}}",
"equipmentChosen": "Hier trainierst du gerade",
"equipmentChoose": "Hier trainieren",
"equipmentLocked": "Lässt sich auf diesem Gerät nicht öffnen",
"placeNewTitle": "Neuer Ort",
"placeName": "Name",
"placeStartFrom": "Beginnen mit",
"placeStartHome": "Zuhause",
"placeStartGym": "Studio",
"placeStartNothing": "Nichts",
"placeDefaultHome": "Zuhause",
"placeDefaultGym": "Studio",
"placeAdd": "Hinzufügen",
"placeRename": "Umbenennen",
"placeSave": "Speichern",
"placeDelete": "Ort löschen",
"placeDeleteMessage": "Der Ort und seine Ausrüstung werden auf all deinen Geräten gelöscht.",
"placeAddEquipment": "Ausrüstung hinzufügen",
"placeEmptyHint": "Hier ist noch nichts. Füge die Ausrüstung hinzu, die es an diesem Ort gibt.",
"equipmentKind": "{kind, select, barbell{Langhantel} ezBar{SZ-Stange} trapBar{Trap Bar} dumbbellHandle{Kurzhantelgriffe} plates{Hantelscheiben} fixedDumbbells{Kurzhanteln} kettlebells{Kettlebells} bench{Bank} rack{Rack} pullUpBar{Klimmzugstange} dipBars{Dipstation} cableMachine{Kabelzug} bands{Widerstandsbänder} other{Eigenes}}",
"itemName": "Was es ist",
"itemHowMany": "Wie viele",
"itemOwnWeight": "Eigengewicht",
"itemWeights": "Gewichte",
"itemAddWeight": "Gewicht hinzufügen",
"itemDone": "Fertig",
"itemRemove": "Entfernen",
"itemWeightInvalid": "Ein Gewicht in Kilogramm, über 0",
"weightKg": "{weight} kg",
"weightCount": "{count} × {weight} kg",
"plateCalculatorTitle": "Scheibenrechner",
"plateCalculatorHint": "Was du auflegst und was sich zwischen den Sätzen ändert",
"platePlace": "Ort",
"plateBar": "Stange",
"plateDumbbellPair": "Zwei Kurzhantelgriffe",
"plateTargets": "Gewichte, kg",
"plateTargetsHelper": "Eins für jeden Satz, etwa 60, 80, 100",
"plateNoPlace": "Füge zuerst einen Ort hinzu, an dem du trainierst, mit seinen Scheiben.",
"plateNoBar": "An diesem Ort gibt es nichts, worauf Scheiben passen. Füge eine Langhantel oder Kurzhantelgriffe hinzu.",
"plateBelowBar": "Unter den {weight} kg der Stange",
"plateShort": "{weight} kg unter deinem Ziel: Näher kommen die Scheiben nicht",
"plateSide": "Jede Seite, von innen: {plates}",
"plateBarAlone": "Nur die Stange",
"plateOff": "Nimm ab: {plates}",
"plateOn": "Leg auf: {plates}",
"plateNoChange": "Nichts ändert sich",
"plateMoves": "{count, plural, =0{Keine Scheibe bewegt sich} =1{1 Scheibe je Seite bewegt sich} other{{count} Scheiben je Seite bewegen sich}}",
"plateSet": "Satz {number}"
}

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"}}}
}

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

View file

@ -2112,4 +2112,224 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get homeToday => 'Heute';
@override
String get equipmentTitle => 'Ausrüstung';
@override
String get equipmentHint => 'Wo du trainierst und was es dort gibt';
@override
String get equipmentEmptyTitle => 'Noch keine Orte';
@override
String get equipmentEmptyHint =>
'Füge die Orte hinzu, an denen du trainierst, etwa dein Zuhause und dein Studio, mit dem, was es dort gibt. Beginne mit dem, was ein Zuhause oder ein Studio meist hat, oder mit nichts.';
@override
String get equipmentAddPlace => 'Ort hinzufügen';
@override
String equipmentItems(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Ausrüstungsstücke',
one: '1 Ausrüstungsstück',
zero: 'Noch nichts',
);
return '$_temp0';
}
@override
String get equipmentChosen => 'Hier trainierst du gerade';
@override
String get equipmentChoose => 'Hier trainieren';
@override
String get equipmentLocked => 'Lässt sich auf diesem Gerät nicht öffnen';
@override
String get placeNewTitle => 'Neuer Ort';
@override
String get placeName => 'Name';
@override
String get placeStartFrom => 'Beginnen mit';
@override
String get placeStartHome => 'Zuhause';
@override
String get placeStartGym => 'Studio';
@override
String get placeStartNothing => 'Nichts';
@override
String get placeDefaultHome => 'Zuhause';
@override
String get placeDefaultGym => 'Studio';
@override
String get placeAdd => 'Hinzufügen';
@override
String get placeRename => 'Umbenennen';
@override
String get placeSave => 'Speichern';
@override
String get placeDelete => 'Ort löschen';
@override
String get placeDeleteMessage =>
'Der Ort und seine Ausrüstung werden auf all deinen Geräten gelöscht.';
@override
String get placeAddEquipment => 'Ausrüstung hinzufügen';
@override
String get placeEmptyHint =>
'Hier ist noch nichts. Füge die Ausrüstung hinzu, die es an diesem Ort gibt.';
@override
String equipmentKind(String kind) {
String _temp0 = intl.Intl.selectLogic(
kind,
{
'barbell': 'Langhantel',
'ezBar': 'SZ-Stange',
'trapBar': 'Trap Bar',
'dumbbellHandle': 'Kurzhantelgriffe',
'plates': 'Hantelscheiben',
'fixedDumbbells': 'Kurzhanteln',
'kettlebells': 'Kettlebells',
'bench': 'Bank',
'rack': 'Rack',
'pullUpBar': 'Klimmzugstange',
'dipBars': 'Dipstation',
'cableMachine': 'Kabelzug',
'bands': 'Widerstandsbänder',
'other': 'Eigenes',
},
);
return '$_temp0';
}
@override
String get itemName => 'Was es ist';
@override
String get itemHowMany => 'Wie viele';
@override
String get itemOwnWeight => 'Eigengewicht';
@override
String get itemWeights => 'Gewichte';
@override
String get itemAddWeight => 'Gewicht hinzufügen';
@override
String get itemDone => 'Fertig';
@override
String get itemRemove => 'Entfernen';
@override
String get itemWeightInvalid => 'Ein Gewicht in Kilogramm, über 0';
@override
String weightKg(String weight) {
return '$weight kg';
}
@override
String weightCount(int count, String weight) {
return '$count × $weight kg';
}
@override
String get plateCalculatorTitle => 'Scheibenrechner';
@override
String get plateCalculatorHint =>
'Was du auflegst und was sich zwischen den Sätzen ändert';
@override
String get platePlace => 'Ort';
@override
String get plateBar => 'Stange';
@override
String get plateDumbbellPair => 'Zwei Kurzhantelgriffe';
@override
String get plateTargets => 'Gewichte, kg';
@override
String get plateTargetsHelper => 'Eins für jeden Satz, etwa 60, 80, 100';
@override
String get plateNoPlace =>
'Füge zuerst einen Ort hinzu, an dem du trainierst, mit seinen Scheiben.';
@override
String get plateNoBar =>
'An diesem Ort gibt es nichts, worauf Scheiben passen. Füge eine Langhantel oder Kurzhantelgriffe hinzu.';
@override
String plateBelowBar(String weight) {
return 'Unter den $weight kg der Stange';
}
@override
String plateShort(String weight) {
return '$weight kg unter deinem Ziel: Näher kommen die Scheiben nicht';
}
@override
String plateSide(String plates) {
return 'Jede Seite, von innen: $plates';
}
@override
String get plateBarAlone => 'Nur die Stange';
@override
String plateOff(String plates) {
return 'Nimm ab: $plates';
}
@override
String plateOn(String plates) {
return 'Leg auf: $plates';
}
@override
String get plateNoChange => 'Nichts ändert sich';
@override
String plateMoves(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Scheiben je Seite bewegen sich',
one: '1 Scheibe je Seite bewegt sich',
zero: 'Keine Scheibe bewegt sich',
);
return '$_temp0';
}
@override
String plateSet(int number) {
return 'Satz $number';
}
}

View file

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