2012-03-15 16 views
7

Estoy ampliando un poco mi this question.Cómo hacer la localización de los contenidos procedentes de @ Html.LabelFor() en mvc3

Tengo mi App_LocalResources en mi aplicación web MVC (no la tengo en dll por separado).

Tengo un Modelo en otro ensamblaje. En el modelo que tengo 2 clases Country y City:

public class Country: MyContainer 
{ 
    public City city {get;set;} 
} 

public class City 
{ 
    public CityName {get;set;} 
} 

public class MyContainer 
{ 
    public Cid {get;set;} 
} 

Así que en mi método de acción que crear y pasar un objeto de mi país como modelo de vista.

Y en la vista que utilizan este:

@Html.LabelFor(mdl=>mdl.City.CityName) 
@Html.LabelFor(mdl=>mdl.Cid) 

Así que esto funciona bien y la etiqueta con el texto se prestan en Inglés.

¿Pero cómo modifico esto para que lea el texto de mis archivos de recursos en mi aplicación web?

Respuesta

12

Se podría escribir un atributo de visualización personalizado:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute 
{ 
    public LocalizedDisplayNameAttribute(string key): base(FormatMessage(key)) 
    { 
    } 

    private static string FormatMessage(string key) 
    { 
     // TODO: fetch the corresponding string from your resource file 
     throw new NotImplementedException(); 
    } 
} 

y luego:

public class City 
{ 
    [LocalizedDisplayName("cityname")] 
    public string CityName { get; set; } 
} 

También es posible que el pago y envío following localization guide. Proporciona una implementación completa de un atributo de muestra.

+1

Gracias Darin por su respuesta, obtuve ese fragmento de código. Pero el problema ahora es que mis clases Country, City y MyContainer están en un proyecto diferente (se llama Location.Model). Y mi archivo de recursos está en mi proyecto de aplicación web mvc3. El Location.Model me parece que es código autogenerado, porque en los archivos cs hay comentarios " // Este código fue generado a partir de una plantilla." y también tiene algún archivo .tt en eso. Así que ayúdame a descubrir dónde y cómo hago los cambios. ¿Debo separar mi proyecto de Recursos ... por favor ayuda ... – thinkmmk

+0

@thinkmmk, no debes pasar el uso de modelos autogenerados a tus vistas. Supongo que es un modelo de dominio autogenerado EF. Siempre debe definir modelos de vista que son clases diseñadas específicamente para una vista determinada. –

+0

Entiendo tu punto, pero este proyecto parece ser bastante complejo y vasto. Entonces, ¿cómo debo avanzar para hacer cambios mínimos? ¿Necesito crear un nuevo objeto de una nueva clase y pasar eso como modelo? Pero la cosa es que esto creará una clase duplicada. – thinkmmk

3

Puede utilizar [Display(ResourceType = typeof(App_LocalResources), Name = "AgreeTandCs")] donde App_LocalResources es el nombre de la clase de recurso (el .resx) y el nombre es el nombre de la cadena estática que desea hacer referencia. Use LabelFor como de costumbre en su vista, y automágicamente atraerá su recurso.

En mi ejemplo, la etiqueta muestra la cadena almacenada con el nombre de variable AgreeTandCs, y si la está viendo en inglés se mostrará en la página como "Acepto estos Términos y condiciones".

0

También puede usar la traducción con {0}, {2} parámetros dentro de la cadena de traducción. Él es mi ejemplo Localize Compare attribute

+0

¿Podría resumir el contenido del enlace? Gracias. – rapvelopment

Cuestiones relacionadas