【问题标题】:Force locale with Asp.Net Core使用 Asp.Net Core 强制区域设置
【发布时间】:2017-02-28 21:28:19
【问题描述】:

我在使用完整的 .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 中的 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 没有效果。

【问题讨论】:

    标签: c# .net asp.net-core asp.net-core-mvc iis-8.5


    【解决方案1】:

    我在使用 ASP Net Core 3.0 时遇到了类似的问题。网站托管在不同的国家/地区,导致格式问题。

    我在启动时添加了以下内容:

    using Microsoft.AspNetCore.Localization;
    using System.Globalization;
    

    在配置服务中:

    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 应用程序。
    【解决方案2】:

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

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

    【讨论】:

    • 刚刚也试过了,结果还是一样。我假设在 Controller 的构造函数或 Actions 中设置这些属性也会涵盖这种情况。不过谢谢你的建议。
    • @NeoDarque 你在创建WebHostBuilder 和调用Build() 之前配置了吗?
    • 是的,正确的。在创建 WebHostBuilder 之前尝试设置 CultureInfo.CurrentCulture、CultureInfo.CurrentUICulture、CultureInfo.DefaultThreadCurrentCulture 和 CultureInfo.DefaultThreadCurrentUICulture。
    • 那个帮助了我,我在Main()方法中添加了它,就在BuildWebHost(args).Run();之前
    【解决方案3】:

    看看Microsoft ASP.NET Core Docs - Globalization and localization

    4) 在 Startup.cs 中的 Configure(...) 中添加 RequestLocalization

    来自文档:

    请求的当前文化在本地化中间件中设置。在 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]

    【讨论】:

    • 我也试过这个,但仍然没有帮助。正如我在上面所写的,我可以在视图中看到 CurrentCulture 和 CurrentUICulture 已正确设置为“sv-SE”,因此这可能不是问题。但即使是这样,viewmodel 属性的渲染仍然使用 en-US 语言环境渲染。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2020-10-07
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多