6

Secondo il documentation:ASP.NET Nucleo DisplayAttribute Localizzazione

The runtime doesn’t look up localized strings for non-validation attributes. In the code above, “Email” (from [Display(Name = "Email")]) will not be localized.

Sto cercando un modo per localizzare testo in DisplayAttribute. Qualche suggerimento per farlo in modo corretto (s)?

risposta

5

È possibile impostare ResourceType su DisplayAttribute che può essere utilizzato per localizzare il testo.

Aggiungere una risorsa .resx al progetto, ad es. MyResources.resx, e aggiungere una risorsa per il vostro campo:

enter image description here

quindi fare riferimento il nome del campo e il tipo MyResources nel DisplayAttribute

[Display(Name = "RememberMe", ResourceType = typeof(MyResources))] 
public bool RememberMe { get; set; } 

La risorsa localizzata sarà tirato attraverso automaticamente (vedere la casella di testo)

Nota: non esiste attualmente un bug in RC2 che gettare un NotImplementedException se si utilizzano caratteri non latini nei tuoi valori delle risorse: https://github.com/aspnet/Razor/issues/760

+1

Sembra strano che gli attributi non convalida non sono localizzati in base a questo nuovo meccanismo di localizzazione nucleo asp.net. Pensi che sia possibile implementarlo anche per gli attributi di non convalida, o c'è una ragione per cui i ragazzi di mvc hanno saltato gli attributi di non validazione? – David

+0

Sono d'accordo, è un po 'strano! Presumo che ci debba essere una ragione per cui hanno deciso di non farlo, ma non ne sono sicuro. Puoi sempre chiedere a GitHub e vedere cosa dicono. – Sock

+1

Ricevo 'Il tipo o lo spazio dei nomi 'MyResources' non è stato trovato '. Cosa mi manca? – Lucius

1

ho appena creato un progetto che dimostra la localizzazione tra cui la localizzazione di Attributo di visualizzazione per la classe proprietà e enumerazioni.

Il progetto può essere trovato qui https://github.com/feradz/ASPNetCoreLocalization/wiki

l'attributo di visualizzazione deve essere localizzato utilizzando l'approccio prima di ASP.NET 1.0 Nucleo. Dai un'occhiata al file DataAnnotations.resx nel progetto.

La proprietà Name di Display non può contenere spazi vuoti e caratteri speciali.

[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))] 
public string FirstName { get; set; } 

ResourceType dovrebbe essere il nome completo della classe di risorsa (cioè compreso lo spazio dei nomi).

2

In realtà ho trovato una soluzione semplice per i follower. Il nome visualizzato nella maggior parte dei casi viene utilizzato nell'etichetta di un campo di input. Quindi, fare questo se vi piace:

<label asp-for="Email">@Localizer["Email"]</label> 

naturalmente, è possibile passare il nome della proprietà da @Html.DisplayNameFor, ma la maggior parte del tempo, questo funziona già bene.

2

Avere una posizione centrale per tutte le tue localizzazioni, sia in vista che in data, è l'approccio migliore a cui riesco a pensare, e questo come ho avuto modo di lavorare. In Startup.cs file dopo l'installazione di pacchetti Nuget per la localizzazione aggiungere il seguente codice

services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(options => 
    options.DataAnnotationLocalizerProvider = (type, factory) => new StringLocalizer<Resources>(factory)); 

services.Configure<RequestLocalizationOptions>(options => { 
    var cultures = new[] 
    { 
     new CultureInfo("en"), 
     new CultureInfo("ar") 
    }; 
    options.DefaultRequestCulture = new RequestCulture("en", "en"); 
    options.SupportedCultures = cultures; 
    options.SupportedUICultures = cultures; 
}); 

In questo modo il DataAnnotationLocalizerProvider sarà dalle Risorse. {} Cultura.rex - (Il file di risorse deve avere un modificatore di accesso di codice gen) - presupponendo che nessuna risorsa sarà necessaria per la lingua predefinita e per poter accedere al file di risorse poiché non verrà generato codice e classe vuota con lo stesso nome deve essere creato.

e in _ViewImports.cshtml file di iniettare il seguente

@inject IHtmlLocalizer<Resources> Localizer 

facendo questo adesso avete una variabile globale Localizer da utilizzare in una qualsiasi delle viste per scopi di localizzazione.

This is how a Central Location for String Localization

si possono trovare ulteriori informazioni sul Globalization and localization in ASP.NET Core