web-dev-qa-db-fra.com

Comment changer CurrentCulture lors de l'exécution?

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"?

18
eran otzap

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.

46
maxbeaudoin

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.

2
eran otzap

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;
        }
    }
1
user2156940