我想以编程方式设置我的用户控件的文化,它定义了几个标签,按钮和文本框......
通常,对于aspx页面,你重写了InitializeCulture-Method并设置了Culture和UICulture来实现这一点,唉ASCX-Controls没有这个方法,那我该怎么做呢?
我已经设置了本地资源mycontrol.ascx.de-DE.resx,mycontrol.ascx.resx和mycontrol.ascx.en-GB.resx但只设置了默认文件的值(mycontrol.ascx.resx )被使用。
提前致谢。
丹尼斯
答案 0 :(得分:7)
我还花了几个小时来解决这个问题,最后得到了这个解决方案。
您只需覆盖FrameworkInitialize()
而不是initilizeculture()
,
例如:
protected override void FrameworkInitialize()
{
String selectedLanguage = LanguageID;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
base.FrameworkInitialize();
}
Jus将此代码放在ascx.cs文件中,不需要调用此覆盖函数。
答案 1 :(得分:5)
当前的文化是线程范围的:Page.Culture
和Page.UICulture
实际上设置了Thread.CurrentThread.CurrentCulture
和Thread.CurrentThread.CurrentUICulture
。
如果在页面标记中定义了用户控件,我认为您无法做任何事情。如果你用LoadControl()
加载它,你可以在调用之前暂时覆盖当前线程的文化并在之后恢复它,但这将非常尴尬:
protected void Page_Load(object sender, EventArgs e)
{
// Some code...
CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
CultureInfo oldUICulture = Thread.CurrentThread.CurrentUICulture;
Thread.CurrentThread.CurrentCulture = yourNewCulture;
Thread.CurrentThread.CurrentUICulture = yourNewUICulture;
try {
Controls.Add(LoadControl("yourUserControl.ascx"));
} finally {
Thread.CurrentThread.CurrentCulture = oldCulture;
Thread.CurrentThread.CurrentUICulture = oldUICulture;
}
// Some other code...
}
答案 2 :(得分:2)
我使用以下代码在项目页面中更改asp.net mvc的语言
public ActionResult ChangeCulture (Culture lang, string returnUrl)
{
if (returnUrl.Length> = 3)
{
returnUrl = returnUrl.Substring (3);
}
return redirect ("/" + lang.ToString () + returnUrl);
}
我也在同一页面上使用了usercontrol(ascx)。当我使用actionlink更改语言时,更改了viewpage语言,但是用户控件pageload事件未被捕获更改,因此viewpage的语言更改但usercontrol的语言不会更改