diff --git a/.github/workflows/generate-tts.yml b/.github/workflows/generate-tts.yml index df04b1de..6884c99d 100644 --- a/.github/workflows/generate-tts.yml +++ b/.github/workflows/generate-tts.yml @@ -28,7 +28,12 @@ jobs: env: MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }} + # if: always() — on commit même si la génération a échoué sur quelques + # fichiers (ex. rate limit résiduel). Le script est idempotent : un + # re-run ne régénère que les manquants, donc la progression n'est jamais + # perdue entre deux exécutions. - name: Commit and push new MP3s + if: always() run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" diff --git a/CLAUDE.md b/CLAUDE.md index dbbcb8fa..2dc97fe6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,6 +38,19 @@ App d'apprentissage des tables de multiplication (PWA, sans backend). reste en `waiting` jusqu'à ce que la page envoie `SKIP_WAITING` via `pwa-register.js`/`setBusy` quand `App` est sur un écran "safe" (`home` uniquement). Évite tout reload mid-séance. +- **i18n (fr/en)** : langue d'interface **globale** (pas par profil), + persistée dans `localStorage` sous `multiplix-lang`, défaut = langue du + navigateur. Cœur dans `src/i18n/lang.ts` (`useLang`, `useStrings` pour React ; + `getLang`/`pickStrings` pour le code hors-React comme `lib/badges`, + `lib/strategies`, `lib/changelog`) ; le `LangProvider` est dans + `src/i18n/LangProvider.tsx`. Chaque domaine a son + module de strings (`src/i18n/*.ts`) exposant un hook `useXStrings()` basé sur + une table `{ fr, en }` typée. La landing statique de `index.html` est + bilingue via des `` togglés par CSS sur `html[lang]` (langue + fixée avant le 1er paint par l'inline script du ``). Voix : MP3 par + langue sous `public/audio/tts//` (cf. `useTTS`), reconnaissance vocale + et parsing des nombres parlés branchés sur la langue (`lib/parseSpokenNumber`). + Les specs publiques et le guide utilisateur restent FR pour l'instant. - localStorage pour la persistance (pas de backend). - Déploiement : GitHub Pages via GitHub Actions (`BASE=/`). - Node minimum : 22.12+ (CI utilise Node 22). @@ -79,7 +92,9 @@ Un guide HTML avec captures d'écran est généré par `npm run user-guide` (scr Les voix sont pré-générées via `scripts/generate-tts.mjs` (Mistral Voxtral) et checked-in dans `public/audio/tts/`. Le script est idempotent : il ne régénère que les fichiers manquants. -**Quand ajouter un MP3** : ajouter une entrée dans `scripts/generate-tts.mjs` avec une nouvelle `key` et le `text` correspondant, puis générer. +**Multilingue** : un sous-dossier par langue — `public/audio/tts/fr/` et `public/audio/tts/en/` (mêmes clés, chemin `audio/tts//.mp3` résolu par `useTTS` selon la langue). `generate-tts.mjs` génère les deux langues par défaut ; restreindre avec `TTS_LANGS=en`. Chaque langue a sa voix Voxtral (constantes `VOICE_ID_FR`/`VOICE_ID_EN` dans le script) ; la voix anglaise est surchargeable par `MISTRAL_VOICE_ID_EN`. + +**Quand ajouter un MP3** : ajouter une entrée dans `buildEntriesFr()` ET `buildEntriesEn()` de `scripts/generate-tts.mjs` avec la même `key`, puis générer. **Comment générer** (la clé API n'est jamais en clair dans le repo) : diff --git a/index.html b/index.html index e14f4c9d..6d7d8208 100644 --- a/index.html +++ b/index.html @@ -33,6 +33,14 @@ déjà cliqué : l'app va monter directement sur Home/Welcome, pas la landing. On masque la landing statique pour éviter qu'elle flash. */ html.skip-static-landing #static-landing { display: none; } + /* Texte bilingue de la landing : chaque chaîne existe en deux éléments + (data-lang fr/en). On affiche celui de la langue de , fixée + avant le 1er paint par le script inline du — donc pas de flash. + `revert` rend à l'élément son display naturel (span inline, li + list-item), pour pouvoir taguer aussi bien des spans que des
  • . */ + [data-lang="en"] { display: none; } + html[lang="en"] [data-lang="fr"] { display: none; } + html[lang="en"] [data-lang="en"] { display: revert; }
    -

    Installer sur iPhone / iPad

    +

    + Installer sur iPhone / iPad + Install on iPhone / iPad +

    -

    Tu es dans Chrome ou Firefox ? Ouvre d'abord cette page dans Safari (le menu de ton navigateur propose « Ouvrir dans Safari »), puis :

    -

    Ajoute l'app à ton écran d'accueil en 3 touches :

    +

    + Tu es dans Chrome ou Firefox ? Ouvre d'abord cette page dans Safari (le menu de ton navigateur propose « Ouvrir dans Safari »), puis : + In Chrome or Firefox? First open this page in Safari (your browser menu has “Open in Safari”), then: +

    +

    + Ajoute l'app à ton écran d'accueil en 3 touches : + Add the app to your Home Screen in 3 taps: +

      -
    1. +
    2. Touche l'icône Partager dans la barre d'outils de Safari (en bas sur iPhone, en haut sur iPad). - Tu ne la vois pas ? Touche d'abord •••, puis « Partager ». + Tu ne la vois pas ? Touche d'abord •••, puis « Partager ».
    3. -
    4. Fais défiler, puis choisis « Sur l'écran d'accueil » .
    5. -
    6. Touche « Ajouter » en haut à droite. L'icône Tablito apparaît sur ton écran !
    7. +
    8. + Tap the Share icon + + in Safari's toolbar (at the bottom on iPhone, at the top on iPad). + Can't see it? Tap ••• first, then “Share”. +
    9. +
    10. Fais défiler, puis choisis « Sur l'écran d'accueil » .
    11. +
    12. Scroll down, then choose “Add to Home Screen” .
    13. +
    14. Touche « Ajouter » en haut à droite. L'icône Tablito apparaît sur ton écran !
    15. +
    16. Tap “Add” at the top right. The Tablito icon appears on your screen!
    @@ -241,13 +310,28 @@

    Installer sur iPhone / iPad

    iOS. Volontairement court et honnête : sur ordinateur l'install est un bonus, le vrai CTA utile est "Essayer dans le navigateur". -->
    -

    Installer sur ordinateur

    -

    Selon ton navigateur :

    +

    + Installer sur ordinateur + Install on desktop +

    +

    + Selon ton navigateur : + Depending on your browser: +

      -
    1. Avec Chrome ou Edge, une icône d'installation apparaît à droite de la barre d'adresse — clique dessus.
    2. -
    3. Sur Safari (Mac), ouvre le menu Fichier puis « Ajouter au Dock ».
    4. +
    5. + Avec Chrome ou Edge, une icône d'installation apparaît à droite de la barre d'adresse — clique dessus. + In Chrome or Edge, an install icon appears at the right of the address bar — click it. +
    6. +
    7. + Sur Safari (Mac), ouvre le menu Fichier puis « Ajouter au Dock ». + In Safari (Mac), open the File menu, then “Add to Dock”. +
    -

    Pas d'installation possible ? Clique sur « Essayer dans le navigateur » ci-dessus pour commencer tout de suite.

    +

    + Pas d'installation possible ? Clique sur « Essayer dans le navigateur » ci-dessus pour commencer tout de suite. + Can't install? Click “Try it in the browser” above to start right away. +

    diff --git a/public/audio/tts/en/comm-2-3.mp3 b/public/audio/tts/en/comm-2-3.mp3 new file mode 100644 index 00000000..b7ec64e4 Binary files /dev/null and b/public/audio/tts/en/comm-2-3.mp3 differ diff --git a/public/audio/tts/en/comm-2-4.mp3 b/public/audio/tts/en/comm-2-4.mp3 new file mode 100644 index 00000000..dbace081 Binary files /dev/null and b/public/audio/tts/en/comm-2-4.mp3 differ diff --git a/public/audio/tts/en/comm-2-5.mp3 b/public/audio/tts/en/comm-2-5.mp3 new file mode 100644 index 00000000..64cba240 Binary files /dev/null and b/public/audio/tts/en/comm-2-5.mp3 differ diff --git a/public/audio/tts/en/comm-2-6.mp3 b/public/audio/tts/en/comm-2-6.mp3 new file mode 100644 index 00000000..ed39fbf0 Binary files /dev/null and b/public/audio/tts/en/comm-2-6.mp3 differ diff --git a/public/audio/tts/en/comm-2-7.mp3 b/public/audio/tts/en/comm-2-7.mp3 new file mode 100644 index 00000000..5ade867f Binary files /dev/null and b/public/audio/tts/en/comm-2-7.mp3 differ diff --git a/public/audio/tts/en/comm-2-8.mp3 b/public/audio/tts/en/comm-2-8.mp3 new file mode 100644 index 00000000..e364d618 Binary files /dev/null and b/public/audio/tts/en/comm-2-8.mp3 differ diff --git a/public/audio/tts/en/comm-2-9.mp3 b/public/audio/tts/en/comm-2-9.mp3 new file mode 100644 index 00000000..08b8ab54 Binary files /dev/null and b/public/audio/tts/en/comm-2-9.mp3 differ diff --git a/public/audio/tts/en/comm-3-4.mp3 b/public/audio/tts/en/comm-3-4.mp3 new file mode 100644 index 00000000..5aa46ca9 Binary files /dev/null and b/public/audio/tts/en/comm-3-4.mp3 differ diff --git a/public/audio/tts/en/comm-3-5.mp3 b/public/audio/tts/en/comm-3-5.mp3 new file mode 100644 index 00000000..e7b1f039 Binary files /dev/null and b/public/audio/tts/en/comm-3-5.mp3 differ diff --git a/public/audio/tts/en/comm-3-6.mp3 b/public/audio/tts/en/comm-3-6.mp3 new file mode 100644 index 00000000..e316a81f Binary files /dev/null and b/public/audio/tts/en/comm-3-6.mp3 differ diff --git a/public/audio/tts/en/comm-3-7.mp3 b/public/audio/tts/en/comm-3-7.mp3 new file mode 100644 index 00000000..049ae36d Binary files /dev/null and b/public/audio/tts/en/comm-3-7.mp3 differ diff --git a/public/audio/tts/en/comm-3-8.mp3 b/public/audio/tts/en/comm-3-8.mp3 new file mode 100644 index 00000000..516d494b Binary files /dev/null and b/public/audio/tts/en/comm-3-8.mp3 differ diff --git a/public/audio/tts/en/comm-3-9.mp3 b/public/audio/tts/en/comm-3-9.mp3 new file mode 100644 index 00000000..9cc8d6ed Binary files /dev/null and b/public/audio/tts/en/comm-3-9.mp3 differ diff --git a/public/audio/tts/en/comm-4-5.mp3 b/public/audio/tts/en/comm-4-5.mp3 new file mode 100644 index 00000000..a52416de Binary files /dev/null and b/public/audio/tts/en/comm-4-5.mp3 differ diff --git a/public/audio/tts/en/comm-4-6.mp3 b/public/audio/tts/en/comm-4-6.mp3 new file mode 100644 index 00000000..64bade88 Binary files /dev/null and b/public/audio/tts/en/comm-4-6.mp3 differ diff --git a/public/audio/tts/en/comm-4-7.mp3 b/public/audio/tts/en/comm-4-7.mp3 new file mode 100644 index 00000000..e0051c49 Binary files /dev/null and b/public/audio/tts/en/comm-4-7.mp3 differ diff --git a/public/audio/tts/en/comm-4-8.mp3 b/public/audio/tts/en/comm-4-8.mp3 new file mode 100644 index 00000000..4e5f4d96 Binary files /dev/null and b/public/audio/tts/en/comm-4-8.mp3 differ diff --git a/public/audio/tts/en/comm-4-9.mp3 b/public/audio/tts/en/comm-4-9.mp3 new file mode 100644 index 00000000..b329c18d Binary files /dev/null and b/public/audio/tts/en/comm-4-9.mp3 differ diff --git a/public/audio/tts/en/comm-5-6.mp3 b/public/audio/tts/en/comm-5-6.mp3 new file mode 100644 index 00000000..236cb6a5 Binary files /dev/null and b/public/audio/tts/en/comm-5-6.mp3 differ diff --git a/public/audio/tts/en/comm-5-7.mp3 b/public/audio/tts/en/comm-5-7.mp3 new file mode 100644 index 00000000..88791782 Binary files /dev/null and b/public/audio/tts/en/comm-5-7.mp3 differ diff --git a/public/audio/tts/en/comm-5-8.mp3 b/public/audio/tts/en/comm-5-8.mp3 new file mode 100644 index 00000000..ead42b3c Binary files /dev/null and b/public/audio/tts/en/comm-5-8.mp3 differ diff --git a/public/audio/tts/en/comm-5-9.mp3 b/public/audio/tts/en/comm-5-9.mp3 new file mode 100644 index 00000000..3902e295 Binary files /dev/null and b/public/audio/tts/en/comm-5-9.mp3 differ diff --git a/public/audio/tts/en/comm-6-7.mp3 b/public/audio/tts/en/comm-6-7.mp3 new file mode 100644 index 00000000..b18718f7 Binary files /dev/null and b/public/audio/tts/en/comm-6-7.mp3 differ diff --git a/public/audio/tts/en/comm-6-8.mp3 b/public/audio/tts/en/comm-6-8.mp3 new file mode 100644 index 00000000..87986e18 Binary files /dev/null and b/public/audio/tts/en/comm-6-8.mp3 differ diff --git a/public/audio/tts/en/comm-6-9.mp3 b/public/audio/tts/en/comm-6-9.mp3 new file mode 100644 index 00000000..c25bf4e2 Binary files /dev/null and b/public/audio/tts/en/comm-6-9.mp3 differ diff --git a/public/audio/tts/en/comm-7-8.mp3 b/public/audio/tts/en/comm-7-8.mp3 new file mode 100644 index 00000000..ad2695c9 Binary files /dev/null and b/public/audio/tts/en/comm-7-8.mp3 differ diff --git a/public/audio/tts/en/comm-7-9.mp3 b/public/audio/tts/en/comm-7-9.mp3 new file mode 100644 index 00000000..23a7fc17 Binary files /dev/null and b/public/audio/tts/en/comm-7-9.mp3 differ diff --git a/public/audio/tts/en/comm-8-9.mp3 b/public/audio/tts/en/comm-8-9.mp3 new file mode 100644 index 00000000..4b939f37 Binary files /dev/null and b/public/audio/tts/en/comm-8-9.mp3 differ diff --git a/public/audio/tts/en/intro-2-2.mp3 b/public/audio/tts/en/intro-2-2.mp3 new file mode 100644 index 00000000..164a7d96 Binary files /dev/null and b/public/audio/tts/en/intro-2-2.mp3 differ diff --git a/public/audio/tts/en/intro-2-3.mp3 b/public/audio/tts/en/intro-2-3.mp3 new file mode 100644 index 00000000..1a4ecfd9 Binary files /dev/null and b/public/audio/tts/en/intro-2-3.mp3 differ diff --git a/public/audio/tts/en/intro-2-4.mp3 b/public/audio/tts/en/intro-2-4.mp3 new file mode 100644 index 00000000..aa37e476 Binary files /dev/null and b/public/audio/tts/en/intro-2-4.mp3 differ diff --git a/public/audio/tts/en/intro-2-5.mp3 b/public/audio/tts/en/intro-2-5.mp3 new file mode 100644 index 00000000..0d9f3e22 Binary files /dev/null and b/public/audio/tts/en/intro-2-5.mp3 differ diff --git a/public/audio/tts/en/intro-2-6.mp3 b/public/audio/tts/en/intro-2-6.mp3 new file mode 100644 index 00000000..c0e57fe0 Binary files /dev/null and b/public/audio/tts/en/intro-2-6.mp3 differ diff --git a/public/audio/tts/en/intro-2-7.mp3 b/public/audio/tts/en/intro-2-7.mp3 new file mode 100644 index 00000000..83f61d7c Binary files /dev/null and b/public/audio/tts/en/intro-2-7.mp3 differ diff --git a/public/audio/tts/en/intro-2-8.mp3 b/public/audio/tts/en/intro-2-8.mp3 new file mode 100644 index 00000000..0a3f5194 Binary files /dev/null and b/public/audio/tts/en/intro-2-8.mp3 differ diff --git a/public/audio/tts/en/intro-2-9.mp3 b/public/audio/tts/en/intro-2-9.mp3 new file mode 100644 index 00000000..68e4d8fc Binary files /dev/null and b/public/audio/tts/en/intro-2-9.mp3 differ diff --git a/public/audio/tts/en/intro-3-3.mp3 b/public/audio/tts/en/intro-3-3.mp3 new file mode 100644 index 00000000..f2d8882e Binary files /dev/null and b/public/audio/tts/en/intro-3-3.mp3 differ diff --git a/public/audio/tts/en/intro-3-4.mp3 b/public/audio/tts/en/intro-3-4.mp3 new file mode 100644 index 00000000..d9b3d65e Binary files /dev/null and b/public/audio/tts/en/intro-3-4.mp3 differ diff --git a/public/audio/tts/en/intro-3-5.mp3 b/public/audio/tts/en/intro-3-5.mp3 new file mode 100644 index 00000000..345a4692 Binary files /dev/null and b/public/audio/tts/en/intro-3-5.mp3 differ diff --git a/public/audio/tts/en/intro-3-6.mp3 b/public/audio/tts/en/intro-3-6.mp3 new file mode 100644 index 00000000..c32e815f Binary files /dev/null and b/public/audio/tts/en/intro-3-6.mp3 differ diff --git a/public/audio/tts/en/intro-3-7.mp3 b/public/audio/tts/en/intro-3-7.mp3 new file mode 100644 index 00000000..9c737fa6 Binary files /dev/null and b/public/audio/tts/en/intro-3-7.mp3 differ diff --git a/public/audio/tts/en/intro-3-8.mp3 b/public/audio/tts/en/intro-3-8.mp3 new file mode 100644 index 00000000..afcaf818 Binary files /dev/null and b/public/audio/tts/en/intro-3-8.mp3 differ diff --git a/public/audio/tts/en/intro-3-9.mp3 b/public/audio/tts/en/intro-3-9.mp3 new file mode 100644 index 00000000..d7052ab8 Binary files /dev/null and b/public/audio/tts/en/intro-3-9.mp3 differ diff --git a/public/audio/tts/en/intro-4-4.mp3 b/public/audio/tts/en/intro-4-4.mp3 new file mode 100644 index 00000000..2f4f48be Binary files /dev/null and b/public/audio/tts/en/intro-4-4.mp3 differ diff --git a/public/audio/tts/en/intro-4-5.mp3 b/public/audio/tts/en/intro-4-5.mp3 new file mode 100644 index 00000000..79ae5526 Binary files /dev/null and b/public/audio/tts/en/intro-4-5.mp3 differ diff --git a/public/audio/tts/en/intro-4-6.mp3 b/public/audio/tts/en/intro-4-6.mp3 new file mode 100644 index 00000000..eea101ac Binary files /dev/null and b/public/audio/tts/en/intro-4-6.mp3 differ diff --git a/public/audio/tts/en/intro-4-7.mp3 b/public/audio/tts/en/intro-4-7.mp3 new file mode 100644 index 00000000..797ae729 Binary files /dev/null and b/public/audio/tts/en/intro-4-7.mp3 differ diff --git a/public/audio/tts/en/intro-4-8.mp3 b/public/audio/tts/en/intro-4-8.mp3 new file mode 100644 index 00000000..25ef27c4 Binary files /dev/null and b/public/audio/tts/en/intro-4-8.mp3 differ diff --git a/public/audio/tts/en/intro-4-9.mp3 b/public/audio/tts/en/intro-4-9.mp3 new file mode 100644 index 00000000..4a110643 Binary files /dev/null and b/public/audio/tts/en/intro-4-9.mp3 differ diff --git a/public/audio/tts/en/intro-5-5.mp3 b/public/audio/tts/en/intro-5-5.mp3 new file mode 100644 index 00000000..dad3c69e Binary files /dev/null and b/public/audio/tts/en/intro-5-5.mp3 differ diff --git a/public/audio/tts/en/intro-5-6.mp3 b/public/audio/tts/en/intro-5-6.mp3 new file mode 100644 index 00000000..c5400c18 Binary files /dev/null and b/public/audio/tts/en/intro-5-6.mp3 differ diff --git a/public/audio/tts/en/intro-5-7.mp3 b/public/audio/tts/en/intro-5-7.mp3 new file mode 100644 index 00000000..fffeaed0 Binary files /dev/null and b/public/audio/tts/en/intro-5-7.mp3 differ diff --git a/public/audio/tts/en/intro-5-8.mp3 b/public/audio/tts/en/intro-5-8.mp3 new file mode 100644 index 00000000..d0f3f562 Binary files /dev/null and b/public/audio/tts/en/intro-5-8.mp3 differ diff --git a/public/audio/tts/en/intro-5-9.mp3 b/public/audio/tts/en/intro-5-9.mp3 new file mode 100644 index 00000000..99d3636a Binary files /dev/null and b/public/audio/tts/en/intro-5-9.mp3 differ diff --git a/public/audio/tts/en/intro-6-6.mp3 b/public/audio/tts/en/intro-6-6.mp3 new file mode 100644 index 00000000..ee835eee Binary files /dev/null and b/public/audio/tts/en/intro-6-6.mp3 differ diff --git a/public/audio/tts/en/intro-6-7.mp3 b/public/audio/tts/en/intro-6-7.mp3 new file mode 100644 index 00000000..2caec2cc Binary files /dev/null and b/public/audio/tts/en/intro-6-7.mp3 differ diff --git a/public/audio/tts/en/intro-6-8.mp3 b/public/audio/tts/en/intro-6-8.mp3 new file mode 100644 index 00000000..27005b98 Binary files /dev/null and b/public/audio/tts/en/intro-6-8.mp3 differ diff --git a/public/audio/tts/en/intro-6-9.mp3 b/public/audio/tts/en/intro-6-9.mp3 new file mode 100644 index 00000000..af6f6ab0 Binary files /dev/null and b/public/audio/tts/en/intro-6-9.mp3 differ diff --git a/public/audio/tts/en/intro-7-7.mp3 b/public/audio/tts/en/intro-7-7.mp3 new file mode 100644 index 00000000..e6319321 Binary files /dev/null and b/public/audio/tts/en/intro-7-7.mp3 differ diff --git a/public/audio/tts/en/intro-7-8.mp3 b/public/audio/tts/en/intro-7-8.mp3 new file mode 100644 index 00000000..fd0e53f1 Binary files /dev/null and b/public/audio/tts/en/intro-7-8.mp3 differ diff --git a/public/audio/tts/en/intro-7-9.mp3 b/public/audio/tts/en/intro-7-9.mp3 new file mode 100644 index 00000000..9f8b741a Binary files /dev/null and b/public/audio/tts/en/intro-7-9.mp3 differ diff --git a/public/audio/tts/en/intro-8-8.mp3 b/public/audio/tts/en/intro-8-8.mp3 new file mode 100644 index 00000000..72525eb3 Binary files /dev/null and b/public/audio/tts/en/intro-8-8.mp3 differ diff --git a/public/audio/tts/en/intro-8-9.mp3 b/public/audio/tts/en/intro-8-9.mp3 new file mode 100644 index 00000000..a472d396 Binary files /dev/null and b/public/audio/tts/en/intro-8-9.mp3 differ diff --git a/public/audio/tts/en/intro-9-9.mp3 b/public/audio/tts/en/intro-9-9.mp3 new file mode 100644 index 00000000..49df5f06 Binary files /dev/null and b/public/audio/tts/en/intro-9-9.mp3 differ diff --git a/public/audio/tts/en/introd-10-2.mp3 b/public/audio/tts/en/introd-10-2.mp3 new file mode 100644 index 00000000..70e038c4 Binary files /dev/null and b/public/audio/tts/en/introd-10-2.mp3 differ diff --git a/public/audio/tts/en/introd-10-5.mp3 b/public/audio/tts/en/introd-10-5.mp3 new file mode 100644 index 00000000..6922c9ff Binary files /dev/null and b/public/audio/tts/en/introd-10-5.mp3 differ diff --git a/public/audio/tts/en/introd-12-2.mp3 b/public/audio/tts/en/introd-12-2.mp3 new file mode 100644 index 00000000..4d0d5d8f Binary files /dev/null and b/public/audio/tts/en/introd-12-2.mp3 differ diff --git a/public/audio/tts/en/introd-12-3.mp3 b/public/audio/tts/en/introd-12-3.mp3 new file mode 100644 index 00000000..e85cf2ca Binary files /dev/null and b/public/audio/tts/en/introd-12-3.mp3 differ diff --git a/public/audio/tts/en/introd-12-4.mp3 b/public/audio/tts/en/introd-12-4.mp3 new file mode 100644 index 00000000..a11b1280 Binary files /dev/null and b/public/audio/tts/en/introd-12-4.mp3 differ diff --git a/public/audio/tts/en/introd-12-6.mp3 b/public/audio/tts/en/introd-12-6.mp3 new file mode 100644 index 00000000..06282a7a Binary files /dev/null and b/public/audio/tts/en/introd-12-6.mp3 differ diff --git a/public/audio/tts/en/introd-14-2.mp3 b/public/audio/tts/en/introd-14-2.mp3 new file mode 100644 index 00000000..1746f931 Binary files /dev/null and b/public/audio/tts/en/introd-14-2.mp3 differ diff --git a/public/audio/tts/en/introd-14-7.mp3 b/public/audio/tts/en/introd-14-7.mp3 new file mode 100644 index 00000000..807d310d Binary files /dev/null and b/public/audio/tts/en/introd-14-7.mp3 differ diff --git a/public/audio/tts/en/introd-15-3.mp3 b/public/audio/tts/en/introd-15-3.mp3 new file mode 100644 index 00000000..10e3a725 Binary files /dev/null and b/public/audio/tts/en/introd-15-3.mp3 differ diff --git a/public/audio/tts/en/introd-15-5.mp3 b/public/audio/tts/en/introd-15-5.mp3 new file mode 100644 index 00000000..2f0d87b4 Binary files /dev/null and b/public/audio/tts/en/introd-15-5.mp3 differ diff --git a/public/audio/tts/en/introd-16-2.mp3 b/public/audio/tts/en/introd-16-2.mp3 new file mode 100644 index 00000000..481dd37c Binary files /dev/null and b/public/audio/tts/en/introd-16-2.mp3 differ diff --git a/public/audio/tts/en/introd-16-4.mp3 b/public/audio/tts/en/introd-16-4.mp3 new file mode 100644 index 00000000..f91cd314 Binary files /dev/null and b/public/audio/tts/en/introd-16-4.mp3 differ diff --git a/public/audio/tts/en/introd-16-8.mp3 b/public/audio/tts/en/introd-16-8.mp3 new file mode 100644 index 00000000..369a8ca0 Binary files /dev/null and b/public/audio/tts/en/introd-16-8.mp3 differ diff --git a/public/audio/tts/en/introd-18-2.mp3 b/public/audio/tts/en/introd-18-2.mp3 new file mode 100644 index 00000000..2d1a50a1 Binary files /dev/null and b/public/audio/tts/en/introd-18-2.mp3 differ diff --git a/public/audio/tts/en/introd-18-3.mp3 b/public/audio/tts/en/introd-18-3.mp3 new file mode 100644 index 00000000..9fcd54e9 Binary files /dev/null and b/public/audio/tts/en/introd-18-3.mp3 differ diff --git a/public/audio/tts/en/introd-18-6.mp3 b/public/audio/tts/en/introd-18-6.mp3 new file mode 100644 index 00000000..9cf56af2 Binary files /dev/null and b/public/audio/tts/en/introd-18-6.mp3 differ diff --git a/public/audio/tts/en/introd-18-9.mp3 b/public/audio/tts/en/introd-18-9.mp3 new file mode 100644 index 00000000..fc2e6e14 Binary files /dev/null and b/public/audio/tts/en/introd-18-9.mp3 differ diff --git a/public/audio/tts/en/introd-20-4.mp3 b/public/audio/tts/en/introd-20-4.mp3 new file mode 100644 index 00000000..669e2069 Binary files /dev/null and b/public/audio/tts/en/introd-20-4.mp3 differ diff --git a/public/audio/tts/en/introd-20-5.mp3 b/public/audio/tts/en/introd-20-5.mp3 new file mode 100644 index 00000000..92ade8ad Binary files /dev/null and b/public/audio/tts/en/introd-20-5.mp3 differ diff --git a/public/audio/tts/en/introd-21-3.mp3 b/public/audio/tts/en/introd-21-3.mp3 new file mode 100644 index 00000000..b3d37a62 Binary files /dev/null and b/public/audio/tts/en/introd-21-3.mp3 differ diff --git a/public/audio/tts/en/introd-21-7.mp3 b/public/audio/tts/en/introd-21-7.mp3 new file mode 100644 index 00000000..768ee351 Binary files /dev/null and b/public/audio/tts/en/introd-21-7.mp3 differ diff --git a/public/audio/tts/en/introd-24-3.mp3 b/public/audio/tts/en/introd-24-3.mp3 new file mode 100644 index 00000000..9262a396 Binary files /dev/null and b/public/audio/tts/en/introd-24-3.mp3 differ diff --git a/public/audio/tts/en/introd-24-4.mp3 b/public/audio/tts/en/introd-24-4.mp3 new file mode 100644 index 00000000..b55f09ad Binary files /dev/null and b/public/audio/tts/en/introd-24-4.mp3 differ diff --git a/public/audio/tts/en/introd-24-6.mp3 b/public/audio/tts/en/introd-24-6.mp3 new file mode 100644 index 00000000..2ea959f3 Binary files /dev/null and b/public/audio/tts/en/introd-24-6.mp3 differ diff --git a/public/audio/tts/en/introd-24-8.mp3 b/public/audio/tts/en/introd-24-8.mp3 new file mode 100644 index 00000000..103a0ad2 Binary files /dev/null and b/public/audio/tts/en/introd-24-8.mp3 differ diff --git a/public/audio/tts/en/introd-25-5.mp3 b/public/audio/tts/en/introd-25-5.mp3 new file mode 100644 index 00000000..e9241c9d Binary files /dev/null and b/public/audio/tts/en/introd-25-5.mp3 differ diff --git a/public/audio/tts/en/introd-27-3.mp3 b/public/audio/tts/en/introd-27-3.mp3 new file mode 100644 index 00000000..7594cf9e Binary files /dev/null and b/public/audio/tts/en/introd-27-3.mp3 differ diff --git a/public/audio/tts/en/introd-27-9.mp3 b/public/audio/tts/en/introd-27-9.mp3 new file mode 100644 index 00000000..cd4efc3e Binary files /dev/null and b/public/audio/tts/en/introd-27-9.mp3 differ diff --git a/public/audio/tts/en/introd-28-4.mp3 b/public/audio/tts/en/introd-28-4.mp3 new file mode 100644 index 00000000..40952710 Binary files /dev/null and b/public/audio/tts/en/introd-28-4.mp3 differ diff --git a/public/audio/tts/en/introd-28-7.mp3 b/public/audio/tts/en/introd-28-7.mp3 new file mode 100644 index 00000000..b108f8f0 Binary files /dev/null and b/public/audio/tts/en/introd-28-7.mp3 differ diff --git a/public/audio/tts/en/introd-30-5.mp3 b/public/audio/tts/en/introd-30-5.mp3 new file mode 100644 index 00000000..426c806c Binary files /dev/null and b/public/audio/tts/en/introd-30-5.mp3 differ diff --git a/public/audio/tts/en/introd-30-6.mp3 b/public/audio/tts/en/introd-30-6.mp3 new file mode 100644 index 00000000..2b53adce Binary files /dev/null and b/public/audio/tts/en/introd-30-6.mp3 differ diff --git a/public/audio/tts/en/introd-32-4.mp3 b/public/audio/tts/en/introd-32-4.mp3 new file mode 100644 index 00000000..bcbfed12 Binary files /dev/null and b/public/audio/tts/en/introd-32-4.mp3 differ diff --git a/public/audio/tts/en/introd-32-8.mp3 b/public/audio/tts/en/introd-32-8.mp3 new file mode 100644 index 00000000..78731a48 Binary files /dev/null and b/public/audio/tts/en/introd-32-8.mp3 differ diff --git a/public/audio/tts/en/introd-35-5.mp3 b/public/audio/tts/en/introd-35-5.mp3 new file mode 100644 index 00000000..64cb1816 Binary files /dev/null and b/public/audio/tts/en/introd-35-5.mp3 differ diff --git a/public/audio/tts/en/introd-35-7.mp3 b/public/audio/tts/en/introd-35-7.mp3 new file mode 100644 index 00000000..9ee9dcb6 Binary files /dev/null and b/public/audio/tts/en/introd-35-7.mp3 differ diff --git a/public/audio/tts/en/introd-36-4.mp3 b/public/audio/tts/en/introd-36-4.mp3 new file mode 100644 index 00000000..26f846e8 Binary files /dev/null and b/public/audio/tts/en/introd-36-4.mp3 differ diff --git a/public/audio/tts/en/introd-36-6.mp3 b/public/audio/tts/en/introd-36-6.mp3 new file mode 100644 index 00000000..e297f727 Binary files /dev/null and b/public/audio/tts/en/introd-36-6.mp3 differ diff --git a/public/audio/tts/en/introd-36-9.mp3 b/public/audio/tts/en/introd-36-9.mp3 new file mode 100644 index 00000000..47fc4bdd Binary files /dev/null and b/public/audio/tts/en/introd-36-9.mp3 differ diff --git a/public/audio/tts/en/introd-4-2.mp3 b/public/audio/tts/en/introd-4-2.mp3 new file mode 100644 index 00000000..16fe82cb Binary files /dev/null and b/public/audio/tts/en/introd-4-2.mp3 differ diff --git a/public/audio/tts/en/introd-40-5.mp3 b/public/audio/tts/en/introd-40-5.mp3 new file mode 100644 index 00000000..6470e488 Binary files /dev/null and b/public/audio/tts/en/introd-40-5.mp3 differ diff --git a/public/audio/tts/en/introd-40-8.mp3 b/public/audio/tts/en/introd-40-8.mp3 new file mode 100644 index 00000000..4f22db90 Binary files /dev/null and b/public/audio/tts/en/introd-40-8.mp3 differ diff --git a/public/audio/tts/en/introd-42-6.mp3 b/public/audio/tts/en/introd-42-6.mp3 new file mode 100644 index 00000000..8d2cb048 Binary files /dev/null and b/public/audio/tts/en/introd-42-6.mp3 differ diff --git a/public/audio/tts/en/introd-42-7.mp3 b/public/audio/tts/en/introd-42-7.mp3 new file mode 100644 index 00000000..148a60ed Binary files /dev/null and b/public/audio/tts/en/introd-42-7.mp3 differ diff --git a/public/audio/tts/en/introd-45-5.mp3 b/public/audio/tts/en/introd-45-5.mp3 new file mode 100644 index 00000000..3f6a46e7 Binary files /dev/null and b/public/audio/tts/en/introd-45-5.mp3 differ diff --git a/public/audio/tts/en/introd-45-9.mp3 b/public/audio/tts/en/introd-45-9.mp3 new file mode 100644 index 00000000..4f1e4334 Binary files /dev/null and b/public/audio/tts/en/introd-45-9.mp3 differ diff --git a/public/audio/tts/en/introd-48-6.mp3 b/public/audio/tts/en/introd-48-6.mp3 new file mode 100644 index 00000000..2d315e30 Binary files /dev/null and b/public/audio/tts/en/introd-48-6.mp3 differ diff --git a/public/audio/tts/en/introd-48-8.mp3 b/public/audio/tts/en/introd-48-8.mp3 new file mode 100644 index 00000000..f4041eac Binary files /dev/null and b/public/audio/tts/en/introd-48-8.mp3 differ diff --git a/public/audio/tts/en/introd-49-7.mp3 b/public/audio/tts/en/introd-49-7.mp3 new file mode 100644 index 00000000..094e4dae Binary files /dev/null and b/public/audio/tts/en/introd-49-7.mp3 differ diff --git a/public/audio/tts/en/introd-54-6.mp3 b/public/audio/tts/en/introd-54-6.mp3 new file mode 100644 index 00000000..7b64df4b Binary files /dev/null and b/public/audio/tts/en/introd-54-6.mp3 differ diff --git a/public/audio/tts/en/introd-54-9.mp3 b/public/audio/tts/en/introd-54-9.mp3 new file mode 100644 index 00000000..433e4f4b Binary files /dev/null and b/public/audio/tts/en/introd-54-9.mp3 differ diff --git a/public/audio/tts/en/introd-56-7.mp3 b/public/audio/tts/en/introd-56-7.mp3 new file mode 100644 index 00000000..1d7f6f84 Binary files /dev/null and b/public/audio/tts/en/introd-56-7.mp3 differ diff --git a/public/audio/tts/en/introd-56-8.mp3 b/public/audio/tts/en/introd-56-8.mp3 new file mode 100644 index 00000000..2c837dfb Binary files /dev/null and b/public/audio/tts/en/introd-56-8.mp3 differ diff --git a/public/audio/tts/en/introd-6-2.mp3 b/public/audio/tts/en/introd-6-2.mp3 new file mode 100644 index 00000000..99c38713 Binary files /dev/null and b/public/audio/tts/en/introd-6-2.mp3 differ diff --git a/public/audio/tts/en/introd-6-3.mp3 b/public/audio/tts/en/introd-6-3.mp3 new file mode 100644 index 00000000..f4e92cbf Binary files /dev/null and b/public/audio/tts/en/introd-6-3.mp3 differ diff --git a/public/audio/tts/en/introd-63-7.mp3 b/public/audio/tts/en/introd-63-7.mp3 new file mode 100644 index 00000000..820ebadb Binary files /dev/null and b/public/audio/tts/en/introd-63-7.mp3 differ diff --git a/public/audio/tts/en/introd-63-9.mp3 b/public/audio/tts/en/introd-63-9.mp3 new file mode 100644 index 00000000..d5340c56 Binary files /dev/null and b/public/audio/tts/en/introd-63-9.mp3 differ diff --git a/public/audio/tts/en/introd-64-8.mp3 b/public/audio/tts/en/introd-64-8.mp3 new file mode 100644 index 00000000..01f1c70b Binary files /dev/null and b/public/audio/tts/en/introd-64-8.mp3 differ diff --git a/public/audio/tts/en/introd-72-8.mp3 b/public/audio/tts/en/introd-72-8.mp3 new file mode 100644 index 00000000..b221bf2d Binary files /dev/null and b/public/audio/tts/en/introd-72-8.mp3 differ diff --git a/public/audio/tts/en/introd-72-9.mp3 b/public/audio/tts/en/introd-72-9.mp3 new file mode 100644 index 00000000..991d6df3 Binary files /dev/null and b/public/audio/tts/en/introd-72-9.mp3 differ diff --git a/public/audio/tts/en/introd-8-2.mp3 b/public/audio/tts/en/introd-8-2.mp3 new file mode 100644 index 00000000..e907f302 Binary files /dev/null and b/public/audio/tts/en/introd-8-2.mp3 differ diff --git a/public/audio/tts/en/introd-8-4.mp3 b/public/audio/tts/en/introd-8-4.mp3 new file mode 100644 index 00000000..d5a5a5b8 Binary files /dev/null and b/public/audio/tts/en/introd-8-4.mp3 differ diff --git a/public/audio/tts/en/introd-81-9.mp3 b/public/audio/tts/en/introd-81-9.mp3 new file mode 100644 index 00000000..49dea415 Binary files /dev/null and b/public/audio/tts/en/introd-81-9.mp3 differ diff --git a/public/audio/tts/en/introd-9-3.mp3 b/public/audio/tts/en/introd-9-3.mp3 new file mode 100644 index 00000000..ef10605d Binary files /dev/null and b/public/audio/tts/en/introd-9-3.mp3 differ diff --git a/public/audio/tts/en/placement-intro.mp3 b/public/audio/tts/en/placement-intro.mp3 new file mode 100644 index 00000000..a7efca3a Binary files /dev/null and b/public/audio/tts/en/placement-intro.mp3 differ diff --git a/public/audio/tts/en/q-2-2.mp3 b/public/audio/tts/en/q-2-2.mp3 new file mode 100644 index 00000000..8218d8e6 Binary files /dev/null and b/public/audio/tts/en/q-2-2.mp3 differ diff --git a/public/audio/tts/en/q-2-3.mp3 b/public/audio/tts/en/q-2-3.mp3 new file mode 100644 index 00000000..b5503e96 Binary files /dev/null and b/public/audio/tts/en/q-2-3.mp3 differ diff --git a/public/audio/tts/en/q-2-4.mp3 b/public/audio/tts/en/q-2-4.mp3 new file mode 100644 index 00000000..605e8328 Binary files /dev/null and b/public/audio/tts/en/q-2-4.mp3 differ diff --git a/public/audio/tts/en/q-2-5.mp3 b/public/audio/tts/en/q-2-5.mp3 new file mode 100644 index 00000000..cebe4634 Binary files /dev/null and b/public/audio/tts/en/q-2-5.mp3 differ diff --git a/public/audio/tts/en/q-2-6.mp3 b/public/audio/tts/en/q-2-6.mp3 new file mode 100644 index 00000000..d3f0536c Binary files /dev/null and b/public/audio/tts/en/q-2-6.mp3 differ diff --git a/public/audio/tts/en/q-2-7.mp3 b/public/audio/tts/en/q-2-7.mp3 new file mode 100644 index 00000000..6eeebffa Binary files /dev/null and b/public/audio/tts/en/q-2-7.mp3 differ diff --git a/public/audio/tts/en/q-2-8.mp3 b/public/audio/tts/en/q-2-8.mp3 new file mode 100644 index 00000000..2543cbae Binary files /dev/null and b/public/audio/tts/en/q-2-8.mp3 differ diff --git a/public/audio/tts/en/q-2-9.mp3 b/public/audio/tts/en/q-2-9.mp3 new file mode 100644 index 00000000..2dd7f1fe Binary files /dev/null and b/public/audio/tts/en/q-2-9.mp3 differ diff --git a/public/audio/tts/en/q-3-2.mp3 b/public/audio/tts/en/q-3-2.mp3 new file mode 100644 index 00000000..7215cf9b Binary files /dev/null and b/public/audio/tts/en/q-3-2.mp3 differ diff --git a/public/audio/tts/en/q-3-3.mp3 b/public/audio/tts/en/q-3-3.mp3 new file mode 100644 index 00000000..3ba3a928 Binary files /dev/null and b/public/audio/tts/en/q-3-3.mp3 differ diff --git a/public/audio/tts/en/q-3-4.mp3 b/public/audio/tts/en/q-3-4.mp3 new file mode 100644 index 00000000..9ea54404 Binary files /dev/null and b/public/audio/tts/en/q-3-4.mp3 differ diff --git a/public/audio/tts/en/q-3-5.mp3 b/public/audio/tts/en/q-3-5.mp3 new file mode 100644 index 00000000..3009ba87 Binary files /dev/null and b/public/audio/tts/en/q-3-5.mp3 differ diff --git a/public/audio/tts/en/q-3-6.mp3 b/public/audio/tts/en/q-3-6.mp3 new file mode 100644 index 00000000..a71b4aba Binary files /dev/null and b/public/audio/tts/en/q-3-6.mp3 differ diff --git a/public/audio/tts/en/q-3-7.mp3 b/public/audio/tts/en/q-3-7.mp3 new file mode 100644 index 00000000..9c779293 Binary files /dev/null and b/public/audio/tts/en/q-3-7.mp3 differ diff --git a/public/audio/tts/en/q-3-8.mp3 b/public/audio/tts/en/q-3-8.mp3 new file mode 100644 index 00000000..e2e078fa Binary files /dev/null and b/public/audio/tts/en/q-3-8.mp3 differ diff --git a/public/audio/tts/en/q-3-9.mp3 b/public/audio/tts/en/q-3-9.mp3 new file mode 100644 index 00000000..89e4bddd Binary files /dev/null and b/public/audio/tts/en/q-3-9.mp3 differ diff --git a/public/audio/tts/en/q-4-2.mp3 b/public/audio/tts/en/q-4-2.mp3 new file mode 100644 index 00000000..9fc79028 Binary files /dev/null and b/public/audio/tts/en/q-4-2.mp3 differ diff --git a/public/audio/tts/en/q-4-3.mp3 b/public/audio/tts/en/q-4-3.mp3 new file mode 100644 index 00000000..9f39d557 Binary files /dev/null and b/public/audio/tts/en/q-4-3.mp3 differ diff --git a/public/audio/tts/en/q-4-4.mp3 b/public/audio/tts/en/q-4-4.mp3 new file mode 100644 index 00000000..8132e2e3 Binary files /dev/null and b/public/audio/tts/en/q-4-4.mp3 differ diff --git a/public/audio/tts/en/q-4-5.mp3 b/public/audio/tts/en/q-4-5.mp3 new file mode 100644 index 00000000..14957bbf Binary files /dev/null and b/public/audio/tts/en/q-4-5.mp3 differ diff --git a/public/audio/tts/en/q-4-6.mp3 b/public/audio/tts/en/q-4-6.mp3 new file mode 100644 index 00000000..014221bd Binary files /dev/null and b/public/audio/tts/en/q-4-6.mp3 differ diff --git a/public/audio/tts/en/q-4-7.mp3 b/public/audio/tts/en/q-4-7.mp3 new file mode 100644 index 00000000..b7d83f64 Binary files /dev/null and b/public/audio/tts/en/q-4-7.mp3 differ diff --git a/public/audio/tts/en/q-4-8.mp3 b/public/audio/tts/en/q-4-8.mp3 new file mode 100644 index 00000000..142a0d0d Binary files /dev/null and b/public/audio/tts/en/q-4-8.mp3 differ diff --git a/public/audio/tts/en/q-4-9.mp3 b/public/audio/tts/en/q-4-9.mp3 new file mode 100644 index 00000000..c2b897be Binary files /dev/null and b/public/audio/tts/en/q-4-9.mp3 differ diff --git a/public/audio/tts/en/q-5-2.mp3 b/public/audio/tts/en/q-5-2.mp3 new file mode 100644 index 00000000..b4551500 Binary files /dev/null and b/public/audio/tts/en/q-5-2.mp3 differ diff --git a/public/audio/tts/en/q-5-3.mp3 b/public/audio/tts/en/q-5-3.mp3 new file mode 100644 index 00000000..28598f47 Binary files /dev/null and b/public/audio/tts/en/q-5-3.mp3 differ diff --git a/public/audio/tts/en/q-5-4.mp3 b/public/audio/tts/en/q-5-4.mp3 new file mode 100644 index 00000000..45ce7c0e Binary files /dev/null and b/public/audio/tts/en/q-5-4.mp3 differ diff --git a/public/audio/tts/en/q-5-5.mp3 b/public/audio/tts/en/q-5-5.mp3 new file mode 100644 index 00000000..69888b77 Binary files /dev/null and b/public/audio/tts/en/q-5-5.mp3 differ diff --git a/public/audio/tts/en/q-5-6.mp3 b/public/audio/tts/en/q-5-6.mp3 new file mode 100644 index 00000000..8bdb8062 Binary files /dev/null and b/public/audio/tts/en/q-5-6.mp3 differ diff --git a/public/audio/tts/en/q-5-7.mp3 b/public/audio/tts/en/q-5-7.mp3 new file mode 100644 index 00000000..c7f1a659 Binary files /dev/null and b/public/audio/tts/en/q-5-7.mp3 differ diff --git a/public/audio/tts/en/q-5-8.mp3 b/public/audio/tts/en/q-5-8.mp3 new file mode 100644 index 00000000..2cd909b9 Binary files /dev/null and b/public/audio/tts/en/q-5-8.mp3 differ diff --git a/public/audio/tts/en/q-5-9.mp3 b/public/audio/tts/en/q-5-9.mp3 new file mode 100644 index 00000000..1fefdabf Binary files /dev/null and b/public/audio/tts/en/q-5-9.mp3 differ diff --git a/public/audio/tts/en/q-6-2.mp3 b/public/audio/tts/en/q-6-2.mp3 new file mode 100644 index 00000000..dd1da587 Binary files /dev/null and b/public/audio/tts/en/q-6-2.mp3 differ diff --git a/public/audio/tts/en/q-6-3.mp3 b/public/audio/tts/en/q-6-3.mp3 new file mode 100644 index 00000000..948acad3 Binary files /dev/null and b/public/audio/tts/en/q-6-3.mp3 differ diff --git a/public/audio/tts/en/q-6-4.mp3 b/public/audio/tts/en/q-6-4.mp3 new file mode 100644 index 00000000..6ba8ee48 Binary files /dev/null and b/public/audio/tts/en/q-6-4.mp3 differ diff --git a/public/audio/tts/en/q-6-5.mp3 b/public/audio/tts/en/q-6-5.mp3 new file mode 100644 index 00000000..b72d136f Binary files /dev/null and b/public/audio/tts/en/q-6-5.mp3 differ diff --git a/public/audio/tts/en/q-6-6.mp3 b/public/audio/tts/en/q-6-6.mp3 new file mode 100644 index 00000000..bbbca1f8 Binary files /dev/null and b/public/audio/tts/en/q-6-6.mp3 differ diff --git a/public/audio/tts/en/q-6-7.mp3 b/public/audio/tts/en/q-6-7.mp3 new file mode 100644 index 00000000..30d3c420 Binary files /dev/null and b/public/audio/tts/en/q-6-7.mp3 differ diff --git a/public/audio/tts/en/q-6-8.mp3 b/public/audio/tts/en/q-6-8.mp3 new file mode 100644 index 00000000..fd5d8f9b Binary files /dev/null and b/public/audio/tts/en/q-6-8.mp3 differ diff --git a/public/audio/tts/en/q-6-9.mp3 b/public/audio/tts/en/q-6-9.mp3 new file mode 100644 index 00000000..80da715c Binary files /dev/null and b/public/audio/tts/en/q-6-9.mp3 differ diff --git a/public/audio/tts/en/q-7-2.mp3 b/public/audio/tts/en/q-7-2.mp3 new file mode 100644 index 00000000..20ec384e Binary files /dev/null and b/public/audio/tts/en/q-7-2.mp3 differ diff --git a/public/audio/tts/en/q-7-3.mp3 b/public/audio/tts/en/q-7-3.mp3 new file mode 100644 index 00000000..b5c06f28 Binary files /dev/null and b/public/audio/tts/en/q-7-3.mp3 differ diff --git a/public/audio/tts/en/q-7-4.mp3 b/public/audio/tts/en/q-7-4.mp3 new file mode 100644 index 00000000..2924c055 Binary files /dev/null and b/public/audio/tts/en/q-7-4.mp3 differ diff --git a/public/audio/tts/en/q-7-5.mp3 b/public/audio/tts/en/q-7-5.mp3 new file mode 100644 index 00000000..7fb361f4 Binary files /dev/null and b/public/audio/tts/en/q-7-5.mp3 differ diff --git a/public/audio/tts/en/q-7-6.mp3 b/public/audio/tts/en/q-7-6.mp3 new file mode 100644 index 00000000..8178b10c Binary files /dev/null and b/public/audio/tts/en/q-7-6.mp3 differ diff --git a/public/audio/tts/en/q-7-7.mp3 b/public/audio/tts/en/q-7-7.mp3 new file mode 100644 index 00000000..a929b2a6 Binary files /dev/null and b/public/audio/tts/en/q-7-7.mp3 differ diff --git a/public/audio/tts/en/q-7-8.mp3 b/public/audio/tts/en/q-7-8.mp3 new file mode 100644 index 00000000..259b9f50 Binary files /dev/null and b/public/audio/tts/en/q-7-8.mp3 differ diff --git a/public/audio/tts/en/q-7-9.mp3 b/public/audio/tts/en/q-7-9.mp3 new file mode 100644 index 00000000..e8c8b494 Binary files /dev/null and b/public/audio/tts/en/q-7-9.mp3 differ diff --git a/public/audio/tts/en/q-8-2.mp3 b/public/audio/tts/en/q-8-2.mp3 new file mode 100644 index 00000000..d48b1f42 Binary files /dev/null and b/public/audio/tts/en/q-8-2.mp3 differ diff --git a/public/audio/tts/en/q-8-3.mp3 b/public/audio/tts/en/q-8-3.mp3 new file mode 100644 index 00000000..7066f33e Binary files /dev/null and b/public/audio/tts/en/q-8-3.mp3 differ diff --git a/public/audio/tts/en/q-8-4.mp3 b/public/audio/tts/en/q-8-4.mp3 new file mode 100644 index 00000000..2dfba2be Binary files /dev/null and b/public/audio/tts/en/q-8-4.mp3 differ diff --git a/public/audio/tts/en/q-8-5.mp3 b/public/audio/tts/en/q-8-5.mp3 new file mode 100644 index 00000000..590805e3 Binary files /dev/null and b/public/audio/tts/en/q-8-5.mp3 differ diff --git a/public/audio/tts/en/q-8-6.mp3 b/public/audio/tts/en/q-8-6.mp3 new file mode 100644 index 00000000..6833d3ce Binary files /dev/null and b/public/audio/tts/en/q-8-6.mp3 differ diff --git a/public/audio/tts/en/q-8-7.mp3 b/public/audio/tts/en/q-8-7.mp3 new file mode 100644 index 00000000..b30a3056 Binary files /dev/null and b/public/audio/tts/en/q-8-7.mp3 differ diff --git a/public/audio/tts/en/q-8-8.mp3 b/public/audio/tts/en/q-8-8.mp3 new file mode 100644 index 00000000..17635454 Binary files /dev/null and b/public/audio/tts/en/q-8-8.mp3 differ diff --git a/public/audio/tts/en/q-8-9.mp3 b/public/audio/tts/en/q-8-9.mp3 new file mode 100644 index 00000000..a60cf908 Binary files /dev/null and b/public/audio/tts/en/q-8-9.mp3 differ diff --git a/public/audio/tts/en/q-9-2.mp3 b/public/audio/tts/en/q-9-2.mp3 new file mode 100644 index 00000000..fa61022b Binary files /dev/null and b/public/audio/tts/en/q-9-2.mp3 differ diff --git a/public/audio/tts/en/q-9-3.mp3 b/public/audio/tts/en/q-9-3.mp3 new file mode 100644 index 00000000..924efaef Binary files /dev/null and b/public/audio/tts/en/q-9-3.mp3 differ diff --git a/public/audio/tts/en/q-9-4.mp3 b/public/audio/tts/en/q-9-4.mp3 new file mode 100644 index 00000000..e453575d Binary files /dev/null and b/public/audio/tts/en/q-9-4.mp3 differ diff --git a/public/audio/tts/en/q-9-5.mp3 b/public/audio/tts/en/q-9-5.mp3 new file mode 100644 index 00000000..39eff125 Binary files /dev/null and b/public/audio/tts/en/q-9-5.mp3 differ diff --git a/public/audio/tts/en/q-9-6.mp3 b/public/audio/tts/en/q-9-6.mp3 new file mode 100644 index 00000000..624503b1 Binary files /dev/null and b/public/audio/tts/en/q-9-6.mp3 differ diff --git a/public/audio/tts/en/q-9-7.mp3 b/public/audio/tts/en/q-9-7.mp3 new file mode 100644 index 00000000..4e34dd76 Binary files /dev/null and b/public/audio/tts/en/q-9-7.mp3 differ diff --git a/public/audio/tts/en/q-9-8.mp3 b/public/audio/tts/en/q-9-8.mp3 new file mode 100644 index 00000000..799fb724 Binary files /dev/null and b/public/audio/tts/en/q-9-8.mp3 differ diff --git a/public/audio/tts/en/q-9-9.mp3 b/public/audio/tts/en/q-9-9.mp3 new file mode 100644 index 00000000..f7b79c7e Binary files /dev/null and b/public/audio/tts/en/q-9-9.mp3 differ diff --git a/public/audio/tts/en/qd-10-2.mp3 b/public/audio/tts/en/qd-10-2.mp3 new file mode 100644 index 00000000..4c7d39ac Binary files /dev/null and b/public/audio/tts/en/qd-10-2.mp3 differ diff --git a/public/audio/tts/en/qd-10-5.mp3 b/public/audio/tts/en/qd-10-5.mp3 new file mode 100644 index 00000000..79ffeddd Binary files /dev/null and b/public/audio/tts/en/qd-10-5.mp3 differ diff --git a/public/audio/tts/en/qd-12-2.mp3 b/public/audio/tts/en/qd-12-2.mp3 new file mode 100644 index 00000000..3f8eeac2 Binary files /dev/null and b/public/audio/tts/en/qd-12-2.mp3 differ diff --git a/public/audio/tts/en/qd-12-3.mp3 b/public/audio/tts/en/qd-12-3.mp3 new file mode 100644 index 00000000..17fca7a4 Binary files /dev/null and b/public/audio/tts/en/qd-12-3.mp3 differ diff --git a/public/audio/tts/en/qd-12-4.mp3 b/public/audio/tts/en/qd-12-4.mp3 new file mode 100644 index 00000000..153d72ac Binary files /dev/null and b/public/audio/tts/en/qd-12-4.mp3 differ diff --git a/public/audio/tts/en/qd-12-6.mp3 b/public/audio/tts/en/qd-12-6.mp3 new file mode 100644 index 00000000..ab5d02bb Binary files /dev/null and b/public/audio/tts/en/qd-12-6.mp3 differ diff --git a/public/audio/tts/en/qd-14-2.mp3 b/public/audio/tts/en/qd-14-2.mp3 new file mode 100644 index 00000000..1b255b26 Binary files /dev/null and b/public/audio/tts/en/qd-14-2.mp3 differ diff --git a/public/audio/tts/en/qd-14-7.mp3 b/public/audio/tts/en/qd-14-7.mp3 new file mode 100644 index 00000000..eb36a3e8 Binary files /dev/null and b/public/audio/tts/en/qd-14-7.mp3 differ diff --git a/public/audio/tts/en/qd-15-3.mp3 b/public/audio/tts/en/qd-15-3.mp3 new file mode 100644 index 00000000..b26f4d47 Binary files /dev/null and b/public/audio/tts/en/qd-15-3.mp3 differ diff --git a/public/audio/tts/en/qd-15-5.mp3 b/public/audio/tts/en/qd-15-5.mp3 new file mode 100644 index 00000000..9a22b97b Binary files /dev/null and b/public/audio/tts/en/qd-15-5.mp3 differ diff --git a/public/audio/tts/en/qd-16-2.mp3 b/public/audio/tts/en/qd-16-2.mp3 new file mode 100644 index 00000000..cae840ec Binary files /dev/null and b/public/audio/tts/en/qd-16-2.mp3 differ diff --git a/public/audio/tts/en/qd-16-4.mp3 b/public/audio/tts/en/qd-16-4.mp3 new file mode 100644 index 00000000..a5a3ea2c Binary files /dev/null and b/public/audio/tts/en/qd-16-4.mp3 differ diff --git a/public/audio/tts/en/qd-16-8.mp3 b/public/audio/tts/en/qd-16-8.mp3 new file mode 100644 index 00000000..f29a4201 Binary files /dev/null and b/public/audio/tts/en/qd-16-8.mp3 differ diff --git a/public/audio/tts/en/qd-18-2.mp3 b/public/audio/tts/en/qd-18-2.mp3 new file mode 100644 index 00000000..2d63ad1f Binary files /dev/null and b/public/audio/tts/en/qd-18-2.mp3 differ diff --git a/public/audio/tts/en/qd-18-3.mp3 b/public/audio/tts/en/qd-18-3.mp3 new file mode 100644 index 00000000..b4a8177a Binary files /dev/null and b/public/audio/tts/en/qd-18-3.mp3 differ diff --git a/public/audio/tts/en/qd-18-6.mp3 b/public/audio/tts/en/qd-18-6.mp3 new file mode 100644 index 00000000..4bcde2c4 Binary files /dev/null and b/public/audio/tts/en/qd-18-6.mp3 differ diff --git a/public/audio/tts/en/qd-18-9.mp3 b/public/audio/tts/en/qd-18-9.mp3 new file mode 100644 index 00000000..cf56f5e9 Binary files /dev/null and b/public/audio/tts/en/qd-18-9.mp3 differ diff --git a/public/audio/tts/en/qd-20-4.mp3 b/public/audio/tts/en/qd-20-4.mp3 new file mode 100644 index 00000000..2df87537 Binary files /dev/null and b/public/audio/tts/en/qd-20-4.mp3 differ diff --git a/public/audio/tts/en/qd-20-5.mp3 b/public/audio/tts/en/qd-20-5.mp3 new file mode 100644 index 00000000..6770103d Binary files /dev/null and b/public/audio/tts/en/qd-20-5.mp3 differ diff --git a/public/audio/tts/en/qd-21-3.mp3 b/public/audio/tts/en/qd-21-3.mp3 new file mode 100644 index 00000000..6ff3c2de Binary files /dev/null and b/public/audio/tts/en/qd-21-3.mp3 differ diff --git a/public/audio/tts/en/qd-21-7.mp3 b/public/audio/tts/en/qd-21-7.mp3 new file mode 100644 index 00000000..bcf80af9 Binary files /dev/null and b/public/audio/tts/en/qd-21-7.mp3 differ diff --git a/public/audio/tts/en/qd-24-3.mp3 b/public/audio/tts/en/qd-24-3.mp3 new file mode 100644 index 00000000..f7044d33 Binary files /dev/null and b/public/audio/tts/en/qd-24-3.mp3 differ diff --git a/public/audio/tts/en/qd-24-4.mp3 b/public/audio/tts/en/qd-24-4.mp3 new file mode 100644 index 00000000..82b4e633 Binary files /dev/null and b/public/audio/tts/en/qd-24-4.mp3 differ diff --git a/public/audio/tts/en/qd-24-6.mp3 b/public/audio/tts/en/qd-24-6.mp3 new file mode 100644 index 00000000..1bc9b603 Binary files /dev/null and b/public/audio/tts/en/qd-24-6.mp3 differ diff --git a/public/audio/tts/en/qd-24-8.mp3 b/public/audio/tts/en/qd-24-8.mp3 new file mode 100644 index 00000000..8b7da0cf Binary files /dev/null and b/public/audio/tts/en/qd-24-8.mp3 differ diff --git a/public/audio/tts/en/qd-25-5.mp3 b/public/audio/tts/en/qd-25-5.mp3 new file mode 100644 index 00000000..16c3012a Binary files /dev/null and b/public/audio/tts/en/qd-25-5.mp3 differ diff --git a/public/audio/tts/en/qd-27-3.mp3 b/public/audio/tts/en/qd-27-3.mp3 new file mode 100644 index 00000000..069ce96a Binary files /dev/null and b/public/audio/tts/en/qd-27-3.mp3 differ diff --git a/public/audio/tts/en/qd-27-9.mp3 b/public/audio/tts/en/qd-27-9.mp3 new file mode 100644 index 00000000..42c60514 Binary files /dev/null and b/public/audio/tts/en/qd-27-9.mp3 differ diff --git a/public/audio/tts/en/qd-28-4.mp3 b/public/audio/tts/en/qd-28-4.mp3 new file mode 100644 index 00000000..625b9fee Binary files /dev/null and b/public/audio/tts/en/qd-28-4.mp3 differ diff --git a/public/audio/tts/en/qd-28-7.mp3 b/public/audio/tts/en/qd-28-7.mp3 new file mode 100644 index 00000000..d1d347d3 Binary files /dev/null and b/public/audio/tts/en/qd-28-7.mp3 differ diff --git a/public/audio/tts/en/qd-30-5.mp3 b/public/audio/tts/en/qd-30-5.mp3 new file mode 100644 index 00000000..33da92d3 Binary files /dev/null and b/public/audio/tts/en/qd-30-5.mp3 differ diff --git a/public/audio/tts/en/qd-30-6.mp3 b/public/audio/tts/en/qd-30-6.mp3 new file mode 100644 index 00000000..ce0335b7 Binary files /dev/null and b/public/audio/tts/en/qd-30-6.mp3 differ diff --git a/public/audio/tts/en/qd-32-4.mp3 b/public/audio/tts/en/qd-32-4.mp3 new file mode 100644 index 00000000..f9c7d8d5 Binary files /dev/null and b/public/audio/tts/en/qd-32-4.mp3 differ diff --git a/public/audio/tts/en/qd-32-8.mp3 b/public/audio/tts/en/qd-32-8.mp3 new file mode 100644 index 00000000..e351ca16 Binary files /dev/null and b/public/audio/tts/en/qd-32-8.mp3 differ diff --git a/public/audio/tts/en/qd-35-5.mp3 b/public/audio/tts/en/qd-35-5.mp3 new file mode 100644 index 00000000..b79bb546 Binary files /dev/null and b/public/audio/tts/en/qd-35-5.mp3 differ diff --git a/public/audio/tts/en/qd-35-7.mp3 b/public/audio/tts/en/qd-35-7.mp3 new file mode 100644 index 00000000..c3fd5dda Binary files /dev/null and b/public/audio/tts/en/qd-35-7.mp3 differ diff --git a/public/audio/tts/en/qd-36-4.mp3 b/public/audio/tts/en/qd-36-4.mp3 new file mode 100644 index 00000000..43f24800 Binary files /dev/null and b/public/audio/tts/en/qd-36-4.mp3 differ diff --git a/public/audio/tts/en/qd-36-6.mp3 b/public/audio/tts/en/qd-36-6.mp3 new file mode 100644 index 00000000..e5c155ee Binary files /dev/null and b/public/audio/tts/en/qd-36-6.mp3 differ diff --git a/public/audio/tts/en/qd-36-9.mp3 b/public/audio/tts/en/qd-36-9.mp3 new file mode 100644 index 00000000..29fc22f6 Binary files /dev/null and b/public/audio/tts/en/qd-36-9.mp3 differ diff --git a/public/audio/tts/en/qd-4-2.mp3 b/public/audio/tts/en/qd-4-2.mp3 new file mode 100644 index 00000000..3957d9f4 Binary files /dev/null and b/public/audio/tts/en/qd-4-2.mp3 differ diff --git a/public/audio/tts/en/qd-40-5.mp3 b/public/audio/tts/en/qd-40-5.mp3 new file mode 100644 index 00000000..bb76d1f4 Binary files /dev/null and b/public/audio/tts/en/qd-40-5.mp3 differ diff --git a/public/audio/tts/en/qd-40-8.mp3 b/public/audio/tts/en/qd-40-8.mp3 new file mode 100644 index 00000000..911da57a Binary files /dev/null and b/public/audio/tts/en/qd-40-8.mp3 differ diff --git a/public/audio/tts/en/qd-42-6.mp3 b/public/audio/tts/en/qd-42-6.mp3 new file mode 100644 index 00000000..d6db81c7 Binary files /dev/null and b/public/audio/tts/en/qd-42-6.mp3 differ diff --git a/public/audio/tts/en/qd-42-7.mp3 b/public/audio/tts/en/qd-42-7.mp3 new file mode 100644 index 00000000..795b8db8 Binary files /dev/null and b/public/audio/tts/en/qd-42-7.mp3 differ diff --git a/public/audio/tts/en/qd-45-5.mp3 b/public/audio/tts/en/qd-45-5.mp3 new file mode 100644 index 00000000..c0b0c907 Binary files /dev/null and b/public/audio/tts/en/qd-45-5.mp3 differ diff --git a/public/audio/tts/en/qd-45-9.mp3 b/public/audio/tts/en/qd-45-9.mp3 new file mode 100644 index 00000000..562d53b2 Binary files /dev/null and b/public/audio/tts/en/qd-45-9.mp3 differ diff --git a/public/audio/tts/en/qd-48-6.mp3 b/public/audio/tts/en/qd-48-6.mp3 new file mode 100644 index 00000000..aef22bc0 Binary files /dev/null and b/public/audio/tts/en/qd-48-6.mp3 differ diff --git a/public/audio/tts/en/qd-48-8.mp3 b/public/audio/tts/en/qd-48-8.mp3 new file mode 100644 index 00000000..4189a2e4 Binary files /dev/null and b/public/audio/tts/en/qd-48-8.mp3 differ diff --git a/public/audio/tts/en/qd-49-7.mp3 b/public/audio/tts/en/qd-49-7.mp3 new file mode 100644 index 00000000..ec45e1d5 Binary files /dev/null and b/public/audio/tts/en/qd-49-7.mp3 differ diff --git a/public/audio/tts/en/qd-54-6.mp3 b/public/audio/tts/en/qd-54-6.mp3 new file mode 100644 index 00000000..8dbc7496 Binary files /dev/null and b/public/audio/tts/en/qd-54-6.mp3 differ diff --git a/public/audio/tts/en/qd-54-9.mp3 b/public/audio/tts/en/qd-54-9.mp3 new file mode 100644 index 00000000..8e35a808 Binary files /dev/null and b/public/audio/tts/en/qd-54-9.mp3 differ diff --git a/public/audio/tts/en/qd-56-7.mp3 b/public/audio/tts/en/qd-56-7.mp3 new file mode 100644 index 00000000..25acc750 Binary files /dev/null and b/public/audio/tts/en/qd-56-7.mp3 differ diff --git a/public/audio/tts/en/qd-56-8.mp3 b/public/audio/tts/en/qd-56-8.mp3 new file mode 100644 index 00000000..39277d87 Binary files /dev/null and b/public/audio/tts/en/qd-56-8.mp3 differ diff --git a/public/audio/tts/en/qd-6-2.mp3 b/public/audio/tts/en/qd-6-2.mp3 new file mode 100644 index 00000000..09efe2f5 Binary files /dev/null and b/public/audio/tts/en/qd-6-2.mp3 differ diff --git a/public/audio/tts/en/qd-6-3.mp3 b/public/audio/tts/en/qd-6-3.mp3 new file mode 100644 index 00000000..44a60db8 Binary files /dev/null and b/public/audio/tts/en/qd-6-3.mp3 differ diff --git a/public/audio/tts/en/qd-63-7.mp3 b/public/audio/tts/en/qd-63-7.mp3 new file mode 100644 index 00000000..3778127e Binary files /dev/null and b/public/audio/tts/en/qd-63-7.mp3 differ diff --git a/public/audio/tts/en/qd-63-9.mp3 b/public/audio/tts/en/qd-63-9.mp3 new file mode 100644 index 00000000..0855a270 Binary files /dev/null and b/public/audio/tts/en/qd-63-9.mp3 differ diff --git a/public/audio/tts/en/qd-64-8.mp3 b/public/audio/tts/en/qd-64-8.mp3 new file mode 100644 index 00000000..c128a75a Binary files /dev/null and b/public/audio/tts/en/qd-64-8.mp3 differ diff --git a/public/audio/tts/en/qd-72-8.mp3 b/public/audio/tts/en/qd-72-8.mp3 new file mode 100644 index 00000000..ca983320 Binary files /dev/null and b/public/audio/tts/en/qd-72-8.mp3 differ diff --git a/public/audio/tts/en/qd-72-9.mp3 b/public/audio/tts/en/qd-72-9.mp3 new file mode 100644 index 00000000..3084ca43 Binary files /dev/null and b/public/audio/tts/en/qd-72-9.mp3 differ diff --git a/public/audio/tts/en/qd-8-2.mp3 b/public/audio/tts/en/qd-8-2.mp3 new file mode 100644 index 00000000..9fb982f3 Binary files /dev/null and b/public/audio/tts/en/qd-8-2.mp3 differ diff --git a/public/audio/tts/en/qd-8-4.mp3 b/public/audio/tts/en/qd-8-4.mp3 new file mode 100644 index 00000000..d5178e71 Binary files /dev/null and b/public/audio/tts/en/qd-8-4.mp3 differ diff --git a/public/audio/tts/en/qd-81-9.mp3 b/public/audio/tts/en/qd-81-9.mp3 new file mode 100644 index 00000000..6903e125 Binary files /dev/null and b/public/audio/tts/en/qd-81-9.mp3 differ diff --git a/public/audio/tts/en/qd-9-3.mp3 b/public/audio/tts/en/qd-9-3.mp3 new file mode 100644 index 00000000..2964bebb Binary files /dev/null and b/public/audio/tts/en/qd-9-3.mp3 differ diff --git a/public/audio/tts/en/recap-done.mp3 b/public/audio/tts/en/recap-done.mp3 new file mode 100644 index 00000000..bcbc4c3b Binary files /dev/null and b/public/audio/tts/en/recap-done.mp3 differ diff --git a/public/audio/tts/en/rules-intro-welcome.mp3 b/public/audio/tts/en/rules-intro-welcome.mp3 new file mode 100644 index 00000000..b1a9e3cb Binary files /dev/null and b/public/audio/tts/en/rules-intro-welcome.mp3 differ diff --git a/public/audio/tts/en/rules-intro-x1.mp3 b/public/audio/tts/en/rules-intro-x1.mp3 new file mode 100644 index 00000000..44bf5c6f Binary files /dev/null and b/public/audio/tts/en/rules-intro-x1.mp3 differ diff --git a/public/audio/tts/en/rules-intro-x10.mp3 b/public/audio/tts/en/rules-intro-x10.mp3 new file mode 100644 index 00000000..8baf979e Binary files /dev/null and b/public/audio/tts/en/rules-intro-x10.mp3 differ diff --git a/public/audio/tts/en/strategy-3-4.mp3 b/public/audio/tts/en/strategy-3-4.mp3 new file mode 100644 index 00000000..260e5c85 Binary files /dev/null and b/public/audio/tts/en/strategy-3-4.mp3 differ diff --git a/public/audio/tts/en/strategy-3-5.mp3 b/public/audio/tts/en/strategy-3-5.mp3 new file mode 100644 index 00000000..776c409b Binary files /dev/null and b/public/audio/tts/en/strategy-3-5.mp3 differ diff --git a/public/audio/tts/en/strategy-3-6.mp3 b/public/audio/tts/en/strategy-3-6.mp3 new file mode 100644 index 00000000..330481ee Binary files /dev/null and b/public/audio/tts/en/strategy-3-6.mp3 differ diff --git a/public/audio/tts/en/strategy-3-7.mp3 b/public/audio/tts/en/strategy-3-7.mp3 new file mode 100644 index 00000000..fec45200 Binary files /dev/null and b/public/audio/tts/en/strategy-3-7.mp3 differ diff --git a/public/audio/tts/en/strategy-3-8.mp3 b/public/audio/tts/en/strategy-3-8.mp3 new file mode 100644 index 00000000..4709da65 Binary files /dev/null and b/public/audio/tts/en/strategy-3-8.mp3 differ diff --git a/public/audio/tts/en/strategy-3-9.mp3 b/public/audio/tts/en/strategy-3-9.mp3 new file mode 100644 index 00000000..8703fc32 Binary files /dev/null and b/public/audio/tts/en/strategy-3-9.mp3 differ diff --git a/public/audio/tts/en/strategy-4-4.mp3 b/public/audio/tts/en/strategy-4-4.mp3 new file mode 100644 index 00000000..1bce0088 Binary files /dev/null and b/public/audio/tts/en/strategy-4-4.mp3 differ diff --git a/public/audio/tts/en/strategy-4-5.mp3 b/public/audio/tts/en/strategy-4-5.mp3 new file mode 100644 index 00000000..2abe2655 Binary files /dev/null and b/public/audio/tts/en/strategy-4-5.mp3 differ diff --git a/public/audio/tts/en/strategy-4-6.mp3 b/public/audio/tts/en/strategy-4-6.mp3 new file mode 100644 index 00000000..8a0efff1 Binary files /dev/null and b/public/audio/tts/en/strategy-4-6.mp3 differ diff --git a/public/audio/tts/en/strategy-4-7.mp3 b/public/audio/tts/en/strategy-4-7.mp3 new file mode 100644 index 00000000..205242c1 Binary files /dev/null and b/public/audio/tts/en/strategy-4-7.mp3 differ diff --git a/public/audio/tts/en/strategy-4-8.mp3 b/public/audio/tts/en/strategy-4-8.mp3 new file mode 100644 index 00000000..84e5e730 Binary files /dev/null and b/public/audio/tts/en/strategy-4-8.mp3 differ diff --git a/public/audio/tts/en/strategy-4-9.mp3 b/public/audio/tts/en/strategy-4-9.mp3 new file mode 100644 index 00000000..bf5cc1fe Binary files /dev/null and b/public/audio/tts/en/strategy-4-9.mp3 differ diff --git a/public/audio/tts/en/strategy-5-5.mp3 b/public/audio/tts/en/strategy-5-5.mp3 new file mode 100644 index 00000000..514ff456 Binary files /dev/null and b/public/audio/tts/en/strategy-5-5.mp3 differ diff --git a/public/audio/tts/en/strategy-5-6.mp3 b/public/audio/tts/en/strategy-5-6.mp3 new file mode 100644 index 00000000..f1ed4bdc Binary files /dev/null and b/public/audio/tts/en/strategy-5-6.mp3 differ diff --git a/public/audio/tts/en/strategy-5-7.mp3 b/public/audio/tts/en/strategy-5-7.mp3 new file mode 100644 index 00000000..5b5f99ed Binary files /dev/null and b/public/audio/tts/en/strategy-5-7.mp3 differ diff --git a/public/audio/tts/en/strategy-5-8.mp3 b/public/audio/tts/en/strategy-5-8.mp3 new file mode 100644 index 00000000..1539fee9 Binary files /dev/null and b/public/audio/tts/en/strategy-5-8.mp3 differ diff --git a/public/audio/tts/en/strategy-5-9.mp3 b/public/audio/tts/en/strategy-5-9.mp3 new file mode 100644 index 00000000..102f08b3 Binary files /dev/null and b/public/audio/tts/en/strategy-5-9.mp3 differ diff --git a/public/audio/tts/en/strategy-6-6.mp3 b/public/audio/tts/en/strategy-6-6.mp3 new file mode 100644 index 00000000..49c79b49 Binary files /dev/null and b/public/audio/tts/en/strategy-6-6.mp3 differ diff --git a/public/audio/tts/en/strategy-6-7.mp3 b/public/audio/tts/en/strategy-6-7.mp3 new file mode 100644 index 00000000..26efdb98 Binary files /dev/null and b/public/audio/tts/en/strategy-6-7.mp3 differ diff --git a/public/audio/tts/en/strategy-6-8.mp3 b/public/audio/tts/en/strategy-6-8.mp3 new file mode 100644 index 00000000..d147d7c0 Binary files /dev/null and b/public/audio/tts/en/strategy-6-8.mp3 differ diff --git a/public/audio/tts/en/strategy-6-9.mp3 b/public/audio/tts/en/strategy-6-9.mp3 new file mode 100644 index 00000000..bd04896f Binary files /dev/null and b/public/audio/tts/en/strategy-6-9.mp3 differ diff --git a/public/audio/tts/en/strategy-7-7.mp3 b/public/audio/tts/en/strategy-7-7.mp3 new file mode 100644 index 00000000..b2d9b472 Binary files /dev/null and b/public/audio/tts/en/strategy-7-7.mp3 differ diff --git a/public/audio/tts/en/strategy-7-8.mp3 b/public/audio/tts/en/strategy-7-8.mp3 new file mode 100644 index 00000000..b74ff75f Binary files /dev/null and b/public/audio/tts/en/strategy-7-8.mp3 differ diff --git a/public/audio/tts/en/strategy-7-9.mp3 b/public/audio/tts/en/strategy-7-9.mp3 new file mode 100644 index 00000000..77e89107 Binary files /dev/null and b/public/audio/tts/en/strategy-7-9.mp3 differ diff --git a/public/audio/tts/en/strategy-8-8.mp3 b/public/audio/tts/en/strategy-8-8.mp3 new file mode 100644 index 00000000..ef8ee246 Binary files /dev/null and b/public/audio/tts/en/strategy-8-8.mp3 differ diff --git a/public/audio/tts/en/strategy-8-9.mp3 b/public/audio/tts/en/strategy-8-9.mp3 new file mode 100644 index 00000000..26d73757 Binary files /dev/null and b/public/audio/tts/en/strategy-8-9.mp3 differ diff --git a/public/audio/tts/en/strategy-9-9.mp3 b/public/audio/tts/en/strategy-9-9.mp3 new file mode 100644 index 00000000..4fff4f05 Binary files /dev/null and b/public/audio/tts/en/strategy-9-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-10-2.mp3 b/public/audio/tts/en/strategyd-10-2.mp3 new file mode 100644 index 00000000..73cfc545 Binary files /dev/null and b/public/audio/tts/en/strategyd-10-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-10-5.mp3 b/public/audio/tts/en/strategyd-10-5.mp3 new file mode 100644 index 00000000..c8c8b39f Binary files /dev/null and b/public/audio/tts/en/strategyd-10-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-12-2.mp3 b/public/audio/tts/en/strategyd-12-2.mp3 new file mode 100644 index 00000000..e3b06ac3 Binary files /dev/null and b/public/audio/tts/en/strategyd-12-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-12-3.mp3 b/public/audio/tts/en/strategyd-12-3.mp3 new file mode 100644 index 00000000..7debf7a1 Binary files /dev/null and b/public/audio/tts/en/strategyd-12-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-12-4.mp3 b/public/audio/tts/en/strategyd-12-4.mp3 new file mode 100644 index 00000000..eec9b3e9 Binary files /dev/null and b/public/audio/tts/en/strategyd-12-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-12-6.mp3 b/public/audio/tts/en/strategyd-12-6.mp3 new file mode 100644 index 00000000..10d79a18 Binary files /dev/null and b/public/audio/tts/en/strategyd-12-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-14-2.mp3 b/public/audio/tts/en/strategyd-14-2.mp3 new file mode 100644 index 00000000..58d075d3 Binary files /dev/null and b/public/audio/tts/en/strategyd-14-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-14-7.mp3 b/public/audio/tts/en/strategyd-14-7.mp3 new file mode 100644 index 00000000..5c2a69b0 Binary files /dev/null and b/public/audio/tts/en/strategyd-14-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-15-3.mp3 b/public/audio/tts/en/strategyd-15-3.mp3 new file mode 100644 index 00000000..b7b6693c Binary files /dev/null and b/public/audio/tts/en/strategyd-15-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-15-5.mp3 b/public/audio/tts/en/strategyd-15-5.mp3 new file mode 100644 index 00000000..bc57da84 Binary files /dev/null and b/public/audio/tts/en/strategyd-15-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-16-2.mp3 b/public/audio/tts/en/strategyd-16-2.mp3 new file mode 100644 index 00000000..2507c9ba Binary files /dev/null and b/public/audio/tts/en/strategyd-16-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-16-4.mp3 b/public/audio/tts/en/strategyd-16-4.mp3 new file mode 100644 index 00000000..37c0ba5d Binary files /dev/null and b/public/audio/tts/en/strategyd-16-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-16-8.mp3 b/public/audio/tts/en/strategyd-16-8.mp3 new file mode 100644 index 00000000..4646f876 Binary files /dev/null and b/public/audio/tts/en/strategyd-16-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-18-2.mp3 b/public/audio/tts/en/strategyd-18-2.mp3 new file mode 100644 index 00000000..c8972019 Binary files /dev/null and b/public/audio/tts/en/strategyd-18-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-18-3.mp3 b/public/audio/tts/en/strategyd-18-3.mp3 new file mode 100644 index 00000000..36c5061c Binary files /dev/null and b/public/audio/tts/en/strategyd-18-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-18-6.mp3 b/public/audio/tts/en/strategyd-18-6.mp3 new file mode 100644 index 00000000..46616146 Binary files /dev/null and b/public/audio/tts/en/strategyd-18-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-18-9.mp3 b/public/audio/tts/en/strategyd-18-9.mp3 new file mode 100644 index 00000000..e83b727c Binary files /dev/null and b/public/audio/tts/en/strategyd-18-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-20-4.mp3 b/public/audio/tts/en/strategyd-20-4.mp3 new file mode 100644 index 00000000..2be413c2 Binary files /dev/null and b/public/audio/tts/en/strategyd-20-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-20-5.mp3 b/public/audio/tts/en/strategyd-20-5.mp3 new file mode 100644 index 00000000..dff54bba Binary files /dev/null and b/public/audio/tts/en/strategyd-20-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-21-3.mp3 b/public/audio/tts/en/strategyd-21-3.mp3 new file mode 100644 index 00000000..fee1995f Binary files /dev/null and b/public/audio/tts/en/strategyd-21-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-21-7.mp3 b/public/audio/tts/en/strategyd-21-7.mp3 new file mode 100644 index 00000000..97cbcbcc Binary files /dev/null and b/public/audio/tts/en/strategyd-21-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-24-3.mp3 b/public/audio/tts/en/strategyd-24-3.mp3 new file mode 100644 index 00000000..3f754b87 Binary files /dev/null and b/public/audio/tts/en/strategyd-24-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-24-4.mp3 b/public/audio/tts/en/strategyd-24-4.mp3 new file mode 100644 index 00000000..d0a20110 Binary files /dev/null and b/public/audio/tts/en/strategyd-24-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-24-6.mp3 b/public/audio/tts/en/strategyd-24-6.mp3 new file mode 100644 index 00000000..0e9d6acc Binary files /dev/null and b/public/audio/tts/en/strategyd-24-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-24-8.mp3 b/public/audio/tts/en/strategyd-24-8.mp3 new file mode 100644 index 00000000..3bb81027 Binary files /dev/null and b/public/audio/tts/en/strategyd-24-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-25-5.mp3 b/public/audio/tts/en/strategyd-25-5.mp3 new file mode 100644 index 00000000..9adc0add Binary files /dev/null and b/public/audio/tts/en/strategyd-25-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-27-3.mp3 b/public/audio/tts/en/strategyd-27-3.mp3 new file mode 100644 index 00000000..5a1fa0da Binary files /dev/null and b/public/audio/tts/en/strategyd-27-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-27-9.mp3 b/public/audio/tts/en/strategyd-27-9.mp3 new file mode 100644 index 00000000..ae0ffaa1 Binary files /dev/null and b/public/audio/tts/en/strategyd-27-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-28-4.mp3 b/public/audio/tts/en/strategyd-28-4.mp3 new file mode 100644 index 00000000..bcae7824 Binary files /dev/null and b/public/audio/tts/en/strategyd-28-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-28-7.mp3 b/public/audio/tts/en/strategyd-28-7.mp3 new file mode 100644 index 00000000..9b9f0aa6 Binary files /dev/null and b/public/audio/tts/en/strategyd-28-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-30-5.mp3 b/public/audio/tts/en/strategyd-30-5.mp3 new file mode 100644 index 00000000..41243580 Binary files /dev/null and b/public/audio/tts/en/strategyd-30-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-30-6.mp3 b/public/audio/tts/en/strategyd-30-6.mp3 new file mode 100644 index 00000000..8d051b8f Binary files /dev/null and b/public/audio/tts/en/strategyd-30-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-32-4.mp3 b/public/audio/tts/en/strategyd-32-4.mp3 new file mode 100644 index 00000000..00cfafff Binary files /dev/null and b/public/audio/tts/en/strategyd-32-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-32-8.mp3 b/public/audio/tts/en/strategyd-32-8.mp3 new file mode 100644 index 00000000..2d436377 Binary files /dev/null and b/public/audio/tts/en/strategyd-32-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-35-5.mp3 b/public/audio/tts/en/strategyd-35-5.mp3 new file mode 100644 index 00000000..354d7577 Binary files /dev/null and b/public/audio/tts/en/strategyd-35-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-35-7.mp3 b/public/audio/tts/en/strategyd-35-7.mp3 new file mode 100644 index 00000000..50e0ba0f Binary files /dev/null and b/public/audio/tts/en/strategyd-35-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-36-4.mp3 b/public/audio/tts/en/strategyd-36-4.mp3 new file mode 100644 index 00000000..b154ac41 Binary files /dev/null and b/public/audio/tts/en/strategyd-36-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-36-6.mp3 b/public/audio/tts/en/strategyd-36-6.mp3 new file mode 100644 index 00000000..753548b9 Binary files /dev/null and b/public/audio/tts/en/strategyd-36-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-36-9.mp3 b/public/audio/tts/en/strategyd-36-9.mp3 new file mode 100644 index 00000000..b8813d6c Binary files /dev/null and b/public/audio/tts/en/strategyd-36-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-4-2.mp3 b/public/audio/tts/en/strategyd-4-2.mp3 new file mode 100644 index 00000000..08a85a73 Binary files /dev/null and b/public/audio/tts/en/strategyd-4-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-40-5.mp3 b/public/audio/tts/en/strategyd-40-5.mp3 new file mode 100644 index 00000000..02405640 Binary files /dev/null and b/public/audio/tts/en/strategyd-40-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-40-8.mp3 b/public/audio/tts/en/strategyd-40-8.mp3 new file mode 100644 index 00000000..1ad7ee30 Binary files /dev/null and b/public/audio/tts/en/strategyd-40-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-42-6.mp3 b/public/audio/tts/en/strategyd-42-6.mp3 new file mode 100644 index 00000000..f65389fa Binary files /dev/null and b/public/audio/tts/en/strategyd-42-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-42-7.mp3 b/public/audio/tts/en/strategyd-42-7.mp3 new file mode 100644 index 00000000..86066c4d Binary files /dev/null and b/public/audio/tts/en/strategyd-42-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-45-5.mp3 b/public/audio/tts/en/strategyd-45-5.mp3 new file mode 100644 index 00000000..1004a9f2 Binary files /dev/null and b/public/audio/tts/en/strategyd-45-5.mp3 differ diff --git a/public/audio/tts/en/strategyd-45-9.mp3 b/public/audio/tts/en/strategyd-45-9.mp3 new file mode 100644 index 00000000..5505d80d Binary files /dev/null and b/public/audio/tts/en/strategyd-45-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-48-6.mp3 b/public/audio/tts/en/strategyd-48-6.mp3 new file mode 100644 index 00000000..fa1bc985 Binary files /dev/null and b/public/audio/tts/en/strategyd-48-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-48-8.mp3 b/public/audio/tts/en/strategyd-48-8.mp3 new file mode 100644 index 00000000..36e3dd47 Binary files /dev/null and b/public/audio/tts/en/strategyd-48-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-49-7.mp3 b/public/audio/tts/en/strategyd-49-7.mp3 new file mode 100644 index 00000000..b0e89406 Binary files /dev/null and b/public/audio/tts/en/strategyd-49-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-54-6.mp3 b/public/audio/tts/en/strategyd-54-6.mp3 new file mode 100644 index 00000000..d3597df1 Binary files /dev/null and b/public/audio/tts/en/strategyd-54-6.mp3 differ diff --git a/public/audio/tts/en/strategyd-54-9.mp3 b/public/audio/tts/en/strategyd-54-9.mp3 new file mode 100644 index 00000000..ee5ac64a Binary files /dev/null and b/public/audio/tts/en/strategyd-54-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-56-7.mp3 b/public/audio/tts/en/strategyd-56-7.mp3 new file mode 100644 index 00000000..0efea0b7 Binary files /dev/null and b/public/audio/tts/en/strategyd-56-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-56-8.mp3 b/public/audio/tts/en/strategyd-56-8.mp3 new file mode 100644 index 00000000..a9fb451b Binary files /dev/null and b/public/audio/tts/en/strategyd-56-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-6-2.mp3 b/public/audio/tts/en/strategyd-6-2.mp3 new file mode 100644 index 00000000..fbc9e411 Binary files /dev/null and b/public/audio/tts/en/strategyd-6-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-6-3.mp3 b/public/audio/tts/en/strategyd-6-3.mp3 new file mode 100644 index 00000000..8abee06e Binary files /dev/null and b/public/audio/tts/en/strategyd-6-3.mp3 differ diff --git a/public/audio/tts/en/strategyd-63-7.mp3 b/public/audio/tts/en/strategyd-63-7.mp3 new file mode 100644 index 00000000..5f3ae30b Binary files /dev/null and b/public/audio/tts/en/strategyd-63-7.mp3 differ diff --git a/public/audio/tts/en/strategyd-63-9.mp3 b/public/audio/tts/en/strategyd-63-9.mp3 new file mode 100644 index 00000000..2702d734 Binary files /dev/null and b/public/audio/tts/en/strategyd-63-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-64-8.mp3 b/public/audio/tts/en/strategyd-64-8.mp3 new file mode 100644 index 00000000..a42544a7 Binary files /dev/null and b/public/audio/tts/en/strategyd-64-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-72-8.mp3 b/public/audio/tts/en/strategyd-72-8.mp3 new file mode 100644 index 00000000..c5973a78 Binary files /dev/null and b/public/audio/tts/en/strategyd-72-8.mp3 differ diff --git a/public/audio/tts/en/strategyd-72-9.mp3 b/public/audio/tts/en/strategyd-72-9.mp3 new file mode 100644 index 00000000..cbac2df5 Binary files /dev/null and b/public/audio/tts/en/strategyd-72-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-8-2.mp3 b/public/audio/tts/en/strategyd-8-2.mp3 new file mode 100644 index 00000000..73540512 Binary files /dev/null and b/public/audio/tts/en/strategyd-8-2.mp3 differ diff --git a/public/audio/tts/en/strategyd-8-4.mp3 b/public/audio/tts/en/strategyd-8-4.mp3 new file mode 100644 index 00000000..1887babc Binary files /dev/null and b/public/audio/tts/en/strategyd-8-4.mp3 differ diff --git a/public/audio/tts/en/strategyd-81-9.mp3 b/public/audio/tts/en/strategyd-81-9.mp3 new file mode 100644 index 00000000..4646d661 Binary files /dev/null and b/public/audio/tts/en/strategyd-81-9.mp3 differ diff --git a/public/audio/tts/en/strategyd-9-3.mp3 b/public/audio/tts/en/strategyd-9-3.mp3 new file mode 100644 index 00000000..183e1a5e Binary files /dev/null and b/public/audio/tts/en/strategyd-9-3.mp3 differ diff --git a/public/audio/tts/en/welcome-hello.mp3 b/public/audio/tts/en/welcome-hello.mp3 new file mode 100644 index 00000000..ea45ff52 Binary files /dev/null and b/public/audio/tts/en/welcome-hello.mp3 differ diff --git a/public/audio/tts/en/welcome-name.mp3 b/public/audio/tts/en/welcome-name.mp3 new file mode 100644 index 00000000..24448356 Binary files /dev/null and b/public/audio/tts/en/welcome-name.mp3 differ diff --git a/public/audio/tts/en/welcome-test.mp3 b/public/audio/tts/en/welcome-test.mp3 new file mode 100644 index 00000000..fbe4ab37 Binary files /dev/null and b/public/audio/tts/en/welcome-test.mp3 differ diff --git a/public/audio/tts/comm-2-3.mp3 b/public/audio/tts/fr/comm-2-3.mp3 similarity index 100% rename from public/audio/tts/comm-2-3.mp3 rename to public/audio/tts/fr/comm-2-3.mp3 diff --git a/public/audio/tts/comm-2-4.mp3 b/public/audio/tts/fr/comm-2-4.mp3 similarity index 100% rename from public/audio/tts/comm-2-4.mp3 rename to public/audio/tts/fr/comm-2-4.mp3 diff --git a/public/audio/tts/comm-2-5.mp3 b/public/audio/tts/fr/comm-2-5.mp3 similarity index 100% rename from public/audio/tts/comm-2-5.mp3 rename to public/audio/tts/fr/comm-2-5.mp3 diff --git a/public/audio/tts/comm-2-6.mp3 b/public/audio/tts/fr/comm-2-6.mp3 similarity index 100% rename from public/audio/tts/comm-2-6.mp3 rename to public/audio/tts/fr/comm-2-6.mp3 diff --git a/public/audio/tts/comm-2-7.mp3 b/public/audio/tts/fr/comm-2-7.mp3 similarity index 100% rename from public/audio/tts/comm-2-7.mp3 rename to public/audio/tts/fr/comm-2-7.mp3 diff --git a/public/audio/tts/comm-2-8.mp3 b/public/audio/tts/fr/comm-2-8.mp3 similarity index 100% rename from public/audio/tts/comm-2-8.mp3 rename to public/audio/tts/fr/comm-2-8.mp3 diff --git a/public/audio/tts/comm-2-9.mp3 b/public/audio/tts/fr/comm-2-9.mp3 similarity index 100% rename from public/audio/tts/comm-2-9.mp3 rename to public/audio/tts/fr/comm-2-9.mp3 diff --git a/public/audio/tts/comm-3-4.mp3 b/public/audio/tts/fr/comm-3-4.mp3 similarity index 100% rename from public/audio/tts/comm-3-4.mp3 rename to public/audio/tts/fr/comm-3-4.mp3 diff --git a/public/audio/tts/comm-3-5.mp3 b/public/audio/tts/fr/comm-3-5.mp3 similarity index 100% rename from public/audio/tts/comm-3-5.mp3 rename to public/audio/tts/fr/comm-3-5.mp3 diff --git a/public/audio/tts/comm-3-6.mp3 b/public/audio/tts/fr/comm-3-6.mp3 similarity index 100% rename from public/audio/tts/comm-3-6.mp3 rename to public/audio/tts/fr/comm-3-6.mp3 diff --git a/public/audio/tts/comm-3-7.mp3 b/public/audio/tts/fr/comm-3-7.mp3 similarity index 100% rename from public/audio/tts/comm-3-7.mp3 rename to public/audio/tts/fr/comm-3-7.mp3 diff --git a/public/audio/tts/comm-3-8.mp3 b/public/audio/tts/fr/comm-3-8.mp3 similarity index 100% rename from public/audio/tts/comm-3-8.mp3 rename to public/audio/tts/fr/comm-3-8.mp3 diff --git a/public/audio/tts/comm-3-9.mp3 b/public/audio/tts/fr/comm-3-9.mp3 similarity index 100% rename from public/audio/tts/comm-3-9.mp3 rename to public/audio/tts/fr/comm-3-9.mp3 diff --git a/public/audio/tts/comm-4-5.mp3 b/public/audio/tts/fr/comm-4-5.mp3 similarity index 100% rename from public/audio/tts/comm-4-5.mp3 rename to public/audio/tts/fr/comm-4-5.mp3 diff --git a/public/audio/tts/comm-4-6.mp3 b/public/audio/tts/fr/comm-4-6.mp3 similarity index 100% rename from public/audio/tts/comm-4-6.mp3 rename to public/audio/tts/fr/comm-4-6.mp3 diff --git a/public/audio/tts/comm-4-7.mp3 b/public/audio/tts/fr/comm-4-7.mp3 similarity index 100% rename from public/audio/tts/comm-4-7.mp3 rename to public/audio/tts/fr/comm-4-7.mp3 diff --git a/public/audio/tts/comm-4-8.mp3 b/public/audio/tts/fr/comm-4-8.mp3 similarity index 100% rename from public/audio/tts/comm-4-8.mp3 rename to public/audio/tts/fr/comm-4-8.mp3 diff --git a/public/audio/tts/comm-4-9.mp3 b/public/audio/tts/fr/comm-4-9.mp3 similarity index 100% rename from public/audio/tts/comm-4-9.mp3 rename to public/audio/tts/fr/comm-4-9.mp3 diff --git a/public/audio/tts/comm-5-6.mp3 b/public/audio/tts/fr/comm-5-6.mp3 similarity index 100% rename from public/audio/tts/comm-5-6.mp3 rename to public/audio/tts/fr/comm-5-6.mp3 diff --git a/public/audio/tts/comm-5-7.mp3 b/public/audio/tts/fr/comm-5-7.mp3 similarity index 100% rename from public/audio/tts/comm-5-7.mp3 rename to public/audio/tts/fr/comm-5-7.mp3 diff --git a/public/audio/tts/comm-5-8.mp3 b/public/audio/tts/fr/comm-5-8.mp3 similarity index 100% rename from public/audio/tts/comm-5-8.mp3 rename to public/audio/tts/fr/comm-5-8.mp3 diff --git a/public/audio/tts/comm-5-9.mp3 b/public/audio/tts/fr/comm-5-9.mp3 similarity index 100% rename from public/audio/tts/comm-5-9.mp3 rename to public/audio/tts/fr/comm-5-9.mp3 diff --git a/public/audio/tts/comm-6-7.mp3 b/public/audio/tts/fr/comm-6-7.mp3 similarity index 100% rename from public/audio/tts/comm-6-7.mp3 rename to public/audio/tts/fr/comm-6-7.mp3 diff --git a/public/audio/tts/comm-6-8.mp3 b/public/audio/tts/fr/comm-6-8.mp3 similarity index 100% rename from public/audio/tts/comm-6-8.mp3 rename to public/audio/tts/fr/comm-6-8.mp3 diff --git a/public/audio/tts/comm-6-9.mp3 b/public/audio/tts/fr/comm-6-9.mp3 similarity index 100% rename from public/audio/tts/comm-6-9.mp3 rename to public/audio/tts/fr/comm-6-9.mp3 diff --git a/public/audio/tts/comm-7-8.mp3 b/public/audio/tts/fr/comm-7-8.mp3 similarity index 100% rename from public/audio/tts/comm-7-8.mp3 rename to public/audio/tts/fr/comm-7-8.mp3 diff --git a/public/audio/tts/comm-7-9.mp3 b/public/audio/tts/fr/comm-7-9.mp3 similarity index 100% rename from public/audio/tts/comm-7-9.mp3 rename to public/audio/tts/fr/comm-7-9.mp3 diff --git a/public/audio/tts/comm-8-9.mp3 b/public/audio/tts/fr/comm-8-9.mp3 similarity index 100% rename from public/audio/tts/comm-8-9.mp3 rename to public/audio/tts/fr/comm-8-9.mp3 diff --git a/public/audio/tts/intro-2-2.mp3 b/public/audio/tts/fr/intro-2-2.mp3 similarity index 100% rename from public/audio/tts/intro-2-2.mp3 rename to public/audio/tts/fr/intro-2-2.mp3 diff --git a/public/audio/tts/intro-2-3.mp3 b/public/audio/tts/fr/intro-2-3.mp3 similarity index 100% rename from public/audio/tts/intro-2-3.mp3 rename to public/audio/tts/fr/intro-2-3.mp3 diff --git a/public/audio/tts/intro-2-4.mp3 b/public/audio/tts/fr/intro-2-4.mp3 similarity index 100% rename from public/audio/tts/intro-2-4.mp3 rename to public/audio/tts/fr/intro-2-4.mp3 diff --git a/public/audio/tts/intro-2-5.mp3 b/public/audio/tts/fr/intro-2-5.mp3 similarity index 100% rename from public/audio/tts/intro-2-5.mp3 rename to public/audio/tts/fr/intro-2-5.mp3 diff --git a/public/audio/tts/intro-2-6.mp3 b/public/audio/tts/fr/intro-2-6.mp3 similarity index 100% rename from public/audio/tts/intro-2-6.mp3 rename to public/audio/tts/fr/intro-2-6.mp3 diff --git a/public/audio/tts/intro-2-7.mp3 b/public/audio/tts/fr/intro-2-7.mp3 similarity index 100% rename from public/audio/tts/intro-2-7.mp3 rename to public/audio/tts/fr/intro-2-7.mp3 diff --git a/public/audio/tts/intro-2-8.mp3 b/public/audio/tts/fr/intro-2-8.mp3 similarity index 100% rename from public/audio/tts/intro-2-8.mp3 rename to public/audio/tts/fr/intro-2-8.mp3 diff --git a/public/audio/tts/intro-2-9.mp3 b/public/audio/tts/fr/intro-2-9.mp3 similarity index 100% rename from public/audio/tts/intro-2-9.mp3 rename to public/audio/tts/fr/intro-2-9.mp3 diff --git a/public/audio/tts/intro-3-3.mp3 b/public/audio/tts/fr/intro-3-3.mp3 similarity index 100% rename from public/audio/tts/intro-3-3.mp3 rename to public/audio/tts/fr/intro-3-3.mp3 diff --git a/public/audio/tts/intro-3-4.mp3 b/public/audio/tts/fr/intro-3-4.mp3 similarity index 100% rename from public/audio/tts/intro-3-4.mp3 rename to public/audio/tts/fr/intro-3-4.mp3 diff --git a/public/audio/tts/intro-3-5.mp3 b/public/audio/tts/fr/intro-3-5.mp3 similarity index 100% rename from public/audio/tts/intro-3-5.mp3 rename to public/audio/tts/fr/intro-3-5.mp3 diff --git a/public/audio/tts/intro-3-6.mp3 b/public/audio/tts/fr/intro-3-6.mp3 similarity index 100% rename from public/audio/tts/intro-3-6.mp3 rename to public/audio/tts/fr/intro-3-6.mp3 diff --git a/public/audio/tts/intro-3-7.mp3 b/public/audio/tts/fr/intro-3-7.mp3 similarity index 100% rename from public/audio/tts/intro-3-7.mp3 rename to public/audio/tts/fr/intro-3-7.mp3 diff --git a/public/audio/tts/intro-3-8.mp3 b/public/audio/tts/fr/intro-3-8.mp3 similarity index 100% rename from public/audio/tts/intro-3-8.mp3 rename to public/audio/tts/fr/intro-3-8.mp3 diff --git a/public/audio/tts/intro-3-9.mp3 b/public/audio/tts/fr/intro-3-9.mp3 similarity index 100% rename from public/audio/tts/intro-3-9.mp3 rename to public/audio/tts/fr/intro-3-9.mp3 diff --git a/public/audio/tts/intro-4-4.mp3 b/public/audio/tts/fr/intro-4-4.mp3 similarity index 100% rename from public/audio/tts/intro-4-4.mp3 rename to public/audio/tts/fr/intro-4-4.mp3 diff --git a/public/audio/tts/intro-4-5.mp3 b/public/audio/tts/fr/intro-4-5.mp3 similarity index 100% rename from public/audio/tts/intro-4-5.mp3 rename to public/audio/tts/fr/intro-4-5.mp3 diff --git a/public/audio/tts/intro-4-6.mp3 b/public/audio/tts/fr/intro-4-6.mp3 similarity index 100% rename from public/audio/tts/intro-4-6.mp3 rename to public/audio/tts/fr/intro-4-6.mp3 diff --git a/public/audio/tts/intro-4-7.mp3 b/public/audio/tts/fr/intro-4-7.mp3 similarity index 100% rename from public/audio/tts/intro-4-7.mp3 rename to public/audio/tts/fr/intro-4-7.mp3 diff --git a/public/audio/tts/intro-4-8.mp3 b/public/audio/tts/fr/intro-4-8.mp3 similarity index 100% rename from public/audio/tts/intro-4-8.mp3 rename to public/audio/tts/fr/intro-4-8.mp3 diff --git a/public/audio/tts/intro-4-9.mp3 b/public/audio/tts/fr/intro-4-9.mp3 similarity index 100% rename from public/audio/tts/intro-4-9.mp3 rename to public/audio/tts/fr/intro-4-9.mp3 diff --git a/public/audio/tts/intro-5-5.mp3 b/public/audio/tts/fr/intro-5-5.mp3 similarity index 100% rename from public/audio/tts/intro-5-5.mp3 rename to public/audio/tts/fr/intro-5-5.mp3 diff --git a/public/audio/tts/intro-5-6.mp3 b/public/audio/tts/fr/intro-5-6.mp3 similarity index 100% rename from public/audio/tts/intro-5-6.mp3 rename to public/audio/tts/fr/intro-5-6.mp3 diff --git a/public/audio/tts/intro-5-7.mp3 b/public/audio/tts/fr/intro-5-7.mp3 similarity index 100% rename from public/audio/tts/intro-5-7.mp3 rename to public/audio/tts/fr/intro-5-7.mp3 diff --git a/public/audio/tts/intro-5-8.mp3 b/public/audio/tts/fr/intro-5-8.mp3 similarity index 100% rename from public/audio/tts/intro-5-8.mp3 rename to public/audio/tts/fr/intro-5-8.mp3 diff --git a/public/audio/tts/intro-5-9.mp3 b/public/audio/tts/fr/intro-5-9.mp3 similarity index 100% rename from public/audio/tts/intro-5-9.mp3 rename to public/audio/tts/fr/intro-5-9.mp3 diff --git a/public/audio/tts/intro-6-6.mp3 b/public/audio/tts/fr/intro-6-6.mp3 similarity index 100% rename from public/audio/tts/intro-6-6.mp3 rename to public/audio/tts/fr/intro-6-6.mp3 diff --git a/public/audio/tts/intro-6-7.mp3 b/public/audio/tts/fr/intro-6-7.mp3 similarity index 100% rename from public/audio/tts/intro-6-7.mp3 rename to public/audio/tts/fr/intro-6-7.mp3 diff --git a/public/audio/tts/intro-6-8.mp3 b/public/audio/tts/fr/intro-6-8.mp3 similarity index 100% rename from public/audio/tts/intro-6-8.mp3 rename to public/audio/tts/fr/intro-6-8.mp3 diff --git a/public/audio/tts/intro-6-9.mp3 b/public/audio/tts/fr/intro-6-9.mp3 similarity index 100% rename from public/audio/tts/intro-6-9.mp3 rename to public/audio/tts/fr/intro-6-9.mp3 diff --git a/public/audio/tts/intro-7-7.mp3 b/public/audio/tts/fr/intro-7-7.mp3 similarity index 100% rename from public/audio/tts/intro-7-7.mp3 rename to public/audio/tts/fr/intro-7-7.mp3 diff --git a/public/audio/tts/intro-7-8.mp3 b/public/audio/tts/fr/intro-7-8.mp3 similarity index 100% rename from public/audio/tts/intro-7-8.mp3 rename to public/audio/tts/fr/intro-7-8.mp3 diff --git a/public/audio/tts/intro-7-9.mp3 b/public/audio/tts/fr/intro-7-9.mp3 similarity index 100% rename from public/audio/tts/intro-7-9.mp3 rename to public/audio/tts/fr/intro-7-9.mp3 diff --git a/public/audio/tts/intro-8-8.mp3 b/public/audio/tts/fr/intro-8-8.mp3 similarity index 100% rename from public/audio/tts/intro-8-8.mp3 rename to public/audio/tts/fr/intro-8-8.mp3 diff --git a/public/audio/tts/intro-8-9.mp3 b/public/audio/tts/fr/intro-8-9.mp3 similarity index 100% rename from public/audio/tts/intro-8-9.mp3 rename to public/audio/tts/fr/intro-8-9.mp3 diff --git a/public/audio/tts/intro-9-9.mp3 b/public/audio/tts/fr/intro-9-9.mp3 similarity index 100% rename from public/audio/tts/intro-9-9.mp3 rename to public/audio/tts/fr/intro-9-9.mp3 diff --git a/public/audio/tts/introd-10-2.mp3 b/public/audio/tts/fr/introd-10-2.mp3 similarity index 100% rename from public/audio/tts/introd-10-2.mp3 rename to public/audio/tts/fr/introd-10-2.mp3 diff --git a/public/audio/tts/introd-10-5.mp3 b/public/audio/tts/fr/introd-10-5.mp3 similarity index 100% rename from public/audio/tts/introd-10-5.mp3 rename to public/audio/tts/fr/introd-10-5.mp3 diff --git a/public/audio/tts/introd-12-2.mp3 b/public/audio/tts/fr/introd-12-2.mp3 similarity index 100% rename from public/audio/tts/introd-12-2.mp3 rename to public/audio/tts/fr/introd-12-2.mp3 diff --git a/public/audio/tts/introd-12-3.mp3 b/public/audio/tts/fr/introd-12-3.mp3 similarity index 100% rename from public/audio/tts/introd-12-3.mp3 rename to public/audio/tts/fr/introd-12-3.mp3 diff --git a/public/audio/tts/introd-12-4.mp3 b/public/audio/tts/fr/introd-12-4.mp3 similarity index 100% rename from public/audio/tts/introd-12-4.mp3 rename to public/audio/tts/fr/introd-12-4.mp3 diff --git a/public/audio/tts/introd-12-6.mp3 b/public/audio/tts/fr/introd-12-6.mp3 similarity index 100% rename from public/audio/tts/introd-12-6.mp3 rename to public/audio/tts/fr/introd-12-6.mp3 diff --git a/public/audio/tts/introd-14-2.mp3 b/public/audio/tts/fr/introd-14-2.mp3 similarity index 100% rename from public/audio/tts/introd-14-2.mp3 rename to public/audio/tts/fr/introd-14-2.mp3 diff --git a/public/audio/tts/introd-14-7.mp3 b/public/audio/tts/fr/introd-14-7.mp3 similarity index 100% rename from public/audio/tts/introd-14-7.mp3 rename to public/audio/tts/fr/introd-14-7.mp3 diff --git a/public/audio/tts/introd-15-3.mp3 b/public/audio/tts/fr/introd-15-3.mp3 similarity index 100% rename from public/audio/tts/introd-15-3.mp3 rename to public/audio/tts/fr/introd-15-3.mp3 diff --git a/public/audio/tts/introd-15-5.mp3 b/public/audio/tts/fr/introd-15-5.mp3 similarity index 100% rename from public/audio/tts/introd-15-5.mp3 rename to public/audio/tts/fr/introd-15-5.mp3 diff --git a/public/audio/tts/introd-16-2.mp3 b/public/audio/tts/fr/introd-16-2.mp3 similarity index 100% rename from public/audio/tts/introd-16-2.mp3 rename to public/audio/tts/fr/introd-16-2.mp3 diff --git a/public/audio/tts/introd-16-4.mp3 b/public/audio/tts/fr/introd-16-4.mp3 similarity index 100% rename from public/audio/tts/introd-16-4.mp3 rename to public/audio/tts/fr/introd-16-4.mp3 diff --git a/public/audio/tts/introd-16-8.mp3 b/public/audio/tts/fr/introd-16-8.mp3 similarity index 100% rename from public/audio/tts/introd-16-8.mp3 rename to public/audio/tts/fr/introd-16-8.mp3 diff --git a/public/audio/tts/introd-18-2.mp3 b/public/audio/tts/fr/introd-18-2.mp3 similarity index 100% rename from public/audio/tts/introd-18-2.mp3 rename to public/audio/tts/fr/introd-18-2.mp3 diff --git a/public/audio/tts/introd-18-3.mp3 b/public/audio/tts/fr/introd-18-3.mp3 similarity index 100% rename from public/audio/tts/introd-18-3.mp3 rename to public/audio/tts/fr/introd-18-3.mp3 diff --git a/public/audio/tts/introd-18-6.mp3 b/public/audio/tts/fr/introd-18-6.mp3 similarity index 100% rename from public/audio/tts/introd-18-6.mp3 rename to public/audio/tts/fr/introd-18-6.mp3 diff --git a/public/audio/tts/introd-18-9.mp3 b/public/audio/tts/fr/introd-18-9.mp3 similarity index 100% rename from public/audio/tts/introd-18-9.mp3 rename to public/audio/tts/fr/introd-18-9.mp3 diff --git a/public/audio/tts/introd-20-4.mp3 b/public/audio/tts/fr/introd-20-4.mp3 similarity index 100% rename from public/audio/tts/introd-20-4.mp3 rename to public/audio/tts/fr/introd-20-4.mp3 diff --git a/public/audio/tts/introd-20-5.mp3 b/public/audio/tts/fr/introd-20-5.mp3 similarity index 100% rename from public/audio/tts/introd-20-5.mp3 rename to public/audio/tts/fr/introd-20-5.mp3 diff --git a/public/audio/tts/introd-21-3.mp3 b/public/audio/tts/fr/introd-21-3.mp3 similarity index 100% rename from public/audio/tts/introd-21-3.mp3 rename to public/audio/tts/fr/introd-21-3.mp3 diff --git a/public/audio/tts/introd-21-7.mp3 b/public/audio/tts/fr/introd-21-7.mp3 similarity index 100% rename from public/audio/tts/introd-21-7.mp3 rename to public/audio/tts/fr/introd-21-7.mp3 diff --git a/public/audio/tts/introd-24-3.mp3 b/public/audio/tts/fr/introd-24-3.mp3 similarity index 100% rename from public/audio/tts/introd-24-3.mp3 rename to public/audio/tts/fr/introd-24-3.mp3 diff --git a/public/audio/tts/introd-24-4.mp3 b/public/audio/tts/fr/introd-24-4.mp3 similarity index 100% rename from public/audio/tts/introd-24-4.mp3 rename to public/audio/tts/fr/introd-24-4.mp3 diff --git a/public/audio/tts/introd-24-6.mp3 b/public/audio/tts/fr/introd-24-6.mp3 similarity index 100% rename from public/audio/tts/introd-24-6.mp3 rename to public/audio/tts/fr/introd-24-6.mp3 diff --git a/public/audio/tts/introd-24-8.mp3 b/public/audio/tts/fr/introd-24-8.mp3 similarity index 100% rename from public/audio/tts/introd-24-8.mp3 rename to public/audio/tts/fr/introd-24-8.mp3 diff --git a/public/audio/tts/introd-25-5.mp3 b/public/audio/tts/fr/introd-25-5.mp3 similarity index 100% rename from public/audio/tts/introd-25-5.mp3 rename to public/audio/tts/fr/introd-25-5.mp3 diff --git a/public/audio/tts/introd-27-3.mp3 b/public/audio/tts/fr/introd-27-3.mp3 similarity index 100% rename from public/audio/tts/introd-27-3.mp3 rename to public/audio/tts/fr/introd-27-3.mp3 diff --git a/public/audio/tts/introd-27-9.mp3 b/public/audio/tts/fr/introd-27-9.mp3 similarity index 100% rename from public/audio/tts/introd-27-9.mp3 rename to public/audio/tts/fr/introd-27-9.mp3 diff --git a/public/audio/tts/introd-28-4.mp3 b/public/audio/tts/fr/introd-28-4.mp3 similarity index 100% rename from public/audio/tts/introd-28-4.mp3 rename to public/audio/tts/fr/introd-28-4.mp3 diff --git a/public/audio/tts/introd-28-7.mp3 b/public/audio/tts/fr/introd-28-7.mp3 similarity index 100% rename from public/audio/tts/introd-28-7.mp3 rename to public/audio/tts/fr/introd-28-7.mp3 diff --git a/public/audio/tts/introd-30-5.mp3 b/public/audio/tts/fr/introd-30-5.mp3 similarity index 100% rename from public/audio/tts/introd-30-5.mp3 rename to public/audio/tts/fr/introd-30-5.mp3 diff --git a/public/audio/tts/introd-30-6.mp3 b/public/audio/tts/fr/introd-30-6.mp3 similarity index 100% rename from public/audio/tts/introd-30-6.mp3 rename to public/audio/tts/fr/introd-30-6.mp3 diff --git a/public/audio/tts/introd-32-4.mp3 b/public/audio/tts/fr/introd-32-4.mp3 similarity index 100% rename from public/audio/tts/introd-32-4.mp3 rename to public/audio/tts/fr/introd-32-4.mp3 diff --git a/public/audio/tts/introd-32-8.mp3 b/public/audio/tts/fr/introd-32-8.mp3 similarity index 100% rename from public/audio/tts/introd-32-8.mp3 rename to public/audio/tts/fr/introd-32-8.mp3 diff --git a/public/audio/tts/introd-35-5.mp3 b/public/audio/tts/fr/introd-35-5.mp3 similarity index 100% rename from public/audio/tts/introd-35-5.mp3 rename to public/audio/tts/fr/introd-35-5.mp3 diff --git a/public/audio/tts/introd-35-7.mp3 b/public/audio/tts/fr/introd-35-7.mp3 similarity index 100% rename from public/audio/tts/introd-35-7.mp3 rename to public/audio/tts/fr/introd-35-7.mp3 diff --git a/public/audio/tts/introd-36-4.mp3 b/public/audio/tts/fr/introd-36-4.mp3 similarity index 100% rename from public/audio/tts/introd-36-4.mp3 rename to public/audio/tts/fr/introd-36-4.mp3 diff --git a/public/audio/tts/introd-36-6.mp3 b/public/audio/tts/fr/introd-36-6.mp3 similarity index 100% rename from public/audio/tts/introd-36-6.mp3 rename to public/audio/tts/fr/introd-36-6.mp3 diff --git a/public/audio/tts/introd-36-9.mp3 b/public/audio/tts/fr/introd-36-9.mp3 similarity index 100% rename from public/audio/tts/introd-36-9.mp3 rename to public/audio/tts/fr/introd-36-9.mp3 diff --git a/public/audio/tts/introd-4-2.mp3 b/public/audio/tts/fr/introd-4-2.mp3 similarity index 100% rename from public/audio/tts/introd-4-2.mp3 rename to public/audio/tts/fr/introd-4-2.mp3 diff --git a/public/audio/tts/introd-40-5.mp3 b/public/audio/tts/fr/introd-40-5.mp3 similarity index 100% rename from public/audio/tts/introd-40-5.mp3 rename to public/audio/tts/fr/introd-40-5.mp3 diff --git a/public/audio/tts/introd-40-8.mp3 b/public/audio/tts/fr/introd-40-8.mp3 similarity index 100% rename from public/audio/tts/introd-40-8.mp3 rename to public/audio/tts/fr/introd-40-8.mp3 diff --git a/public/audio/tts/introd-42-6.mp3 b/public/audio/tts/fr/introd-42-6.mp3 similarity index 100% rename from public/audio/tts/introd-42-6.mp3 rename to public/audio/tts/fr/introd-42-6.mp3 diff --git a/public/audio/tts/introd-42-7.mp3 b/public/audio/tts/fr/introd-42-7.mp3 similarity index 100% rename from public/audio/tts/introd-42-7.mp3 rename to public/audio/tts/fr/introd-42-7.mp3 diff --git a/public/audio/tts/introd-45-5.mp3 b/public/audio/tts/fr/introd-45-5.mp3 similarity index 100% rename from public/audio/tts/introd-45-5.mp3 rename to public/audio/tts/fr/introd-45-5.mp3 diff --git a/public/audio/tts/introd-45-9.mp3 b/public/audio/tts/fr/introd-45-9.mp3 similarity index 100% rename from public/audio/tts/introd-45-9.mp3 rename to public/audio/tts/fr/introd-45-9.mp3 diff --git a/public/audio/tts/introd-48-6.mp3 b/public/audio/tts/fr/introd-48-6.mp3 similarity index 100% rename from public/audio/tts/introd-48-6.mp3 rename to public/audio/tts/fr/introd-48-6.mp3 diff --git a/public/audio/tts/introd-48-8.mp3 b/public/audio/tts/fr/introd-48-8.mp3 similarity index 100% rename from public/audio/tts/introd-48-8.mp3 rename to public/audio/tts/fr/introd-48-8.mp3 diff --git a/public/audio/tts/introd-49-7.mp3 b/public/audio/tts/fr/introd-49-7.mp3 similarity index 100% rename from public/audio/tts/introd-49-7.mp3 rename to public/audio/tts/fr/introd-49-7.mp3 diff --git a/public/audio/tts/introd-54-6.mp3 b/public/audio/tts/fr/introd-54-6.mp3 similarity index 100% rename from public/audio/tts/introd-54-6.mp3 rename to public/audio/tts/fr/introd-54-6.mp3 diff --git a/public/audio/tts/introd-54-9.mp3 b/public/audio/tts/fr/introd-54-9.mp3 similarity index 100% rename from public/audio/tts/introd-54-9.mp3 rename to public/audio/tts/fr/introd-54-9.mp3 diff --git a/public/audio/tts/introd-56-7.mp3 b/public/audio/tts/fr/introd-56-7.mp3 similarity index 100% rename from public/audio/tts/introd-56-7.mp3 rename to public/audio/tts/fr/introd-56-7.mp3 diff --git a/public/audio/tts/introd-56-8.mp3 b/public/audio/tts/fr/introd-56-8.mp3 similarity index 100% rename from public/audio/tts/introd-56-8.mp3 rename to public/audio/tts/fr/introd-56-8.mp3 diff --git a/public/audio/tts/introd-6-2.mp3 b/public/audio/tts/fr/introd-6-2.mp3 similarity index 100% rename from public/audio/tts/introd-6-2.mp3 rename to public/audio/tts/fr/introd-6-2.mp3 diff --git a/public/audio/tts/introd-6-3.mp3 b/public/audio/tts/fr/introd-6-3.mp3 similarity index 100% rename from public/audio/tts/introd-6-3.mp3 rename to public/audio/tts/fr/introd-6-3.mp3 diff --git a/public/audio/tts/introd-63-7.mp3 b/public/audio/tts/fr/introd-63-7.mp3 similarity index 100% rename from public/audio/tts/introd-63-7.mp3 rename to public/audio/tts/fr/introd-63-7.mp3 diff --git a/public/audio/tts/introd-63-9.mp3 b/public/audio/tts/fr/introd-63-9.mp3 similarity index 100% rename from public/audio/tts/introd-63-9.mp3 rename to public/audio/tts/fr/introd-63-9.mp3 diff --git a/public/audio/tts/introd-64-8.mp3 b/public/audio/tts/fr/introd-64-8.mp3 similarity index 100% rename from public/audio/tts/introd-64-8.mp3 rename to public/audio/tts/fr/introd-64-8.mp3 diff --git a/public/audio/tts/introd-72-8.mp3 b/public/audio/tts/fr/introd-72-8.mp3 similarity index 100% rename from public/audio/tts/introd-72-8.mp3 rename to public/audio/tts/fr/introd-72-8.mp3 diff --git a/public/audio/tts/introd-72-9.mp3 b/public/audio/tts/fr/introd-72-9.mp3 similarity index 100% rename from public/audio/tts/introd-72-9.mp3 rename to public/audio/tts/fr/introd-72-9.mp3 diff --git a/public/audio/tts/introd-8-2.mp3 b/public/audio/tts/fr/introd-8-2.mp3 similarity index 100% rename from public/audio/tts/introd-8-2.mp3 rename to public/audio/tts/fr/introd-8-2.mp3 diff --git a/public/audio/tts/introd-8-4.mp3 b/public/audio/tts/fr/introd-8-4.mp3 similarity index 100% rename from public/audio/tts/introd-8-4.mp3 rename to public/audio/tts/fr/introd-8-4.mp3 diff --git a/public/audio/tts/introd-81-9.mp3 b/public/audio/tts/fr/introd-81-9.mp3 similarity index 100% rename from public/audio/tts/introd-81-9.mp3 rename to public/audio/tts/fr/introd-81-9.mp3 diff --git a/public/audio/tts/introd-9-3.mp3 b/public/audio/tts/fr/introd-9-3.mp3 similarity index 100% rename from public/audio/tts/introd-9-3.mp3 rename to public/audio/tts/fr/introd-9-3.mp3 diff --git a/public/audio/tts/placement-intro.mp3 b/public/audio/tts/fr/placement-intro.mp3 similarity index 100% rename from public/audio/tts/placement-intro.mp3 rename to public/audio/tts/fr/placement-intro.mp3 diff --git a/public/audio/tts/q-2-2.mp3 b/public/audio/tts/fr/q-2-2.mp3 similarity index 100% rename from public/audio/tts/q-2-2.mp3 rename to public/audio/tts/fr/q-2-2.mp3 diff --git a/public/audio/tts/q-2-3.mp3 b/public/audio/tts/fr/q-2-3.mp3 similarity index 100% rename from public/audio/tts/q-2-3.mp3 rename to public/audio/tts/fr/q-2-3.mp3 diff --git a/public/audio/tts/q-2-4.mp3 b/public/audio/tts/fr/q-2-4.mp3 similarity index 100% rename from public/audio/tts/q-2-4.mp3 rename to public/audio/tts/fr/q-2-4.mp3 diff --git a/public/audio/tts/q-2-5.mp3 b/public/audio/tts/fr/q-2-5.mp3 similarity index 100% rename from public/audio/tts/q-2-5.mp3 rename to public/audio/tts/fr/q-2-5.mp3 diff --git a/public/audio/tts/q-2-6.mp3 b/public/audio/tts/fr/q-2-6.mp3 similarity index 100% rename from public/audio/tts/q-2-6.mp3 rename to public/audio/tts/fr/q-2-6.mp3 diff --git a/public/audio/tts/q-2-7.mp3 b/public/audio/tts/fr/q-2-7.mp3 similarity index 100% rename from public/audio/tts/q-2-7.mp3 rename to public/audio/tts/fr/q-2-7.mp3 diff --git a/public/audio/tts/q-2-8.mp3 b/public/audio/tts/fr/q-2-8.mp3 similarity index 100% rename from public/audio/tts/q-2-8.mp3 rename to public/audio/tts/fr/q-2-8.mp3 diff --git a/public/audio/tts/q-2-9.mp3 b/public/audio/tts/fr/q-2-9.mp3 similarity index 100% rename from public/audio/tts/q-2-9.mp3 rename to public/audio/tts/fr/q-2-9.mp3 diff --git a/public/audio/tts/q-3-2.mp3 b/public/audio/tts/fr/q-3-2.mp3 similarity index 100% rename from public/audio/tts/q-3-2.mp3 rename to public/audio/tts/fr/q-3-2.mp3 diff --git a/public/audio/tts/q-3-3.mp3 b/public/audio/tts/fr/q-3-3.mp3 similarity index 100% rename from public/audio/tts/q-3-3.mp3 rename to public/audio/tts/fr/q-3-3.mp3 diff --git a/public/audio/tts/q-3-4.mp3 b/public/audio/tts/fr/q-3-4.mp3 similarity index 100% rename from public/audio/tts/q-3-4.mp3 rename to public/audio/tts/fr/q-3-4.mp3 diff --git a/public/audio/tts/q-3-5.mp3 b/public/audio/tts/fr/q-3-5.mp3 similarity index 100% rename from public/audio/tts/q-3-5.mp3 rename to public/audio/tts/fr/q-3-5.mp3 diff --git a/public/audio/tts/q-3-6.mp3 b/public/audio/tts/fr/q-3-6.mp3 similarity index 100% rename from public/audio/tts/q-3-6.mp3 rename to public/audio/tts/fr/q-3-6.mp3 diff --git a/public/audio/tts/q-3-7.mp3 b/public/audio/tts/fr/q-3-7.mp3 similarity index 100% rename from public/audio/tts/q-3-7.mp3 rename to public/audio/tts/fr/q-3-7.mp3 diff --git a/public/audio/tts/q-3-8.mp3 b/public/audio/tts/fr/q-3-8.mp3 similarity index 100% rename from public/audio/tts/q-3-8.mp3 rename to public/audio/tts/fr/q-3-8.mp3 diff --git a/public/audio/tts/q-3-9.mp3 b/public/audio/tts/fr/q-3-9.mp3 similarity index 100% rename from public/audio/tts/q-3-9.mp3 rename to public/audio/tts/fr/q-3-9.mp3 diff --git a/public/audio/tts/q-4-2.mp3 b/public/audio/tts/fr/q-4-2.mp3 similarity index 100% rename from public/audio/tts/q-4-2.mp3 rename to public/audio/tts/fr/q-4-2.mp3 diff --git a/public/audio/tts/q-4-3.mp3 b/public/audio/tts/fr/q-4-3.mp3 similarity index 100% rename from public/audio/tts/q-4-3.mp3 rename to public/audio/tts/fr/q-4-3.mp3 diff --git a/public/audio/tts/q-4-4.mp3 b/public/audio/tts/fr/q-4-4.mp3 similarity index 100% rename from public/audio/tts/q-4-4.mp3 rename to public/audio/tts/fr/q-4-4.mp3 diff --git a/public/audio/tts/q-4-5.mp3 b/public/audio/tts/fr/q-4-5.mp3 similarity index 100% rename from public/audio/tts/q-4-5.mp3 rename to public/audio/tts/fr/q-4-5.mp3 diff --git a/public/audio/tts/q-4-6.mp3 b/public/audio/tts/fr/q-4-6.mp3 similarity index 100% rename from public/audio/tts/q-4-6.mp3 rename to public/audio/tts/fr/q-4-6.mp3 diff --git a/public/audio/tts/q-4-7.mp3 b/public/audio/tts/fr/q-4-7.mp3 similarity index 100% rename from public/audio/tts/q-4-7.mp3 rename to public/audio/tts/fr/q-4-7.mp3 diff --git a/public/audio/tts/q-4-8.mp3 b/public/audio/tts/fr/q-4-8.mp3 similarity index 100% rename from public/audio/tts/q-4-8.mp3 rename to public/audio/tts/fr/q-4-8.mp3 diff --git a/public/audio/tts/q-4-9.mp3 b/public/audio/tts/fr/q-4-9.mp3 similarity index 100% rename from public/audio/tts/q-4-9.mp3 rename to public/audio/tts/fr/q-4-9.mp3 diff --git a/public/audio/tts/q-5-2.mp3 b/public/audio/tts/fr/q-5-2.mp3 similarity index 100% rename from public/audio/tts/q-5-2.mp3 rename to public/audio/tts/fr/q-5-2.mp3 diff --git a/public/audio/tts/q-5-3.mp3 b/public/audio/tts/fr/q-5-3.mp3 similarity index 100% rename from public/audio/tts/q-5-3.mp3 rename to public/audio/tts/fr/q-5-3.mp3 diff --git a/public/audio/tts/q-5-4.mp3 b/public/audio/tts/fr/q-5-4.mp3 similarity index 100% rename from public/audio/tts/q-5-4.mp3 rename to public/audio/tts/fr/q-5-4.mp3 diff --git a/public/audio/tts/q-5-5.mp3 b/public/audio/tts/fr/q-5-5.mp3 similarity index 100% rename from public/audio/tts/q-5-5.mp3 rename to public/audio/tts/fr/q-5-5.mp3 diff --git a/public/audio/tts/q-5-6.mp3 b/public/audio/tts/fr/q-5-6.mp3 similarity index 100% rename from public/audio/tts/q-5-6.mp3 rename to public/audio/tts/fr/q-5-6.mp3 diff --git a/public/audio/tts/q-5-7.mp3 b/public/audio/tts/fr/q-5-7.mp3 similarity index 100% rename from public/audio/tts/q-5-7.mp3 rename to public/audio/tts/fr/q-5-7.mp3 diff --git a/public/audio/tts/q-5-8.mp3 b/public/audio/tts/fr/q-5-8.mp3 similarity index 100% rename from public/audio/tts/q-5-8.mp3 rename to public/audio/tts/fr/q-5-8.mp3 diff --git a/public/audio/tts/q-5-9.mp3 b/public/audio/tts/fr/q-5-9.mp3 similarity index 100% rename from public/audio/tts/q-5-9.mp3 rename to public/audio/tts/fr/q-5-9.mp3 diff --git a/public/audio/tts/q-6-2.mp3 b/public/audio/tts/fr/q-6-2.mp3 similarity index 100% rename from public/audio/tts/q-6-2.mp3 rename to public/audio/tts/fr/q-6-2.mp3 diff --git a/public/audio/tts/q-6-3.mp3 b/public/audio/tts/fr/q-6-3.mp3 similarity index 100% rename from public/audio/tts/q-6-3.mp3 rename to public/audio/tts/fr/q-6-3.mp3 diff --git a/public/audio/tts/q-6-4.mp3 b/public/audio/tts/fr/q-6-4.mp3 similarity index 100% rename from public/audio/tts/q-6-4.mp3 rename to public/audio/tts/fr/q-6-4.mp3 diff --git a/public/audio/tts/q-6-5.mp3 b/public/audio/tts/fr/q-6-5.mp3 similarity index 100% rename from public/audio/tts/q-6-5.mp3 rename to public/audio/tts/fr/q-6-5.mp3 diff --git a/public/audio/tts/q-6-6.mp3 b/public/audio/tts/fr/q-6-6.mp3 similarity index 100% rename from public/audio/tts/q-6-6.mp3 rename to public/audio/tts/fr/q-6-6.mp3 diff --git a/public/audio/tts/q-6-7.mp3 b/public/audio/tts/fr/q-6-7.mp3 similarity index 100% rename from public/audio/tts/q-6-7.mp3 rename to public/audio/tts/fr/q-6-7.mp3 diff --git a/public/audio/tts/q-6-8.mp3 b/public/audio/tts/fr/q-6-8.mp3 similarity index 100% rename from public/audio/tts/q-6-8.mp3 rename to public/audio/tts/fr/q-6-8.mp3 diff --git a/public/audio/tts/q-6-9.mp3 b/public/audio/tts/fr/q-6-9.mp3 similarity index 100% rename from public/audio/tts/q-6-9.mp3 rename to public/audio/tts/fr/q-6-9.mp3 diff --git a/public/audio/tts/q-7-2.mp3 b/public/audio/tts/fr/q-7-2.mp3 similarity index 100% rename from public/audio/tts/q-7-2.mp3 rename to public/audio/tts/fr/q-7-2.mp3 diff --git a/public/audio/tts/q-7-3.mp3 b/public/audio/tts/fr/q-7-3.mp3 similarity index 100% rename from public/audio/tts/q-7-3.mp3 rename to public/audio/tts/fr/q-7-3.mp3 diff --git a/public/audio/tts/q-7-4.mp3 b/public/audio/tts/fr/q-7-4.mp3 similarity index 100% rename from public/audio/tts/q-7-4.mp3 rename to public/audio/tts/fr/q-7-4.mp3 diff --git a/public/audio/tts/q-7-5.mp3 b/public/audio/tts/fr/q-7-5.mp3 similarity index 100% rename from public/audio/tts/q-7-5.mp3 rename to public/audio/tts/fr/q-7-5.mp3 diff --git a/public/audio/tts/q-7-6.mp3 b/public/audio/tts/fr/q-7-6.mp3 similarity index 100% rename from public/audio/tts/q-7-6.mp3 rename to public/audio/tts/fr/q-7-6.mp3 diff --git a/public/audio/tts/q-7-7.mp3 b/public/audio/tts/fr/q-7-7.mp3 similarity index 100% rename from public/audio/tts/q-7-7.mp3 rename to public/audio/tts/fr/q-7-7.mp3 diff --git a/public/audio/tts/q-7-8.mp3 b/public/audio/tts/fr/q-7-8.mp3 similarity index 100% rename from public/audio/tts/q-7-8.mp3 rename to public/audio/tts/fr/q-7-8.mp3 diff --git a/public/audio/tts/q-7-9.mp3 b/public/audio/tts/fr/q-7-9.mp3 similarity index 100% rename from public/audio/tts/q-7-9.mp3 rename to public/audio/tts/fr/q-7-9.mp3 diff --git a/public/audio/tts/q-8-2.mp3 b/public/audio/tts/fr/q-8-2.mp3 similarity index 100% rename from public/audio/tts/q-8-2.mp3 rename to public/audio/tts/fr/q-8-2.mp3 diff --git a/public/audio/tts/q-8-3.mp3 b/public/audio/tts/fr/q-8-3.mp3 similarity index 100% rename from public/audio/tts/q-8-3.mp3 rename to public/audio/tts/fr/q-8-3.mp3 diff --git a/public/audio/tts/q-8-4.mp3 b/public/audio/tts/fr/q-8-4.mp3 similarity index 100% rename from public/audio/tts/q-8-4.mp3 rename to public/audio/tts/fr/q-8-4.mp3 diff --git a/public/audio/tts/q-8-5.mp3 b/public/audio/tts/fr/q-8-5.mp3 similarity index 100% rename from public/audio/tts/q-8-5.mp3 rename to public/audio/tts/fr/q-8-5.mp3 diff --git a/public/audio/tts/q-8-6.mp3 b/public/audio/tts/fr/q-8-6.mp3 similarity index 100% rename from public/audio/tts/q-8-6.mp3 rename to public/audio/tts/fr/q-8-6.mp3 diff --git a/public/audio/tts/q-8-7.mp3 b/public/audio/tts/fr/q-8-7.mp3 similarity index 100% rename from public/audio/tts/q-8-7.mp3 rename to public/audio/tts/fr/q-8-7.mp3 diff --git a/public/audio/tts/q-8-8.mp3 b/public/audio/tts/fr/q-8-8.mp3 similarity index 100% rename from public/audio/tts/q-8-8.mp3 rename to public/audio/tts/fr/q-8-8.mp3 diff --git a/public/audio/tts/q-8-9.mp3 b/public/audio/tts/fr/q-8-9.mp3 similarity index 100% rename from public/audio/tts/q-8-9.mp3 rename to public/audio/tts/fr/q-8-9.mp3 diff --git a/public/audio/tts/q-9-2.mp3 b/public/audio/tts/fr/q-9-2.mp3 similarity index 100% rename from public/audio/tts/q-9-2.mp3 rename to public/audio/tts/fr/q-9-2.mp3 diff --git a/public/audio/tts/q-9-3.mp3 b/public/audio/tts/fr/q-9-3.mp3 similarity index 100% rename from public/audio/tts/q-9-3.mp3 rename to public/audio/tts/fr/q-9-3.mp3 diff --git a/public/audio/tts/q-9-4.mp3 b/public/audio/tts/fr/q-9-4.mp3 similarity index 100% rename from public/audio/tts/q-9-4.mp3 rename to public/audio/tts/fr/q-9-4.mp3 diff --git a/public/audio/tts/q-9-5.mp3 b/public/audio/tts/fr/q-9-5.mp3 similarity index 100% rename from public/audio/tts/q-9-5.mp3 rename to public/audio/tts/fr/q-9-5.mp3 diff --git a/public/audio/tts/q-9-6.mp3 b/public/audio/tts/fr/q-9-6.mp3 similarity index 100% rename from public/audio/tts/q-9-6.mp3 rename to public/audio/tts/fr/q-9-6.mp3 diff --git a/public/audio/tts/q-9-7.mp3 b/public/audio/tts/fr/q-9-7.mp3 similarity index 100% rename from public/audio/tts/q-9-7.mp3 rename to public/audio/tts/fr/q-9-7.mp3 diff --git a/public/audio/tts/q-9-8.mp3 b/public/audio/tts/fr/q-9-8.mp3 similarity index 100% rename from public/audio/tts/q-9-8.mp3 rename to public/audio/tts/fr/q-9-8.mp3 diff --git a/public/audio/tts/q-9-9.mp3 b/public/audio/tts/fr/q-9-9.mp3 similarity index 100% rename from public/audio/tts/q-9-9.mp3 rename to public/audio/tts/fr/q-9-9.mp3 diff --git a/public/audio/tts/qd-10-2.mp3 b/public/audio/tts/fr/qd-10-2.mp3 similarity index 100% rename from public/audio/tts/qd-10-2.mp3 rename to public/audio/tts/fr/qd-10-2.mp3 diff --git a/public/audio/tts/qd-10-5.mp3 b/public/audio/tts/fr/qd-10-5.mp3 similarity index 100% rename from public/audio/tts/qd-10-5.mp3 rename to public/audio/tts/fr/qd-10-5.mp3 diff --git a/public/audio/tts/qd-12-2.mp3 b/public/audio/tts/fr/qd-12-2.mp3 similarity index 100% rename from public/audio/tts/qd-12-2.mp3 rename to public/audio/tts/fr/qd-12-2.mp3 diff --git a/public/audio/tts/qd-12-3.mp3 b/public/audio/tts/fr/qd-12-3.mp3 similarity index 100% rename from public/audio/tts/qd-12-3.mp3 rename to public/audio/tts/fr/qd-12-3.mp3 diff --git a/public/audio/tts/qd-12-4.mp3 b/public/audio/tts/fr/qd-12-4.mp3 similarity index 100% rename from public/audio/tts/qd-12-4.mp3 rename to public/audio/tts/fr/qd-12-4.mp3 diff --git a/public/audio/tts/qd-12-6.mp3 b/public/audio/tts/fr/qd-12-6.mp3 similarity index 100% rename from public/audio/tts/qd-12-6.mp3 rename to public/audio/tts/fr/qd-12-6.mp3 diff --git a/public/audio/tts/qd-14-2.mp3 b/public/audio/tts/fr/qd-14-2.mp3 similarity index 100% rename from public/audio/tts/qd-14-2.mp3 rename to public/audio/tts/fr/qd-14-2.mp3 diff --git a/public/audio/tts/qd-14-7.mp3 b/public/audio/tts/fr/qd-14-7.mp3 similarity index 100% rename from public/audio/tts/qd-14-7.mp3 rename to public/audio/tts/fr/qd-14-7.mp3 diff --git a/public/audio/tts/qd-15-3.mp3 b/public/audio/tts/fr/qd-15-3.mp3 similarity index 100% rename from public/audio/tts/qd-15-3.mp3 rename to public/audio/tts/fr/qd-15-3.mp3 diff --git a/public/audio/tts/qd-15-5.mp3 b/public/audio/tts/fr/qd-15-5.mp3 similarity index 100% rename from public/audio/tts/qd-15-5.mp3 rename to public/audio/tts/fr/qd-15-5.mp3 diff --git a/public/audio/tts/qd-16-2.mp3 b/public/audio/tts/fr/qd-16-2.mp3 similarity index 100% rename from public/audio/tts/qd-16-2.mp3 rename to public/audio/tts/fr/qd-16-2.mp3 diff --git a/public/audio/tts/qd-16-4.mp3 b/public/audio/tts/fr/qd-16-4.mp3 similarity index 100% rename from public/audio/tts/qd-16-4.mp3 rename to public/audio/tts/fr/qd-16-4.mp3 diff --git a/public/audio/tts/qd-16-8.mp3 b/public/audio/tts/fr/qd-16-8.mp3 similarity index 100% rename from public/audio/tts/qd-16-8.mp3 rename to public/audio/tts/fr/qd-16-8.mp3 diff --git a/public/audio/tts/qd-18-2.mp3 b/public/audio/tts/fr/qd-18-2.mp3 similarity index 100% rename from public/audio/tts/qd-18-2.mp3 rename to public/audio/tts/fr/qd-18-2.mp3 diff --git a/public/audio/tts/qd-18-3.mp3 b/public/audio/tts/fr/qd-18-3.mp3 similarity index 100% rename from public/audio/tts/qd-18-3.mp3 rename to public/audio/tts/fr/qd-18-3.mp3 diff --git a/public/audio/tts/qd-18-6.mp3 b/public/audio/tts/fr/qd-18-6.mp3 similarity index 100% rename from public/audio/tts/qd-18-6.mp3 rename to public/audio/tts/fr/qd-18-6.mp3 diff --git a/public/audio/tts/qd-18-9.mp3 b/public/audio/tts/fr/qd-18-9.mp3 similarity index 100% rename from public/audio/tts/qd-18-9.mp3 rename to public/audio/tts/fr/qd-18-9.mp3 diff --git a/public/audio/tts/qd-20-4.mp3 b/public/audio/tts/fr/qd-20-4.mp3 similarity index 100% rename from public/audio/tts/qd-20-4.mp3 rename to public/audio/tts/fr/qd-20-4.mp3 diff --git a/public/audio/tts/qd-20-5.mp3 b/public/audio/tts/fr/qd-20-5.mp3 similarity index 100% rename from public/audio/tts/qd-20-5.mp3 rename to public/audio/tts/fr/qd-20-5.mp3 diff --git a/public/audio/tts/qd-21-3.mp3 b/public/audio/tts/fr/qd-21-3.mp3 similarity index 100% rename from public/audio/tts/qd-21-3.mp3 rename to public/audio/tts/fr/qd-21-3.mp3 diff --git a/public/audio/tts/qd-21-7.mp3 b/public/audio/tts/fr/qd-21-7.mp3 similarity index 100% rename from public/audio/tts/qd-21-7.mp3 rename to public/audio/tts/fr/qd-21-7.mp3 diff --git a/public/audio/tts/qd-24-3.mp3 b/public/audio/tts/fr/qd-24-3.mp3 similarity index 100% rename from public/audio/tts/qd-24-3.mp3 rename to public/audio/tts/fr/qd-24-3.mp3 diff --git a/public/audio/tts/qd-24-4.mp3 b/public/audio/tts/fr/qd-24-4.mp3 similarity index 100% rename from public/audio/tts/qd-24-4.mp3 rename to public/audio/tts/fr/qd-24-4.mp3 diff --git a/public/audio/tts/qd-24-6.mp3 b/public/audio/tts/fr/qd-24-6.mp3 similarity index 100% rename from public/audio/tts/qd-24-6.mp3 rename to public/audio/tts/fr/qd-24-6.mp3 diff --git a/public/audio/tts/qd-24-8.mp3 b/public/audio/tts/fr/qd-24-8.mp3 similarity index 100% rename from public/audio/tts/qd-24-8.mp3 rename to public/audio/tts/fr/qd-24-8.mp3 diff --git a/public/audio/tts/qd-25-5.mp3 b/public/audio/tts/fr/qd-25-5.mp3 similarity index 100% rename from public/audio/tts/qd-25-5.mp3 rename to public/audio/tts/fr/qd-25-5.mp3 diff --git a/public/audio/tts/qd-27-3.mp3 b/public/audio/tts/fr/qd-27-3.mp3 similarity index 100% rename from public/audio/tts/qd-27-3.mp3 rename to public/audio/tts/fr/qd-27-3.mp3 diff --git a/public/audio/tts/qd-27-9.mp3 b/public/audio/tts/fr/qd-27-9.mp3 similarity index 100% rename from public/audio/tts/qd-27-9.mp3 rename to public/audio/tts/fr/qd-27-9.mp3 diff --git a/public/audio/tts/qd-28-4.mp3 b/public/audio/tts/fr/qd-28-4.mp3 similarity index 100% rename from public/audio/tts/qd-28-4.mp3 rename to public/audio/tts/fr/qd-28-4.mp3 diff --git a/public/audio/tts/qd-28-7.mp3 b/public/audio/tts/fr/qd-28-7.mp3 similarity index 100% rename from public/audio/tts/qd-28-7.mp3 rename to public/audio/tts/fr/qd-28-7.mp3 diff --git a/public/audio/tts/qd-30-5.mp3 b/public/audio/tts/fr/qd-30-5.mp3 similarity index 100% rename from public/audio/tts/qd-30-5.mp3 rename to public/audio/tts/fr/qd-30-5.mp3 diff --git a/public/audio/tts/qd-30-6.mp3 b/public/audio/tts/fr/qd-30-6.mp3 similarity index 100% rename from public/audio/tts/qd-30-6.mp3 rename to public/audio/tts/fr/qd-30-6.mp3 diff --git a/public/audio/tts/qd-32-4.mp3 b/public/audio/tts/fr/qd-32-4.mp3 similarity index 100% rename from public/audio/tts/qd-32-4.mp3 rename to public/audio/tts/fr/qd-32-4.mp3 diff --git a/public/audio/tts/qd-32-8.mp3 b/public/audio/tts/fr/qd-32-8.mp3 similarity index 100% rename from public/audio/tts/qd-32-8.mp3 rename to public/audio/tts/fr/qd-32-8.mp3 diff --git a/public/audio/tts/qd-35-5.mp3 b/public/audio/tts/fr/qd-35-5.mp3 similarity index 100% rename from public/audio/tts/qd-35-5.mp3 rename to public/audio/tts/fr/qd-35-5.mp3 diff --git a/public/audio/tts/qd-35-7.mp3 b/public/audio/tts/fr/qd-35-7.mp3 similarity index 100% rename from public/audio/tts/qd-35-7.mp3 rename to public/audio/tts/fr/qd-35-7.mp3 diff --git a/public/audio/tts/qd-36-4.mp3 b/public/audio/tts/fr/qd-36-4.mp3 similarity index 100% rename from public/audio/tts/qd-36-4.mp3 rename to public/audio/tts/fr/qd-36-4.mp3 diff --git a/public/audio/tts/qd-36-6.mp3 b/public/audio/tts/fr/qd-36-6.mp3 similarity index 100% rename from public/audio/tts/qd-36-6.mp3 rename to public/audio/tts/fr/qd-36-6.mp3 diff --git a/public/audio/tts/qd-36-9.mp3 b/public/audio/tts/fr/qd-36-9.mp3 similarity index 100% rename from public/audio/tts/qd-36-9.mp3 rename to public/audio/tts/fr/qd-36-9.mp3 diff --git a/public/audio/tts/qd-4-2.mp3 b/public/audio/tts/fr/qd-4-2.mp3 similarity index 100% rename from public/audio/tts/qd-4-2.mp3 rename to public/audio/tts/fr/qd-4-2.mp3 diff --git a/public/audio/tts/qd-40-5.mp3 b/public/audio/tts/fr/qd-40-5.mp3 similarity index 100% rename from public/audio/tts/qd-40-5.mp3 rename to public/audio/tts/fr/qd-40-5.mp3 diff --git a/public/audio/tts/qd-40-8.mp3 b/public/audio/tts/fr/qd-40-8.mp3 similarity index 100% rename from public/audio/tts/qd-40-8.mp3 rename to public/audio/tts/fr/qd-40-8.mp3 diff --git a/public/audio/tts/qd-42-6.mp3 b/public/audio/tts/fr/qd-42-6.mp3 similarity index 100% rename from public/audio/tts/qd-42-6.mp3 rename to public/audio/tts/fr/qd-42-6.mp3 diff --git a/public/audio/tts/qd-42-7.mp3 b/public/audio/tts/fr/qd-42-7.mp3 similarity index 100% rename from public/audio/tts/qd-42-7.mp3 rename to public/audio/tts/fr/qd-42-7.mp3 diff --git a/public/audio/tts/qd-45-5.mp3 b/public/audio/tts/fr/qd-45-5.mp3 similarity index 100% rename from public/audio/tts/qd-45-5.mp3 rename to public/audio/tts/fr/qd-45-5.mp3 diff --git a/public/audio/tts/qd-45-9.mp3 b/public/audio/tts/fr/qd-45-9.mp3 similarity index 100% rename from public/audio/tts/qd-45-9.mp3 rename to public/audio/tts/fr/qd-45-9.mp3 diff --git a/public/audio/tts/qd-48-6.mp3 b/public/audio/tts/fr/qd-48-6.mp3 similarity index 100% rename from public/audio/tts/qd-48-6.mp3 rename to public/audio/tts/fr/qd-48-6.mp3 diff --git a/public/audio/tts/qd-48-8.mp3 b/public/audio/tts/fr/qd-48-8.mp3 similarity index 100% rename from public/audio/tts/qd-48-8.mp3 rename to public/audio/tts/fr/qd-48-8.mp3 diff --git a/public/audio/tts/qd-49-7.mp3 b/public/audio/tts/fr/qd-49-7.mp3 similarity index 100% rename from public/audio/tts/qd-49-7.mp3 rename to public/audio/tts/fr/qd-49-7.mp3 diff --git a/public/audio/tts/qd-54-6.mp3 b/public/audio/tts/fr/qd-54-6.mp3 similarity index 100% rename from public/audio/tts/qd-54-6.mp3 rename to public/audio/tts/fr/qd-54-6.mp3 diff --git a/public/audio/tts/qd-54-9.mp3 b/public/audio/tts/fr/qd-54-9.mp3 similarity index 100% rename from public/audio/tts/qd-54-9.mp3 rename to public/audio/tts/fr/qd-54-9.mp3 diff --git a/public/audio/tts/qd-56-7.mp3 b/public/audio/tts/fr/qd-56-7.mp3 similarity index 100% rename from public/audio/tts/qd-56-7.mp3 rename to public/audio/tts/fr/qd-56-7.mp3 diff --git a/public/audio/tts/qd-56-8.mp3 b/public/audio/tts/fr/qd-56-8.mp3 similarity index 100% rename from public/audio/tts/qd-56-8.mp3 rename to public/audio/tts/fr/qd-56-8.mp3 diff --git a/public/audio/tts/qd-6-2.mp3 b/public/audio/tts/fr/qd-6-2.mp3 similarity index 100% rename from public/audio/tts/qd-6-2.mp3 rename to public/audio/tts/fr/qd-6-2.mp3 diff --git a/public/audio/tts/qd-6-3.mp3 b/public/audio/tts/fr/qd-6-3.mp3 similarity index 100% rename from public/audio/tts/qd-6-3.mp3 rename to public/audio/tts/fr/qd-6-3.mp3 diff --git a/public/audio/tts/qd-63-7.mp3 b/public/audio/tts/fr/qd-63-7.mp3 similarity index 100% rename from public/audio/tts/qd-63-7.mp3 rename to public/audio/tts/fr/qd-63-7.mp3 diff --git a/public/audio/tts/qd-63-9.mp3 b/public/audio/tts/fr/qd-63-9.mp3 similarity index 100% rename from public/audio/tts/qd-63-9.mp3 rename to public/audio/tts/fr/qd-63-9.mp3 diff --git a/public/audio/tts/qd-64-8.mp3 b/public/audio/tts/fr/qd-64-8.mp3 similarity index 100% rename from public/audio/tts/qd-64-8.mp3 rename to public/audio/tts/fr/qd-64-8.mp3 diff --git a/public/audio/tts/qd-72-8.mp3 b/public/audio/tts/fr/qd-72-8.mp3 similarity index 100% rename from public/audio/tts/qd-72-8.mp3 rename to public/audio/tts/fr/qd-72-8.mp3 diff --git a/public/audio/tts/qd-72-9.mp3 b/public/audio/tts/fr/qd-72-9.mp3 similarity index 100% rename from public/audio/tts/qd-72-9.mp3 rename to public/audio/tts/fr/qd-72-9.mp3 diff --git a/public/audio/tts/qd-8-2.mp3 b/public/audio/tts/fr/qd-8-2.mp3 similarity index 100% rename from public/audio/tts/qd-8-2.mp3 rename to public/audio/tts/fr/qd-8-2.mp3 diff --git a/public/audio/tts/qd-8-4.mp3 b/public/audio/tts/fr/qd-8-4.mp3 similarity index 100% rename from public/audio/tts/qd-8-4.mp3 rename to public/audio/tts/fr/qd-8-4.mp3 diff --git a/public/audio/tts/qd-81-9.mp3 b/public/audio/tts/fr/qd-81-9.mp3 similarity index 100% rename from public/audio/tts/qd-81-9.mp3 rename to public/audio/tts/fr/qd-81-9.mp3 diff --git a/public/audio/tts/qd-9-3.mp3 b/public/audio/tts/fr/qd-9-3.mp3 similarity index 100% rename from public/audio/tts/qd-9-3.mp3 rename to public/audio/tts/fr/qd-9-3.mp3 diff --git a/public/audio/tts/recap-done.mp3 b/public/audio/tts/fr/recap-done.mp3 similarity index 100% rename from public/audio/tts/recap-done.mp3 rename to public/audio/tts/fr/recap-done.mp3 diff --git a/public/audio/tts/rules-intro-welcome.mp3 b/public/audio/tts/fr/rules-intro-welcome.mp3 similarity index 100% rename from public/audio/tts/rules-intro-welcome.mp3 rename to public/audio/tts/fr/rules-intro-welcome.mp3 diff --git a/public/audio/tts/rules-intro-x1.mp3 b/public/audio/tts/fr/rules-intro-x1.mp3 similarity index 100% rename from public/audio/tts/rules-intro-x1.mp3 rename to public/audio/tts/fr/rules-intro-x1.mp3 diff --git a/public/audio/tts/rules-intro-x10.mp3 b/public/audio/tts/fr/rules-intro-x10.mp3 similarity index 100% rename from public/audio/tts/rules-intro-x10.mp3 rename to public/audio/tts/fr/rules-intro-x10.mp3 diff --git a/public/audio/tts/strategy-3-4.mp3 b/public/audio/tts/fr/strategy-3-4.mp3 similarity index 100% rename from public/audio/tts/strategy-3-4.mp3 rename to public/audio/tts/fr/strategy-3-4.mp3 diff --git a/public/audio/tts/strategy-3-5.mp3 b/public/audio/tts/fr/strategy-3-5.mp3 similarity index 100% rename from public/audio/tts/strategy-3-5.mp3 rename to public/audio/tts/fr/strategy-3-5.mp3 diff --git a/public/audio/tts/strategy-3-6.mp3 b/public/audio/tts/fr/strategy-3-6.mp3 similarity index 100% rename from public/audio/tts/strategy-3-6.mp3 rename to public/audio/tts/fr/strategy-3-6.mp3 diff --git a/public/audio/tts/strategy-3-7.mp3 b/public/audio/tts/fr/strategy-3-7.mp3 similarity index 100% rename from public/audio/tts/strategy-3-7.mp3 rename to public/audio/tts/fr/strategy-3-7.mp3 diff --git a/public/audio/tts/strategy-3-8.mp3 b/public/audio/tts/fr/strategy-3-8.mp3 similarity index 100% rename from public/audio/tts/strategy-3-8.mp3 rename to public/audio/tts/fr/strategy-3-8.mp3 diff --git a/public/audio/tts/strategy-3-9.mp3 b/public/audio/tts/fr/strategy-3-9.mp3 similarity index 100% rename from public/audio/tts/strategy-3-9.mp3 rename to public/audio/tts/fr/strategy-3-9.mp3 diff --git a/public/audio/tts/strategy-4-4.mp3 b/public/audio/tts/fr/strategy-4-4.mp3 similarity index 100% rename from public/audio/tts/strategy-4-4.mp3 rename to public/audio/tts/fr/strategy-4-4.mp3 diff --git a/public/audio/tts/strategy-4-5.mp3 b/public/audio/tts/fr/strategy-4-5.mp3 similarity index 100% rename from public/audio/tts/strategy-4-5.mp3 rename to public/audio/tts/fr/strategy-4-5.mp3 diff --git a/public/audio/tts/strategy-4-6.mp3 b/public/audio/tts/fr/strategy-4-6.mp3 similarity index 100% rename from public/audio/tts/strategy-4-6.mp3 rename to public/audio/tts/fr/strategy-4-6.mp3 diff --git a/public/audio/tts/strategy-4-7.mp3 b/public/audio/tts/fr/strategy-4-7.mp3 similarity index 100% rename from public/audio/tts/strategy-4-7.mp3 rename to public/audio/tts/fr/strategy-4-7.mp3 diff --git a/public/audio/tts/strategy-4-8.mp3 b/public/audio/tts/fr/strategy-4-8.mp3 similarity index 100% rename from public/audio/tts/strategy-4-8.mp3 rename to public/audio/tts/fr/strategy-4-8.mp3 diff --git a/public/audio/tts/strategy-4-9.mp3 b/public/audio/tts/fr/strategy-4-9.mp3 similarity index 100% rename from public/audio/tts/strategy-4-9.mp3 rename to public/audio/tts/fr/strategy-4-9.mp3 diff --git a/public/audio/tts/strategy-5-5.mp3 b/public/audio/tts/fr/strategy-5-5.mp3 similarity index 100% rename from public/audio/tts/strategy-5-5.mp3 rename to public/audio/tts/fr/strategy-5-5.mp3 diff --git a/public/audio/tts/strategy-5-6.mp3 b/public/audio/tts/fr/strategy-5-6.mp3 similarity index 100% rename from public/audio/tts/strategy-5-6.mp3 rename to public/audio/tts/fr/strategy-5-6.mp3 diff --git a/public/audio/tts/strategy-5-7.mp3 b/public/audio/tts/fr/strategy-5-7.mp3 similarity index 100% rename from public/audio/tts/strategy-5-7.mp3 rename to public/audio/tts/fr/strategy-5-7.mp3 diff --git a/public/audio/tts/strategy-5-8.mp3 b/public/audio/tts/fr/strategy-5-8.mp3 similarity index 100% rename from public/audio/tts/strategy-5-8.mp3 rename to public/audio/tts/fr/strategy-5-8.mp3 diff --git a/public/audio/tts/strategy-5-9.mp3 b/public/audio/tts/fr/strategy-5-9.mp3 similarity index 100% rename from public/audio/tts/strategy-5-9.mp3 rename to public/audio/tts/fr/strategy-5-9.mp3 diff --git a/public/audio/tts/strategy-6-6.mp3 b/public/audio/tts/fr/strategy-6-6.mp3 similarity index 100% rename from public/audio/tts/strategy-6-6.mp3 rename to public/audio/tts/fr/strategy-6-6.mp3 diff --git a/public/audio/tts/strategy-6-7.mp3 b/public/audio/tts/fr/strategy-6-7.mp3 similarity index 100% rename from public/audio/tts/strategy-6-7.mp3 rename to public/audio/tts/fr/strategy-6-7.mp3 diff --git a/public/audio/tts/strategy-6-8.mp3 b/public/audio/tts/fr/strategy-6-8.mp3 similarity index 100% rename from public/audio/tts/strategy-6-8.mp3 rename to public/audio/tts/fr/strategy-6-8.mp3 diff --git a/public/audio/tts/strategy-6-9.mp3 b/public/audio/tts/fr/strategy-6-9.mp3 similarity index 100% rename from public/audio/tts/strategy-6-9.mp3 rename to public/audio/tts/fr/strategy-6-9.mp3 diff --git a/public/audio/tts/strategy-7-7.mp3 b/public/audio/tts/fr/strategy-7-7.mp3 similarity index 100% rename from public/audio/tts/strategy-7-7.mp3 rename to public/audio/tts/fr/strategy-7-7.mp3 diff --git a/public/audio/tts/strategy-7-8.mp3 b/public/audio/tts/fr/strategy-7-8.mp3 similarity index 100% rename from public/audio/tts/strategy-7-8.mp3 rename to public/audio/tts/fr/strategy-7-8.mp3 diff --git a/public/audio/tts/strategy-7-9.mp3 b/public/audio/tts/fr/strategy-7-9.mp3 similarity index 100% rename from public/audio/tts/strategy-7-9.mp3 rename to public/audio/tts/fr/strategy-7-9.mp3 diff --git a/public/audio/tts/strategy-8-8.mp3 b/public/audio/tts/fr/strategy-8-8.mp3 similarity index 100% rename from public/audio/tts/strategy-8-8.mp3 rename to public/audio/tts/fr/strategy-8-8.mp3 diff --git a/public/audio/tts/strategy-8-9.mp3 b/public/audio/tts/fr/strategy-8-9.mp3 similarity index 100% rename from public/audio/tts/strategy-8-9.mp3 rename to public/audio/tts/fr/strategy-8-9.mp3 diff --git a/public/audio/tts/strategy-9-9.mp3 b/public/audio/tts/fr/strategy-9-9.mp3 similarity index 100% rename from public/audio/tts/strategy-9-9.mp3 rename to public/audio/tts/fr/strategy-9-9.mp3 diff --git a/public/audio/tts/strategyd-10-2.mp3 b/public/audio/tts/fr/strategyd-10-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-10-2.mp3 rename to public/audio/tts/fr/strategyd-10-2.mp3 diff --git a/public/audio/tts/strategyd-10-5.mp3 b/public/audio/tts/fr/strategyd-10-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-10-5.mp3 rename to public/audio/tts/fr/strategyd-10-5.mp3 diff --git a/public/audio/tts/strategyd-12-2.mp3 b/public/audio/tts/fr/strategyd-12-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-12-2.mp3 rename to public/audio/tts/fr/strategyd-12-2.mp3 diff --git a/public/audio/tts/strategyd-12-3.mp3 b/public/audio/tts/fr/strategyd-12-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-12-3.mp3 rename to public/audio/tts/fr/strategyd-12-3.mp3 diff --git a/public/audio/tts/strategyd-12-4.mp3 b/public/audio/tts/fr/strategyd-12-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-12-4.mp3 rename to public/audio/tts/fr/strategyd-12-4.mp3 diff --git a/public/audio/tts/strategyd-12-6.mp3 b/public/audio/tts/fr/strategyd-12-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-12-6.mp3 rename to public/audio/tts/fr/strategyd-12-6.mp3 diff --git a/public/audio/tts/strategyd-14-2.mp3 b/public/audio/tts/fr/strategyd-14-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-14-2.mp3 rename to public/audio/tts/fr/strategyd-14-2.mp3 diff --git a/public/audio/tts/strategyd-14-7.mp3 b/public/audio/tts/fr/strategyd-14-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-14-7.mp3 rename to public/audio/tts/fr/strategyd-14-7.mp3 diff --git a/public/audio/tts/strategyd-15-3.mp3 b/public/audio/tts/fr/strategyd-15-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-15-3.mp3 rename to public/audio/tts/fr/strategyd-15-3.mp3 diff --git a/public/audio/tts/strategyd-15-5.mp3 b/public/audio/tts/fr/strategyd-15-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-15-5.mp3 rename to public/audio/tts/fr/strategyd-15-5.mp3 diff --git a/public/audio/tts/strategyd-16-2.mp3 b/public/audio/tts/fr/strategyd-16-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-16-2.mp3 rename to public/audio/tts/fr/strategyd-16-2.mp3 diff --git a/public/audio/tts/strategyd-16-4.mp3 b/public/audio/tts/fr/strategyd-16-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-16-4.mp3 rename to public/audio/tts/fr/strategyd-16-4.mp3 diff --git a/public/audio/tts/strategyd-16-8.mp3 b/public/audio/tts/fr/strategyd-16-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-16-8.mp3 rename to public/audio/tts/fr/strategyd-16-8.mp3 diff --git a/public/audio/tts/strategyd-18-2.mp3 b/public/audio/tts/fr/strategyd-18-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-18-2.mp3 rename to public/audio/tts/fr/strategyd-18-2.mp3 diff --git a/public/audio/tts/strategyd-18-3.mp3 b/public/audio/tts/fr/strategyd-18-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-18-3.mp3 rename to public/audio/tts/fr/strategyd-18-3.mp3 diff --git a/public/audio/tts/strategyd-18-6.mp3 b/public/audio/tts/fr/strategyd-18-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-18-6.mp3 rename to public/audio/tts/fr/strategyd-18-6.mp3 diff --git a/public/audio/tts/strategyd-18-9.mp3 b/public/audio/tts/fr/strategyd-18-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-18-9.mp3 rename to public/audio/tts/fr/strategyd-18-9.mp3 diff --git a/public/audio/tts/strategyd-20-4.mp3 b/public/audio/tts/fr/strategyd-20-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-20-4.mp3 rename to public/audio/tts/fr/strategyd-20-4.mp3 diff --git a/public/audio/tts/strategyd-20-5.mp3 b/public/audio/tts/fr/strategyd-20-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-20-5.mp3 rename to public/audio/tts/fr/strategyd-20-5.mp3 diff --git a/public/audio/tts/strategyd-21-3.mp3 b/public/audio/tts/fr/strategyd-21-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-21-3.mp3 rename to public/audio/tts/fr/strategyd-21-3.mp3 diff --git a/public/audio/tts/strategyd-21-7.mp3 b/public/audio/tts/fr/strategyd-21-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-21-7.mp3 rename to public/audio/tts/fr/strategyd-21-7.mp3 diff --git a/public/audio/tts/strategyd-24-3.mp3 b/public/audio/tts/fr/strategyd-24-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-24-3.mp3 rename to public/audio/tts/fr/strategyd-24-3.mp3 diff --git a/public/audio/tts/strategyd-24-4.mp3 b/public/audio/tts/fr/strategyd-24-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-24-4.mp3 rename to public/audio/tts/fr/strategyd-24-4.mp3 diff --git a/public/audio/tts/strategyd-24-6.mp3 b/public/audio/tts/fr/strategyd-24-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-24-6.mp3 rename to public/audio/tts/fr/strategyd-24-6.mp3 diff --git a/public/audio/tts/strategyd-24-8.mp3 b/public/audio/tts/fr/strategyd-24-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-24-8.mp3 rename to public/audio/tts/fr/strategyd-24-8.mp3 diff --git a/public/audio/tts/strategyd-25-5.mp3 b/public/audio/tts/fr/strategyd-25-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-25-5.mp3 rename to public/audio/tts/fr/strategyd-25-5.mp3 diff --git a/public/audio/tts/strategyd-27-3.mp3 b/public/audio/tts/fr/strategyd-27-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-27-3.mp3 rename to public/audio/tts/fr/strategyd-27-3.mp3 diff --git a/public/audio/tts/strategyd-27-9.mp3 b/public/audio/tts/fr/strategyd-27-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-27-9.mp3 rename to public/audio/tts/fr/strategyd-27-9.mp3 diff --git a/public/audio/tts/strategyd-28-4.mp3 b/public/audio/tts/fr/strategyd-28-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-28-4.mp3 rename to public/audio/tts/fr/strategyd-28-4.mp3 diff --git a/public/audio/tts/strategyd-28-7.mp3 b/public/audio/tts/fr/strategyd-28-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-28-7.mp3 rename to public/audio/tts/fr/strategyd-28-7.mp3 diff --git a/public/audio/tts/strategyd-30-5.mp3 b/public/audio/tts/fr/strategyd-30-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-30-5.mp3 rename to public/audio/tts/fr/strategyd-30-5.mp3 diff --git a/public/audio/tts/strategyd-30-6.mp3 b/public/audio/tts/fr/strategyd-30-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-30-6.mp3 rename to public/audio/tts/fr/strategyd-30-6.mp3 diff --git a/public/audio/tts/strategyd-32-4.mp3 b/public/audio/tts/fr/strategyd-32-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-32-4.mp3 rename to public/audio/tts/fr/strategyd-32-4.mp3 diff --git a/public/audio/tts/strategyd-32-8.mp3 b/public/audio/tts/fr/strategyd-32-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-32-8.mp3 rename to public/audio/tts/fr/strategyd-32-8.mp3 diff --git a/public/audio/tts/strategyd-35-5.mp3 b/public/audio/tts/fr/strategyd-35-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-35-5.mp3 rename to public/audio/tts/fr/strategyd-35-5.mp3 diff --git a/public/audio/tts/strategyd-35-7.mp3 b/public/audio/tts/fr/strategyd-35-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-35-7.mp3 rename to public/audio/tts/fr/strategyd-35-7.mp3 diff --git a/public/audio/tts/strategyd-36-4.mp3 b/public/audio/tts/fr/strategyd-36-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-36-4.mp3 rename to public/audio/tts/fr/strategyd-36-4.mp3 diff --git a/public/audio/tts/strategyd-36-6.mp3 b/public/audio/tts/fr/strategyd-36-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-36-6.mp3 rename to public/audio/tts/fr/strategyd-36-6.mp3 diff --git a/public/audio/tts/strategyd-36-9.mp3 b/public/audio/tts/fr/strategyd-36-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-36-9.mp3 rename to public/audio/tts/fr/strategyd-36-9.mp3 diff --git a/public/audio/tts/strategyd-4-2.mp3 b/public/audio/tts/fr/strategyd-4-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-4-2.mp3 rename to public/audio/tts/fr/strategyd-4-2.mp3 diff --git a/public/audio/tts/strategyd-40-5.mp3 b/public/audio/tts/fr/strategyd-40-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-40-5.mp3 rename to public/audio/tts/fr/strategyd-40-5.mp3 diff --git a/public/audio/tts/strategyd-40-8.mp3 b/public/audio/tts/fr/strategyd-40-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-40-8.mp3 rename to public/audio/tts/fr/strategyd-40-8.mp3 diff --git a/public/audio/tts/strategyd-42-6.mp3 b/public/audio/tts/fr/strategyd-42-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-42-6.mp3 rename to public/audio/tts/fr/strategyd-42-6.mp3 diff --git a/public/audio/tts/strategyd-42-7.mp3 b/public/audio/tts/fr/strategyd-42-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-42-7.mp3 rename to public/audio/tts/fr/strategyd-42-7.mp3 diff --git a/public/audio/tts/strategyd-45-5.mp3 b/public/audio/tts/fr/strategyd-45-5.mp3 similarity index 100% rename from public/audio/tts/strategyd-45-5.mp3 rename to public/audio/tts/fr/strategyd-45-5.mp3 diff --git a/public/audio/tts/strategyd-45-9.mp3 b/public/audio/tts/fr/strategyd-45-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-45-9.mp3 rename to public/audio/tts/fr/strategyd-45-9.mp3 diff --git a/public/audio/tts/strategyd-48-6.mp3 b/public/audio/tts/fr/strategyd-48-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-48-6.mp3 rename to public/audio/tts/fr/strategyd-48-6.mp3 diff --git a/public/audio/tts/strategyd-48-8.mp3 b/public/audio/tts/fr/strategyd-48-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-48-8.mp3 rename to public/audio/tts/fr/strategyd-48-8.mp3 diff --git a/public/audio/tts/strategyd-49-7.mp3 b/public/audio/tts/fr/strategyd-49-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-49-7.mp3 rename to public/audio/tts/fr/strategyd-49-7.mp3 diff --git a/public/audio/tts/strategyd-54-6.mp3 b/public/audio/tts/fr/strategyd-54-6.mp3 similarity index 100% rename from public/audio/tts/strategyd-54-6.mp3 rename to public/audio/tts/fr/strategyd-54-6.mp3 diff --git a/public/audio/tts/strategyd-54-9.mp3 b/public/audio/tts/fr/strategyd-54-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-54-9.mp3 rename to public/audio/tts/fr/strategyd-54-9.mp3 diff --git a/public/audio/tts/strategyd-56-7.mp3 b/public/audio/tts/fr/strategyd-56-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-56-7.mp3 rename to public/audio/tts/fr/strategyd-56-7.mp3 diff --git a/public/audio/tts/strategyd-56-8.mp3 b/public/audio/tts/fr/strategyd-56-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-56-8.mp3 rename to public/audio/tts/fr/strategyd-56-8.mp3 diff --git a/public/audio/tts/strategyd-6-2.mp3 b/public/audio/tts/fr/strategyd-6-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-6-2.mp3 rename to public/audio/tts/fr/strategyd-6-2.mp3 diff --git a/public/audio/tts/strategyd-6-3.mp3 b/public/audio/tts/fr/strategyd-6-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-6-3.mp3 rename to public/audio/tts/fr/strategyd-6-3.mp3 diff --git a/public/audio/tts/strategyd-63-7.mp3 b/public/audio/tts/fr/strategyd-63-7.mp3 similarity index 100% rename from public/audio/tts/strategyd-63-7.mp3 rename to public/audio/tts/fr/strategyd-63-7.mp3 diff --git a/public/audio/tts/strategyd-63-9.mp3 b/public/audio/tts/fr/strategyd-63-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-63-9.mp3 rename to public/audio/tts/fr/strategyd-63-9.mp3 diff --git a/public/audio/tts/strategyd-64-8.mp3 b/public/audio/tts/fr/strategyd-64-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-64-8.mp3 rename to public/audio/tts/fr/strategyd-64-8.mp3 diff --git a/public/audio/tts/strategyd-72-8.mp3 b/public/audio/tts/fr/strategyd-72-8.mp3 similarity index 100% rename from public/audio/tts/strategyd-72-8.mp3 rename to public/audio/tts/fr/strategyd-72-8.mp3 diff --git a/public/audio/tts/strategyd-72-9.mp3 b/public/audio/tts/fr/strategyd-72-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-72-9.mp3 rename to public/audio/tts/fr/strategyd-72-9.mp3 diff --git a/public/audio/tts/strategyd-8-2.mp3 b/public/audio/tts/fr/strategyd-8-2.mp3 similarity index 100% rename from public/audio/tts/strategyd-8-2.mp3 rename to public/audio/tts/fr/strategyd-8-2.mp3 diff --git a/public/audio/tts/strategyd-8-4.mp3 b/public/audio/tts/fr/strategyd-8-4.mp3 similarity index 100% rename from public/audio/tts/strategyd-8-4.mp3 rename to public/audio/tts/fr/strategyd-8-4.mp3 diff --git a/public/audio/tts/strategyd-81-9.mp3 b/public/audio/tts/fr/strategyd-81-9.mp3 similarity index 100% rename from public/audio/tts/strategyd-81-9.mp3 rename to public/audio/tts/fr/strategyd-81-9.mp3 diff --git a/public/audio/tts/strategyd-9-3.mp3 b/public/audio/tts/fr/strategyd-9-3.mp3 similarity index 100% rename from public/audio/tts/strategyd-9-3.mp3 rename to public/audio/tts/fr/strategyd-9-3.mp3 diff --git a/public/audio/tts/welcome-hello.mp3 b/public/audio/tts/fr/welcome-hello.mp3 similarity index 100% rename from public/audio/tts/welcome-hello.mp3 rename to public/audio/tts/fr/welcome-hello.mp3 diff --git a/public/audio/tts/welcome-name.mp3 b/public/audio/tts/fr/welcome-name.mp3 similarity index 100% rename from public/audio/tts/welcome-name.mp3 rename to public/audio/tts/fr/welcome-name.mp3 diff --git a/public/audio/tts/welcome-test.mp3 b/public/audio/tts/fr/welcome-test.mp3 similarity index 100% rename from public/audio/tts/welcome-test.mp3 rename to public/audio/tts/fr/welcome-test.mp3 diff --git a/scripts/generate-tts.mjs b/scripts/generate-tts.mjs index 1535d12a..4f71595e 100644 --- a/scripts/generate-tts.mjs +++ b/scripts/generate-tts.mjs @@ -4,11 +4,18 @@ * Generates pre-recorded TTS audio files via the Mistral Voxtral TTS API. * * Usage: - * MISTRAL_API_KEY=... node scripts/generate-tts.mjs + * MISTRAL_API_KEY=... node scripts/generate-tts.mjs # toutes les langues + * MISTRAL_API_KEY=... TTS_LANGS=en node scripts/generate-tts.mjs # une seule * - * Output: public/audio/tts/*.mp3 + * Output (un sous-dossier par langue) : + * public/audio/tts/fr/*.mp3 (français) + * public/audio/tts/en/*.mp3 (anglais) * * Skips files that already exist (delete a file to regenerate it). + * + * Voix : la voix française par défaut est figée ci-dessous. La voix anglaise + * est surchargeable par la variable d'env MISTRAL_VOICE_ID_EN (sinon on réutilise + * la voix par défaut, qui sait lire l'anglais — accent près). */ import { writeFile, mkdir } from 'node:fs/promises'; @@ -17,12 +24,14 @@ import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = dirname(fileURLToPath(import.meta.url)); -const OUTPUT_DIR = join(__dirname, '..', 'public', 'audio', 'tts'); +const TTS_ROOT = join(__dirname, '..', 'public', 'audio', 'tts'); const MISTRAL_TTS_URL = 'https://api.mistral.ai/v1/audio/speech'; const MODEL = 'voxtral-mini-tts-2603'; // Marie - Curious (fr_fr, female) -const VOICE_ID = 'e0580ce5-e63c-4cbe-88c8-a983b80c5f1f'; +const VOICE_ID_FR = 'e0580ce5-e63c-4cbe-88c8-a983b80c5f1f'; +// Voix anglaise (en, female), surchargeable par MISTRAL_VOICE_ID_EN. +const VOICE_ID_EN = process.env.MISTRAL_VOICE_ID_EN || '5de47977-6e47-4266-a938-3bc1d76b4676'; const API_KEY = process.env.MISTRAL_API_KEY; if (!API_KEY) { @@ -30,40 +39,67 @@ if (!API_KEY) { process.exit(1); } -async function generateAudio(text, outputPath) { - const response = await fetch(MISTRAL_TTS_URL, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: MODEL, - input: text, - voice_id: VOICE_ID, - response_format: 'mp3', - }), - }); +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); + +// Retries sur erreurs transitoires : l'API renvoie facilement 429 (rate limit) +// en rafale, et le délai fixe entre appels ne suffit pas toujours. Backoff +// exponentiel (1s, 2s, 4s, 8s) sur 429 et 5xx ; les autres 4xx sont définitives +// (texte/voix invalide) et échouent tout de suite. +const MAX_ATTEMPTS = 5; + +async function generateAudio(text, voiceId, outputPath) { + for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { + let response; + try { + response = await fetch(MISTRAL_TTS_URL, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: MODEL, + input: text, + voice_id: voiceId, + response_format: 'mp3', + }), + }); + } catch (err) { + // Erreur réseau : transitoire, on retente. + if (attempt < MAX_ATTEMPTS) { + await sleep(1000 * 2 ** (attempt - 1)); + continue; + } + console.error(`Network error: ${err}`); + return false; + } + + if (response.ok) { + const data = await response.json(); + if (!data.audio_data) { + console.error('No audio_data in response'); + return false; + } + await writeFile(outputPath, Buffer.from(data.audio_data, 'base64')); + return true; + } + + const transient = response.status === 429 || response.status >= 500; + if (transient && attempt < MAX_ATTEMPTS) { + await sleep(1000 * 2 ** (attempt - 1)); + continue; + } - if (!response.ok) { const body = await response.text(); console.error(`API error: ${response.status} - ${body}`); return false; } - - const data = await response.json(); - if (!data.audio_data) { - console.error('No audio_data in response'); - return false; - } - - await writeFile(outputPath, Buffer.from(data.audio_data, 'base64')); - return true; + return false; } -// Speech text for each strategy, keyed by canonical pair (a <= b). -// KEEP IN SYNC with src/lib/strategies.ts (pivots and StrategyKind). -function strategyText(a, b) { +// === Français === +// KEEP IN SYNC avec src/lib/strategies.ts (pivots et StrategyKind). +function strategyTextFr(a, b) { const lo = Math.min(a, b); const hi = Math.max(a, b); if (lo === 2) return null; @@ -96,17 +132,49 @@ function strategyText(a, b) { return null; } -function buildEntries() { +// === Anglais === (miroir conceptuel de strategyTextFr) +function strategyTextEn(a, b) { + const lo = Math.min(a, b); + const hi = Math.max(a, b); + if (lo === 2) return null; + if (lo === hi && lo === 3) return null; + const PIVOT_PRIORITY = [9, 5, 3, 4, 6, 7, 8]; + for (const pivot of PIVOT_PRIORITY) { + if (lo === pivot || hi === pivot) { + const n = pivot === lo ? hi : lo; + const p = pivot * n; + switch (pivot) { + case 9: + return `${n} times 9 is ${n} times 10 minus ${n}. ${n * 10} minus ${n} equals ${p}.`; + case 5: { + const seq = Array.from({ length: n }, (_, i) => (i + 1) * 5).join(', '); + return `${n} times 5 is counting by 5. ${seq}. Equals ${p}.`; + } + case 3: + return `${n} times 3 is ${n} times 2 plus ${n}. ${n * 2} plus ${n} equals ${p}.`; + case 4: + return `${n} times 4 is double the double. ${n} times 2 equals ${n * 2}, and ${n * 2} times 2 equals ${p}.`; + case 6: + return `${n} times 6 is ${n} times 5 plus ${n}. ${n * 5} plus ${n} equals ${p}.`; + case 7: + return `${n} times 7 is ${n} times 5 plus ${n} times 2. ${n * 5} plus ${n * 2} equals ${p}.`; + case 8: + return `${n} times 8 is doubling three times. ${n} times 2 equals ${n * 2}, times 2 equals ${n * 4}, times 2 equals ${p}.`; + } + } + } + return null; +} + +function buildEntriesFr() { const entries = []; - // Questions: "A fois B" for all A,B in [2..9] for (let a = 2; a <= 9; a++) { for (let b = 2; b <= 9; b++) { entries.push({ key: `q-${a}-${b}`, text: `${a} fois ${b}` }); } } - // Introductions: "Nouveau ! A fois B, c'est B+B+...+B, égale P" for unique facts (a <= b) for (let a = 2; a <= 9; a++) { for (let b = a; b <= 9; b++) { const addition = Array.from({ length: a }, () => String(b)).join(' plus '); @@ -117,7 +185,6 @@ function buildEntries() { } } - // Commutativity: "B fois A, c'est pareil ! C'est aussi P" for facts where a != b for (let a = 2; a <= 9; a++) { for (let b = a + 1; b <= 9; b++) { entries.push({ @@ -127,26 +194,19 @@ function buildEntries() { } } - // Strategies: spoken hint when the strategy step is shown (intro or feedback ≤ box 2) for (let a = 2; a <= 9; a++) { for (let b = a; b <= 9; b++) { - const text = strategyText(a, b); + const text = strategyTextFr(a, b); if (text) entries.push({ key: `strategy-${a}-${b}`, text }); } } - // Niveau 2 — division (specs §11). Pour chaque couple (a,b) ∈ [2..9]², le - // fait « (a×b) ÷ a = b » : question (qd-), introduction (introd-) et astuce - // « pense à la multiplication » (strategyd-). 64 faits → 192 fichiers. for (let a = 2; a <= 9; a++) { for (let b = 2; b <= 9; b++) { const dividend = a * b; const divisor = a; const quotient = b; - entries.push({ - key: `qd-${dividend}-${divisor}`, - text: `${dividend} divisé par ${divisor}`, - }); + entries.push({ key: `qd-${dividend}-${divisor}`, text: `${dividend} divisé par ${divisor}` }); entries.push({ key: `introd-${dividend}-${divisor}`, text: `Nouveau ! ${dividend} divisé par ${divisor}. ${divisor} fois combien font ${dividend} ? ${divisor} fois ${quotient}, égale ${dividend}. Donc ${dividend} divisé par ${divisor}, égale ${quotient}.`, @@ -158,15 +218,11 @@ function buildEntries() { } } - // Static phrases entries.push({ key: 'welcome-hello', text: "Bonjour ! Je suis Piou, ton petit copain d'apprentissage. On va apprendre les tables de multiplication ensemble !", }); - entries.push({ - key: 'welcome-name', - text: "Comment tu t'appelles ?", - }); + entries.push({ key: 'welcome-name', text: "Comment tu t'appelles ?" }); entries.push({ key: 'welcome-test', text: "Je vais te poser quelques questions pour voir ce que tu connais déjà. Pas de stress, il n'y a pas de piège !", @@ -175,10 +231,7 @@ function buildEntries() { key: 'placement-intro', text: "Réponds du mieux que tu peux. Et si tu ne sais pas, tape sur « Je ne sais pas ».", }); - entries.push({ - key: 'recap-done', - text: "Séance terminée ! Bravo, tu as bien travaillé !", - }); + entries.push({ key: 'recap-done', text: "Séance terminée ! Bravo, tu as bien travaillé !" }); entries.push({ key: 'rules-intro-welcome', text: "Avant de commencer, je vais te montrer deux règles toutes simples pour multiplier par 1 et par 10. Pas besoin de les apprendre par coeur : tu vas comprendre comment elles marchent !", @@ -195,18 +248,106 @@ function buildEntries() { return entries; } -async function main() { - await mkdir(OUTPUT_DIR, { recursive: true }); +function buildEntriesEn() { + const entries = []; - const entries = buildEntries(); - console.log(`Generating ${entries.length} audio files...\n`); + for (let a = 2; a <= 9; a++) { + for (let b = 2; b <= 9; b++) { + entries.push({ key: `q-${a}-${b}`, text: `${a} times ${b}` }); + } + } + + for (let a = 2; a <= 9; a++) { + for (let b = a; b <= 9; b++) { + const addition = Array.from({ length: a }, () => String(b)).join(' plus '); + entries.push({ + key: `intro-${a}-${b}`, + text: `New! ${a} times ${b} is ${addition}, equals ${a * b}`, + }); + } + } + + for (let a = 2; a <= 9; a++) { + for (let b = a + 1; b <= 9; b++) { + entries.push({ + key: `comm-${a}-${b}`, + text: `${b} times ${a} is the same! It's also ${a * b}`, + }); + } + } + + for (let a = 2; a <= 9; a++) { + for (let b = a; b <= 9; b++) { + const text = strategyTextEn(a, b); + if (text) entries.push({ key: `strategy-${a}-${b}`, text }); + } + } + + for (let a = 2; a <= 9; a++) { + for (let b = 2; b <= 9; b++) { + const dividend = a * b; + const divisor = a; + const quotient = b; + entries.push({ key: `qd-${dividend}-${divisor}`, text: `${dividend} divided by ${divisor}` }); + entries.push({ + key: `introd-${dividend}-${divisor}`, + text: `New! ${dividend} divided by ${divisor}. ${divisor} times what makes ${dividend}? ${divisor} times ${quotient} equals ${dividend}. So ${dividend} divided by ${divisor} equals ${quotient}.`, + }); + entries.push({ + key: `strategyd-${dividend}-${divisor}`, + text: `${divisor} times what makes ${dividend}? ${divisor} times ${quotient} equals ${dividend}. So ${dividend} divided by ${divisor} equals ${quotient}.`, + }); + } + } + + entries.push({ + key: 'welcome-hello', + text: "Hi! I'm Piou, your little learning buddy. We're going to learn the times tables together!", + }); + entries.push({ key: 'welcome-name', text: "What's your name?" }); + entries.push({ + key: 'welcome-test', + text: "I'll ask you a few questions to see what you already know. No stress, there are no tricks!", + }); + entries.push({ + key: 'placement-intro', + text: 'Answer as best you can. And if you don\'t know, tap "I don\'t know".', + }); + entries.push({ key: 'recap-done', text: 'Session complete! Well done, great work!' }); + entries.push({ + key: 'rules-intro-welcome', + text: "Before we start, I'll show you two really simple rules for multiplying by 1 and by 10. No need to memorize them: you'll understand how they work!", + }); + entries.push({ + key: 'rules-intro-x1', + text: 'Any number times 1 stays the same. For example, 4 times 1 equals 4, and 8 times 1 equals 8. Easy, right?', + }); + entries.push({ + key: 'rules-intro-x10', + text: 'To multiply by 10, the digits shift one place to the left, and a zero takes the units place. For example, 3 becomes 30, 7 becomes 70, 12 becomes 120. Tip: every answer in the 10 times table ends in zero!', + }); + + return entries; +} + +const LANGS = { + fr: { dir: join(TTS_ROOT, 'fr'), voice: VOICE_ID_FR, build: buildEntriesFr }, + en: { dir: join(TTS_ROOT, 'en'), voice: VOICE_ID_EN, build: buildEntriesEn }, +}; + +async function generateLang(lang) { + const { dir, voice, build } = LANGS[lang]; + await mkdir(dir, { recursive: true }); + + const entries = build(); + console.log(`\n[${lang}] Generating ${entries.length} audio files into ${dir}...\n`); let success = 0; let skipped = 0; let failed = 0; for (const { key, text } of entries) { - const filepath = join(OUTPUT_DIR, `${key}.mp3`); + const filepath = join(dir, `${key}.mp3`); if (existsSync(filepath)) { skipped++; @@ -214,9 +355,9 @@ async function main() { } const preview = text.length > 60 ? text.slice(0, 57) + '...' : text; - process.stdout.write(`${key}: "${preview}"... `); + process.stdout.write(`[${lang}] ${key}: "${preview}"... `); - const ok = await generateAudio(text, filepath); + const ok = await generateAudio(text, voice, filepath); if (ok) { console.log('ok'); success++; @@ -226,10 +367,25 @@ async function main() { } // Rate-limit API calls - await new Promise((r) => setTimeout(r, 200)); + await sleep(300); + } + + console.log(`\n[${lang}] Done! ${success} generated, ${skipped} skipped, ${failed} failed.`); + return failed; +} + +async function main() { + // TTS_LANGS=fr,en (défaut : toutes les langues supportées). + const requested = (process.env.TTS_LANGS || 'fr,en') + .split(',') + .map((s) => s.trim()) + .filter((s) => s in LANGS); + + let failed = 0; + for (const lang of requested) { + failed += await generateLang(lang); } - console.log(`\nDone! ${success} generated, ${skipped} skipped, ${failed} failed.`); if (failed > 0) process.exit(1); } diff --git a/src/App.tsx b/src/App.tsx index 1ce9bbec..b499e68c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -34,6 +34,7 @@ import { isStandalone, clearInstallSkipped } from './lib/install'; import { preflightMicPermission } from './lib/micPreflight'; import { syncLastSession } from './lib/push'; import { isVoiceMode } from './hooks/useInputMode'; +import { useAppStrings } from './i18n/app'; // Eager : parcours principal (onboarding + boucle quotidienne). Ces // écrans sont hit par tout utilisateur, souvent plusieurs fois par jour // (Session/Recap surtout) — pas de gain à les lazy-loader, et ça @@ -104,6 +105,7 @@ function isDisposableScreen(screen: Screen): boolean { const RESHOW_PICKER_AFTER_HIDDEN_MS = 15 * 60 * 1000; export default function App() { + const appStrings = useAppStrings(); const [profile, setProfile] = useState(() => loadProfile()); const [screen, setScreen] = useState(() => initialScreen(profile, listProfiles().length)); // Pilote l'affichage du bouton « changer de joueur » sur Home et le retour @@ -593,9 +595,7 @@ export default function App() { const handleDeleteProfile = useCallback(() => { if (!profile) return; - const ok = window.confirm( - `Supprimer le profil de ${profile.name} ?\n\nLe prénom, les séances, les badges et la série seront effacés de cet appareil. Cette action est irréversible.`, - ); + const ok = window.confirm(appStrings.confirmDeleteProfile(profile.name)); if (!ok) return; deleteActiveProfile(); // Même décision qu'au boot : plusieurs enfants → « Qui joue ? » ; un seul @@ -603,7 +603,7 @@ export default function App() { const next = loadProfile(); setProfile(next); setScreen(initialScreen(next, listProfiles().length)); - }, [profile]); + }, [profile, appStrings]); return (
    diff --git a/src/__tests__/divisionBadges.test.ts b/src/__tests__/divisionBadges.test.ts index 532824d9..77fe52cd 100644 --- a/src/__tests__/divisionBadges.test.ts +++ b/src/__tests__/divisionBadges.test.ts @@ -8,7 +8,7 @@ import { visibleBadgeDefinitions, factsForDivisionTable, getCompletedDivisionTables, - DIVISION_BADGE_DEFINITIONS, + getDivisionBadgeDefinitions, } from '../lib/badges'; import { createNewProfile } from '../lib/storage'; @@ -58,7 +58,7 @@ describe('visibleBadgeDefinitions', () => { expect(ids.has(BADGE_IDS.DIV_GENIE)).toBe(true); expect(ids.has(BADGE_IDS.DIV_PREMIERE_MAITRISE)).toBe(true); // 1 + 8 tables + 1 = 10 badges division - expect(DIVISION_BADGE_DEFINITIONS).toHaveLength(10); + expect(getDivisionBadgeDefinitions()).toHaveLength(10); }); }); diff --git a/src/__tests__/parseEnglishNumber.test.ts b/src/__tests__/parseEnglishNumber.test.ts new file mode 100644 index 00000000..c39f338f --- /dev/null +++ b/src/__tests__/parseEnglishNumber.test.ts @@ -0,0 +1,145 @@ +// @vitest-environment node +import { describe, it, expect } from 'vitest'; +import { parseEnglishNumber, parseEnglishAnswer } from '../lib/parseEnglishNumber'; + +describe('parseEnglishNumber', () => { + it('parses pure digit strings', () => { + expect(parseEnglishNumber('0')).toBe(0); + expect(parseEnglishNumber('7')).toBe(7); + expect(parseEnglishNumber('42')).toBe(42); + expect(parseEnglishNumber('100')).toBe(100); + }); + + it('parses units', () => { + expect(parseEnglishNumber('zero')).toBe(0); + expect(parseEnglishNumber('one')).toBe(1); + expect(parseEnglishNumber('two')).toBe(2); + expect(parseEnglishNumber('nine')).toBe(9); + }); + + it('parses teens', () => { + expect(parseEnglishNumber('ten')).toBe(10); + expect(parseEnglishNumber('eleven')).toBe(11); + expect(parseEnglishNumber('sixteen')).toBe(16); + expect(parseEnglishNumber('seventeen')).toBe(17); + expect(parseEnglishNumber('nineteen')).toBe(19); + }); + + it('parses compound tens 20..99', () => { + expect(parseEnglishNumber('twenty')).toBe(20); + expect(parseEnglishNumber('twenty-one')).toBe(21); + expect(parseEnglishNumber('twenty one')).toBe(21); + expect(parseEnglishNumber('twenty-four')).toBe(24); + expect(parseEnglishNumber('thirty-six')).toBe(36); + expect(parseEnglishNumber('forty-eight')).toBe(48); + expect(parseEnglishNumber('fifty-six')).toBe(56); + expect(parseEnglishNumber('sixty-three')).toBe(63); + expect(parseEnglishNumber('seventy-two')).toBe(72); + expect(parseEnglishNumber('eighty-one')).toBe(81); + expect(parseEnglishNumber('ninety-nine')).toBe(99); + }); + + it('parses one hundred (with optional "and")', () => { + expect(parseEnglishNumber('hundred')).toBe(100); + expect(parseEnglishNumber('a hundred')).toBe(100); + expect(parseEnglishNumber('one hundred')).toBe(100); + }); + + it('is case insensitive and ignores punctuation', () => { + expect(parseEnglishNumber('TWENTY-FOUR')).toBe(24); + expect(parseEnglishNumber(' twenty-four! ')).toBe(24); + expect(parseEnglishNumber('twenty four')).toBe(24); + }); + + it('rejects digit-by-digit sequences to avoid TTS echo false positives', () => { + // Nobody says "two three" to mean 23 — they say "twenty-three". + expect(parseEnglishNumber('two three')).toBeNull(); + expect(parseEnglishNumber('two four')).toBeNull(); + expect(parseEnglishNumber('2 4')).toBeNull(); + }); + + it('returns null for unparseable input', () => { + expect(parseEnglishNumber('hello')).toBeNull(); + expect(parseEnglishNumber('')).toBeNull(); + expect(parseEnglishNumber(' ')).toBeNull(); + expect(parseEnglishNumber('five times two')).toBeNull(); + }); + + it('covers a representative set of integers 0..100', () => { + const expected: Record = { + 0: 'zero', + 1: 'one', + 5: 'five', + 10: 'ten', + 15: 'fifteen', + 17: 'seventeen', + 20: 'twenty', + 21: 'twenty-one', + 35: 'thirty-five', + 42: 'forty-two', + 56: 'fifty-six', + 63: 'sixty-three', + 70: 'seventy', + 72: 'seventy-two', + 80: 'eighty', + 81: 'eighty-one', + 90: 'ninety', + 99: 'ninety-nine', + 100: 'one hundred', + }; + for (const [n, phrase] of Object.entries(expected)) { + expect(parseEnglishNumber(phrase), phrase).toBe(parseInt(n, 10)); + } + }); +}); + +describe('parseEnglishAnswer', () => { + it('accepts filler words in the prefix ("um", "uh", etc.)', () => { + expect(parseEnglishAnswer('um thirty-two')).toBe(32); + expect(parseEnglishAnswer('take thirty')).toBe(30); + expect(parseEnglishAnswer('uh, thirty-two')).toBe(32); + expect(parseEnglishAnswer('um 30')).toBe(30); + }); + + it('rejects the single-token fallback when a number word precedes (broken compound)', () => { + // "eighty one" without compounding shouldn't fall back to "one" = 1 if it + // were broken; "one hundred one" is out of the mapped range. + expect(parseEnglishAnswer('one hundred one')).toBeNull(); + }); + + it('accepts recognized simple numbers and compounds', () => { + expect(parseEnglishAnswer('72')).toBe(72); + expect(parseEnglishAnswer('81')).toBe(81); + expect(parseEnglishAnswer('eighty-one')).toBe(81); + expect(parseEnglishAnswer('seventy-two')).toBe(72); + expect(parseEnglishAnswer('zero')).toBe(0); + }); + + it('extracts the answer after an equality marker (spoken equation)', () => { + expect(parseEnglishAnswer('6 times 5 equals 30')).toBe(30); + expect(parseEnglishAnswer('six times five equals thirty')).toBe(30); + expect(parseEnglishAnswer('8 times 7 equals 56')).toBe(56); + expect(parseEnglishAnswer('6 times 5 is 30')).toBe(30); + expect(parseEnglishAnswer("that's 30")).toBe(30); + expect(parseEnglishAnswer('it makes forty-two')).toBe(42); + // Several markers → take after the last one. + expect(parseEnglishAnswer('6 times 5 equals 30 that is 30')).toBe(30); + }); + + it('rejects a pure TTS echo (no equality marker)', () => { + expect(parseEnglishAnswer('6 times 5')).toBeNull(); + expect(parseEnglishAnswer('six times five')).toBeNull(); + // Marker with no number after it → nothing to submit. + expect(parseEnglishAnswer('6 times 5 equals')).toBeNull(); + }); + + it('accepts the last number when the prefix is only digit numbers', () => { + // iOS Safari accumulates multiple attempts in one transcript ("37" then + // "27" → "37 27"); we want the last expressed intent (27). + expect(parseEnglishAnswer('37 27')).toBe(27); + expect(parseEnglishAnswer('37 27 27')).toBe(27); + expect(parseEnglishAnswer('30 37 27')).toBe(27); + // But we still reject the question echo even in digits. + expect(parseEnglishAnswer('6 times 5')).toBeNull(); + }); +}); diff --git a/src/__tests__/setup.ts b/src/__tests__/setup.ts index 1a173d3e..72c2d31f 100644 --- a/src/__tests__/setup.ts +++ b/src/__tests__/setup.ts @@ -1,5 +1,26 @@ // Vitest setup file — runs once per test file before the tests. // +// i18n : jsdom ET Node 22 exposent `navigator.language` = 'en-US', ce qui +// basculerait l'app en anglais et casserait les assertions de texte français +// des tests existants. On fige la langue d'interface sur le français via une +// préférence localStorage explicite (lue en priorité par detectLang) AVANT que +// le moindre module ne soit importé (les setupFiles tournent en premier). En +// environnement node, localStorage n'existe pas : on le polyfill a minima. +if (typeof localStorage === 'undefined') { + const store = new Map(); + (globalThis as unknown as { localStorage: Storage }).localStorage = { + getItem: (k: string) => store.get(k) ?? null, + setItem: (k: string, v: string) => void store.set(k, String(v)), + removeItem: (k: string) => void store.delete(k), + clear: () => store.clear(), + key: (i: number) => Array.from(store.keys())[i] ?? null, + get length() { + return store.size; + }, + } as Storage; +} +localStorage.setItem('multiplix-lang', 'fr'); +// // jsdom ships a lot of the DOM but not the Web Audio API. `useSound` instantiates // `new AudioContext()` as soon as a question is answered, which would throw in // jsdom. We stub it with a minimal no-op implementation so the real `useSound` diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx index 27c5411a..5a3f5f36 100644 --- a/src/components/Badge.tsx +++ b/src/components/Badge.tsx @@ -1,4 +1,6 @@ import { medallionColorFor, progressPercent } from '../lib/badges'; +import { useBadgeStrings } from '../i18n/progress'; +import { useLocale } from '../i18n/lang'; interface BadgeProps { badge: { @@ -23,14 +25,16 @@ function LockIcon() { } export default function Badge({ badge, earned, earnedDate, progress, onClick }: BadgeProps) { + const t = useBadgeStrings(); + const locale = useLocale(); const color = earned ? medallionColorFor(badge.id) : 'var(--ink-muted)'; const showProgress = !earned && progress && progress.target > 0; const percent = showProgress ? progressPercent(progress) : 0; const label = earned - ? `${badge.name}, débloqué — voir les détails` + ? t.earnedLabel(badge.name) : showProgress - ? `${badge.name}, verrouillé, progression ${percent}% — voir comment le débloquer` - : `${badge.name}, verrouillé — voir comment le débloquer`; + ? t.lockedWithProgressLabel(badge.name, percent) + : t.lockedLabel(badge.name); return (
    {earned && earnedDate ? (
    - {new Date(earnedDate).toLocaleDateString('fr-FR', { + {new Date(earnedDate).toLocaleDateString(locale, { day: 'numeric', month: 'short', })} diff --git a/src/components/BadgeDetailModal.tsx b/src/components/BadgeDetailModal.tsx index 0188e23b..271f13f8 100644 --- a/src/components/BadgeDetailModal.tsx +++ b/src/components/BadgeDetailModal.tsx @@ -2,6 +2,8 @@ import type { BadgeDefinition } from '../lib/badges'; import { getBadgeDetail, medallionColorFor, progressPercent } from '../lib/badges'; import type { UserProfile } from '../types'; import Modal from './Modal'; +import { useBadgeDetailStrings } from '../i18n/progress'; +import { useLocale } from '../i18n/lang'; interface BadgeDetailModalProps { badge: BadgeDefinition; @@ -11,13 +13,6 @@ interface BadgeDetailModalProps { onClose: () => void; } -function hintFor(current: number, remaining: number): string { - if (current === 0) return 'Tu n’as pas encore commencé celui-ci. À toi de jouer !'; - if (remaining === 1) return 'Plus qu’un seul ! Tu y es presque.'; - if (remaining <= 3) return `Plus que ${remaining} ! Tu y es presque.`; - return `Encore ${remaining} pour le débloquer.`; -} - export default function BadgeDetailModal({ badge, earned, @@ -25,6 +20,14 @@ export default function BadgeDetailModal({ profile, onClose, }: BadgeDetailModalProps) { + const t = useBadgeDetailStrings(); + const locale = useLocale(); + const hintFor = (current: number, remaining: number): string => { + if (current === 0) return t.hintNotStarted; + if (remaining === 1) return t.hintOneLeft; + if (remaining <= 3) return t.hintFewLeft(remaining); + return t.hintMoreLeft(remaining); + }; const detail = getBadgeDetail(badge.id, profile); const color = earned ? medallionColorFor(badge.id) : 'var(--ink-muted)'; const progress = detail.progress; @@ -67,23 +70,24 @@ export default function BadgeDetailModal({ )} {showCallToAction && ( -

    À toi de jouer !

    +

    {t.callToAction}

    )} {earned && earnedDate && (
    - Débloqué le{' '} - {new Date(earnedDate).toLocaleDateString('fr-FR', { - day: 'numeric', - month: 'long', - year: 'numeric', - })} + {t.unlockedOn( + new Date(earnedDate).toLocaleDateString(locale, { + day: 'numeric', + month: 'long', + year: 'numeric', + }), + )}
    )} ); diff --git a/src/components/DivisionMysteryImage.tsx b/src/components/DivisionMysteryImage.tsx index c2fc801d..07de9f1e 100644 --- a/src/components/DivisionMysteryImage.tsx +++ b/src/components/DivisionMysteryImage.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import type { DivisionFact, MysteryTheme } from '../types'; import MysteryGrid, { type MysteryCell } from './MysteryGrid'; +import { useFactCellStrings } from '../i18n/progress'; interface DivisionMysteryImageProps { facts: DivisionFact[]; @@ -11,6 +12,7 @@ interface DivisionMysteryImageProps { // SANS canonicalisation — les cases miroir évoluent indépendamment, fidèle à la // non-commutativité (specs §11.5). export default function DivisionMysteryImage({ facts, theme }: DivisionMysteryImageProps) { + const t = useFactCellStrings(); const factMap = useMemo(() => { const m = new Map(); for (const f of facts) m.set(`${f.divisor},${f.quotient}`, f); @@ -22,7 +24,7 @@ export default function DivisionMysteryImage({ facts, theme }: DivisionMysteryIm return { level: fact?.introduced ? fact.box : 0, introduced: fact?.introduced ?? false, - ariaLabel: `${row * col} divisé par ${row}`, + ariaLabel: t.divLabel(row * col, row), detailHeading: fact ? `${fact.dividend} ÷ ${fact.divisor} = ${fact.quotient}` : '', gridA: fact?.divisor ?? row, gridB: fact?.quotient ?? col, diff --git a/src/components/DivisionProgressGrid.tsx b/src/components/DivisionProgressGrid.tsx index 213a82ff..1740d5e7 100644 --- a/src/components/DivisionProgressGrid.tsx +++ b/src/components/DivisionProgressGrid.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import type { DivisionFact } from '../types'; import LeitnerGrid, { type LeitnerGridCell } from './LeitnerGrid'; +import { useFactCellStrings } from '../i18n/progress'; interface DivisionProgressGridProps { facts: DivisionFact[]; @@ -10,6 +11,7 @@ interface DivisionProgressGridProps { // SANS canonicalisation — les cases miroir évoluent indépendamment, fidèle à // la non-commutativité (specs §11.5). Pas de diagonale particulière. export default function DivisionProgressGrid({ facts }: DivisionProgressGridProps) { + const t = useFactCellStrings(); const factMap = useMemo(() => { const m = new Map(); for (const f of facts) m.set(`${f.divisor},${f.quotient}`, f); @@ -22,7 +24,7 @@ export default function DivisionProgressGrid({ facts }: DivisionProgressGridProp return { box: fact?.box ?? 1, introduced: fact?.introduced ?? false, - ariaLabel: `${row * col} divisé par ${row}`, + ariaLabel: t.divLabel(row * col, row), diagonal: false, modal: { title: fact ? `${fact.dividend} ÷ ${fact.divisor} = ${fact.quotient}` : '', diff --git a/src/components/DivisionStrategyHint.tsx b/src/components/DivisionStrategyHint.tsx index 1ebeb239..c7de2445 100644 --- a/src/components/DivisionStrategyHint.tsx +++ b/src/components/DivisionStrategyHint.tsx @@ -1,5 +1,6 @@ import type { DivisionStrategy } from '../lib/divisionStrategies'; import StrategyHintShell from './StrategyHintShell'; +import { useStrategyHintStrings } from '../i18n/strategies'; interface DivisionStrategyHintProps { strategy: DivisionStrategy; @@ -11,9 +12,10 @@ interface DivisionStrategyHintProps { // manquant « divisor × ☐ = dividend » : l'enfant retrouve lui-même le facteur, // geste clé de la relation d'inversion (specs §11.4 ; Van de Walle). export default function DivisionStrategyHint({ strategy, variant = 'feedback' }: DivisionStrategyHintProps) { + const t = useStrategyHintStrings(); const missingFactor = ( - {strategy.divisor} × ? ={' '} + {strategy.divisor} × ? ={' '} {strategy.dividend} ); @@ -23,7 +25,7 @@ export default function DivisionStrategyHint({ strategy, variant = 'feedback' }: variant={variant} title={strategy.title} lines={[strategy.intro, missingFactor, strategy.conclusion]} - eyebrow="L'astuce" + eyebrow={t.eyebrowDiv} /> ); } diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 007a0254..310de231 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -1,5 +1,26 @@ import { Component, type ReactNode } from 'react'; import { getActiveProfileRaw } from '../lib/storage'; +import { getLang } from '../i18n/lang'; + +// ErrorBoundary est un composant classe : pas de hooks, donc pas de +// useStrings(). On lit la langue courante via le singleton getLang() au moment +// du render et on sélectionne dans un dico local { fr, en } (même forme). +const strings = { + fr: { + title: 'Oups, un petit bug', + text: "L'application a rencontré un problème. Ta progression est enregistrée sur cet appareil — rechargez la page pour reprendre.", + reload: 'Recharger', + downloadBackup: 'Télécharger une sauvegarde', + technicalDetails: 'Détails techniques', + }, + en: { + title: 'Oops, a little bug', + text: 'The app ran into a problem. Your progress is saved on this device — reload the page to continue.', + reload: 'Reload', + downloadBackup: 'Download a backup', + technicalDetails: 'Technical details', + }, +}; interface ErrorBoundaryProps { children: ReactNode; @@ -47,25 +68,23 @@ export default class ErrorBoundary extends Component
    -

    Oups, un petit bug

    -

    - L'application a rencontré un problème. Ta progression est enregistrée - sur cet appareil — rechargez la page pour reprendre. -

    +

    {t.title}

    +

    {t.text}

    {this.state.message && (
    - Détails techniques + {t.technicalDetails}
    {this.state.message}
    )} diff --git a/src/components/FeedbackModal.tsx b/src/components/FeedbackModal.tsx index 52bd1b7b..0ce52db1 100644 --- a/src/components/FeedbackModal.tsx +++ b/src/components/FeedbackModal.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import { submitFeedback, buildContext, feedbackEnabled } from '../lib/feedback'; import type { UserProfile } from '../types'; import Modal from './Modal'; +import { useFeedbackModalStrings } from '../i18n/parent'; interface FeedbackModalProps { profile: UserProfile | null; @@ -16,6 +17,7 @@ export default function FeedbackModal({ profile, onClose }: FeedbackModalProps) const [includeProfile, setIncludeProfile] = useState(false); const [status, setStatus] = useState('idle'); const [errorMsg, setErrorMsg] = useState(''); + const t = useFeedbackModalStrings(); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); @@ -31,15 +33,15 @@ export default function FeedbackModal({ profile, onClose }: FeedbackModalProps) setStatus('success'); } catch (err) { setStatus('error'); - setErrorMsg(err instanceof Error ? err.message : 'Envoi impossible'); + setErrorMsg(err instanceof Error ? err.message : t.sendFailed); } }; if (!feedbackEnabled) { return ( -

    Le formulaire n'est pas configuré.

    - +

    {t.notConfigured}

    +
    ); } @@ -51,24 +53,24 @@ export default function FeedbackModal({ profile, onClose }: FeedbackModalProps) className="feedback-modal" disableClose={status === 'sending'} > -

    Votre avis

    +

    {t.title}

    {status === 'success' ? (
    -

    Merci, c'est bien reçu !

    - +

    {t.thanks}

    +
    ) : (