_toLangCode dédoublonné — la décision n'était écrite que dans une copie sur trois
La fonction était recopiée dans VoiceOrchestrator, AssistantChatSheet et GeoBeaconTriggerService. La limite « FR/NL/EN/DE seulement, le reste retombe sur le français » est une décision assumée, mais elle n'était documentée que dans la première : les deux autres ressemblaient à un oubli qu'on aurait envie de « corriger » en ajoutant des langues, ce qui aurait produit un support partiel silencieux — les listes de commandes vocales, elles, ne couvrent que ces quatre langues. Une seule copie dans Helpers/voiceLanguage.dart, une seule décision. flutter analyze lib sans erreur, flutter build apk --debug --flavor dev vert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
66301805d8
commit
0aff904ede
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
||||||
import 'package:mymuseum_visitapp/Components/VisitorPrivacyNotice.dart';
|
import 'package:mymuseum_visitapp/Components/VisitorPrivacyNotice.dart';
|
||||||
import 'package:mymuseum_visitapp/Helpers/assistantSuggestions.dart';
|
import 'package:mymuseum_visitapp/Helpers/assistantSuggestions.dart';
|
||||||
|
import 'package:mymuseum_visitapp/Helpers/voiceLanguage.dart';
|
||||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||||
import 'package:mymuseum_visitapp/Models/AssistantResponse.dart';
|
import 'package:mymuseum_visitapp/Models/AssistantResponse.dart';
|
||||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||||
@ -152,15 +153,8 @@ class _AssistantChatSheetState extends State<AssistantChatSheet> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String _toLangCode(String lang) {
|
/// Voir `Helpers/voiceLanguage.dart` : limite assumée à FR/NL/EN/DE, pas un oubli.
|
||||||
switch (lang.toUpperCase()) {
|
String _toLangCode(String lang) => toVoiceLangCode(lang);
|
||||||
case 'FR': return 'fr-FR';
|
|
||||||
case 'NL': return 'nl-NL';
|
|
||||||
case 'EN': return 'en-US';
|
|
||||||
case 'DE': return 'de-DE';
|
|
||||||
default: return 'fr-FR';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _scrollToBottom() {
|
void _scrollToBottom() {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
|||||||
24
lib/Helpers/voiceLanguage.dart
Normal file
24
lib/Helpers/voiceLanguage.dart
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/// Code de langue passé au moteur de synthèse vocale.
|
||||||
|
///
|
||||||
|
/// ⛔ **L'assistant vocal est limité à FR/NL/EN/DE — décidé le 2026-08-13**, cf.
|
||||||
|
/// `DOCS/voice-latency-plan.md` §1.6. Les six autres langues déclarées dans
|
||||||
|
/// `constants.dart` retombent sur `fr-FR` : un visiteur italien se fait répondre en
|
||||||
|
/// français, sans erreur ni trace. En ajouter une coûte peu — les traductions `voice.*`
|
||||||
|
/// existent déjà pour les 10 langues, Whisper est multilingue et le wake word est
|
||||||
|
/// phonétique — mais il faut aussi compléter les quatre listes de commandes de
|
||||||
|
/// `VoiceOrchestrator`, sinon la langue n'est supportée qu'à moitié.
|
||||||
|
///
|
||||||
|
/// ⚠️ **Ce fichier existe parce que la fonction était copiée trois fois** : dans
|
||||||
|
/// `VoiceOrchestrator`, dans `AssistantChatSheet` et dans `GeoBeaconTriggerService` — et
|
||||||
|
/// la décision ci-dessus n'était écrite que dans la première. Les deux autres ressemblaient
|
||||||
|
/// à un oubli qu'on aurait envie de « corriger » en ajoutant des langues, ce qui aurait
|
||||||
|
/// produit un support partiel silencieux. Une seule copie, une seule décision.
|
||||||
|
String toVoiceLangCode(String? language) {
|
||||||
|
switch ((language ?? 'FR').toUpperCase()) {
|
||||||
|
case 'FR': return 'fr-FR';
|
||||||
|
case 'NL': return 'nl-NL';
|
||||||
|
case 'EN': return 'en-US';
|
||||||
|
case 'DE': return 'de-DE';
|
||||||
|
default: return 'fr-FR';
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart';
|
|||||||
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
import 'package:mymuseum_visitapp/Helpers/translationHelper.dart';
|
||||||
import 'package:just_audio/just_audio.dart';
|
import 'package:just_audio/just_audio.dart';
|
||||||
import 'package:mobile_scanner/mobile_scanner.dart';
|
import 'package:mobile_scanner/mobile_scanner.dart';
|
||||||
|
import 'package:mymuseum_visitapp/Helpers/voiceLanguage.dart';
|
||||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||||
import 'package:mymuseum_visitapp/Services/Glasses/engines/llm_client.dart';
|
import 'package:mymuseum_visitapp/Services/Glasses/engines/llm_client.dart';
|
||||||
import 'package:mymuseum_visitapp/Services/Glasses/engines/stt_engine.dart';
|
import 'package:mymuseum_visitapp/Services/Glasses/engines/stt_engine.dart';
|
||||||
@ -459,19 +460,8 @@ class VoiceOrchestrator {
|
|||||||
|
|
||||||
bool _isRepeatCommand(String text) => _matchesAny(text, _repeatPhrases);
|
bool _isRepeatCommand(String text) => _matchesAny(text, _repeatPhrases);
|
||||||
|
|
||||||
/// ⛔ L'assistant vocal est limité à FR/NL/EN/DE — décidé le 2026-08-13, cf.
|
/// Déléguée à `toVoiceLangCode` — la fonction était copiée ici, dans `AssistantChatSheet`
|
||||||
/// `DOCS/voice-latency-plan.md` §1.6. Les six autres langues déclarées dans
|
/// et dans `GeoBeaconTriggerService`, et la décision « FR/NL/EN/DE seulement » n'était
|
||||||
/// `constants.dart` retombent ici sur `fr-FR` : un visiteur italien se fait répondre
|
/// écrite que dans cette copie-ci. Voir `Helpers/voiceLanguage.dart`.
|
||||||
/// en français, sans erreur ni trace. En ajouter une coûte peu — les traductions
|
String _toLangCode(String lang) => toVoiceLangCode(lang);
|
||||||
/// `voice.*` existent déjà pour les 10 langues — mais il faut aussi compléter les
|
|
||||||
/// quatre listes de commandes ci-dessous, sinon la langue est à moitié supportée.
|
|
||||||
String _toLangCode(String lang) {
|
|
||||||
switch (lang.toUpperCase()) {
|
|
||||||
case 'FR': return 'fr-FR';
|
|
||||||
case 'NL': return 'nl-NL';
|
|
||||||
case 'EN': return 'en-US';
|
|
||||||
case 'DE': return 'de-DE';
|
|
||||||
default: return 'fr-FR';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import 'package:beacon_scanner/beacon_scanner.dart';
|
|||||||
import 'package:manager_api_new/api.dart';
|
import 'package:manager_api_new/api.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:geolocator/geolocator.dart';
|
import 'package:geolocator/geolocator.dart';
|
||||||
|
import 'package:mymuseum_visitapp/Helpers/voiceLanguage.dart';
|
||||||
import 'package:mymuseum_visitapp/Models/beaconSection.dart';
|
import 'package:mymuseum_visitapp/Models/beaconSection.dart';
|
||||||
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
import 'package:mymuseum_visitapp/Models/visitContext.dart';
|
||||||
import 'package:mymuseum_visitapp/Services/assistantService.dart';
|
import 'package:mymuseum_visitapp/Services/assistantService.dart';
|
||||||
@ -292,15 +293,11 @@ class GeoBeaconTriggerService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String _toLangCode(String lang) {
|
/// Voir `Helpers/voiceLanguage.dart` : le vocal ne couvre que FR/NL/EN/DE, et un
|
||||||
switch (lang.toUpperCase()) {
|
/// visiteur italien se fait donc accueillir en français à l'approche d'une œuvre.
|
||||||
case 'FR': return 'fr-FR';
|
/// C'est une limite assumée, pas un oubli — elle était invisible ici tant que la
|
||||||
case 'NL': return 'nl-NL';
|
/// fonction était recopiée.
|
||||||
case 'EN': return 'en-US';
|
String _toLangCode(String lang) => toVoiceLangCode(lang);
|
||||||
case 'DE': return 'de-DE';
|
|
||||||
default: return 'fr-FR';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dispose() {
|
void dispose() {
|
||||||
stop();
|
stop();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user