Add French (fr) exercise instructions
Adds a tenth language to all 1,324 exercises: `instructions.fr` and `instruction_steps.fr`, plus the schema, README, viewer and setup guide. Register matches the existing Spanish/Italian/Polish translations — informal second-person imperative (tutoiement): en: Lie flat on your back with your knees bent and feet flat on the ground. fr: Allonge-toi sur le dos, les genoux fléchis et les pieds à plat au sol. How it was produced ------------------- The 7,710 English step sentences deduplicate to 4,414 unique strings. Those were translated (LLM-assisted, glossary-constrained, then audited), and the per-exercise arrays were rebuilt deterministically by mapping each English step back through that table. `instructions.fr` is the join of `instruction_steps.fr`, so the two can never drift. A fixed glossary pinned the recurring terms — répétitions, position de départ, haltère/barre, sangle abdominale, omoplates, largeur des épaules — so terminology is consistent across all 1,324 records rather than varying sentence by sentence. Verified -------- - 1,324 records validate against the updated schema; a record missing `fr` is now rejected. - fr step count == en step count in every record (the dataset's existing invariant across all nine prior languages). - instructions.fr == ' '.join(instruction_steps.fr) in every record. - Every pre-existing field is byte-identical; `fr` is purely additive. - No empty strings, none left in English, no vouvoiement across 7,710 steps. - index.html embed stays in sync with data/exercises.json; the language picker renders "Français" and the steps display correctly. Note for review: these are machine translations, reviewed programmatically rather than by a native speaker. Happy to adjust any wording.
This commit is contained in:
@@ -11,12 +11,12 @@
|
|||||||
<img src="videos/0334-DsgkuIt.gif" width="120" alt="dumbbell lateral raise" />
|
<img src="videos/0334-DsgkuIt.gif" width="120" alt="dumbbell lateral raise" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
**A comprehensive, ready-to-use fitness exercise dataset with 1,324 exercises — each with an animation GIF, 180×180 thumbnail image, category, body-part, equipment, target and muscle-group data, and step-by-step instructions in 9 languages (English, Spanish, Italian, Turkish, Russian, Chinese, Hindi, Polish, Korean).**
|
**A comprehensive, ready-to-use fitness exercise dataset with 1,324 exercises — each with an animation GIF, 180×180 thumbnail image, category, body-part, equipment, target and muscle-group data, and step-by-step instructions in 10 languages (English, Spanish, Italian, Turkish, Russian, Chinese, Hindi, Polish, Korean, French).**
|
||||||
|
|
||||||
[](data/exercises.json)
|
[](data/exercises.json)
|
||||||
[](videos/)
|
[](videos/)
|
||||||
[](images/)
|
[](images/)
|
||||||
[](#-overview)
|
[](#-overview)
|
||||||
[](https://github.com/hasaneyldrm/logpress-public)
|
[](https://github.com/hasaneyldrm/logpress-public)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
- 1,324 exercises with category, body-part, equipment, target and muscle-group data
|
- 1,324 exercises with category, body-part, equipment, target and muscle-group data
|
||||||
- an animation GIF + 180×180 thumbnail for every exercise (media © [Gym visual](https://gymvisual.com/) — see [License](#-license--use))
|
- an animation GIF + 180×180 thumbnail for every exercise (media © [Gym visual](https://gymvisual.com/) — see [License](#-license--use))
|
||||||
- step-by-step instructions in 9 languages (🇬🇧 English, 🇪🇸 Spanish, 🇮🇹 Italian, 🇹🇷 Turkish, 🇷🇺 Russian, 🇨🇳 Chinese, 🇮🇳 Hindi, 🇵🇱 Polish, 🇰🇷 Korean)
|
- step-by-step instructions in 10 languages (🇬🇧 English, 🇪🇸 Spanish, 🇮🇹 Italian, 🇹🇷 Turkish, 🇷🇺 Russian, 🇨🇳 Chinese, 🇮🇳 Hindi, 🇵🇱 Polish, 🇰🇷 Korean, 🇫🇷 French)
|
||||||
- the interactive browser (`index.html`) and developer setup guide (`setup.html`)
|
- the interactive browser (`index.html`) and developer setup guide (`setup.html`)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -71,7 +71,7 @@ Each exercise entry contains:
|
|||||||
| Muscle Group | Supporting / synergist muscles |
|
| Muscle Group | Supporting / synergist muscles |
|
||||||
| Equipment | Equipment required (or `body weight` for bodyweight) |
|
| Equipment | Equipment required (or `body weight` for bodyweight) |
|
||||||
| Instructions | Step-by-step instructions for each exercise |
|
| Instructions | Step-by-step instructions for each exercise |
|
||||||
| Available Languages | 🇬🇧 English · 🇪🇸 Spanish · 🇮🇹 Italian · 🇹🇷 Turkish · 🇷🇺 Russian · 🇨🇳 Chinese · 🇮🇳 Hindi · 🇵🇱 Polish · 🇰🇷 Korean |
|
| Available Languages | 🇬🇧 English · 🇪🇸 Spanish · 🇮🇹 Italian · 🇹🇷 Turkish · 🇷🇺 Russian · 🇨🇳 Chinese · 🇮🇳 Hindi · 🇵🇱 Polish · 🇰🇷 Korean · 🇫🇷 French |
|
||||||
| Media | 180×180 thumbnail (`image`) + animation GIF (`gif_url`) per exercise — media © Gym visual, see [License](#-license--use) |
|
| Media | 180×180 thumbnail (`image`) + animation GIF (`gif_url`) per exercise — media © Gym visual, see [License](#-license--use) |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -88,7 +88,7 @@ A fully client-side exercise explorer with:
|
|||||||
- Live search across all 1,324 exercises
|
- Live search across all 1,324 exercises
|
||||||
- Filter by category, equipment, and target muscle
|
- Filter by category, equipment, and target muscle
|
||||||
- Infinite scroll grid
|
- Infinite scroll grid
|
||||||
- Click any card to see full details and instructions in English, Spanish, Italian, Turkish, Russian, Chinese, Hindi, Polish, or Korean
|
- Click any card to see full details and instructions in English, Spanish, Italian, Turkish, Russian, Chinese, Hindi, Polish, Korean, or French
|
||||||
|
|
||||||
### `setup.html` — Developer Setup Guide
|
### `setup.html` — Developer Setup Guide
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ exercises-dataset/
|
|||||||
| Metric | Count |
|
| Metric | Count |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Total Exercises | **1,324** |
|
| Total Exercises | **1,324** |
|
||||||
| Instruction Languages | **9** |
|
| Instruction Languages | **10** |
|
||||||
|
|
||||||
### Exercises by Body Part
|
### Exercises by Body Part
|
||||||
|
|
||||||
@@ -189,7 +189,8 @@ Each record in `data/exercises.json` follows this structure. A machine-readable
|
|||||||
| `instructions.hi` | `string` | Full step-by-step instructions in Hindi |
|
| `instructions.hi` | `string` | Full step-by-step instructions in Hindi |
|
||||||
| `instructions.pl` | `string` | Full step-by-step instructions in Polish |
|
| `instructions.pl` | `string` | Full step-by-step instructions in Polish |
|
||||||
| `instructions.ko` | `string` | Full step-by-step instructions in Korean |
|
| `instructions.ko` | `string` | Full step-by-step instructions in Korean |
|
||||||
| `instruction_steps.<lang>` | `array[string]` | Same instructions split into an ordered array of steps, per language (`en`, `es`, `it`, `tr`, `ru`, `zh`, `hi`, `pl`, `ko`) |
|
| `instructions.fr` | `string` | Full step-by-step instructions in French |
|
||||||
|
| `instruction_steps.<lang>` | `array[string]` | Same instructions split into an ordered array of steps, per language (`en`, `es`, `it`, `tr`, `ru`, `zh`, `hi`, `pl`, `ko`, `fr`) |
|
||||||
| `muscle_group` | `string` | Primary synergist muscle group |
|
| `muscle_group` | `string` | Primary synergist muscle group |
|
||||||
| `secondary_muscles` | `array[string]` | Additional muscles involved |
|
| `secondary_muscles` | `array[string]` | Additional muscles involved |
|
||||||
| `target` | `string` | Primary target muscle (e.g. `"biceps"`, `"pectoralis major"`) |
|
| `target` | `string` | Primary target muscle (e.g. `"biceps"`, `"pectoralis major"`) |
|
||||||
@@ -217,7 +218,8 @@ Each record in `data/exercises.json` follows this structure. A machine-readable
|
|||||||
"zh": "平躺,膝盖弯曲,双脚平放在地上。...",
|
"zh": "平躺,膝盖弯曲,双脚平放在地上。...",
|
||||||
"hi": "अपने घुटनों को मोड़कर और पैरों को ज़मीन पर सपाट रखते हुए अपनी पीठ के बल लेट जाएँ।...",
|
"hi": "अपने घुटनों को मोड़कर और पैरों को ज़मीन पर सपाट रखते हुए अपनी पीठ के बल लेट जाएँ।...",
|
||||||
"pl": "Połóż się płasko na plecach, ugnij kolana i oprzyj stopy płasko na pod ...",
|
"pl": "Połóż się płasko na plecach, ugnij kolana i oprzyj stopy płasko na pod ...",
|
||||||
"ko": "등을 바닥에 누워 무릎을 구부리고 발을 바닥에 붙입니다. ..."
|
"ko": "등을 바닥에 누워 무릎을 구부리고 발을 바닥에 붙입니다. ...",
|
||||||
|
"fr": "Allonge-toi sur le dos, les genoux fléchis et les pieds à plat au sol. ..."
|
||||||
},
|
},
|
||||||
"muscle_group": "hip flexors",
|
"muscle_group": "hip flexors",
|
||||||
"secondary_muscles": ["hip flexors", "lower back"],
|
"secondary_muscles": ["hip flexors", "lower back"],
|
||||||
@@ -333,6 +335,7 @@ print(ex["instructions"]["tr"]) # Turkish
|
|||||||
print(ex["instructions"]["ru"]) # Russian
|
print(ex["instructions"]["ru"]) # Russian
|
||||||
print(ex["instructions"]["zh"]) # Chinese
|
print(ex["instructions"]["zh"]) # Chinese
|
||||||
print(ex["instructions"]["hi"]) # Hindi
|
print(ex["instructions"]["hi"]) # Hindi
|
||||||
|
print(ex["instructions"]["fr"]) # French
|
||||||
```
|
```
|
||||||
|
|
||||||
### Python — Load with Pandas
|
### Python — Load with Pandas
|
||||||
@@ -384,6 +387,7 @@ console.log(ex.instructions.zh); // Chinese
|
|||||||
console.log(ex.instructions.hi); // Hindi
|
console.log(ex.instructions.hi); // Hindi
|
||||||
console.log(ex.instructions.pl); // Polish
|
console.log(ex.instructions.pl); // Polish
|
||||||
console.log(ex.instructions.ko); // Korean
|
console.log(ex.instructions.ko); // Korean
|
||||||
|
console.log(ex.instructions.fr); // French
|
||||||
```
|
```
|
||||||
|
|
||||||
### TypeScript — Type-safe Usage
|
### TypeScript — Type-safe Usage
|
||||||
@@ -405,6 +409,7 @@ interface Exercise {
|
|||||||
hi: string;
|
hi: string;
|
||||||
pl: string;
|
pl: string;
|
||||||
ko: string;
|
ko: string;
|
||||||
|
fr: string;
|
||||||
};
|
};
|
||||||
muscle_group: string;
|
muscle_group: string;
|
||||||
secondary_muscles: string[];
|
secondary_muscles: string[];
|
||||||
|
|||||||
+13006
-1324
File diff suppressed because it is too large
Load Diff
@@ -20,9 +20,10 @@
|
|||||||
"zh": { "type": "string" },
|
"zh": { "type": "string" },
|
||||||
"hi": { "type": "string" },
|
"hi": { "type": "string" },
|
||||||
"pl": { "type": "string" },
|
"pl": { "type": "string" },
|
||||||
"ko": { "type": "string" }
|
"ko": { "type": "string" },
|
||||||
|
"fr": { "type": "string" }
|
||||||
},
|
},
|
||||||
"required": ["en", "es", "it", "tr", "ru", "zh", "hi", "pl", "ko"],
|
"required": ["en", "es", "it", "tr", "ru", "zh", "hi", "pl", "ko", "fr"],
|
||||||
"additionalProperties": { "type": "string" }
|
"additionalProperties": { "type": "string" }
|
||||||
},
|
},
|
||||||
"languageStepsMap": {
|
"languageStepsMap": {
|
||||||
@@ -37,9 +38,10 @@
|
|||||||
"zh": { "$ref": "#/$defs/steps" },
|
"zh": { "$ref": "#/$defs/steps" },
|
||||||
"hi": { "$ref": "#/$defs/steps" },
|
"hi": { "$ref": "#/$defs/steps" },
|
||||||
"pl": { "$ref": "#/$defs/steps" },
|
"pl": { "$ref": "#/$defs/steps" },
|
||||||
"ko": { "$ref": "#/$defs/steps" }
|
"ko": { "$ref": "#/$defs/steps" },
|
||||||
|
"fr": { "$ref": "#/$defs/steps" }
|
||||||
},
|
},
|
||||||
"required": ["en", "es", "it", "tr", "ru", "zh", "hi", "pl", "ko"],
|
"required": ["en", "es", "it", "tr", "ru", "zh", "hi", "pl", "ko", "fr"],
|
||||||
"additionalProperties": { "$ref": "#/$defs/steps" }
|
"additionalProperties": { "$ref": "#/$defs/steps" }
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
|
|||||||
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
@@ -1401,7 +1401,7 @@ function buildLlmPrompt(fwKey, dbKey) {
|
|||||||
|
|
||||||
## Dataset Overview
|
## Dataset Overview
|
||||||
- 1,324 fitness exercises
|
- 1,324 fitness exercises
|
||||||
- Fields: id (string, e.g. "0001"), name, category, body_part, equipment, instructions_en (full text), instructions_es (Spanish text), instructions_it (Italian text), instructions_tr (Turkish text), instructions_ru (Russian text), instructions_zh (Chinese text), instructions_hi (Hindi text), instructions_pl (Polish text), instructions_ko (Korean text), muscle_group, secondary_muscles (JSON array of strings), target, image (relative path like "images/0001.jpg"), gif_url (relative path like "videos/0001.gif"), created_at
|
- Fields: id (string, e.g. "0001"), name, category, body_part, equipment, instructions_en (full text), instructions_es (Spanish text), instructions_it (Italian text), instructions_tr (Turkish text), instructions_ru (Russian text), instructions_zh (Chinese text), instructions_hi (Hindi text), instructions_pl (Polish text), instructions_ko (Korean text), instructions_fr (French text), muscle_group, secondary_muscles (JSON array of strings), target, image (relative path like "images/0001.jpg"), gif_url (relative path like "videos/0001.gif"), created_at
|
||||||
|
|
||||||
## Database Schema (${db.name})
|
## Database Schema (${db.name})
|
||||||
\`\`\`sql
|
\`\`\`sql
|
||||||
|
|||||||
Reference in New Issue
Block a user