C#基于QueryString参数和resx文件设置CultureInfo

时间:2012-02-13 02:19:57

标签: c# asp.net .net cultureinfo

我有一个只显示用户控件表单的Web应用程序。我已经生成了与用户控件关联的 resx 文件,方法是转到用户控件的设计,然后点击工具>生成本地资源

执行此操作已创建必要的 resx 文件:

App_LocalResources
  ContactUsForm.ascx.resx

然后,我只需复制并粘贴现有的 resx 文件并重命名,以便我现在拥有以下内容:

App_LocalResources
  ContactUsForm.ascx.fr-FR.resx
  ContactUsForm.ascx.resx

作为测试,我修改了新的 fr-FR 资源文件中的几个dotnet控件文本,以测试它是否全部按预期工作,但不是。

我使用以下代码根据查询字符串参数设置特定的文化信息:

protected void Page_Init(object sender, EventArgs e)
{
    string cultureName = Request.QueryString["lang"];
    if (!string.IsNullOrEmpty(cultureName))
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
    }
}

然后我可以通过执行以下操作直接导航到容纳用户控件的页面:

http://localhost/Default.aspx?lang=fr-FR

我可以通过执行以下代码确认正在设置文化信息:

CultureInfo currentCultureUI = Thread.CurrentThread.CurrentUICulture;
CultureInfo currentCulture = Thread.CurrentThread.CurrentUICulture;

我可以确认设置文化实际上是 fr-FR 但是根据 ContactUsForm.ascx.fr-FR.resx中的更改,文本没有被替换文件。

我似乎无法按预期工作。我做错了什么,还有其他方法可以达到预期的效果吗?

提前致谢。

更新

如果我在代码中执行以下操作,它可以正常工作:

lHeadingResource1.Text = GetLocalResourceObject("lHeadingResource1.Text").ToString();

它实际上是从 ContactUsForm.ascx.fr-FR.resx 文件中读取正确的字符串。

我还可以确认我的控件还包含所有必需的meta:resourcekey引用。

奇怪的是,如果我没有在代码中设置它,它会默认返回默认文化,并且不会使用上面指定的 fr-FR

2 个答案:

答案 0 :(得分:1)

您应该通过覆盖Page的InitializeCulture方法来设置文化。

protected override void InitializeCulture()
{
    if (Request.Form["DropDownList1"] != null)
    {
        //define the language
        UICulture = Request.Form["DropDownList1"];
        //define the formatting (requires a specific culture)
        Culture = Request.Form["DropDownList1"];
    }
    base.InitializeCulture();
}

此处的页面http://blogs.spanlogic.com/clyap/post/2009/05/29/Programmatically-change-Culture-of-User-Control-(ascx).aspx表明您可以在用户控件中使用FrameworkInitialize。我没有测试过这个。

    protected override void FrameworkInitialize()
    {
        base.FrameworkInitialize();
    }

答案 1 :(得分:1)

试试这个 您必须使用InitializeCulture()

实现您的逻辑
<%@ Page Language="C#" uiculture="auto" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Globalization" %>
<script runat="server">

    protected override void InitializeCulture()
    {
        if (Request.Form["ListBox1"] != null)
        {
            String selectedLanguage = Request.Form["ListBox1"];
            UICulture = selectedLanguage ;
            Culture = selectedLanguage ;

            Thread.CurrentThread.CurrentCulture = 
                CultureInfo.CreateSpecificCulture(selectedLanguage);
            Thread.CurrentThread.CurrentUICulture = new 
                CultureInfo(selectedLanguage);
        }
        base.InitializeCulture();
    }
</script>

更多信息请参阅下面的链接 http://msdn.microsoft.com/en-us/library/bz9tc508(v=vs.80).aspx