代码之家  ›  专栏  ›  技术社区  ›  balexandre

全球资源下的本地化噩梦

  •  3
  • balexandre  · 技术社区  · 15 年前

    我有两个资源文件在下面 App_GlobalResources

    MyApp.resx
    MyApp.sv.resx
    

    对于那些不知道的人: MyApp.resx 除了 MyApp.sv.resx

    我有一个简单的页面显示3 <asp:Label> Text 属性的名称不同,如:

        <i>using Resource.Write:</i><br />
        <asp:Label ID="Label1" runat="server" />
        <hr />
    
        <i>using HttpContext.GetGlobalResourceObject:</i><br />
        <asp:Label ID="Label2" runat="server" />
        <hr />
    
        <i>using Text Resources:</i><br />
        <asp:Label ID="Label3" runat="server" 
                   Text="<%$ Resources:MyApp, btnRemoveMonitoring %>" />
    
        <p style="margin-top:50px;">
        <i>Current UI Culture:</i><br />
            <asp:Literal ID="litCulture" runat="server" />
        </p>
    

    Label3 是第页上唯一调用的,前2个设置如下:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Label1.Text = Resources.AdwizaPAR.btnRemoveMonitoring;
            Label2.Text = HttpContext.GetGlobalResourceObject("MyApp", "btnRemoveMonitoring").ToString();
    
            litCulture.Text = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
        }
    }
    

    浏览器语言 UICulture 为此,我使用:

    protected void Page_Init(object sender, EventArgs e)
    {
        Page.Culture = "en-US";
        Page.UICulture = "en-US";
    }
    

    女巫与:

    protected void Page_Init(object sender, EventArgs e)
    {
        System.Globalization.CultureInfo cinfo = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
        System.Threading.Thread.CurrentThread.CurrentCulture = cinfo;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cinfo;
    }
    

    有了这些,我得到的是:

    alt text

    换句话说 code-behind 要设置正确的文本,请 inline 本地化只是使用浏览器语言。

    我错过了什么?

    2 回复  |  直到 15 年前
        1
  •  3
  •   balexandre    15 年前

    Page_Init 不改变获取全球资源的方式,我们需要 override

    protected override void InitializeCulture()
    {
        //*** make sure to call base class implementation
        base.InitializeCulture();
    
        //*** pull language preference from profile
        string LanguagePreference = "en-US"; // get from whatever property you want
    
        //*** set the cultures
        if (LanguagePreference != null)
        {
            this.UICulture = LanguagePreference;
            this.Culture = LanguagePreference;
        }
    }
    

    现在一切正常

    alt text

        2
  •  0
  •   Eduardo Molteni    15 年前

    Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        Dim lang As String = "en-us"
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)
    End Sub