繁体   English   中英

Asp.Net Core中的IRequestCultureFeature和CurrentCulture有什么区别?

[英]What's the difference between IRequestCultureFeature and CurrentCulture in Asp.Net Core?

在Controller动作中,这些变量:

        var foo = Request.HttpContext.Features.Get<IRequestCultureFeature>()
                      .RequestCulture.Culture;
        var bar = Thread.CurrentThread.CurrentCulture;

两者都返回"en" 它们之间有什么区别,在确定查看网站用户的语言方面,哪个更好?

根据RequestLocalizationMiddleware源代码

public async Task Invoke(HttpContext context)
{

    //..
    context.Features.Set<IRequestCultureFeature>(new RequestCultureFeature(requestCulture, winningProvider));

    SetCurrentThreadCulture(requestCulture);

    await _next(context);
}

private static void SetCurrentThreadCulture(RequestCulture requestCulture)
{
    CultureInfo.CurrentCulture = requestCulture.Culture;
    CultureInfo.CurrentUICulture = requestCulture.UICulture;
}

IRequestCultureFeature和当前CultureInfo都设置了当前请求CultureInfoCultureInfo.CurrentCulture获取/设置Thread.CurrentThread.CurrentCulture ,因此它们是相同的)。 因此,就当前的文化而言,这些方法之间实际上没有区别。

主要区别在于IRequestCultureFeature绑定到当前的HttContext (http请求)。 我认为,当您使用IRequestCultureFeature获取文化时,您明确表示您需要当前的请求文化。 而且,当您使用Thread.CurrentThread.CurrentCulture时,不清楚您的意图是获取请求区域性。 因此,我希望使用IRequestCultureFeature因为它具有更好的可读性。 可以说这对于测试目的也更好。

但是,另一方面,设置文化对每种情况都有不同的影响。 如果用以下代码替换IRequestCultureFeature

context.Features.Set<IRequestCultureFeature>(some request culture);

它只会替换功能,不会影响其他任何功能(研究框架的某些源代码之后的afaik)。 但是这样改变文化

CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture; //namely this line has effect described bellow

将直接影响资源管理器并获取本地化。 浏览源代码显示了对CultureInfo.CurrentUICulture的依赖

protected string GetStringSafely(string name, CultureInfo culture)
{
    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    var keyCulture = culture ?? CultureInfo.CurrentUICulture;
    //..
}

简单的测试证实了这一点

Res.culture1.resx
Value - First value

Res.culture2.resx
Value - Second value

//request culture is "culture1"
LocalizedString res = _stringLocalizer["Value"]; //"First value"
CultureInfo.CurrentUICulture = new CultureInfo("culture2");
LocalizedString res2 = _stringLocalizer["Value"]; //"Second value"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM