Message d’erreur: Le modèle ne sélectionne pas le fichier de ressources spécifique à la langue

Je veux afficher le message d’erreur de modèle en espagnol et j’ai défini ces chaînes dans des fichiers resourse. J’ai fait de même pour les autres chaînes de la page en utilisant la syntaxe de razor, mais celles de l’annotation ViewModel ne sont pas sélectionnées.

En fait, il choisit les valeurs par défaut – anglais. Donc, je suppose que la langue / culture n’a peut-être pas été détectée, mais que d’autres chaînes de la page sont affichées en espagnol

//Spanish: El campo {0} se requiere //English: The {0} field is required <--- this comes out always irrespective of set language [Required(ErrorMessageResourceName = "ErrorMessage_Required", ErrorMessageResourceType = typeof(GlobalResources.Resources))] [Display(Name = "CardNumber", ResourceType = typeof(GlobalResources.Resources) )] public string CardNumber { get; set; } 

Je règle la langue dans mon contrôleur

 protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); HttpCookie cookie = Request.Cookies["lang"]; ssortingng lang = cookie != null ? cookie.Value : "en-US"; System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); } 

Comment étendre les parameters de culture à ViewModels?

Mise à jour Un article similaire: Mondialisation MVC3: il faut un filtre global avant la liaison du modèle

Mise à jour La modification de la langue préférée dans les parameters de mon navigateur l’a fait fonctionner. Cela signifie que les atsortingbuts du modèle utilisent ces parameters, ce qui n’est pas affecté par System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); . Y a-t-il un moyen d’y arriver? – Toujours à la recherche….

Mise à jour: Déplacer le code vers Application_AcquireRequestState semble le résoudre.

 protected void Application_AcquireRequestState() { HttpCookie cookie = Request.Cookies["lang"]; ssortingng lang = cookie != null ? cookie.Value : "en-US"; System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); } 

L’explication que j’ai obtenue , également trouvée dans le lien affiché dans cette question, qu’il était trop tard pour que le modèle utilise la culture définie dans la méthode surchargée du contrôleur, car la liaison avait déjà eu lieu avant l’appel de la méthode. Ce lien était utile

Assurez-vous de définir CurrentCulture et CurrentUICulture . Je soupçonne que CurrentCulture correspond à ce que les fichiers de ressources examinent:

  //I've taken off System.Threading, add a using to it (aids readability) Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(lang); 

Essayez d’utiliser la classe ci-dessous

 public sealed class LanguageManager { ///  /// Default CultureInfo ///  public static readonly CultureInfo DefaultCulture = new CultureInfo("en-US"); ///  /// Available CultureInfo that according resources can be found ///  public static readonly CultureInfo[] AvailableCultures; static LanguageManager() { List availableResources = new List(); ssortingng resourcespath = Path.Combine(System.Web.HttpRuntime.AppDomainAppPath, "App_GlobalResources"); DirectoryInfo dirInfo = new DirectoryInfo(resourcespath); foreach (FileInfo fi in dirInfo.GetFiles("*.*.resx", SearchOption.AllDirectories)) { //Take the cultureName from resx filename, will be smt like en-US ssortingng cultureName = Path.GetFileNameWithoutExtension(fi.Name); //get rid of .resx if (cultureName.LastIndexOf(".") == cultureName.Length - 1) continue; //doesnt accept format FileName..resx cultureName = cultureName.Subssortingng(cultureName.LastIndexOf(".") + 1); availableResources.Add(cultureName); } List result = new List(); foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) { //If language file can be found if (availableResources.Contains(culture.ToSsortingng())) { result.Add(culture); } } AvailableCultures = result.ToArray(); CurrentCulture = DefaultCulture; if (!result.Contains(DefaultCulture) && result.Count > 0) { CurrentCulture = result[0]; } } ///  /// Current selected culture ///  public static CultureInfo CurrentCulture { get { return Thread.CurrentThread.CurrentCulture; } set { Thread.CurrentThread.CurrentUICulture = value; Thread.CurrentThread.CurrentCulture = value; } } } 

Et enfin définissez la culture comme ci-dessous.

 LanguageManager.CurrentCulture = new CultureInfo("Your culture"); 

et maintenant remplacer la culture