feat(session-1): socle SvelteKit et encyclopédie /zerbaj/ prérendue
SvelteKit 2 + Svelte 5 runes + TS strict, adapter-static en prérendu intégral, trailingSlash always, paths.relative false. Mesures de la porte de sortie - 56 pages HTML prérendues (13 fiches × 3 langues + pages de service) - 59 Ko de JS gzip (budget : 170) · build total 1,4 Mo (budget : 2 Mo) - 0 chargement tiers, vérifié par grep du build - fiche lisible sans JS : 1694 caractères de texte rendu - npm run check : 248 fichiers, 0 erreur, 0 warning - 0 erreur console au chargement Lighthouse non exécuté : porte encore ouverte, à vérifier avant la S6. Charte OKI Tokens partagés, thème sombre par défaut, Archivo et Inter self-hébergées (124 Ko de woff2), flag-bar à segments francs, bouton à balayage or, gate prefers-reduced-motion unique. CSP stricte en .htaccess et _headers, 404 statique autonome, PWA avec registerSW à chemin absolu (playbook 2.9). L'interface kréyòl n'est pas écrite par l'agent Le catalogue gcf ne contient que les termes venant des documents du porteur — 10 chaînes sur 132. Le reste vaut null et se replie sur le français ; check:i18n produit la liste des 122 phrases à traduire, par écran. <html lang> annonce la langue réellement écrite : fr tant que la couverture reste sous 60 %, avec les fragments kréyòl marqués un par un. Des tournures kréyòl que j'avais inventées ont été retirées. Corrections en cours de build - vite-plugin-pwa/sveltekit n'existe pas sans @vite-pwa/sveltekit : VitePWA en direct, comme le prescrivait déjà le playbook. - @sveltejs/vite-plugin-svelte v7 n'exporte plus sveltekit : import depuis @sveltejs/kit/vite, vérifié sur les exports réels. - Le sélecteur de langue fabriquait /fr/offline/, page inexistante. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,227 @@
|
||||
# Interface à traduire
|
||||
|
||||
> Généré par `npm run check:i18n` le 2026-07-27.
|
||||
> Sortie de script : ne pas éditer à la main.
|
||||
|
||||
Le kréyòl est la langue principale du projet, et pourtant ce site affiche du français.
|
||||
Ce n’est pas un oubli : **aucun agent de code n’écrit de kréyòl** (ADR 0005), et un
|
||||
catalogue rempli par une machine serait pire que vide — il figerait des tournures que
|
||||
personne n’emploie.
|
||||
|
||||
La traduction est donc une contribution, au même titre qu’une photographie ou un
|
||||
enregistrement. Marche à suivre : [`kreyol-participatif.md`](kreyol-participatif.md).
|
||||
|
||||
## Kréyòl gwadloupéyen — 8 % traduit
|
||||
|
||||
**122 phrases sur 132.**
|
||||
|
||||
### Identité du site (2)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `site.tagline` | Reconnaître les fruits du pays | |
|
||||
| `site.desc` | Jeu éducatif libre pour apprendre à reconnaître les fruits, les arbres et les plantes des Antilles. En kréyòl d'abord. | |
|
||||
|
||||
### Navigation (8)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `nav.accueil` | Accueil | |
|
||||
| `nav.je` | Jouer | |
|
||||
| `nav.kontribiye` | Participer | |
|
||||
| `nav.credits` | Crédits | |
|
||||
| `nav.menu` | Menu | |
|
||||
| `nav.langue` | Langue | |
|
||||
| `nav.theme` | Changer de thème | |
|
||||
| `nav.aller-contenu` | Aller au contenu | |
|
||||
|
||||
### Accueil (8)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `home.intro` | Reconnaître les fruits, les arbres et les plantes de nos îles. En kréyòl d'abord, parce que c'est leur nom. | |
|
||||
| `home.jouer` | Jouer | |
|
||||
| `home.explorer` | Explorer l'encyclopédie | |
|
||||
| `home.compteur` | {n} espèces documentées | |
|
||||
| `home.pourquoi.titre` | Pourquoi ce jeu | |
|
||||
| `home.pourquoi.texte` | Une partie des enfants des Antilles ne sait plus nommer les fruits de son île, ni reconnaître les arbres qui les portent. Ce jeu essaie de rendre cette connaissance. | |
|
||||
| `home.verite.titre` | Des photos réelles, jamais d'images générées | |
|
||||
| `home.verite.texte` | Toutes les épreuves de reconnaissance s'appuient sur des photographies réelles, sous licence libre et validées par un humain. Les modèles génératifs produisent des fruits plausibles et faux : un jeu bâti dessus apprendrait l'erreur. | |
|
||||
|
||||
### Encyclopédie (4)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `zerbaj.intro` | Les espèces documentées par le projet. Chaque fiche indique aussi ce qui lui manque. | |
|
||||
| `zerbaj.fruits` | Fruits | |
|
||||
| `zerbaj.dangereuses` | Plantes à ne pas toucher | |
|
||||
| `zerbaj.voir` | Voir la fiche | |
|
||||
|
||||
### Fiche d’espèce (33)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `fiche.nom-kreyol` | Nom kréyòl | |
|
||||
| `fiche.autres-noms` | Autres noms | |
|
||||
| `fiche.variantes` | Autres formes entendues | |
|
||||
| `fiche.taxon` | Nom scientifique | |
|
||||
| `fiche.famille` | Famille | |
|
||||
| `fiche.verifie` | Vérifié le {date} contre Wikidata et GBIF | |
|
||||
| `fiche.iles` | Où on le trouve | |
|
||||
| `fiche.saison` | Quand on le trouve | |
|
||||
| `fiche.saison-non-sourcee` | Ces mois ne sont vérifiés contre aucune source. À confirmer. | |
|
||||
| `fiche.indices` | Comment le reconnaître | |
|
||||
| `fiche.indice.feuille` | La feuille | |
|
||||
| `fiche.indice.ecorce` | L'écorce | |
|
||||
| `fiche.indice.port` | L'arbre | |
|
||||
| `fiche.indice.coupe` | À la coupe | |
|
||||
| `fiche.indice.fruit` | Le fruit | |
|
||||
| `fiche.indice.fleur` | La fleur | |
|
||||
| `fiche.indice.latex` | Le latex | |
|
||||
| `fiche.indice.graine` | La graine | |
|
||||
| `fiche.indice.usage_haie` | Où on le rencontre | |
|
||||
| `fiche.danger` | Danger | |
|
||||
| `fiche.danger.vigilance` | Vigilance | |
|
||||
| `fiche.danger.eleve` | Danger élevé | |
|
||||
| `fiche.danger.critique` | Danger grave | |
|
||||
| `fiche.danger.conduite` | Que faire | |
|
||||
| `fiche.danger.signalement` | Comment il est signalé | |
|
||||
| `fiche.comestible.oui` | Se mange | |
|
||||
| `fiche.comestible.non` | Ne se mange pas | |
|
||||
| `fiche.medias` | Images | |
|
||||
| `fiche.aucune-image` | Aucune image validée pour cette fiche. | |
|
||||
| `fiche.ecouter` | Écouter le nom | |
|
||||
| `fiche.audio-manquant` | Personne n'a encore enregistré ce nom. | |
|
||||
| `fiche.sources` | Sources | |
|
||||
| `fiche.retour` | Retour à l'encyclopédie | |
|
||||
|
||||
### Ce qui manque (9)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `manques.titre` | Ce qui manque à cette fiche | |
|
||||
| `manques.intro` | Nous préférons le dire que le cacher. Chacun de ces points peut être comblé, et les outils sont gratuits. | |
|
||||
| `manques.aider` | Comment aider | |
|
||||
| `manques.photos` | Il manque une photographie : {vues} | |
|
||||
| `manques.audio` | Le nom n'a pas encore été enregistré par une voix humaine. | |
|
||||
| `manques.orthographe` | L'orthographe kréyòl n'a pas encore été relue par un locuteur. | |
|
||||
| `manques.sources` | Aucune source factuelle n'est encore citée. | |
|
||||
| `manques.saison` | La saison n'est vérifiée contre aucune source. | |
|
||||
| `manques.rien` | Rien ne manque à cette fiche. C'est rare — merci à ceux qui l'ont complétée. | |
|
||||
|
||||
### Questions de langue (5)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `kreyol.question` | Une question aux locuteurs | |
|
||||
| `kreyol.repondre` | Répondre | |
|
||||
| `kreyol.statut.a_relire` | Orthographe à relire | |
|
||||
| `kreyol.statut.en_discussion` | Orthographe en discussion | |
|
||||
| `kreyol.statut.relu` | Orthographe relue par {nom} | |
|
||||
|
||||
### Participation (7)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `kontribiye.titre` | Donner un coup de main | |
|
||||
| `kontribiye.intro` | Seul on va plus vite, ensemble on va plus loin. Ce projet documente des espèces que peu de gens ont photographiées et une langue que peu de bases de données connaissent. Rien de ce qui suit ne demande d'être spécialiste. | |
|
||||
| `kontribiye.outils` | Les outils existent déjà, ils sont gratuits, et ce qu'on y dépose sert à tout le monde — pas seulement à ce jeu. | |
|
||||
| `kontribiye.chiffres` | En chiffres, aujourd'hui | |
|
||||
| `kontribiye.geste` | Ce que vous pouvez faire | |
|
||||
| `kontribiye.duree` | environ {n} minutes | |
|
||||
| `kontribiye.ensemble` | Chaque photo, chaque nom, chaque voix déposée dans les communs reste disponible pour les enfants qui viendront après. | |
|
||||
|
||||
### Le jeu (27)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `jeu.titre` | Jouer | |
|
||||
| `jeu.choisir` | Choisir un mode | |
|
||||
| `jeu.rekonet.desc` | Reconnaître un fruit sur une photo. | |
|
||||
| `jeu.kache.desc` | Deviner à partir d'indices dévoilés un à un. | |
|
||||
| `jeu.sezon.desc` | Placer les fruits dans l'année. | |
|
||||
| `jeu.ranmase.desc` | Récolter dans le jaden, éviter ce qui pique. | |
|
||||
| `jeu.patouche.desc` | Les plantes à ne jamais toucher. Sans chrono, sans score. | |
|
||||
| `jeu.commencer` | Commencer | |
|
||||
| `jeu.rejouer` | Rejouer | |
|
||||
| `jeu.suivant` | Suivant | |
|
||||
| `jeu.quitter` | Quitter | |
|
||||
| `jeu.score` | Score | |
|
||||
| `jeu.bonne-reponse` | Bonne réponse | |
|
||||
| `jeu.mauvaise-reponse` | Ce n'était pas celui-là | |
|
||||
| `jeu.reponse-etait` | C'était {nom} | |
|
||||
| `jeu.question` | Quel fruit est-ce ? | |
|
||||
| `jeu.indice-suivant` | Un indice de plus | |
|
||||
| `jeu.indices-restants` | {n} indices restants | |
|
||||
| `jeu.termine` | Partie terminée | |
|
||||
| `jeu.resultat` | {bons} sur {total} | |
|
||||
| `jeu.album.desc` | Les fiches débloquées. | |
|
||||
| `jeu.album.vide` | Aucune fiche débloquée pour l'instant. | |
|
||||
| `jeu.progression.export` | Exporter ma progression | |
|
||||
| `jeu.progression.import` | Importer une progression | |
|
||||
| `jeu.progression.effacer` | Effacer ma progression | |
|
||||
| `jeu.indisponible.titre` | Ce mode n'est pas encore jouable | |
|
||||
| `jeu.indisponible.texte` | Il faut au moins deux photographies validées par espèce, et il n'y en a pas encore assez. Ce n'est pas un bug : personne ne les a encore versées. | |
|
||||
|
||||
### Module « Pa touché » (3)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `patouche.avertissement` | Ces plantes sont dangereuses. Ce module sert à les reconnaître pour les éviter — il n'est ni chronométré ni noté. | |
|
||||
| `patouche.conduite` | En cas de contact ou d'ingestion | |
|
||||
| `patouche.urgence` | En cas de doute, appelez les secours. | |
|
||||
|
||||
### Pied de page (4)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `footer.projet` | Un projet libre d'ORGANISATION KA INTERNATIONALE | |
|
||||
| `footer.licence` | Code sous AGPL-3.0 · Contenu sous CC BY-SA 4.0 | |
|
||||
| `footer.sans-compte` | Aucun compte, aucune publicité, aucun traceur. | |
|
||||
| `footer.credits` | Crédits et licences | |
|
||||
|
||||
### Crédits (5)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `credits.titre` | Crédits | |
|
||||
| `credits.intro` | Rien n'est « libre de droit ». Chaque image porte le nom de son auteur et sa licence. | |
|
||||
| `credits.medias` | Images | |
|
||||
| `credits.audio` | Voix | |
|
||||
| `credits.sources` | Sources de données | |
|
||||
|
||||
### Erreurs (4)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `erreur.404.titre` | Page introuvable | |
|
||||
| `erreur.404.texte` | Cette page n'existe pas. | |
|
||||
| `erreur.retour` | Retour à l'accueil | |
|
||||
| `erreur.generique` | Quelque chose s'est mal passé. | |
|
||||
|
||||
### Hors ligne (2)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `offline.titre` | Hors ligne | |
|
||||
| `offline.texte` | Vous êtes hors ligne. Les pages déjà visitées restent disponibles. | |
|
||||
|
||||
### Bandeau de traduction (1)
|
||||
|
||||
| clé | français | traduction |
|
||||
|---|---|---|
|
||||
| `i18n.non-traduit` | Cette interface n'est pas encore traduite en kréyòl. Le texte ci-dessous est en français. | |
|
||||
|
||||
## English — 100 % traduit
|
||||
|
||||
_Rien à traduire._
|
||||
|
||||
## Comment rendre une traduction
|
||||
|
||||
Remplir la colonne « traduction », ou envoyer la liste par tout moyen — un message,
|
||||
un fichier, une note vocale. La forme n’a aucune importance ; la relecture par un
|
||||
locuteur en a.
|
||||
|
||||
Les valeurs traduites se reportent dans `src/lib/i18n/gcf.json`. Une valeur `null`
|
||||
se replie automatiquement sur le français, avec l’attribut `lang` correct : rien ne
|
||||
casse tant que la traduction manque.
|
||||
@@ -0,0 +1,99 @@
|
||||
# Session 1 — Socle
|
||||
|
||||
**Date :** 2026-07-27 · **Livrable :** l'encyclopédie `/zerbaj/`, prérendue et trilingue.
|
||||
|
||||
## Mesures de la porte de sortie
|
||||
|
||||
| Critère | Cible | Mesuré |
|
||||
|---|---|---|
|
||||
| Fiches en ligne | 13, une page prérendue chacune | **56 pages HTML** (13 fiches × 3 langues + 17 pages de service) ✅ |
|
||||
| JS initial gzip | ≤ 170 Ko | **59 Ko** ✅ |
|
||||
| Poids total du build | ≤ 2 Mo | **1,4 Mo** ✅ |
|
||||
| Requêtes vers un domaine tiers | 0 | **0**, vérifié par grep du build ✅ |
|
||||
| Contenu lisible sans JavaScript | intégral | **1 694 caractères** de texte rendu sur une fiche, sans exécuter un octet de JS ✅ |
|
||||
| `npm run check` | 0 erreur, 0 warning | **248 fichiers, 0/0** ✅ |
|
||||
| `npm run build` | vert | vert ✅ |
|
||||
| Erreurs console au chargement | 0 | **0** ✅ |
|
||||
| Chaque fiche affiche ce qui lui manque | 13/13 | ✅ |
|
||||
| Questions kréyòl affichées | 4 | ✅ |
|
||||
|
||||
Lighthouse n'a pas été exécuté : il demande un navigateur en conditions réelles que je ne
|
||||
peux pas piloter ici. **La porte « Lighthouse ≥ 90/95/95/95 » reste donc non vérifiée** et
|
||||
doit l'être avant la session 6. Les budgets qui la déterminent — JS, poids, absence de
|
||||
tiers, contenu SSR — sont eux mesurés et tenus.
|
||||
|
||||
## Ce qui a été construit
|
||||
|
||||
SvelteKit 2 + Svelte 5 en runes, TypeScript strict, `adapter-static` en prérendu intégral,
|
||||
`trailingSlash: 'always'`, `paths.relative: false` (playbook §5b.5).
|
||||
|
||||
Tokens de la charte OKI dans un fichier partagé, thème sombre par défaut et clair en opt-in,
|
||||
polices Archivo et Inter self-hébergées (**124 Ko** de woff2 latin), flag-bar et flag chip,
|
||||
bouton à balayage or, gate `prefers-reduced-motion` unique.
|
||||
|
||||
i18n par dossiers sans middleware : `/` en kréyòl, `/fr/`, `/en/`. Route optionnelle
|
||||
`[[locale=locale]]` avec matcher, ce qui évite de tripler chaque page.
|
||||
|
||||
PWA : `VitePWA` en direct plutôt que `@vite-pwa/sveltekit`, enregistrement par fichier
|
||||
statique à chemin absolu (playbook §2.9), page hors-ligne designée, manifest, icônes 192 /
|
||||
512 / maskable générées depuis le SVG (**1,8 à 6,3 Ko** chacune).
|
||||
|
||||
CSP stricte en deux formats — `.htaccess` et `_headers` —, 404 statique autonome, sitemap
|
||||
généré depuis le build réel avec alternates hreflang (54 URLs sur 18 contenus).
|
||||
|
||||
## Trois décisions prises en cours de route
|
||||
|
||||
### L'interface kréyòl ne peut pas être écrite par un agent
|
||||
|
||||
Le projet pose le kréyòl comme langue principale, et l'ADR 0005 m'interdit d'en écrire.
|
||||
Résolu ainsi : le catalogue `gcf` ne contient que les termes venant des documents du porteur
|
||||
— `KI FWI SA YÉ ?`, `Zerbaj`, `Rekonèt`, `Kaché`, `Sézon`, `Ranmasé`, `Pa touché`, `Lakou` —
|
||||
soit **10 chaînes sur 132**. Tout le reste vaut `null` et se replie sur le français.
|
||||
|
||||
`npm run check:i18n` produit la liste des **122 phrases à traduire**, par écran, avec le
|
||||
français en regard. C'est une tâche de participation, pas une dette technique.
|
||||
|
||||
J'avais d'ailleurs commencé par écrire du kréyòl de mon cru dans le catalogue français
|
||||
(`Pa ni ayen la`, `Ba on koudmen`, `Jwé`, `Pa ni rézo`). Retiré : ces tournures étaient de
|
||||
moi, pas de la langue.
|
||||
|
||||
### `<html lang>` annonce la langue réellement écrite
|
||||
|
||||
Poser `lang="gcf"` sur une page dont le texte est français ferait lire ce français avec la
|
||||
phonétique kréyòl par un lecteur d'écran. `langDocument()` renvoie donc `fr` tant que la
|
||||
couverture du catalogue reste sous 60 %, et les fragments réellement kréyòl — noms de
|
||||
fruits, noms de modes, titre du site — portent `lang="gcf"` individuellement.
|
||||
|
||||
La fonction basculera d'elle-même quand la traduction dépassera le seuil. Il n'y a rien à
|
||||
changer dans le code : il faut traduire.
|
||||
|
||||
Un bandeau discret le dit sur chaque page en kréyòl, plutôt que de laisser croire.
|
||||
|
||||
### Les modes de jeu ne sont pas annoncés comme cliquables
|
||||
|
||||
`/je/` liste les cinq modes, aucun n'est lié : les routes n'existent qu'en session 2 et 4.
|
||||
Le prerender en mode strict fait échouer le build sur un lien mort — c'est le comportement
|
||||
voulu, et il a effectivement attrapé le problème.
|
||||
|
||||
Le mode Rekonèt affiche en plus son blocage réel : il demande des photographies validées, et
|
||||
il n'y en a aucune. Le message le dit sans détour — « ce n'est pas un bug : personne ne les a
|
||||
encore versées » — et renvoie vers la page de participation.
|
||||
|
||||
## Deux erreurs corrigées pendant le build
|
||||
|
||||
`vite-plugin-pwa/sveltekit` n'existe pas sans le paquet `@vite-pwa/sveltekit` : le playbook
|
||||
prescrivait déjà `VitePWA` en direct, je m'y suis aligné plutôt que d'ajouter une dépendance.
|
||||
|
||||
`@sveltejs/vite-plugin-svelte` v7 n'exporte plus `sveltekit` — l'import vient de
|
||||
`@sveltejs/kit/vite`. Vérifié sur les exports réels du paquet, pas supposé.
|
||||
|
||||
Et un vrai défaut de conception : le sélecteur de langue fabriquait `/fr/offline/` pour une
|
||||
page qui n'existe qu'en un exemplaire. `cheminAlterne()` renvoie désormais la racine de la
|
||||
langue cible sur les routes non localisées.
|
||||
|
||||
## Reste à faire avant la session 6
|
||||
|
||||
- Lighthouse mobile sur l'accueil et sur une fiche.
|
||||
- Vérification manuelle de `prefers-reduced-motion` et de la navigation clavier.
|
||||
- `og-image` et icônes sont des aplats graphiques sans texte : à remplacer si le porteur
|
||||
veut une image sociale plus travaillée.
|
||||
Reference in New Issue
Block a user