![](/img/trans.png)
[英]What's the difference between <a asp-page="linkhere"> and <a href="linkhere"> in ASP.NET Core?
[英]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
都设置了当前请求CultureInfo
( CultureInfo.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.