我有一个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