以编程方式在ASP.NET中设置用户控件的文化

时间:2011-02-02 15:45:05

标签: c# asp.net user-controls resources ascx

我想以编程方式设置我的用户控件的文化,它定义了几个标签,按钮和文本框......

通常,对于aspx页面,你重写了InitializeCulture-Method并设置了Culture和UICulture来实现这一点,唉ASCX-Controls没有这个方法,那我该怎么做呢?

我已经设置了本地资源mycontrol.ascx.de-DE.resx,mycontrol.ascx.resx和mycontrol.ascx.en-GB.resx但只设置了默认文件的值(mycontrol.ascx.resx )被使用。

提前致谢。

丹尼斯

3 个答案:

答案 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.CulturePage.UICulture实际上设置了Thread.CurrentThread.CurrentCultureThread.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的语言不会更改