6

Ich habe versucht, Lokalisierung für meine ASP.NET Core 1.0 RTM-Webanwendung nach microsofts documentation zu implementieren, und ich kann es einfach nicht zum Laufen bringen. Das Problem, das ich habe, ist, dass es immer Zeichenfolgen aus der englischen Ressourcendatei anzeigt, egal wie ich die Kultur einstelle.ASP.NET Core 1.0 RTM-Lokalisierung funktioniert nicht

Wenn jemand 5 Minuten ihrer Zeit hat, wäre ich wirklich dankbar für Ihre Eingabe.

Hier ist mein Startup.cs Inhalt, die die Lokalisierung in Bezug auf:

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddMvc() 
    .AddViewLocalization(LanguageViewLocationExpanderFormat.SubFolder) 
    .AddDataAnnotationsLocalization(); 
    services.AddScoped<LocalizationFilter>(); 
    services.AddLocalization(options => options.ResourcesPath = "Resources"); 

    var supportedCultures = new List<CultureInfo>{ 
    new CultureInfo("en-US"), 
    new CultureInfo("sl-SI"), 
    new CultureInfo("de-DE"), 
    new CultureInfo("hr-HR") 
    }; 
    services.Configure<RequestLocalizationOptions>(options => 
    { 
    options.SupportedCultures = supportedCultures; 
    options.SupportedUICultures = supportedCultures; 
    options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"), 
     new CultureInfo("en-US")); 
    }); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
    ILoggerFactory loggerFactory) 
{ 
     ... 
     var supportedCultures = new List<CultureInfo>{ 
     new CultureInfo("en-US"), 
     new CultureInfo("sl-SI"), 
     new CultureInfo("de-DE"), 
     new CultureInfo("hr-HR") 
     }; 
     var requestLocalizationOptions = new RequestLocalizationOptions 
     { 
     SupportedCultures = supportedCultures, 
     SupportedUICultures = supportedCultures, 
     DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"), 
      new CultureInfo("en-US")) 
     }; 
     app.UseRequestLocalization(requestLocalizationOptions); 
} 

Und das ist, wie ich die Kultur innerhalb OnActionExecuting bin Wechsel in meiner Action

actionContext.HttpContext.Response.Cookies.Append(
    CookieRequestCultureProvider.DefaultCookieName, 
    CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), 
    new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }); 
CultureInfo.CurrentCulture = culture; 
CultureInfo.CurrentUICulture = culture; 

Ich habe auch versucht, zu tun Dies auf meinem Controller ohne Glück. In meinen Ansichten verwende ich @inject IViewLocalizer Localizer, um lokalisierte Strings mit @Localizer["Name"] anzuzeigen.

  • Resources/Ansichten/controller/ViewName.en.resx
  • Resources/Ansichten/controller/ViewName.sl:

    Mein resoucres werden im Ordner Resources/Ansichten/controller wie so gelegen .resx

  • ...

der String angezeigt ist immer von der .en Ressource Datei, egal wie ich versuche, die Kultur zu verändern. Gibt es etwas, das mir fehlt? Gibt es noch etwas, was ich tun soll? Es scheint, das Problem, das ich habe, ist mit der Einstellung der Sprache. Basierend auf der Dokumentation, die Sie nur den Cookie mit Response.Cookies.Append setzen sollen, aber ich habe auch versucht, mit CultureInfo.CurrentCulture als Thread.CurrentThread.CurentCulture ist nicht mehr verfügbar.

Ich weiß wirklich nicht, was ich vermisse. Irgendwelche Ideen überhaupt?

Antwort

4

Sie wahrscheinlich schlagen die folgenden: https://github.com/aspnet/Mvc/issues/4692

Vor allem einen Blick auf den Kommentar übernehmen: https://github.com/aspnet/Mvc/issues/4692#issuecomment-223671462

Zusammenfassung: Sie können einen Resource Filter in MVC erstellen, das Problem zu umgehen:

public class CultureSettingResourceFilter : IResourceFilter, IOrderedFilter 
{ 
    public int Order 
    { 
     get 
     { 
      return int.MinValue; 
     } 
    } 

    public void OnResourceExecuted(ResourceExecutedContext context) 
    { 
     // By this time the response would already have been started, so do not try to modify the response 
    } 

    public void OnResourceExecuting(ResourceExecutingContext context) 
    { 
     var culture = httpContext.GetRouteValue("your-culture-key-name")?.ToString(); 
     // set your culture here 
     CultureInfo.CurrentCulture = culture; 
     CultureInfo.CurrentUICulture = culture; 
    } 
} 

services.AddMvc(o => 
{ 
    o.Filters.Add(new CultureSettingResourceFilter()); 
}); 
+0

Vielen Dank. Ja, meine Lokalisierung funktioniert tatsächlich, wenn ich eine Lokalisierung in OnResourceExecuting fest codiere. Das Problem, das ich jetzt habe, ist die erwünschte Kultur zu bekommen. Ich versuche, die Kultur von der URL wie http: // localhost: 5000/sl/otherStuff zu bekommen. Gibt es eine Möglichkeit, wie ich es in OnResourceExecuting bekommen kann? –

+1

Wenn Sie Filter verwenden, haben Sie Zugriff auf die Routendaten der aktuellen Anfrage, so dass Sie 'httpContext.GetRouteValue (" culture-key-name ")' ausführen können (Sie müssten den 'Microsoft.AspNetCore.Routing' Namespace hinzufügen, um die' ' GetRouteValue "und" GetRouteData "Erweiterungen. –

+0

Vielen Dank für Ihre Hilfe. Jetzt, da ich alles ausprobiert habe, bestätige ich, dass es funktioniert. Danke. –

1

Ich experimentierte mit i18n und ich habe meine Übersetzungen, wenn die Kulturen mit den Kulturen in den Ressourcendateinamen

var supportedCultures = new List<CultureInfo>{ 
    new CultureInfo("en-US"), 
    new CultureInfo("sl-SI"), 
    new CultureInfo("de-DE"), 
    new CultureInfo("hr-HR") 
    }; 

Änderung abgestimmt unterstützt arbeiten, um Ihre Ressourcendateinamen von

Resources/Ansichten/controller /ViewName.sl.resx

auf spezifische Sprachkultur

Ressourcen/Ansichten/Controllername/ViewName.sl-SI.resx

+0

Vielen Dank für Ihre Zeit und Antwort, aber das hat mein Problem nicht gelöst. –

0

Bearbeiten Sie auf @Siim Haas.
Es funktioniert gut.
In meinem Fall: ich mit dem LanguageViewLocationExpanderFormat.SubFolder

Bei ConfigureServices (IServiceCollection Dienste)

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; }); 

    services.AddMvc() 
     .AddViewLocalization(
      Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.SubFolder, 
      opts => { opts.ResourcesPath = "Resources"; } 
     ) 
     .AddDataAnnotationsLocalization(); 

    services.Configure<RequestLocalizationOptions>(opts => 
    { 
     var supportedCultures = new[] 
     { 
      new CultureInfo("en-AU"), 
      new CultureInfo("en-GB"), 
      new CultureInfo("en-US"), 
      new CultureInfo("en"), 
      new CultureInfo("zh-cn"), 
      new CultureInfo("zh"), 
     }; 
     opts.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US"); 
     opts.SupportedCultures = supportedCultures; 
     opts.SupportedUICultures = supportedCultures; 
    }); 
} 

Auf Configure (IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseRequestLocalization(); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}"); 
    }); 
} 

Meine Ressourcen Stucts wie:

{Ihr Projekt}/Ressourcen/Ansichten/{Ihr Controller} /ViewName.en-us.resx