我已经为我的视图设置了文化并更改了控制器中的文化,但我似乎无法找到如何知道我当前在控制器中使用的文化,我正在寻找类似的东西:
public class HomeController : Controller {
public async Task<IActionResult> Index()
{
// Something like the next line
var requestCulture = GetRequestedCulture()
return View();
}
}
答案就在请求对象上,代码如下:
public async Task<IActionResult> Index() {
// Retrieves the requested culture
var rqf = Request.HttpContext.Features.Get<IRequestCultureFeature>();
// Culture contains the information of the requested culture
var culture = rqf.RequestCulture.Culture;
return View();
}
JohnnysAce 的答案有效。如果您只是想要一种简单的方法来获取当前的文化,那么可以像往常一样在 .net 中完成:
CultureInfo uiCultureInfo = Thread.CurrentThread.CurrentUICulture;
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
如果你想使用 IRequestCultureFeature (参见 JohnnyAces 的回答;因为依赖注入和更好的可测试性),你必须在 Startup.cs 中进行配置。微软在这里提供了一个示例https://github.com/aspnet/Entropy/blob/2fcbabef58c2c21845848c35e9d5e5f89b19adc5/samples/Localization.StarterWeb/Startup.cs
ASP.Net Core 3.1:
如果配置正确,我可以确认这是有效的(请参阅第二个代码块)
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
在您的启动类中将其添加到
Configure
方法中:
IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"), //English US
new CultureInfo("ar-SY"), //Arabic SY
};
var localizationOptions = new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"), //English US will be the default culture (for new visitors)
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
app.UseRequestLocalization(localizationOptions);
然后用户可以通过调用此操作来更改文化:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult SetCulture(string culture, string returnUrl)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Path = Url.Content("~/") });
if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
return LocalRedirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}
此代码适用于获取 ASP 核心控制器中的当前文化:
public string GetCulture() => $"CurrentCulture:{CultureInfo.CurrentCulture.Name}, CurrentUICulture:{CultureInfo.CurrentUICulture.Name}";
CultureInfo.CurrentCulture
命名空间中有一个全局属性System.Globalization
,用于获取当前线程的区域性。这种情况早在 .NET Framework 4.0 就已存在,一直到当前版本的 .NET Core 3.1。
您可以通过以下代码轻松获取当前文化。
var culture = CultureInfo.CurrentCulture.Name;
它也可以在program.cs中使用。
希望这能有所帮助。