我有一个只显示用户控件表单的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 。
答案 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