使用完整的.Net Framework v4.6.2,使用Asp.Net Core 1.1编写的Web应用程序存在一些奇怪的问题。
我想强制应用程序使用瑞典语语言环境(sv-SE)。这在开发机器上工作得很好(当然......),但不能在它应该运行的服务器上运行(运行Windows Server 2012r2)。
我尝试过以下方法:
1)放置" SiteLocale":" sv-SE"在appsettings.json文件中。
2)将以下内容放入web.config
<configuration>
<system.web>
<globalization culture="sv-SE" uiCulture="sv-SE" />
</system.web>
...
</configuration
3)在初始化应用程序设置默认语言环境
之前的program.cs中System.Globalization.CultureInfo.DefaultThreadCurrentCulture = new System.Globalization.CultureInfo("sv-SE");
System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = new System.Globalization.CultureInfo("sv-SE");
4)在Startup.cs
中添加了RequestLocalization到Configure(...)var supportedCultures = new[]
{
new CultureInfo("sv-SE")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("sv-SE"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
5)在我的控制器构造函数中设置当前线程文化
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("sv-SE");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("sv-SE");
6)在我的控制器动作中设置当前线程文化
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("sv-SE");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("sv-SE");
7)为服务器安装了瑞典语语言包(服务器最初只是英语)
完成上述所有操作后,视图中输出的任何日期或数字仍然使用en-US语言环境呈现。
查看视图中的当前区域设置,我可以看到以下内容:
System.Globalization.CultureInfo.CurrentCulture.Name => "sv-SE"
System.Globalization.CultureInfo.CurrentUICulture.Name => "sv-SE"
System.Globalization.CultureInfo.InstalledUICulture => "en-US"
再次,在我的开发机器上,这工作正常,数字&amp;日期根据瑞典语区域设置格式。但是在服务器上他们不是。
在服务器上,应用程序在ApplicationPoolIdentity下运行。我假设它被配置为使用&#34; en-US&#34;因为操作系统最初只安装了英语,所以作为语言环境。
为什么设置CurrentThread.CurrentCulture / CurrentUICulture没有效果感到困惑。
答案 0 :(得分:7)
我在ASP Net Core 3.0中遇到了类似的问题。网站托管位于另一个国家/地区,导致格式问题。
我在启动中添加了以下内容:
using Microsoft.AspNetCore.Localization;
using System.Globalization;
在ConfigureServices中:
services.AddLocalization();
在“配置”中:
var supportedCultures = new[]{
new CultureInfo("en-US")
};
app.UseRequestLocalization(new RequestLocalizationOptions {
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = supportedCultures,
FallBackToParentCultures= false
});
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
答案 1 :(得分:4)
您是否尝试在CultureInfo.CurrentCulture
中设置Program.cs
属性:
using System.Globalization;
CultureInfo.CurrentCulture = new CultureInfo("sv-SE");
答案 2 :(得分:2)
看看Microsoft ASP.NET Core Docs - Globalization and localization。
4)在Startup.cs
中添加了RequestLocalization到Configure(...)
来自docs:
请求中的当前文化是在本地化中间件中设置的。本地化中间件在Startup.cs文件的Configure方法中启用。
注意,必须在可能检查请求文化的任何中间件之前配置本地化中间件(例如,app.UseMvc())。
5)在我的控制器构造函数中设置当前线程文化
6)在我的控制器动作中设置当前线程文化
尝试在OnActionExecuting
过滤器处设置文化,而不是在构造函数或每个操作中进行设置。这是一个示例代码:
public class InternationalizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var cultureInfo = CultureInfo.GetCultureInfo("sv-SE");
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
}
在您的控制器类中,输入:[Internationalization]
。