c# - 文化未应用于多语言网站

标签 c# .net asp.net-mvc azure

我有一个非常不寻常的问题,让我完全陷入困境。我们有一个多语言网站,因此我们使用资源文件。然而,我们 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/

相关文章:

c# - 根据循环中另一个字典的值更新文本文件中的值

c# - 将时间添加到日期时间,但排除周末,并且应该在工作时间之间

.net - 使用xUnit.net AutoRollback和多线程

.net - .NET HTML查看器/Web浏览器控件替代

c# - 当 url 包含编码的符号时,MVC WEB API 路由失败

asp.net-mvc - ASP.NET MVC Html 帮助程序

asp.net-mvc - 名称 'LabelFor' 在 MVC3 的当前上下文中不存在

c# - 在特定列中写入 Serilog ASP.NET MVC C#

c# - 使用反射从类列表的属性中获取值

.net - 为什么 Queue(T) 和 Stack(T) 没有实现 ICollection(T)?