J'ai besoin de changer de culture au moment de l'exécution en fonction des fichiers de ressources pour chaque culture.
Je dois changer les attributs des contrôles dans mon formulaire, selon deux cultures qui ont désigné des fichiers .resx
resorces1.aspx.resx // default
resorces1.aspx.he-IL.resx // hebrew culture
Je peux charger la page avec la ressource de secours, ou sur pageload donner le UICulture = "he-IL"
valeur et il se charge très bien avec les ressources souhaitées.
Le problème est que je dois apporter ces modifications au moment de l'exécution.
1 .. après avoir modifié la valeur d'un événement de clic sur un bouton
btn_change_Click(....)
{
UICulture = "he-IL" ;
}
Il revient toujours à la valeur initialisée de "en-US"
Comment puis-je valider une modification de l'UICulture au moment de l'exécution?
2 .. comment puis-je référencer le fichier de ressources de secours si, par exemple, je ne sais pas qu'il est "en-US"?
Changer la culture actuelle de l'interface utilisateur:
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("he-IL");
ou mieux, récupérez une instance en lecture seule mise en cache de la culture he-IL:
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he-IL");
Au moment de l'exécution, ASP.NET utilise le fichier de ressources qui correspond le mieux au paramètre de la propriété CurrentUICulture. La culture d'interface utilisateur pour le thread est définie en fonction de la culture d'interface utilisateur de la page. Par exemple, si la culture d'interface utilisateur actuelle est espagnole, ASP.NET utilise la version compilée du fichier WebResources.es.resx. S'il n'y a pas de correspondance pour la culture d'interface utilisateur actuelle, ASP.NET utilise le remplacement des ressources. Il commence par rechercher des ressources pour une culture spécifique. Si ceux-ci ne sont pas disponibles, il recherche les ressources pour une culture neutre. S'ils ne sont pas trouvés, ASP.NET charge le fichier de ressources par défaut. Dans cet exemple, le fichier de ressources par défaut est WebResource.resx.
max m'a mis sur la bonne voie, rien que je n'ai jamais rencontré auparavant, mais cela m'a aidé à apporter un ajustement mineur à la documentation msdn à ce sujet:
http://msdn.Microsoft.com/en-us/library/bz9tc508.aspx
string defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void InitializeCulture()
{
if (Request.Form["ListBox1"] != null)
{
String selectedLanguage = Request.Form["ListBox1"];
UICulture = selectedLanguage;
Culture = selectedLanguage;
Thread.CurrentThread.CurrentCulture = new CultureInfo(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
}
else
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(defaultLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(defaultLanguage);
}
base.InitializeCulture();
}
la zone de liste contient différentes cultures, la première et celle sélectionnée est également la culture par défaut, que j'enregistre sur le chargement de la page, sur d'autres la charge sans effet car la zone de liste est déjà une valeur.
Je n'ai pas réussi à faire fonctionner le "repli" tel que décrit ici. J'utilise des fichiers de ressources globales pour la langue et lorsque l'étiquette manque dans le fichier de culture sélectionné par l'utilisateur, elle ne revient pas par défaut à une étiquette dans la culture par défaut? J'ai fini par créer une méthode pour effectuer le repli. Je cherchais de meilleures façons de changer la culture (quand le label n'est pas trouvé) et suis tombé sur ce post, alors j'ai pensé que je le ferais et du contenu.
Dans une de mes classes utilitaires: public String getLabelResource (String sLabelID, String sLangCd) {
cLogger oLogger = new cLogger();
try
{
Object sLabel;
sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID);
if (sLabel.ToString() == "") //label was not found in selected lang
{
//default to US language resource label
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID);
//switch global lang back to selected
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sLangCd);
}
return sLabel.ToString();
}
catch (Exception ex)
{
oLogger.LogWrite("cUtils.cs", "getLabelResource", ex.Message, false);
return String.Empty;
}
}