强制使用特定的语言环境在Asp.Net Core中

12

我遇到了一个使用Asp.Net Core 1.1编写,使用完整的.Net Framework v4.6.2的Web应用程序的一些奇怪问题。

我想强制应用程序使用瑞典语环境(sv-SE)。这在开发机器上运行得非常好(当然...),但是在它应该运行的服务器上(运行Windows Server 2012r2),却不起作用。

我已经尝试了以下方法:

1)在appsettings.json文件中加入“SiteLocale”:“sv-SE”。

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 中的 Configure(...) 中添加了 RequestLocalization

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"

在我的开发机上,这个工作正常,数字和日期根据瑞典语区域设置格式化。但是在服务器上,它们没有。

在服务器上,应用程序正在 ApplicationPoolIdentity 下运行。我假设它配置为使用 "en-US" 作为区域设置,因为操作系统最初只安装了英语语言。

对于为什么设置 CurrentThread.CurrentCulture/CurrentUICulture 没有效果感到困惑。

3个回答

21

我遇到了一个类似的问题,涉及到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");

谢谢,这对我在 Azure 托管的 .NET Core 3 应用程序完美地起作用。 - Ash

9

您是否尝试在 Program.cs 中设置 CultureInfo.CurrentCulture 属性:

using System.Globalization;

CultureInfo.CurrentCulture = new CultureInfo("sv-SE");

1
刚刚也尝试了这个方法,但结果还是一样。我认为在控制器的构造函数或操作中设置这些属性也可以覆盖这种情况。但还是感谢您的建议。 - NeoDarque
@NeoDarque 在创建 WebHostBuilder 并调用 Build() 之前配置了吗? - Henk Mollema
是的,正确的。在创建 WebHostBuilder 之前尝试设置 CultureInfo.CurrentCulture、CultureInfo.CurrentUICulture、CultureInfo.DefaultThreadCurrentCulture 和 CultureInfo.DefaultThreadCurrentUICulture。 - NeoDarque
那个帮了我,我把它添加到 Main() 方法中,在 BuildWebHost(args).Run(); 之前。 - retif

5
请查看Microsoft ASP.NET Core文档-全球化和本地化
从文档中得知,需要在Startup.cs的Configure(...)方法中添加RequestLocalization。
注意:必须在任何可能检查请求区域设置(例如,app.UseMvc())的中间件之前配置本地化中间件。
不要在控制器构造函数或每个操作中设置当前线程的区域性,可以尝试在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;
    }
}

在您的控制器类中,加入以下内容:[国际化]

我也尝试过这个,但仍然没有帮助。正如我之前所写的,我可以在视图中看到CurrentCulture和CurrentUICulture正确设置为"sv-SE",因此这可能不是问题所在。但即使如此,视图模型属性的呈现仍然使用en-US语言环境呈现。 - NeoDarque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接