tablet-app-new/lib/Helpers/translations.dart
Thomas Fransolet 7c29b4bb76 K7 et K3 : SectionArticle et SectionEvent sur la borne
flutter build apk --debug vert, APK produit. La borne couvre désormais
12 des 13 types ; seul SectionParcours reste dehors, et définitivement —
un parcours guidé fait marcher le visiteur avec géodéclenchement.

Les deux écrans suivent la maquette paysage validée le 12/08 : ils sont
dessinés pour une dalle large et fixe, pas pour un téléphone debout.

K7 — Article. article_view.dart remplace le stub Text("TODO Article") et
le case est décommenté (l'import d'ArticleView était déjà en tête de
main_view, laissé par celui qui avait écrit le TODO). Rail média à 38 %
avec image, vignettes à plat et audio docké ; colonne de lecture à 62 %
plafonnée à 720 px, parce qu'étirer le texte sur 1280 px le rend
illisible. isContentTop, qui voulait dire « texte au-dessus » en portrait,
devient le côté : à true, texte à gauche et rail à droite.

Trois états incomplets, tous possibles en configuration. Le rail n'existe
que s'il a quelque chose à ancrer : sans audio le dock tombe, sans photo
le rail disparaît et l'audio passe en tête de la colonne, sans rien la
colonne se centre.

L'audio est porté par langue (audioIds est une List<TranslationDTO>) :
pas d'entrée pour la langue choisie, pas de lecteur, sans repli sur une
autre langue. TranslationHelper.get renvoyant "" quand la langue manque,
la règle tombe juste.

K3 — Événement. event_view.dart : bande héros à 26 % au lieu des 52 % de
mymuseum (debout devant une borne, personne ne défile pour découvrir
qu'il y a un programme dessous), programme à gauche avec bloc « en
cours », carte flutter_map vive à droite. Le détail d'un bloc s'ouvre
sous la carte et non en showModalBottomSheet : ce dernier est une réponse
à l'étroitesse, or ici il y a la place à côté.

Quatre choses que le code a dictées :

- La barre de pied de la maquette n'appartient pas à ces écrans.
  section_page_detail la dessine déjà pour les treize types, avec les
  clés back/menu selon isFromMenu. La dessiner aurait affiché deux
  boutons retour.
- Un seul constructeur de marqueurs au lieu des quatre de mymuseum.
  MapAnnotationDTO et MapAnnotation portent des champs rigoureusement
  identiques mais sont deux types Dart distincts. Normalisé par une
  classe interne à deux fabriques — L5 appliqué au front, et il porte
  d'autant plus que la convention [lng, lat] est l'endroit exact où une
  divergence ne lève aucune erreur.
- L'audio d'article se résout dans contents avant l'API. ContentDTO
  porte son resource complet (idiome de marker_view), donc l'audio est
  trouvé sans appel réseau quand il est embarqué, donc hors ligne aussi.
  resourceGetDetail n'est qu'un repli ; mymuseum appelle l'API
  systématiquement en ligne.
- Nouvelle clé i18n event.live dans les 10 langues. Sans les 10,
  getFromLocale renvoie "" et la pastille rendrait une boîte vide.
  ATTENTION : PL, CN, UK et AR sont de ma main et demandent une
  relecture humaine.

Le nouveau code emploie withValues plutôt que withOpacity, déprécié —
le repo est en pleine migration (13 contre 9).

flutter analyze sur Screens/Article, Screens/Event et Helpers : zéro
issue dans les fichiers touchés. Les 2 restantes sont dans MQTTHelper,
préexistantes.

Non prouvé : le rendu. Aucun des deux écrans n'a été vu à l'œil, et un
build vert ne dit rien d'une mise en page. Aucun SectionEvent n'existe
en base, le type étant né avec Postgres v3 — c'est le §19.13 cas E qui
en créera un.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 15:20:08 +02:00

184 lines
5.4 KiB
Dart

import 'package:tablet_app/Models/translation.dart';
List<Translation> translations = [
Translation(language: "FR", data: {
"weather.hourly": "Prochaines heures",
"weather.nextdays": "Prochains jours",
"agenda.all": "Tout",
"monday": "Lundi",
"tuesday": "Mardi",
"wednesday": "Mercredi",
"thursday": "Jeudi",
"friday": "Vendredi",
"saturday": "Samedi",
"sunday": "Dimanche",
"menu": "Menu",
"quiz.seeResponses": "Voir les réponses",
"quiz.restart": "Recommencer",
"map.search": "Rechercher",
"back": "Retour",
"event.live": "En cours"
}),
Translation(language: "EN", data: {
"weather.hourly": "Hourly",
"weather.nextdays": "Next days",
"agenda.all": "All",
"monday": "Monday",
"tuesday": "Tuesday",
"wednesday": "Wednesday",
"thursday": "Thursday",
"friday": "Friday",
"saturday": "Saturday",
"sunday": "Sunday",
"menu": "Menu",
"quiz.seeResponses": "See the answers",
"quiz.restart": "Restart",
"map.search": "Search",
"back": "Back",
"event.live": "Now on"
}),
Translation(language: "DE", data: {
"weather.hourly": "Nächste Stunden",
"weather.nextdays": "Nächsten Tage",
"agenda.all": "Alle",
"monday": "Montag",
"tuesday": "Dienstag",
"wednesday": "Mittwoch",
"thursday": "Donnerstag",
"friday": "Freitag",
"saturday": "Samstag",
"sunday": "Sonntag",
"menu": "Speisekarte",
"quiz.seeResponses": "Sehen Sie sich die Antworten an",
"quiz.restart": "Neu starten",
"map.search": "Suchen",
"back": "Zurück",
"event.live": "Läuft"
}),
Translation(language: "NL", data: {
"weather.hourly": "Volgende uren",
"weather.nextdays": "Volgende dagen",
"agenda.all": "Alle",
"monday": "Maandag",
"tuesday": "Dinsdag",
"wednesday": "Woensdag",
"thursday": "Donderdag",
"friday": "Vrijdag",
"saturday": "Zaterdag",
"sunday": "Zondag",
"menu": "Menu",
"quiz.seeResponses": "Zie de antwoorden",
"quiz.restart": "Herstarten",
"map.search": "Zoeken",
"back": "Rug",
"event.live": "Nu bezig"
}),
Translation(language: "IT", data: {
"weather.hourly": "Le prossime ore",
"weather.nextdays": "Prossimi giorni",
"agenda.all": "Tutto",
"monday": "Lunedì",
"tuesday": "Martedì",
"wednesday": "Mercoledì",
"thursday": "Giovedì",
"friday": "Venerdì",
"saturday": "Sabato",
"sunday": "Domenica",
"menu": "Menù",
"quiz.seeResponses": "Vedi le risposte",
"quiz.restart": "Ricomincia",
"map.search": "Cerca",
"back": "Indietro",
"event.live": "In corso"
}),
Translation(language: "ES", data: {
"weather.hourly": "Próximas horas",
"weather.nextdays": "Proximos dias",
"agenda.all": "Todo",
"monday": "Lunes",
"tuesday": "Martes",
"wednesday": "Miércoles",
"thursday": "Jueves",
"friday": "Viernes",
"saturday": "Sábado",
"sunday": "Domingo",
"menu": "Menú",
"quiz.seeResponses": "Ver las respuestas",
"quiz.restart": "Reanudar",
"map.search": "Buscar",
"back": "Atrás",
"event.live": "En curso"
}),
Translation(language: "PL", data: {
"weather.hourly": "Następne godziny",
"weather.nextdays": "Następne dni",
"agenda.all": "Wszystko",
"monday": "Poniedziałek",
"tuesday": "Wtorek",
"wednesday": "Środa",
"thursday": "Czwartek",
"friday": "Piątek",
"saturday": "Sobota",
"sunday": "Niedziela",
"menu": "Menu",
"quiz.seeResponses": "Zobacz odpowiedzi",
"quiz.restart": "Uruchom ponownie",
"map.search": "Szukaj",
"back": "Z powrotem",
"event.live": "Trwa"
}),
Translation(language: "CN", data: {
"weather.hourly": "接下来的几个小时",
"weather.nextdays": "未来几天",
"agenda.all": "全部",
"monday": "星期一",
"tuesday": "星期二",
"wednesday": "星期三",
"thursday": "星期四",
"friday": "星期五",
"saturday": "星期六",
"sunday": "星期日",
"menu": "菜单",
"quiz.seeResponses": "查看答案",
"quiz.restart": "重新开始",
"map.search": "搜索",
"back": "后退",
"event.live": "进行中"
}),
Translation(language: "UK", data: {
"weather.hourly": "Наступні години",
"weather.nextdays": "Наступні дні",
"agenda.all": "все",
"monday": "Понеділок",
"tuesday": "Вівторок",
"wednesday": "Середа",
"thursday": "Четвер",
"friday": "П'ятниця",
"saturday": "Субота",
"sunday": "Неділя",
"menu": "Меню",
"quiz.seeResponses": "Подивіться відповіді",
"quiz.restart": "Перезапустіть",
"map.search": "Шукати",
"back": "Назад",
"event.live": "Зараз"
}),
Translation(language: "AR", data: {
"weather.hourly": "الساعات القادمة",
"weather.nextdays": "الايام القادمة",
"agenda.all": "الجميع",
"monday": "الإثنين",
"tuesday": "الثلاثاء",
"wednesday": "الأربعاء",
"thursday": "الخميس",
"friday": "الجمعة",
"saturday": "السبت",
"sunday": "الأحد",
"menu": "القائمة",
"quiz.seeResponses": "انظر الإجابات",
"quiz.restart": "إعادة تشغيل",
"map.search": "بحث",
"back": "خلف",
"event.live": "جارٍ الآن"
}),
];