Asp.net核心1.1本地化,不改变文化

时间:2017-04-06 19:37:02

标签: asp.net-core asp.net-core-1.1

我遵循了关于Asp.Net Core本地化的Microsoft教程,我有一个问题,除非我更改Startup.cs文件中的默认文化,否则Culture不会更改。

// Startup.cs - ConfigureServices Method
services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });

services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();



// Startup.cs - Configure Method
var supportedCultures = new List<CultureInfo>
{            
    new CultureInfo("en-GB"),
    new CultureInfo("fr-FR"),
    ...
};

app.UseRequestLocalization(new RequestLocalizationOptions()
{
    DefaultRequestCulture = new RequestCulture("en-GB"),            
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures,
    RequestCultureProviders = new List<IRequestCultureProvider>()
});


// HomeController
public IActionResult SetLanguage(string culture, string returnUrl)
    {
        Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
            new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
        );

        return LocalRedirect(returnUrl);
    }

我想用Anchor Link改变语言,如:

<a asp-area="" asp-controller="Home" asp-action="SetLanguage" asp-route-culture="fr-FR" asp-route-returnUrl="@Context.Request.Path">FR</a>

当我点击链接时,cookie已成功设置,页面重新加载但本地化文本保持不变。当我更改Startup.cs文件中的DefaultRequestCulture时,文化显示正常(这意味着我的Resx文件被正确命名等)

那么我如何根据点击的链接来改变语言呢?

修改 如果有人可以提供帮助,我仍在寻找解决方案

编辑2 我做了一个新的解决方案,问题仍然发生在VS 2017中,我在Github上传我的VS项目,如果有人可以更好看,并解释我做错了什么https://github.com/adonis07/Localization

编辑3
我能够通过在我的解决方案 Microsoft.AspNetCore.Authentication.Cookies 中添加nuget包来解决问题。现在文化运作正常。

1 个答案:

答案 0 :(得分:-1)

您是否正在将线程配置为在代码中的某个位置更改为特定区域性?无论你在哪里阅读语言cookie,都会有这样的事情:

CultureInfo ci = new CultureInfo(culture);
        System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
        System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);