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();
}
}