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



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

这样做创建了必要的resx文件:

App_LocalResources
  ContactUsForm.ascx.resx

然后,我简单地复制并粘贴现有的resx文件,并将其重命名,这样我现在就有了以下内容:

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

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

我使用以下代码基于querystring参数设置特定的区域性信息:

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

您应该通过重写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();
    }

试试这个您必须使用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

相关内容

  • 没有找到相关文章

最新更新