You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Umbraco 7中设置CultureInfo后Resx资源未切换语言的解决方法

问题分析与解决方案

我之前在Umbraco 7项目里也碰到过一模一样的问题,结合你的描述,咱们从几个关键环节一步步排查解决:

1. 先修正资源绑定的语法错误

你当前的标签代码存在语法问题:

<asp:label runat="server" id="lblSayHello" Text="<% Resources:Resource SayHello%>" />

ASP.NET中绑定全局资源的正确语法是带$符号且用逗号分隔资源类和键名,修改后:

<asp:label runat="server" id="lblSayHello" Text="<%$ Resources:Resource, SayHello %>" />

这个错误是最常见的诱因——不正确的语法会让ASP.NET无法正确解析资源键,直接 fallback 到默认Resource.resx的内容。

2. 确认资源文件的配置与部署

  • 确保法语资源文件命名规范:必须是Resource.fr-FR.resx(和默认Resource.resx同名,后缀追加文化代码),且放在App_GlobalResources文件夹下(ASP.NET全局资源的默认存放目录)。
  • 检查文件属性:右键资源文件→「属性」,确认**生成操作(Build Action)**为Content,**自定义工具(Custom Tool)**为GlobalResourceProxyGenerator——这个工具会自动生成资源访问类,确保代码能正确读取资源内容。

3. 调整线程文化设置的时机

你当前在页面加载时设置线程文化,这个时机太晚了!Umbraco的请求生命周期中,资源绑定逻辑会在页面加载前执行,此时设置文化已经无法影响资源读取。

推荐在更早的请求阶段设置,比如:

方法一:Global.asax中处理

protected void Application_BeginRequest(object sender, EventArgs e)
{
    // 测试阶段硬编码为fr-FR,后续可改为从URL、Cookie或Umbraco页面属性动态获取
    var cultureInfo = System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
    System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
    System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
}

方法二:Umbraco专用事件处理

创建一个实现IApplicationEventHandler的类,在Umbraco启动时绑定请求事件:

using System.Globalization;
using System.Threading;
using Umbraco.Core;
using Umbraco.Core.Events;

public class CultureEventHandler : IApplicationEventHandler
{
    public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { }

    public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { }

    public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        umbracoApplication.BeginRequest += (sender, e) =>
        {
            var cultureInfo = CultureInfo.GetCultureInfo("fr-FR");
            Thread.CurrentThread.CurrentCulture = cultureInfo;
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
        };
    }
}

4. 验证Umbraco的文化配置

  • 检查web.config中的globalization节点,确保没有硬编码默认文化:
    <globalization uiCulture="auto" culture="auto" />
    
  • 登录Umbraco后台,进入「设置→语言」,确认已添加法语(fr-FR)语言,且站点的文化继承配置未被页面单独覆盖。

5. 用代码直接测试资源读取

如果以上步骤完成后仍有问题,可以在用户控件的Page_Load中直接通过代码读取资源,验证问题根源:

protected void Page_Load(object sender, EventArgs e)
{
    // 打印当前文化,确认是否正确设置为fr-FR
    Response.Write(Thread.CurrentThread.CurrentUICulture.Name);
    // 直接读取资源
    lblSayHello.Text = Resources.Resource.SayHello;
}

如果这段代码能输出Bonjour,说明资源文件和文化设置没问题,问题还是出在标签绑定语法上;如果仍输出Hello,则需要确认线程文化是否真的被正确设置。


内容的提问来源于stack exchange,提问作者Computer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:32:33