c# - ASP.net MVC 5 Multi-Language:语言资源有时不能一致地工作
问题描述
我正在使用资源管理器在 ASP.NET MVC 5 应用程序中基于 threadUI 文化加载资源。我在 Application_AcquireRequestState 事件中设置线程文化,当前文化为每个用户保存,它由数据库中的 Web 服务器加载,如下代码:
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
string languageName = default(string);
CultureInfo ci = default(CultureInfo);
if (!User.Identity.IsAuthenticated)
{
languageName = Request.RequestContext.HttpContext.Session["_culture"] == null ?
Helper.ApplicationInformation.AppCulture.Name :
Request.RequestContext.HttpContext.Session["_culture"].ToString();
ci = CultureInfo.GetCultureInfo(languageName.ToUpper());
}
else
{
ci = CultureInfo.GetCultureInfo(Helper.User.Preferences.Language.Name);
}
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
Bridge.Resources.Global.Culture = ci;
Bridge.Resources.Login.Culture = ci;
Bridge.Resources.Search.Culture = ci;
Bridge.Resources.Workspace.Culture = ci;
}
在不同线程中设置文化时会发生这种情况,实际上是当 2 个或更多用户同时更改语言时,
我认为资源管理器中存在RaceCondition问题,导致当前线程加载具有无效 UI 文化的资源
我对此进行了研究,并找到了以下相关链接:
ResouceManager 有时会错误地加载 ASP.Net MVC 资源文件
尽管更改了 CurrentThread.CurrentCulture,但 ASP.NET MVC 5 本地化资源冻结并且不更改语言
多语言应用程序中的 ASP.NET 资源管理器 RaceCondition
我尝试下载多语言示例,但它也发生了,我从以下链接下载:
在 action:index control:Home 中添加 'ThreadSleep(4000)' 以重现此问题。
我做了所有提到的,但没有任何工作。我可以尝试使资源始终如一地工作吗?
谢谢。
解决方案
有几种方法可以设置每种用户语言。IIS 服务器将会话保持 20 分钟。您需要通过添加行来更改 web.config 文件中的时间:
<sessionState timeout="120" cookieless="AutoDetect">
// Change timeout to your preferred value
或者您需要去更改应用程序池中的设置。对于我的项目,我使用 cookie 来保存用户语言选项。Cookie 将在很长一段时间内可用。例如我在 Global.asax Application_BeginRequest 中使用过
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies["NAMEOFCOOKIE"];
if (cookie != null && cookie.Value != null)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
}
else
{
// FIND IN DB YOUR USER'S LANGUAGE AND SET IT
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
HttpCookie cookieNew = new HttpCookie("NAMEOFCOOKIE");
cookieNew.Value = "YOUR USERS'S DB VALUE";
Response.Cookies.Add(cookieNew);
}
}
}
}
当您使用资源时,不要忘记一件事,您需要将它放在文件名的末尾您的语言短名称。例如,您有默认文件 MainPageLang.resx 并且您需要英语和俄语,您必须添加文件 MainPageLang.en.resx 和 MainPageLang.ru.resx。
“您的用户的数据库值”必须是“en”或“ru”。
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("YOUR USERS'S DB VALUE");
HttpCookie cookieNew = new HttpCookie("NAMEOFCOOKIE");
cookieNew.Value = "YOUR USERS'S DB VALUE";
Response.Cookies.Add(cookieNew);
推荐阅读
- bioinformatics - 运行 Trinity 的问题 - 可能是读取文件格式?
- ruby-on-rails - 推送到 Heroku 时,Rails 应用程序预编译资产失败错误
- sql-server - 将密码存储在数据库中以供以后使用
- hibernate - 错误状态 500 源不是空 struts2 文件上传不起作用
- c# - 如何从删除按钮上的 GridView 中的行中获取值
- asp.net - Asp.net - 显示存储在 SQL Server 中的 word 文档内容
- python - if __name__ == "__main__": 如果整个 .py 文件是一个模块并且永远不会作为自己的脚本运行,该写什么?
- python - python图像错误
- php - Yii2 - 压缩 cookie 值或更好的替代方案
- android - 移除 Android Studio 中的奇怪箭头