[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fdfJUPO12gYUIFBQJjcYYRFTbM40nlDeCgEM7Ghni-Bg":3},{"id":4,"slug":5,"titleFr":6,"titleEn":6,"titleKm":6,"descriptionFr":7,"descriptionEn":8,"descriptionKm":9,"tags":10,"githubUrl":9,"demoUrl":19,"imageUrl":9,"featured":20,"createdAt":21},48,"babel-duo","PolyGloChet","## Qu'est-ce que PolyGloChet ?\n\nPolyGloChet est une application de messagerie bilingue conçue pour faciliter l'apprentissage du français et du khmer entre deux personnes distantes. Chaque message envoyé est automatiquement analysé, corrigé et traduit dans les trois langues par Gemini AI — sans interrompre la conversation.\n\n## Correction grammaticale en temps réel\n\nDès que l'utilisateur commence à taper, un debounce d'une seconde déclenche une analyse Gemini :\n\n- **Détection automatique** de la langue du message (FR, EN ou KH)\n- **Suggestion de correction** affichée dans une popup inline avant l'envoi\n- **Explication pédagogique** : Gemini justifie chaque modification dans la langue natale de l'auteur\n- L'utilisateur peut **accepter** la correction (texte remplacé automatiquement), la **refuser** ou l'**ignorer**\n- Si la phrase est correcte, Gemini répond simplement \"Parfait !\" avec un encouragement\n\n## Leçons granulaires — une entrée par faute\n\nContrairement à une correction globale, PolyGloChet décompose chaque message en **autant de leçons qu'il y a de fautes** :\n\n- Exemple : \"je veut manger du riz a la maison\" → 2 leçons distinctes : \"veut → veux\" et \"a → à\"\n- Chaque leçon contient : l'original, la version corrigée, et l'explication grammaticale\n- Les leçons sont générées dans la **langue natale de l'auteur** (français pour Chet, khmer pour Lys)\n- Une leçon n'est générée que si une vraie faute est détectée — pas de bruit inutile\n\n## Historique des corrections (GCS)\n\nToutes les leçons sont persistées dans Google Cloud Storage (`chat/lessons.json`) au moment de l'envoi du message :\n\n- **Indépendant de la suggestion** : les leçons sont sauvegardées qu'on accepte ou refuse la correction\n- **Consultable à tout moment** via le panel 📖 dans l'application ou via la démo portfolio\n- Chaque entrée conserve : l'auteur, la langue, l'original, la correction, l'explication et la date\n- Ordre antichronologique (plus récent en premier)\n\n## Traductions trilingues automatiques\n\nChaque message est traduit en français, anglais et khmer par Gemini dès l'envoi :\n\n- Affichage des 3 traductions sous chaque bulle de message\n- **Flag de langue** (🇫🇷 🇬🇧 🇰🇭) indiquant la langue originale du message\n- Si la suggestion a déjà fourni les traductions, elles sont réutilisées — pas d'appel Gemini double\n- Traduction absente pour les messages trop courts (\u003C 2 caractères)\n\n## Reconnaissance vocale (VAD)\n\nL'envoi vocal repose sur une pipeline de détection d'activité vocale entièrement côté client :\n\n- **Silero VAD v5** via ONNX Runtime Web — détection de début/fin de parole sans serveur\n- Trois états visuels : ⏳ initialisation ONNX, 🔴 écoute active (pulsant), 🟢 voix détectée (pulsant)\n- Segments \u003C 0.8s filtrés (évite les bruits courts parasites)\n- Audio capturé en base64 → envoyé à Gemini (`geminiTranscribeAndTranslate`) → texte + traductions\n- Badge 🎤 affiché sur les bulles de messages vocaux\n\n## Coffre multimédia\n\nLes images et vidéos partagées dans le chat sont stockées dans Google Cloud Storage dans le même format que le coffre (`YYYY/MM/DD/filename`) :\n\n- **Compression automatique** côté client (WebP/JPEG, max 2048px via Canvas API)\n- **Signed URLs** pour upload et téléchargement sécurisé (expiration 1h, cache Map)\n- Les images partagées apparaissent automatiquement dans le coffre photo — pas de synchronisation nécessaire\n- Semaphore (max 3 requêtes concurrentes) pour éviter la saturation des signed URLs\n\n## Actions sur les messages\n\nUne barre d'actions apparaît sur sélection d'un message :\n\n- **Copier** : copie le texte original + toutes les traductions dans le presse-papiers\n- **TTS** (Text-To-Speech) : lecture à voix haute via Web Speech API en 🇫🇷 fr-FR, 🇬🇧 en-US ou 🇰🇭 km-KH\n- **Supprimer** : uniquement par l'auteur du message (vérifié côté backend)\n\n## Navigation et interface\n\n- **Navigation historique** : boutons ← → pour consulter les messages des jours précédents\n- **Double horloge** : heure de Paris (Europe/Paris) et de Phnom Penh (Asia/Phnom_Penh) sous chaque bulle\n- **Polling** toutes les 8s pour les messages du jour (nouveaux messages de l'autre côté)\n- **Interface bilingue** FR + Khmer dans toute l'UI\n- **PWA installable** : fonctionne hors-ligne, icône sur l'écran d'accueil\n\n## Architecture technique\n\n- **Frontend** : SvelteKit 5 + Svelte 5 runes (`$state`, `$derived`, `$effect`) + TypeScript\n- **Backend** : Nuxt 3 / Nitro sur Vercel (serverless)\n- **Stockage** : Google Cloud Storage — messages `chat/YYYY/MM/DD.json`, leçons `chat/lessons.json`\n- **AI** : Vertex AI Gemini 2.5 Flash — traduction, correction, transcription audio\n- **Auth** : Google Identity Services (FedCM) — JWT vérifié stateless côté backend\n- **VAD** : @ricky0123/vad-web + onnxruntime-web (Silero VAD v5)","## What is PolyGloChet?\n\nPolyGloChet is a bilingual messaging app designed to facilitate French and Khmer learning between two people at a distance. Every message sent is automatically analyzed, corrected and translated into three languages by Gemini AI — without interrupting the conversation.\n\n## Real-Time Grammar Correction\n\nAs soon as the user starts typing, a one-second debounce triggers a Gemini analysis:\n\n- **Automatic language detection** of the message (FR, EN or KH)\n- **Correction suggestion** displayed in an inline popup before sending\n- **Educational explanation**: Gemini justifies each change in the author's native language\n- The user can **accept** the correction (text replaced automatically), **reject** it or **ignore** it\n- If the sentence is correct, Gemini simply responds \"Perfect!\" with an encouragement\n\n## Granular Lessons — One Entry Per Error\n\nUnlike a global correction, PolyGloChet breaks down each message into **as many lessons as there are errors**:\n\n- Example: \"je veut manger du riz a la maison\" → 2 distinct lessons: \"veut → veux\" and \"a → à\"\n- Each lesson contains: the original, the corrected version, and the grammatical explanation\n- Lessons are generated in the **author's native language** (French for Chet, Khmer for Lys)\n- A lesson is only generated when a real error is detected — no unnecessary noise\n\n## Corrections History (GCS)\n\nAll lessons are persisted in Google Cloud Storage (`chat/lessons.json`) at message send time:\n\n- **Independent of the suggestion**: lessons are saved whether you accept or reject the correction\n- **Consultable at any time** via the 📖 panel in the app or through the portfolio demo\n- Each entry stores: author, language, original, correction, explanation and date\n- Reverse-chronological order (most recent first)\n\n## Automatic Trilingual Translations\n\nEvery message is translated into French, English and Khmer by Gemini upon sending:\n\n- All 3 translations displayed under each message bubble\n- **Language flag** (🇫🇷 🇬🇧 🇰🇭) indicating the original language of the message\n- If the suggestion already provided translations, they are reused — no double Gemini call\n- Translation skipped for very short messages (\u003C 2 characters)\n\n## Voice Recognition (VAD)\n\nVoice sending relies on a fully client-side voice activity detection pipeline:\n\n- **Silero VAD v5** via ONNX Runtime Web — start/end of speech detection with no server\n- Three visual states: ⏳ ONNX initializing, 🔴 active listening (pulsing), 🟢 voice detected (pulsing)\n- Segments \u003C 0.8s filtered out (avoids short background noises)\n- Audio captured as base64 → sent to Gemini (`geminiTranscribeAndTranslate`) → text + translations\n- 🎤 badge displayed on voice message bubbles\n\n## Media Vault\n\nImages and videos shared in chat are stored in Google Cloud Storage in the same format as the vault (`YYYY/MM/DD/filename`):\n\n- **Automatic client-side compression** (WebP/JPEG, max 2048px via Canvas API)\n- **Signed URLs** for secure upload and download (1h expiry, Map cache)\n- Shared images appear automatically in the photo vault — no synchronization needed\n- Semaphore (max 3 concurrent requests) to prevent signed URL saturation\n\n## Message Actions\n\nAn action bar appears when a message is selected:\n\n- **Copy**: copies the original text + all translations to clipboard\n- **TTS** (Text-To-Speech): reads aloud via Web Speech API in 🇫🇷 fr-FR, 🇬🇧 en-US or 🇰🇭 km-KH\n- **Delete**: only by the message author (verified server-side)\n\n## Navigation & Interface\n\n- **History navigation**: ← → buttons to browse previous days' messages\n- **Dual clock**: Paris time (Europe/Paris) and Phnom Penh time (Asia/Phnom_Penh) under each bubble\n- **Polling** every 8s for today's messages (new messages from the other side)\n- **Bilingual UI** FR + Khmer throughout the entire interface\n- **Installable PWA**: works offline, home screen icon\n\n## Technical Architecture\n\n- **Frontend**: SvelteKit 5 + Svelte 5 runes (`$state`, `$derived`, `$effect`) + TypeScript\n- **Backend**: Nuxt 3 / Nitro on Vercel (serverless)\n- **Storage**: Google Cloud Storage — messages `chat/YYYY/MM/DD.json`, lessons `chat/lessons.json`\n- **AI**: Vertex AI Gemini 2.5 Flash — translation, correction, audio transcription\n- **Auth**: Google Identity Services (FedCM) — stateless JWT verification server-side\n- **VAD**: @ricky0123/vad-web + onnxruntime-web (Silero VAD v5)",null,[11,12,13,14,15,16,17,18],"SvelteKit","Svelte 5","Gemini AI","TypeScript","GCS","PWA","VAD","Web Speech","https://chetana.fr/projects/polyglochet",true,"2026-03-07T00:46:53.857159"]