使用母版页在ASP.NET应用程序上切换语言

Ces*_*Gon 4 asp.net localization master-pages cultureinfo

我正在使用Visual Studio 2008和ASP.NET来构建Web应用程序.我的大多数网页都基于一个母版页.该母版页包含三个用作语言切换的按钮链接; 该Click事件处理程序是这样的:

protected void lbuLangEN_Click(object sender, EventArgs e)
{
    this.SwitchLanguage(string.Empty);
}  

protected void lbuLangES_Click(object sender, EventArgs e)
{
    this.SwitchLanguage("es");
}
Run Code Online (Sandbox Code Playgroud)

然后我有我的私人方法SwitchLanguage:

private void SwitchLanguage(string culture)
{
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该足以使基于我的母版页的页面表现出本地化的行为,即resx根据文化从适当的本地文件中获取资源.但是,它不起作用.它们总是以西班牙语出现,这是我浏览器的默认语言.我在入口和出口处设置了一些跟踪消息SwitchLanguage,显然当前线程没有改变它的文化信息:每次SwitchLanguage调用时,当前线程的文化都是"es-ES",无论我的代码刚刚设置了什么.

我的代码或我采用的方法有问题吗?谢谢.

And*_*mar 10

你可以使用OnAcquireRequestStateGlobal.asax改变文化.它在加载会话后立即调用,但在任何母版页事件之前调用.

因此,在按钮事件处理程序中,您将会话变量设置为所需的当前区域性.然后,您重定向到当前页面.然后,Global.asax事件可以在主页加载之前选择新语言:

protected void OnAcquireRequestState(object sender, EventArgs e)
{
    string cultureName = "en-GB";
    if (HttpContext.Current.Session != null &&
        HttpContext.Current.Session["CultureName"] is string)
        cultureName = HttpContext.Current.Session["CultureName"];

    if (Thread.CurrentThread.CurrentUICulture.Name == cultureName) 
        return;

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture;
}
Run Code Online (Sandbox Code Playgroud)