using System.Collections.Generic; namespace MyInfoMate.Vr.Ui { /// /// Les textes de l'app elle-même — « Retour au menu », « Ce contenu est vide » — /// par opposition aux textes du contenu, qui viennent de l'export et passent par /// ConfigurationExport.Translate. /// /// Pourquoi une table en dur plutôt que le mécanisme du manager. Il y a une /// dizaine de phrases, elles ne changent pas avec le contenu, et un casque démarre /// souvent sans réseau : les faire venir du serveur ferait dépendre le bouton retour /// d'une requête. Le manager, lui, a des centaines de libellés et un back-office pour /// les éditer — ce n'est pas le même problème. /// /// Les quatre langues sont celles que le champ languages d'une configuration /// propose. Une langue inconnue retombe sur le français plutôt que d'afficher une /// clé : un visiteur qui lit la mauvaise langue s'en sort, un visiteur qui lit /// backToMenu non. /// public static class Strings { public const string BackToMenu = "backToMenu"; public const string ChooseLanguage = "chooseLanguage"; public const string EmptyContent = "emptyContent"; public const string NothingToday = "nothingToday"; public const string NotSupported = "notSupported"; public const string Scene3DFailed = "scene3dFailed"; static readonly Dictionary> Table = new Dictionary> { ["FR"] = new Dictionary { [BackToMenu] = "Retour au menu", [ChooseLanguage] = "Choisissez votre langue", [EmptyContent] = "Ce contenu est vide.", [NothingToday] = "Rien au programme aujourd'hui.", [NotSupported] = "Ce type de contenu n'est pas encore affichable dans le casque.", [Scene3DFailed] = "Cette scène 3D n'a pas pu être chargée.", }, ["EN"] = new Dictionary { [BackToMenu] = "Back to menu", [ChooseLanguage] = "Choose your language", [EmptyContent] = "This content is empty.", [NothingToday] = "Nothing on the programme today.", [NotSupported] = "This type of content cannot be shown in the headset yet.", [Scene3DFailed] = "This 3D scene could not be loaded.", }, ["NL"] = new Dictionary { [BackToMenu] = "Terug naar het menu", [ChooseLanguage] = "Kies uw taal", [EmptyContent] = "Deze inhoud is leeg.", [NothingToday] = "Vandaag staat er niets op het programma.", [NotSupported] = "Dit soort inhoud is nog niet zichtbaar in de bril.", [Scene3DFailed] = "Deze 3D-scène kon niet worden geladen.", }, ["DE"] = new Dictionary { [BackToMenu] = "Zurück zum Menü", [ChooseLanguage] = "Wählen Sie Ihre Sprache", [EmptyContent] = "Dieser Inhalt ist leer.", [NothingToday] = "Heute steht nichts auf dem Programm.", [NotSupported] = "Diese Art von Inhalt ist in der Brille noch nicht verfügbar.", [Scene3DFailed] = "Diese 3D-Szene konnte nicht geladen werden.", }, }; /// /// Le nom d'une langue dans cette langue. C'est la seule façon de nommer un /// choix de langue : « Dutch » ne dit rien à quelqu'un qui cherche « Nederlands ». /// static readonly Dictionary Names = new Dictionary { ["FR"] = "Français", ["EN"] = "English", ["NL"] = "Nederlands", ["DE"] = "Deutsch", }; public const string Fallback = "FR"; public static string Get(string key, string language) { var code = Normalize(language); if (Table.TryGetValue(code, out var texts) && texts.TryGetValue(key, out var text)) return text; return Table[Fallback][key]; } /// Le nom à afficher pour une langue, son code à défaut. public static string NameOf(string language) { var code = Normalize(language); return Names.TryGetValue(code, out var name) ? name : code; } /// /// L'export écrit les langues tantôt en fr, tantôt en FR — et les /// traductions d'un même contenu ne suivent pas toujours la casse du champ /// languages de la configuration. Tout passe par ici. /// public static string Normalize(string language) => string.IsNullOrEmpty(language) ? Fallback : language.Trim().ToUpperInvariant(); } }