在ASP.NET中以编程方式设置用户控件的区域性

4
我想以编程的方式设置我的用户控件的文化,该用户控件定义了多个标签、按钮和文本框...
通常情况下,对于aspx页面,您可以重写InitializeCulture方法并设置Culture和UICulture来实现此目的,但是ASCX控件没有这个方法,那么我该如何做呢?
我已经设置了本地资源mycontrol.ascx.de-DE.resx、mycontrol.ascx.resx和mycontrol.ascx.en-GB.resx,但只使用了默认文件(mycontrol.ascx.resx)中的值。
提前感谢。
Dennis
3个回答

6
当前文化是线程范围的: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...
}

@Dennis,InitializeCulture()在页面生命周期的早期被调用,因此在加载用户控件时应该已经设置好了所有内容。您在哪个阶段加载它? - Frédéric Hamidi
@Dennis,将其放在“Page_Load”中是可以的,但由于已加载的用户控件不会保存在“ViewState”中,因此您可能应该在每个请求上重新加载它。 - Frédéric Hamidi
@Dennis,也许这是一个资源问题。您能否验证在Visual Studio属性窗格中所有的.resx文件的构建操作是否设置为“嵌入式资源”,并且您的卫星程序集是否正确部署在bin文件夹的子目录中? - Frédéric Hamidi
感谢您的坚持 - 是的,我可以。我的默认.resx被调用,给我的标签/文本框等默认名称,我的de-DE.resx和en-GB.resx也是以同样的方式构建的 - 如果我把这些文件拿走,我的标签和文本框就会变成空白。 - Dennis Röttger
哦,所以你的 resx 文件显然被部署为 Content 而不是 Embedded Resource。这样也可以,但是它们需要与你的 ascx 文件位于同一级别的 App_LocalResources 文件夹中。是这样吗? - Frédéric Hamidi
显示剩余4条评论

6

我也花了好几个小时来解决这个问题,最终找到了以下解决方案。你只需要重写FrameworkInitialize()而不是initilizeculture(),例如:

protected override void FrameworkInitialize()
{
    String selectedLanguage = LanguageID;
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);

    base.FrameworkInitialize();
}

将以下代码放入您的ascx.cs文件中,此覆盖函数无需调用。

这可能解决我的问题。我在页面的InitualizeCulture中设置了文化,但页面上的用户控件没有遵守它。 - Garr Godfrey

2
我在我的项目页面中使用了以下代码来更改asp.net mvc的语言:
public ActionResult ChangeCulture (Culture lang, string returnUrl)
     {
         if (returnUrl.Length> = 3)
         {
             returnUrl = returnUrl.Substring (3);
         }
         return redirect ("/" + lang.ToString () + returnUrl);
     }

同时,我在同一页上使用了用户控件(ascx)。当我使用动作链接更改语言时,视图页面的语言会发生变化,但用户控件的pageload事件没有捕获到这种变化,因此视图页面的语言会发生变化,但用户控件的语言不会改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接