2012-03-15 9 views
7

Po prostu nieco rozszerzam mój this question.Jak zrobić lokalizację dla treści pochodzących z @ Html.LabelFor() w mvc3

Mam moją App_LocalResources w mojej aplikacji internetowej MVC (nie mam go w osobnej bibliotece dll).

Mam mój model w innym zestawie. W modelu mam 2 klas Country i City:

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

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

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

Więc w moim metody działania utworzyć i przekazać obiekt z kraju mojego viewmodel.

I w widoku używać to:

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

Tak to działa dobrze i etykieta z tekstem są świadczone w języku angielskim.

Ale jak mogę to zmodyfikować, aby odczytał tekst z moich plików zasobów w mojej aplikacji internetowej?

Odpowiedz

12

można napisać niestandardowy atrybut wyświetlania:

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(); 
    } 
} 

a następnie:

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

Można również wyewidencjonowania following localization guide. Zapewnia pełną implementację przykładowego atrybutu.

+1

Dziękuję Darin za odpowiedź, mam ten kawałek kodu. Ale problem polega na tym, że moje klasy Country, City i MyContainer są w innym projekcie (o nazwie Location.Model). A mój plik zasobów znajduje się w moim projekcie aplikacji webowej mvc3. Wydaje mi się, że Location.Model jest autogenerowanym kodem, bo w plikach cs znajduje się komentarz " // Ten kod został wygenerowany z szablonu.", a także ma jakiś plik .tt w tym. Pomóż mi dowiedzieć się, gdzie i jak robię zmiany. Czy muszę oddzielić projekt Moje zasoby ... proszę o pomoc .. – thinkmmk

+0

@thinkmmk, nie powinieneś przekazywać swoich autogenerowanych modeli swoim poglądom. Przypuszczam, że jest to jakiś autogenerowany model domeny EF. Zawsze powinieneś definiować modele widoku, które są klasami specjalnie zaprojektowanymi dla danego widoku. –

+0

Rozumiem, ale ten projekt wydaje się dość złożony i rozległy. Jak więc muszę iść naprzód, wprowadzając minimalne zmiany. Czy muszę utworzyć nowy obiekt nowej klasy i przekazać go jako model? Ale chodzi o to, że stworzy duplikat klasy. – thinkmmk

3

Możesz użyć [Display(ResourceType = typeof(App_LocalResources), Name = "AgreeTandCs")], gdzie App_LocalResources jest nazwą klasy zasobów (twoja .resx), a Nazwa jest nazwą statycznego ciągu, do którego chcesz się odwoływać. Używaj standardu LabelFor jak zwykle w swoim widoku, który automagicznie pobierze twój zasób.

W moim przykładzie etykieta wyświetla ciąg znaków zapisany pod nazwą o nazwie AgreeTandCs, a jeśli przeglądasz go w języku angielskim, zostanie on wyświetlony na stronie jako "Zgadzam się z tymi warunkami".

Powiązane problemy