2015-10-07 1 views
0

Dans mon WPF appliation, j'ai bien défini comme suitLocalize messages d'erreur dataannotation que par culture

[Required(AllowEmptyStrings =false, ErrorMessageResourceName ="Msg1", ErrorMessageResourceType =typeof(*<AssemblyName>*.Resources.*<ResourceFileName>*))] 
public string Name 
{ 
    get 
    { 
     return _name; 
    } 

    set 
    { 
     if (_name == value) 
     { 
      return; 
     } 
     _name = value; 
    } 
} 

Je mes messages d'erreur définis dans l'assemblage séparé qui comporte un fichier de ressources pour les différentes cultures par exemple Ressources.resx, Ressources.en-GB.Resx, Ressources.fr-FR.Resx, Ressources.en-US.Resx, etc.

Avec le code ci-dessus en place, je suis en mesure de récupérer le message d'erreur de fichier de ressources par défaut dans mon assembly satellite mais je ne vois aucune disposition pour trouver la ressource de chaîne à partir du fichier de ressources spécifiques à la culture. Ce que je veux dire, c'est que si mon CurrentUICluture est défini en anglais (Royaume-Uni), je veux récupérer la valeur de la ressource à partir du fichier "Resources.en-GB.Resx" au lieu du fichier par défaut (Ressources.Resx).

Je ne vois aucun moyen de transmettre les informations de culture dans la définition d'attribut Required. En outre, j'ai testé qu'il n'est pas intrinsèquement regarder dans le fichier de ressources spécifiques à la culture en fonction de l'ensemble de culture en cours.

Ce que je veux, c'est un moyen de rendre la culture du mécanisme de récupération de ressources consciente.

Merci,

Répondre

0

Enfin, j'obtenu le correctif pour mon problème de this link

Dans mon application, je mettais la culture au moment de commencer l'application par mettre le code suivant dans le fichier app.xaml.cs. Cependant, même si je règle la culture initialement, tous les threads n'utiliseront pas la même culture que moi. Ainsi, le thread qui lisait la valeur de ressource pour moi utilisait toujours la culture par défaut et cela entraînait la lecture de la chaîne de ressources toujours à partir du fichier de ressources de culture par défaut plutôt que du fichier de ressources spécifiques à la culture. Donc, l'astuce consistait à définir tous les threads dans mon application pour utiliser la même culture que j'ai définie initialement. Il y a deux propriétés pour ce

  1. CultureInfo.DefaultThreadCurrentCulture
  2. CultureInfo.DefaultThreadCurrentUICulture

valeur de la culture de réglage nécessaire à ces deux propriétés sera d'abord faire en sorte que tous les fils ultérieurs utilisés dans l'application auront la même culture que définie par l'utilisateur. Ces deux propriétés définissent la culture sur tous les threads du domaine d'application actuel. Une fois la culture définie correctement, la lecture des valeurs de ressources devient intrinsèquement sensible à la culture et lit les valeurs de ressources à partir de fichiers de ressources spécifiques à la culture.

Voici donc la version mise à jour de la méthode InitializeCulture:

private static void InitializeCultures() 
    { 
     var culture = ConfigurationManager.AppSettings.Get("Culture"); 
     if (!String.IsNullOrEmpty(culture)) 
     { 
      Thread.CurrentThread.CurrentCulture = CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(culture); 
     } 

     var UICulture = ConfigurationManager.AppSettings.Get("UICulture"); 
     if (!String.IsNullOrEmpty(UICulture)) 
     { 
      Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(UICulture); 
     } 
    } 

post-scriptum Il y a une mise en garde de l'utilisation de ce correctif dans l'application Web. SVP lire à ce sujet sur le lien d'origine.

Espérons que cela aide ...

0

Si vous souhaitez faire de votre culture d'un site Web au courant, vous devrez modifier l'attribut de la mondialisation dans le web.config sous l'élément system.web:

<globalization fileEncoding="utf-8" requestEncoding="utf-8" culture="auto" uiCulture="auto" enableClientBasedCulture="true" /> 

Ensuite, il recherchera les ressources en fonction des paramètres de langue préférés du navigateur.

Vous pouvez spécifier explicitement:

<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="" culture="en-US" uiCulture="en-US" /> 
+0

Merci pour votre réponse. Mais le mien est l'application WPF et non l'application web. Toute idée de comment le faire fonctionner dans l'application WPF? – user2185592

+0

Ahh désolé, j'ai manqué que vous avez mentionné cela dans votre message original. Je ne vois aucun problème avec le code que vous avez fourni. peut-être cette réponse SO aidera: http://stackoverflow.com/a/14163432/4270650 –