2015-07-30 11 views
17

Ich versuche, mein vorhandenes ASP.NET MVC 5 Projekt zu MVC 6 vNext Projekt zu migrieren, während ich in der Lage gewesen bin, die meisten Probleme zu lösen und zu lösen, finde ich keine Dokumentation zur Verwendung der RESX-Ressource in MVC-Dateien für die Lokalisierung 6MVC 6: Wie benutzt man RESX-Dateien?

Meine Viewmodel verwenden Aussagen wie

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

das funktionierte in MVC 5 in Ordnung, solange die RESX richtig und die Zugriffsmodifikatoren enthalten war wurden richtig eingestellt, aber es scheint nicht zu in einem vNext-Projekt arbeiten Weiß jemand, wie RESX in MVC 6 vNext-Projekten verwendet werden kann?

Ich habe ein paar Posts hier und auf der GIT-Hub-Site gesehen, die sagen, dass die Lokalisierungsstory für ASP.NET 5/MVC 6 komplett ist, aber ich finde kein anständiges Beispiel, wo die Resource-Strings verwendet wurden.

dem Code gibt mir über einen Fehler

CS0246 Fehler der Art oder der ‚Ressourcen‘ Namespace-Namen nicht gefunden werden konnte (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis?)

Edit: Changed Text klarstellen, dass ich für die Umsetzung der Lokalisierung in vNext (MVC 6) Projekte, ich bin in der Lage, um es in MVC funktioniert 5.

Edit 2 Suche: die Lokalisierung Bit ein erhielt Arbeits Nachdem ich die Antwort von Mohammed umgesetzt habe, stehe ich jetzt vor einem neuen Fehler.

Sobald ich Fügen Sie

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

Pakete und fügen Sie die folgende Zeile in ConfigureServices im Startup.cs

services.AddMvcLocalization(); 

Ich bekomme einen neuen Fehler, wenn der folgende Code ausgeführt zu werden.

public class HomeController : Controller 
    { 
     private readonly IHtmlLocalizer _localizer; 

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

Fehler:

Eine nicht behandelte Ausnahme beim Verarbeiten der Anforderung.

InvalidOperationException: Kann Dienst für Typ 'Microsoft.Framework.Runtime.IApplicationEnvironment' zu lösen, während versucht 'Microsoft.Framework.Localization.ResourceManagerStringLocalizerFactory' zu aktivieren. Microsoft.Framework.DependencyInjection.ServiceLookup.Service.CreateCallSite (Serviceprovider Anbieter, ISet`1 callSiteChain)

Wenn es eine Abhängigkeit herauszufinden Cant ich bin fehlt oder es gibt ein Problem in dem Code

Bearbeiten 3:

Für alle, die immer noch nach einer Lösung suchen. Zu diesem Zeitpunkt können Sie den Code in der Antwort von Muhammad Rehan Saee verwenden, um Lokalisierungsunterstützung in Ihrem CSHTML zu erhalten.Doch die Geschichte Lokalisierung bei der Validierung zu ermöglichen Attribute ist noch nicht geschehen (zum Zeitpunkt dieser edit: 08/Sep/2015) Werfen Sie einen Blick auf das Thema auf der GitHub Website für mvc unter:

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

PS: Um die InvalidOperationException zu beheben ich habe die folgende

Betrachtet man alle Abhängigkeiten als beta7- * und Clearing alle Inhalte meiner C: \ Benutzer \ .dnx \ packages wurde der Fehler beseitigen.

Details zu der Frage, die ich angesprochen:

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

Edit: 25/Dec/2015

Dies funktioniert schließlich in MVC 6 jetzt.

Schrieb eine schnelle Blog-Post hier: http://pratikvasani.github.io/archive/2015/12/25/MVC-6-localization-how-to/

+1

@Coulton: Ich bin in der Lage RESX zu verwenden, in meinem vorhandenen MVC 5 Projekt wie Sie erwähnten in der Link oben, mein Problem ist, dass nicht funktioniert in MVC 6 mit den neuen vNext-Projekten. Ich suche nach einer Möglichkeit, mit den vorhandenen Resx-Dateien in MVC 6 – Pratik

Antwort

4

Sie einen Blick auf eine vollständige Probe here auf dem ASP.NET MVC GitHub Projekt nehmen. Zum Zeitpunkt des Schreibens ist dies alles ein sehr neuer Code und kann sich ändern. Sie müssen die folgenden in Ihrem Autostart hinzuzufügen:

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

Die IStringLocalizerFactory scheint verwendet zu werden Instanzen von IStringLocalizer von ResX Typen zu erstellen. Sie können dann die IStringLocalizer verwenden, um Ihre lokalisierten Zeichenfolgen zu erhalten. Hier ist die vollständige Schnittstelle (LocalizedString ist nur ein Name-Wert-Paar):

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

Schließlich können Sie die IStringLocalizer in der Controller injizieren wie so (Beachten Sie, dass IHtmlLocalizer<HomeController> erbt von 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

zu arbeiten Danke für die Info, ich verstehe jetzt, was sie mit der Ressourcenbehandlung zu tun versuchen, leider bin ich auf ein anderes Problem gestoßen. Es scheint, die Pakete haben Konflikte in ihnen Sobald ich hinzufügen "Microsoft.Framework.Localization": "1.0.0-beta7-10364", als eine Abhängigkeit, ich beginne, den Fehler zu bekommen: ** Methode nicht gefunden: 'Boolean Microsoft.Framework.DependencyInjection.ServiceCollectionExtensions.TryAdd ** Haben Sie eine Chance, diesen Fehler schon einmal gesehen zu haben? – Pratik

+0

Verwenden Sie alle Beta 7 Bits? Ich muss zugeben, dass ich die Lokalisierungs-Bits noch nicht ausprobieren konnte. –

+1

Ich benutze beta7 wo ich kann. Eigentlich habe ich es auch mit der Beta5-Version von Microsoft.Framework.Localization versucht. Das scheint auch nicht zu funktionieren :( Es ist überraschend, wie so viele grundlegende Funktionen mit MVC 6 fehlen. Ich hatte gehofft, sie hätten einige davon vor dem RTM – Pratik

3

Things wurden in mvc 6.0.0-rc1-final geändert. Nach der Durchführung vieler anderer Foren funktioniert die Konfiguration unten, wenn jemand mit den neuesten Änderungen in der Lokalisierungsfunktion arbeiten möchte.

In startup.cs konfigurieren

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

und Sie können mit IHtmlLocalizer in Controller starten.

und Sie können testen, mit Abfragezeichenfolgeflag http://localhost:5000/Home/Contact?culture=fr-CH oder der Kultur in Chrom ändern, indem Sie die gewünschte Sprache Hinzufügen unter „Sprache und Input Setting“

+4

Warum Buchung unvollständiger Code? Da beim Überspringen eine 'CustomStringLocalizerFactory' als nicht relevant angesehen wird? –