2012-03-15 6 views
7

Sto semplicemente estendendo un po 'il mio this question.Come localizzare i contenuti provenienti da @ Html.LabelFor() in mvc3

Ho il mio App_LocalResources nella mia applicazione Web MVC (non ce l'ho in dll separata).

Ho un mio modello in assemblaggio diverso. Nel Modello ho 2 classi Country e City:

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

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

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

Così nel mio metodo di azione che creare e trasferire un oggetto di paese come il mio ViewModel.

E nella visualizzazione Io uso questo:

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

Quindi questo funziona bene e l'etichetta con testo siano resi in inglese.

Ma come si modifica questo in modo che legga il testo dai miei file di risorse nella mia applicazione Web?

risposta

12

Si potrebbe scrivere un attributo di visualizzazione personalizzato:

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

e poi:

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

Si può anche checkout il following localization guide. Fornisce un'implementazione completa di un attributo di esempio.

+1

Grazie Darin per la tua risposta, ho preso quel pezzo di codice. Ma il problema ora è che le mie classi Country, City e MyContainer si trovano in un progetto diverso (chiamato Location.Model). E il mio file di risorse è nel mio progetto di applicazione web mvc3. The Location.Model mi sembra un codice generato automaticamente, coz nei file cs theres comment " // Questo codice è stato generato da un modello." e ha anche qualche file .tt dentro. Quindi, per favore aiutami a capire dove e come faccio i cambiamenti. Ho bisogno di separare il mio progetto Risorse ... per favore aiuto .. – thinkmmk

+0

@thinkmmk, non dovresti passare usare i modelli generati automaticamente alle tue visualizzazioni. Suppongo che sia un modello di dominio autogenerato EF. È sempre necessario definire i modelli di vista che sono classi progettate specificamente per una determinata vista. –

+0

Ho capito il motivo, ma questo progetto sembra abbastanza complesso e vasto. Quindi, come ho bisogno di andare avanti con le modifiche minime da apportare. Devo creare un nuovo oggetto di una nuova classe e passarlo come modello? Ma la cosa è che creerà una classe duplicata. – thinkmmk

3

È possibile utilizzare [Display(ResourceType = typeof(App_LocalResources), Name = "AgreeTandCs")] dove App_LocalResources è il nome della classe di risorse (il proprio .resx) e Nome è il nome della stringa statica a cui si desidera fare riferimento. Utilizza LabelFor come di consueto nella tua vista e attirerà automaticamente la tua risorsa.

Nel mio esempio, l'etichetta visualizza la stringa memorizzata con il nome variabile AgreeTandCs e, se la stai visualizzando in inglese, verrà visualizzata nella pagina "Accetto i presenti Termini e condizioni".

0

È inoltre possibile utilizzare la traduzione con i parametri {0}, {2} all'interno della stringa di traduzione. Lui è il mio esempio Localize Compare attribute

+0

Potresti riassumere il contenuto del link? Grazie. – rapvelopment

Problemi correlati