我们有一个基于ASP.NET MVC 5.2的应用程序,我们使用资源文件(resx),Localization.resx
,Localization.de-DE.resx
,Localization.de-AT.resx
,{{1产生附属组件的},Localization.en-US.resx
...等等。
我们首先通过cookie确定语言,然后通过浏览器标题信息进行回退。效果很好。
Localization.en-GB.resx
我们直接在{/ p>等视图中使用protected internal void Application_BeginRequest(object sender, EventArgs e)
{
HttpCookie cultureCookie = httpRequest.Cookies[CookieName.Culture];
string cultureName;
if (cultureCookie != null)
cultureName = cultureCookie.Value;
else
{
if (httpRequest.UserLanguages != null && httpRequest.UserLanguages.Length > 0)
cultureName = httpRequest.UserLanguages[0];
else
cultureName = null;
}
cultureName = CultureHelper.GetImplementedCulture(cultureName); // returns default on null
Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
Localization.PropertyName
到目前为止这种方法很好但是在大约60-80分钟之后我们在一个环境(生产性)上遇到了问题:本地化不再起作用了。 它会影响这些短信!线程仍然具有正确的文化!
在内部,我们仍然使用<div class="text-right">@Localization.Header_TopMenu_Service</div>
值,例如静态文本,税收计算......这仍然有效。
因此,应用程序的某些部分现在使用英语(静态内容和逻辑内容,如税收计算),Thread.CurrentThread.CurrentCulture
资源中的所有元素都是德语(默认)。
为什么会发生这种情况?
我们认为有一些竞争条件,但我们已经将一些信息嵌入到输出中,一切都很好:
Localization
即使此输出中的语言为en-GB,本地化也会输出默认值,即德语。
当我们重新启动或回收应用程序时,本地化再次运行60分钟。 我们还尝试通过Filter或Controller中设置语言:同样的问题。
这个奇怪的问题可能是什么原因? 错误的实施?卫星组件的东西? IIS问题?系统配置?
因为在测试阶段一切正常并且这种效果只发生在prod上(没有新版本,只是副本)我认为它与系统有关。
答案 0 :(得分:1)
问题解决了。
这是一种竞争条件,它将Localization.Culture
(或在其他实施中Resources.Culture
)全局设置为特定语言。
问题是,在Web应用程序中这应该为null。如果为空,ResourceManager.GetString()
使用Thread.CurrentThread.CurrentUICulture
进行本地化。
如果Localization.Culture
不为null,则ResourceManager不关心Thread.CurrentThread.CurrentUICulture
。