【问题标题】:C# Setting CultureInfo based on QueryString parameter and resx fileC# 根据 QueryString 参数和 resx 文件设置 CultureInfo
【发布时间】:2012-02-13 02:19:57
【问题描述】:

我有一个简单地显示表单用户控件的 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

【问题讨论】:

    标签: c# asp.net .net cultureinfo


    【解决方案1】:

    您应该通过覆盖页面的 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_Init 之前运行。这两者都是在用户控件上触发任何事件之前。
    • protected override void FrameworkInitialize() 成功了。谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2019-07-31
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多