我有一个非常不寻常的问题让我完全感到困惑。我们有一个多语言网站,因此我们采用资源文件。然而,我们视图中的每个烧录文本(例如
更加神秘的是,有一小段文字总是尊重我的文化变化。该文本通过方法调用检索:
在我开始将文化管理代码移动到不同位置并重新部署到Azure以希望解决问题之前,我希望有人能想出为什么只有通过方法调用检索的文本被本地化。
更新
看起来这个问题在部署后出现,但可以通过重新启动云服务来解决。
更新2 根据@RichardSchneider的要求,自动生成的
<a href="#">@TextResources.my_key</a>
)都将本地化为随机文化。这仅发生在我的 Azure 部署上,我无法在本地重现。更加神秘的是,有一小段文字总是尊重我的文化变化。该文本通过方法调用检索:
<a href="#">@.ConfigUtils.getTerms()</a>
方法是:
public static string getTerms()
{
string key = GetKeyFromDb(CONSTANTS.TERMS);
if (!string.IsNullOrEmpty(key))
{
return TextResources.ResourceManager.GetString(key);
我仍在从我们的资源文件中阅读,但在这种情况下,它正在按照预期进行本地化!文化是在视图中读取资源文件后,在调用此方法之前应用的吗?!
我们所有的控制器都继承自一个基础控制器,在其中我们重写了OnActionExecuting()
来应用我们的文化:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
ContextModel ctx = (ContextModel) Session["ContextModel"];
// Set the correct localization according to the value set by the user
if (ctx != null && ctx.UserLanguageId != null){
Thread.CurrentThread.CurrentUICulture = new CultureInfo (ctx.UserLanguageId);
Thread.CurrentThread.CurrentCulture = new CultureInfo(ctx.UserLanguageId);
}
}
在我开始将文化管理代码移动到不同位置并重新部署到Azure以希望解决问题之前,我希望有人能想出为什么只有通过方法调用检索的文本被本地化。
OnActionExecuting()
在操作之前执行,因此我认为这是放置文化管理代码的适当位置。还有其他地方更好吗?更新
看起来这个问题在部署后出现,但可以通过重新启动云服务来解决。
更新2 根据@RichardSchneider的要求,自动生成的
TextResources
代码如下:public static string my_key{
get {
return ResourceManager.GetString("my_key", resourceCulture);
}
}
OnActionExecuting
的开头执行Debug.WriteLine(new { SynchronizationContext.Current })
,会显示什么?是AspNetSynchronizationContext
吗? - noseratio - open to workasync
,你很有可能做错了... 可能会添加答案。 - Alexei Levenkov