2015-07-30 22 views
17

Sto provando a migrare il mio progetto ASP.NET MVC 5 esistente in MVV 6 progetto vNext, mentre sono riuscito a risolvere e risolvere gran parte dei problemi, non riesco a trovare alcuna documentazione su come utilizzare la risorsa RESX file per la localizzazione in MVC 6MVC 6: come utilizzare i file RESX?

miei ViewModels stanno usando affermazioni come

[Required(ErrorMessageResourceType = typeof(Resources.MyProj.Messages), ErrorMessageResourceName = "FieldRequired")] 

Questo ha funzionato bene in MVC 5 fino a quando il RESX è stato incluso correttamente e i modificatori di accesso sono stati fissati in modo corretto, ma doesnt sembrano lavoro in un progetto vNext Qualcuno sa come può essere usato RESX nei progetti MVC 6 vNext?

Ho visto alcuni post qui e sul sito dell'hub GIT che dicono che la storia di localizzazione per ASP.NET 5/MVC 6 è completa ma non trovo alcun campione decente in cui sono state utilizzate le stringhe di risorse.

Utilizzando il codice di cui sopra mi dà un errore di

CS0246 errore non è stato trovato Il tipo o dello spazio dei nomi il nome 'Risorse' (che le manca un un riferimento all'assembly direttiva using o?)

Edit: Modificato il testo per chiarire che sto cercando per l'attuazione della localizzazione in vNext (MVC) 6 progetti, sono in grado di farlo funzionare in MVC 5.

Edit 2: ha ottenuto il bit localizzazione lavorando un Dopo aver implementato la risposta di Mohammed, sono bloccato da un nuovo errore ora.

Una volta ho includono

"Microsoft.AspNet.Localization": "1.0.0-beta7-10364", 
    "Microsoft.Framework.Localization": "1.0.0-beta7-10364", 

pacchetti e aggiungere la seguente riga nel ConfigureServices nel Startup.cs

services.AddMvcLocalization(); 

ottengo un nuovo errore quando si sta eseguito il codice seguente.

public class HomeController : Controller 
    { 
     private readonly IHtmlLocalizer _localizer; 

     public HomeController(IHtmlLocalizer<HomeController> localizer) 
     { 
      _localizer = localizer; 
     } 
      .... 

errore: Si è verificato

Eccezione non gestita durante l'elaborazione della richiesta.

InvalidOperationException: Impossibile risolvere il servizio per il tipo 'Microsoft.Framework.Runtime.IApplicationEnvironment' durante il tentativo di attivare 'Microsoft.Framework.Localization.ResourceManagerStringLocalizerFactory'. Microsoft.Framework.DependencyInjection.ServiceLookup.Service.CreateCallSite (ServiceProvider fornitore, ISet`1 callSiteChain)

riesco a capire se una dipendenza che mi manca o c'è un problema nel codice

Modifica 3:

A chiunque sia ancora alla ricerca di una soluzione. A questo punto, è possibile utilizzare il codice nella risposta tramite Muhammad Rehan Saee per ottenere il supporto per la localizzazione nel proprio CSHTML.Tuttavia la storia per consentire la localizzazione in validazione attributi non è ancora finito (al momento di questa modifica: 08/Set/2015) Date un'occhiata la questione sul sito GitHub per MVC qui di seguito:

https://github.com/aspnet/Mvc/issues/2766#issuecomment-137192942

PS: Per risolvere l'InvalidOperationException ho fatto la seguente

Prendendo tutte le dipendenze come il beta7- * e cancellare tutti i contenuti della mia C: \ Users \ \ .dnx pacchetti sono liberato dell'errore.

dettagli sulla questione ho sollevato:

https://github.com/aspnet/Mvc/issues/2893#issuecomment-127164729

Edit: 25/Dic/2015

Questa è finalmente lavorando in MVC 6 ora.

ha postato sul blog veloce qui: http://pratikvasani.github.io/archive/2015/12/25/MVC-6-localization-how-to/

+1

@Coulton: Sono in grado di utilizzare RESX nel mio progetto di 5 MVC esistente come lei ha citato nella il link sopra, il mio problema è che non funziona in MVC 6 con i nuovi progetti vNext. Sto cercando un modo per lavorare con i file Resx esistenti in MVC 6 – Pratik

risposta

4

È possibile dare un'occhiata a un campione completo sul progetto ASP.NET MVC GitHub here. Al momento della stesura di questo è tutto un codice molto nuovo e soggetto a modifiche. È necessario aggiungere il seguente nella vostra startup:

public class Startup 
{ 
    // Set up application services 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Add MVC services to the services container 
     services.AddMvc(); 
     services.AddMvcLocalization(); 

     // Adding TestStringLocalizerFactory since ResourceStringLocalizerFactory uses ResourceManager. DNX does 
     // not support getting non-enu resources from ResourceManager yet. 
     services.AddSingleton<IStringLocalizerFactory, TestStringLocalizerFactory>(); 
    } 

    public void Configure(IApplicationBuilder app) 
    { 
     app.UseCultureReplacer(); 

     app.UseRequestLocalization(); 

     // Add MVC to the request pipeline 
     app.UseMvcWithDefaultRoute(); 
    } 
} 

La IStringLocalizerFactory sembra essere utilizzato per creare istanze di IStringLocalizer dai tipi Resx. È quindi possibile utilizzare IStringLocalizer per ottenere le stringhe localizzate. Qui è l'interfaccia completa (LocalizedString è solo una coppia di valori nome):

/// <summary> 
/// Represents a service that provides localized strings. 
/// </summary> 
public interface IStringLocalizer 
{ 
    /// <summary> 
    /// Gets the string resource with the given name. 
    /// </summary> 
    /// <param name="name">The name of the string resource.</param> 
    /// <returns>The string resource as a <see cref="LocalizedString"/>.</returns> 
    LocalizedString this[string name] { get; } 

    /// <summary> 
    /// Gets the string resource with the given name and formatted with the supplied arguments. 
    /// </summary> 
    /// <param name="name">The name of the string resource.</param> 
    /// <param name="arguments">The values to format the string with.</param> 
    /// <returns>The formatted string resource as a <see cref="LocalizedString"/>.</returns> 
    LocalizedString this[string name, params object[] arguments] { get; } 

    /// <summary> 
    /// Gets all string resources. 
    /// </summary> 
    /// <param name="includeAncestorCultures"> 
    /// A <see cref="System.Boolean"/> indicating whether to include 
    /// strings from ancestor cultures. 
    /// </param> 
    /// <returns>The strings.</returns> 
    IEnumerable<LocalizedString> GetAllStrings(bool includeAncestorCultures); 

    /// <summary> 
    /// Creates a new <see cref="ResourceManagerStringLocalizer"/> for a specific <see cref="CultureInfo"/>. 
    /// </summary> 
    /// <param name="culture">The <see cref="CultureInfo"/> to use.</param> 
    /// <returns>A culture-specific <see cref="IStringLocalizer"/>.</returns> 
    IStringLocalizer WithCulture(CultureInfo culture); 
} 

Infine è possibile iniettare il IStringLocalizer nel controller in questo modo (Si noti che IHtmlLocalizer<HomeController> eredita da IStringLocalizer):

public class HomeController : Controller 
{ 
    private readonly IHtmlLocalizer _localizer; 

    public HomeController(IHtmlLocalizer<HomeController> localizer) 
    { 
     _localizer = localizer; 
    } 

    public IActionResult Index() 
    { 
     return View(); 
    } 

    public IActionResult Locpage() 
    { 
     ViewData["Message"] = _localizer["Learn More"]; 
     return View(); 
    } 
} 
+1

Grazie per le informazioni, ora capisco cosa stanno cercando di fare con la gestione delle risorse, purtroppo ho incontrato un altro problema. Sembra che i pacchetti abbiano dei conflitti in loro Non appena aggiungo "Microsoft.Framework.Localization": "1.0.0-beta7-10364", come dipendenza, comincio a ricevere l'errore: ** Metodo non trovato: 'Boolean Microsoft.Framework.DependencyInjection.ServiceCollectionExtensions.TryAdd ** Qualche volta hai visto questo errore? – Pratik

+0

Stai utilizzando tutti i 7 bit Beta? Devo ammettere, non ho ancora avuto la possibilità di provare i bit di localizzazione. –

+1

Sto usando beta7 dove posso. In realtà ho anche provato con la versione beta5 di Microsoft.Framework.Localization. Non sembra funzionare neanche :( È sorprendente il fatto che manchino così tante funzionalità di base con MVC 6. Speravo che ne avrebbero scaricato alcune prima di RTM – Pratik

3

Cose sono stati modificati in mvc 6.0.0-rc1-final. Dopo aver consultato molti altri forum, la configurazione di seguito funzionerà se qualcuno prevede di lavorare con le ultime modifiche alla funzione di localizzazione.

In startup.cs configurare

public void ConfigureServices(IServiceCollection services) 
    {   
     services.AddMvc();   
     services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(); 
     services.AddSingleton<IStringLocalizerFactory, CustomStringLocalizerFactory>(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    {   
     var requestLocalizationOptions = new RequestLocalizationOptions 
     {     
      SupportedCultures = new List<CultureInfo>{ 
       new CultureInfo("en-US"),  
       new CultureInfo("fr-CH") 
      }, 
      SupportedUICultures = new List<CultureInfo> 
      { 
       new CultureInfo("en-US"),      
       new CultureInfo("fr-CH")      
      } 
     }; 
     app.UseRequestLocalization(requestLocalizationOptions, new RequestCulture(new CultureInfo("en-US")));   
    } 

e si può iniziare a utilizzare IHtmlLocalizer controller.

e si può testare con querystring http://localhost:5000/Home/Contact?culture=fr-CH o cambiare la cultura in cromo con l'aggiunta di lingua preferita in "Lingua e immissione impostazione"

+4

Perché postare codice incompleto? Poiché quando saltare un 'CustomStringLocalizerFactory' è considerato non rilevante? –

Problemi correlati