使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化

Posted

技术标签:

【中文标题】使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化【英文标题】:set current culture to browser culture by default with ASPNETCore 1.1.1 localisation 【发布时间】:2017-03-29 10:01:06 【问题描述】:

我想知道如何使用 ASPNETCore 1.1.1 将当前文化默认设置为浏览器文化

我按照这个例子 https://andrewlock.net/adding-localisation-to-an-asp-net-core-application/

在我的 startup.cs 我有这个

public void ConfigureServices(IServiceCollection services)

    services.AddSingleton<IStringLocalizerFactory, SingleFileResourceManagerStringLocalizerFactory>();
    services.AddLocalization(opts =>  opts.ResourcesPath = "Resources"; );

    // Add framework services.
    services.AddMvc()
        .AddViewLocalization(
            LanguageViewLocationExpanderFormat.Suffix,
            opts =>  opts.ResourcesPath = "Resources"; )
        .AddDataAnnotationsLocalization();

    services.Configure<RequestLocalizationOptions>(
        opts =>
        
            var supportedCultures = new List<CultureInfo>
            
                new CultureInfo("en"),
                new CultureInfo("es"),
                new CultureInfo("fr"),
            ;

            opts.DefaultRequestCulture = new RequestCulture("fr");
            // Formatting numbers, dates, etc.
            opts.SupportedCultures = supportedCultures;
            // UI strings that we have localized.
            opts.SupportedUICultures = supportedCultures;
        );

我有一个语言选择器,我在缓存中添加了 CookieRequestCultureProvider.DefaultCookieName。

        [HttpPost]
        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);
        

还有这个资源文件

资源.resx

Resources.en.resx

资源.es.resx

Resources.fr.resx

这一切都很好,这里的问题是,每次我调用网站时我都想获得默认的文化,在这种情况下是“fr”,但我总是得到最后一个,我在关闭网络之前选择页面。

我怎样才能防止这种情况发生。

最好的问候。

乔莉妮丝

【问题讨论】:

【参考方案1】:

Cookie 不会在用户离开网站时失效,因此由于您将 Cookie 的有效期设置为一年,因此用户选择的最后一种语言将在一年内有效。

与 cookie 不同,当用户离开网站并且有相同需求的人已经在 github 上请求了该功能并为其创建了 NuGet 包时,会话就会终止。

https://github.com/aspnet/Localization/issues/344

https://www.nuget.org/packages/My.AspNetCore.Localization.Session

解决此问题的其他方法是使用较短的到期日期(如果您不需要非常精确)或在检测到用户创建了新会话时删除 cookie。

【讨论】:

感谢 Vache,感谢您的支持。

以上是关于使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化的主要内容,如果未能解决你的问题,请参考以下文章

Docker在Linux上运行NetCore系列使用私有Nuget与多个本地包引用运行ASPNetCore

.Net IDE智能提示汉化(.Net6AspNetCore)

_Layout.cshtml 上的本地化

NetCore 国际化最佳实践

Aspnetcore2.0中Entityframeworkcore及Autofac的使用(附Demo)

使用aspnetcore前后端分离开发,你一定要知道这个。