Sha*_*Wet 6 asp.net-core-mvc asp.net-core-localization
我有一个带有以下startup.cs的ASP.Net Core 3.1应用程序(我已经根据网络搜索尝试了以下配置的各种组合):
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<RequestLocalizationOptions>(options =>
{
options.RequestCultureProviders = new[] { new CookieRequestCultureProvider() };
});
Run Code Online (Sandbox Code Playgroud)
和
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(options.Value);
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的登录方法中,我将文化 Cookie 设置如下:
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture([logged-in-user].CultureCode)));
Run Code Online (Sandbox Code Playgroud)
在后续请求中,我可以在浏览器开发工具的“网络”选项卡中看到 cookie:

然而,在服务器上,任何给定的请求仍然保留我的开发环境的默认服务器区域性(即en-ZA)。(我通过检查System.Threading.Thread.CurrentThread.CurrentCulture.Name服务器操作方法中的任何断点来看到这一点)
我在客户端和服务器之间遇到了日期转换问题(例如,具有en-US文化的客户端,如上面的屏幕截图所示)将 2009 年 3 月 5 日(3 月 5 日)的日期发送到服务器,并且服务器正在解释它如5月3日。
为什么我的服务器不支持 CultureCookie?我缺少什么?
正如您所提到的,您已经在您的方法中注册了本地化服务ConfigureServices。
我建议的方法是像这样使用它:
services.AddLocalization(options => options.ResourcesPath = "Resources");
services
.AddControllersWithViews()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
Run Code Online (Sandbox Code Playgroud)
但不要忘记注册中间件:
// In StartUp.cs Configure method
var SupportedCultures = new CultureInfo[]
{
new CultureInfo("en"),
new CultureInfo("zh")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(defaultLanguage),
SupportedCultures = SupportedCultures,
SupportedUICultures = SupportedCultures
});
Run Code Online (Sandbox Code Playgroud)
至于您的cookie结束时间问题,请尝试指定您的cookie的结束日期。像这样:
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
SameSite = SameSiteMode.None
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6651 次 |
| 最近记录: |