gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:39:48 24 4
gpt4 key购买 nike

在 Controller Action 中这些变量:

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

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

最佳答案

根据source code 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 设置当前请求文化(CultureInfo.CurrentCulture 获取/设置 Thread.CurrentThread. CurrentCulture,因此它们是相同的)。因此,就获得当前文化而言,这些方法之间没有任何区别。

主要区别在于IRequestCultureFeature绑定(bind)到当前HttContext(http请求)。在我看来,当您使用 IRequestCultureFeature 获取文化时,您明确表示您需要当前的请求文化。而且,当您使用 Thread.CurrentThread.CurrentCulture 时,您的意图是否获得请求文化并不清楚。所以我更喜欢使用 IRequestCultureFeature 因为更好的可读性。可以说这也更适合测试目的。

但另一方面,设置文化对每个场景都有不同的影响。如果将 IRequestCultureFeature 替换为以下代码

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

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

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

将直接影响资源管理器和获取本地化。浏览 source code显示对 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"

关于c# - Asp.Net Core 中的 IRequestCultureFeature 和 CurrentCulture 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com