Aller au contenu principal

Gestion du multilingue

Lagoon centralise les textes affichés dans des fichiers Dico.xml. Chaque clé est ensuite référencée dans l'interface ou le code, ce qui évite les libellés en dur.

Emplacement des fichiers Dico.xml​

ProjetUsage
App.ClientTextes de l'interface utilisateur.
App.ServerMessages serveur, erreurs API et notifications.
App.SharedTextes partagés entre Client, Server et Shared, par exemple des enums.

Format d'un dictionnaire​

Dico.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="" id="root">
<xsd:element name="string">
<xsd:complexType>
<xsd:attribute name="key" use="required" type="xsd:string" />
<xsd:attribute id="fr-FR" name="fr" use="required" type="xsd:string" />
<xsd:attribute id="en-US" name="en" use="required" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>

<!-- Sample -->
<string key="lblSampleKey" fr="Traduction en français" en="English translation" />
</root>

Dans cet exemple, seules les cultures fr-FR et en-US sont présentes. Vous pouvez ajouter de nouvelles langues en ajoutant les attributs au schéma et aux entrées.

Utilisation en C#​

MyService.cs
using Lagoon.Helpers;

public class MyService
{
public string GetTranslatedContent()
{
// Traduit la clé dans la culture courante.
return "lblSampleKey".Translate();
}
}

Utilisation en markup​

La plupart des composants Lagoon traduisent automatiquement les valeurs préfixées par #.

MyComponent.razor
@inherits LgComponentBase

<LgLabel Text="#lblSampleKey" />
<LgButton Text="#save" OnClick="SaveAsync" />
MyComponent.razor.cs
public partial class MyComponent : LgComponentBase
{
private Task SaveAsync(ActionEventArgs args)
{
// Exemple volontairement minimal : l'action réelle dépend de la page.
return Task.CompletedTask;
}
}

Si un composant ne gère pas directement le préfixe #, utilisez la traduction manuelle.

MyComponent.razor
@inherits LgComponentBase

<LgLabel Text='@("lblSampleKey".Translate())' />

Formatage avec Translate()​

Translate() supporte les zones de remplacement de string.Format.

Dico.xml
<string key="lblWelcomeUser" fr="Bienvenue {0} ! Dernière connexion le {1}" en="Welcome {0}! Last login on {1}" />
MyService.cs
public string GetWelcomeMessage(string userName, string lastLoginDate)
{
// Injecte les valeurs dans les zones {0} et {1} du dictionnaire.
return "lblWelcomeUser".Translate(userName, lastLoginDate);
}
Sauts de ligne

Pour afficher un texte multiligne, vous pouvez stocker \r\n ou &#x0a; dans le dictionnaire et appliquer un style white-space: pre-wrap à l'élément qui affiche le texte.

Surcharge de clés Lagoon​

Les composants Lagoon utilisent eux aussi des clés de dictionnaire. Une application peut surcharger une clé existante en déclarant la même clé dans son propre Dico.xml.

Chargement à chaud côté client​

Un composant héritant de LgComponentBase peut charger ou surcharger des traductions pendant l'exécution avec App.LoadLanguages(...).

MyComponent.razor.cs
public partial class MyComponent : LgComponentBase
{
public void LoadLanguage()
{
Dictionary<string, Dictionary<string, string>> dicoToLoad = new();

Dictionary<string, string> fr = new();
Dictionary<string, string> en = new();

fr.Add("lblSampleKey", "La traduction en français");
en.Add("lblSampleKey", "English translation");

dicoToLoad.Add("fr", fr);
dicoToLoad.Add("en", en);

// Charge les traductions et rafraîchit les composants qui utilisent le dictionnaire.
App.LoadLanguages(dicoToLoad);
}
}

Une clé définie dans Dico.xml est surchargée par App.LoadLanguages(...). Si la clé n'existe pas, elle est ajoutée.

Chargement à chaud côté serveur​

Côté serveur, le chargement dynamique se fait via le gestionnaire d'application Lagoon.

LanguageService.cs
public class LanguageService
{
public void LoadLanguages(Dictionary<string, Dictionary<string, string>> dico)
{
// Charge les traductions côté serveur pour les réponses API traduites.
LgApplicationBase.Current.LoadLanguages(dico);
}
}

Synchronisation client / serveur​

Aucune action spécifique n'est nécessaire pour synchroniser la langue entre l'UI et les API : quand le client change de langue, les requêtes suivantes reçoivent les réponses serveur dans la même langue lors de l'utilisation de Translate() côté serveur.

Caractères utiles en XML​

SéquenceRésultat
&amp;amp;&
&amp;lt;<
&amp;gt;>
&#x0a;Retour à la ligne
&#8226;Puce noire

Voir aussi​