C #: Comment obtenir une chaîne de ressources d’une certaine culture

J’ai une assemblée de ressources avec des textes traduits dans différentes langues. Le type de projet ressemble à ceci:

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx

Je peux obtenir les textes en utilisant des propriétés statiques comme ceci:

var value = FooBar.Hello; 

Ou en utilisant une reflection comme celle-ci:

 var value = resourceAssembly .GetType("Namespace.FooBar") .GetProperty("Hello") .GetValue(null, null) as ssortingng; 

Les deux méthodes me procureront la valeur appartenant à la culture d’interface utilisateur actuelle du fil actuel. Ce qui est bien et totalement ce que je voudrais habituellement.

Mais est-ce que je peux faire quelque chose si je veux explicitement, par exemple, la valeur suédoise, sans avoir à changer la culture de l’interface utilisateur?

Vous pouvez modifier manuellement la propriété Culture de la classe FooBar générée par Visual Studio. Ou si vous utilisez directement la classe ResourceManager , vous pouvez utiliser la surcharge de GetSsortingng qui prend la culture souhaitée en tant que paramètre.

Essayez le code suivant. Cela a bien fonctionné pour moi au moins:

 FooBar.ResourceManager.GetSsortingng("Hello", CultureInfo.GetCultureInfo("sv-SE")) 

Vous pouvez modifier manuellement la culture dans votre classe d’access aux ressources. Mais cela n’est pas recommandé car cela pose d’autres problèmes d’internationalisation.

Par exemple, vous devriez:

  • Gérez tous les formats numériques avec les surcharges de culture
  • Assurez-vous que les autres bibliothèques que vous utilisez ont un mécanisme similaire à celui que vous avez.
  • Dans les cas où ce qui précède est impossible (par exemple BCL), créez des enveloppes pour tout ce qui POURRAIT être spécifique à la culture (et cela BEAUCOUP de choses).

Donc, si possible, changez la culture d’interface utilisateur actuelle du thread actuel.

Voici un code que j’ai utilisé pour récupérer un fichier de ressources par nom de culture – c’est vb.net, mais vous voyez l’idée.

 Dim reader As New System.Resources.ResXResourceReader(Ssortingng.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture)) 

Et si vous voulez le retourner sous forme de dictionnaire:

 If reader IsNot Nothing Then Dim d As New Dictionary(Of Ssortingng, Ssortingng) Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator() While enumerator.MoveNext d.Add(enumerator.Key, enumerator.Value) End While Return d End If 

Utilisez la deuxième surcharge de GetValue: –

  .GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))