我有一个非常不寻常的问题,让我完全陷入困境。我们有一个多语言网站,因此我们使用资源文件。然而,我们 View 上的每一段文字都被烧毁了,比如 <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);
我仍在读取我们的资源文件,但在这种情况下,它正在根据需要进行本地化!文化是在 View 中读取资源文件之后、调用此方法之前应用的吗?!
我们所有的 Controller 都继承自基本 Controller ,我们在其中重写 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);
}
}
最佳答案
这个问题已经在这里得到解答:Asynchrony and thread culture
<小时/>一种可能的选择是您在代码中使用 async
和 .ConfigureAwait(false)
。由于awiat
(获取文本/渲染 View )之后的结果代码从它恰好执行的线程中获取随机区域性,而不是您希望在操作过滤器的同步部分中设置的区域性。
可能的修复 - don't use that .ConfigureAwait(false)
或者,如果您必须在所有调用中显式传递文化,并确保在进行区域设置敏感调用之前将其设置回来。
更遥远的可能性:假设您使用默认资源文件生成来使其在 ASP.Net 应用程序中正常运行,您应该
- 设置当前UICulture
- 确保生成的资源管理器的
Culture
属性设置为null
。
根据你看到的行为,我猜想在最初的启动中有些东西设置了文化
错误,结果你得到了“随机”文化。
要调试,请尝试检查 Culture 属性的值 - 应为 null。
关于c# - 文化未应用于多语言网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117913/