2013-05-28 21 views
7

sto cercando di realizzare due cose:Localizzazione in ASP.NET MVC 4 utilizzando App_GlobalResources

  1. localizzare i messaggi di errore “built-in” per “FieldMustBeDate” e "FieldMustBeNumeric".
  2. Localizza alcuni degli altri messaggi di errore che potresti incontrare, ad esempio "PropertyValueRequired".

Utilizzando http://forums.asp.net/t/1862672.aspx/1 per il problema 1 e MVC 4 ignores DefaultModelBinder.ResourceClassKey per problema 2 sono riuscito a ottenere entrambi lavoro a livello locale.

Tuttavia, non appena pubblico su un sito Web, i messaggi di errore "built-in" tornano automaticamente in inglese mentre gli altri messaggi di errore rimangono localizzati.

Ho letto diversi punti in cui è consigliabile evitare l'utilizzo di App_GlobalResources, tuttavia non riesco a risolvere il problema 1 senza utilizzare questo.

Ho creato un file .resx con il nome "WebResources.resx", impostare l'azione di compilazione su "Embedded", impostare la directory Copia su output su "Non copiare", impostare lo strumento personalizzato su "PublicResXFileCodeGenerator" e imposta lo spazio dei nomi degli strumenti personalizzati su "Risorse". Il progetto stesso è impostato per pubblicare solo i file necessari.

mio Global.asax.cs contiene il seguente codice (rilevante):

ClientDataTypeModelValidatorProvider.ResourceClassKey = "WebResources"; 
    DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute), 
    typeof(MyRequiredAttributeAdapter)); 

E il MyRequiredAttributeAdapter classe contiene il seguente codice:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public MyRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
     { 
      attribute.ErrorMessageResourceType = typeof(Resources.WebResources); 
     } 
     if (attribute.ErrorMessageResourceName == null) 
     { 
      attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
     } 
    } 
} 

Questo è il lavoro a livello locale tuttavia qualcuno ha qualche idea su come far funzionare i messaggi "integrati" dopo che questo è stato pubblicato?

Grazie per il vostro aiuto!

Con i migliori saluti, Andreas

risposta

5

ho capito questo fuori me stesso. Se si sta tentando di eseguire quanto sopra, è necessario separare i messaggi di errore localizzati.

Creare un file * .resx per l'altro messaggi di errore fx "PropertyValueRequired" e impostare l'azione di costruzione di “embedded”, impostare la copia di output directory a “fare nessuna copia”, impostare lo strumento personalizzato a “PublicResXFileCodeGenerator” e imposta lo spazio dei nomi degli strumenti personalizzati su "Risorse".

Nel mio caso ho spostato "PropertyValueRequired" ad un file chiamato LocalDanish.resx (ancora nella cartella App_GlobalResources) e ha cambiato la linea nel mio "MyRequiredAttributeAdapter" dal

attribute.ErrorMessageResourceType = typeof(Resources.WebResources); 

a

attribute.ErrorMessageResourceType = typeof(Resources.LocalDanish); 

Per far funzionare i messaggi di errore "integrati", è necessario creare due file * .resx. Ho creato WebResources.resx e WebResources.da.resx. NON modificare nulla, lasciare le impostazioni su di default (Build Action su "Content", ecc.). Immagino che il sito web cerchi automaticamente * .da.resx nel mio caso perché mi hanno fissato il globalizzazione nel mio WebConfig:

<globalization uiCulture="da-DK" culture="da-DK"/> 

Spero che questo aiuti a nessuno.

Con i migliori saluti, Andreas

+0

Grazie! Questo problema mi ha fatto impazzire! – KTW

1

mi hanno fatto alcune aggiunte minori al post originale, che non si traduce tutti i messaggi nel mio caso. (lunghezza della stringa e valori delle proprietà non validi)

Seguire i passaggi precedenti, per creare i file * RESX, impostare le loro proprietà, e quindi impostare il locale nel web.config, come descritto da Andreas.

Quindi creare un paio di adattatori:

// As described in original post: 
public class LocalizedRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public LocalizedRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
      attribute.ErrorMessageResourceType = typeof(Resources.Resources); 
     if (attribute.ErrorMessageResourceName == null) 
      attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
    } 
} 

// Addition to original post: 
public class LocalizedStringLengthAttributeAdapter : StringLengthAttributeAdapter 
{ 
    public LocalizedStringLengthAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     StringLengthAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
      attribute.ErrorMessageResourceType = typeof(Resources.Resources); 
     if (attribute.ErrorMessageResourceName == null) 
      attribute.ErrorMessageResourceName = "StringLengthAttribute_ValidationError"; 
    } 
} 

E in Global.asax.cx:

// Addition to original post: (Used for "PropertyValueInvalid") 
DefaultModelBinder.ResourceClassKey = "Resources"; 

// As described in original post: 
ClientDataTypeModelValidatorProvider.ResourceClassKey = "Resources"; 
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredAttribute), typeof(LocalizedRequiredAttributeAdapter)); 
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthAttribute), typeof(LocalizedStringLengthAttributeAdapter));