【问题标题】:ASP.NET resource expression not returning correct Culture valueASP.NET 资源表达式未返回正确的文化值
【发布时间】:2010-11-15 00:13:32
【问题描述】:

我在一个 ASP.NET 页面中使用资源表达式指令,该页面有四个全局资源文件,中性、英国、美国和意大利。但是,使用表达式语法总是返回 US。

ASPX 页面的一些代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GlobalisationResources._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h2>Current culture: <%= System.Threading.Thread.CurrentThread.CurrentUICulture.Name + " - " + System.Threading.Thread.CurrentThread.CurrentCulture.Name %></h2>
        <h2>At page load: <asp:Literal ID="PageLoadLiteral" runat="server" /></h2>
        <h2>At initialise culture: <asp:Literal ID="InitCultureLiteral" runat="server" /></h2>
        <asp:DropDownList AutoPostBack="true" runat="server" ID="LangDropDown" />
        <br />      
        Using resources processor command: <span><asp:Literal runat="server" Text="<%$ Resources: SomeResources, Banana %>" /></span>
        <br />
        GetGlobalResourceObject: <span><%= GetGlobalResourceObject ("SomeResources", "Banana") %></span>
        <br />
        Typed: <span><%= Resources.SomeResources.Banana %></span>       
        <br />      
        <br />      
        ORANGES! Using resources processor command: <span><asp:Literal runat="server" Text="<%$ Resources: SomeResources, Orange %>" /></span>
        <br />
        ORANGES! GetGlobalResourceObject: <span><%= GetGlobalResourceObject ("SomeResources", "Orange")%></span>
        <br />
        ORANGES! Typed: <span><%= Resources.SomeResources.Orange %></span>      
    </div>
    </form>
</body>
</html>

背后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.Globalization;

namespace GlobalisationResources
{
    public partial class _Default : Page
    {
        string mCulture;

        protected void Page_Load (object sender, EventArgs e)
        {
            LangDropDown.SelectedIndexChanged += LangDropDown_SelectedIndexChanged;

            if (!IsPostBack)
            {
                LangDropDown.Items.Add ("en-US");
                LangDropDown.Items.Add ("en-GB");
                LangDropDown.Items.Add ("it-IT");
            }

            PageLoadLiteral.Text = Thread.CurrentThread.CurrentUICulture.Name + " - " + Thread.CurrentThread.CurrentCulture.Name;
            InitCultureLiteral.Text = mCulture;
        }

        override protected void InitializeCulture ()
        {
            mCulture = Thread.CurrentThread.CurrentUICulture.Name + " - " + Thread.CurrentThread.CurrentCulture.Name;

            base.InitializeCulture ();
        }

        void LangDropDown_SelectedIndexChanged (object sender, EventArgs e)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (LangDropDown.Text);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo (LangDropDown.Text);
        }
    }
}

如您所见,用户可以随时更改语言,并在页面顶部打印出各个阶段的文化,结果是:

第一次请求:

当前文化:en-US - en-GB
页面加载时:en-US - en-GB
初始化文化时:en-US - en-GB

选择GB时:

当前文化:en-GB - en-GB
页面加载时:en-US - en-GB
初始化文化时:en-US - en-GB

对于 IT:

当前文化:it-IT - it-IT
页面加载时:en-US - en-GB
在初始化文化时:en-US - en-GB

我不知道这些结果是否对 Resources 语法的使用有任何影响,但有谁知道为什么它总是会在其他一切(GetGlobalResourceObject 和类型化)总是工作时获取错误的值?

附:我在英国,我的地区也设置为英国。

谢谢。

【问题讨论】:

    标签: c# asp.net resources localization globalization


    【解决方案1】:

    我认为您的文化设置不正确 使用like..设置,请告诉我

    protected override void InitializeCulture()
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        base.InitializeCulture();
    }
    

    【讨论】:

    • 这正是我所做的,但它似乎不起作用。它只会提取默认值,而不是文化特定值。
    • 那个时候明白了!虽然由于调用 InitialiseCulture 方法的顺序,控件尚未创建。只需使用 Request.Form["ControlName"] 即可修复,一切都很好。谢谢!
    【解决方案2】:

    也可以通过声明方式解决此问题:

    &lt;%@ Page Language="vb" AutoEventWireup="false" Inherits="Timesheet.ProjectPoP" CodeFile="ProjectPoP.aspx.vb" Culture="auto" UICulture="auto" %&gt;

    通过设置两个属性

    - Culture="auto"
    - UICulture="auto"

    到“AUTO”或“en-US”或任何其他文化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      相关资源
      最近更新 更多