在ASP.NET应用程序中实现语言菜单的最佳方法

时间:2008-11-09 00:26:35

标签: asp.net localization master-pages globalization

我尝试实现一个典型的语言菜单,用户可以通过网站中所有页面中显示的菜单选择他们想要查看网站的语言。

该菜单将出现在多个母版页上(目前一个用于登录用户的页面,另一个用于未登录用户的页面)。

我当前的实现是拥有一个主页基类(让我们称之为MasterBase)。 MasterBase有一个事件

public event LanguageChangedEventHandler LanguageChanged;

其中LanguagedChangedEventHandler简单地定义为

public delegate void LanguageChangedEventHandler(string NewCulture);

MasterBase也有一个可覆盖的方法

protected virtual void OnLanguageChanged(string NewCulture)

基本上只会触发事件。

每个继承MasterBase的母版页都会覆盖OnLanguageChanged并执行常见的操作,例如设置Thread的CurrentUICulture和语言cookie然后执行

Server.Transfer(this.Page.AppRelativeVirtualPath, true);

使页面重新加载新文化的本地化值。在登录用户的母版页上,它还会更新数据库中用户的语言首选项。

每个语言选项当前是从MasterBase继承的母版页上的LinkBut​​ton。单击链接时,它会调用基于OnLanguagedChanged的方法传递正确的区域性信息。 E.g。

protected void btnEnglish_Click(object sender, EventArgs e) {
    this.OnLanguageChanged("en-US");
    }

每个需要处理语言更改的页面都会在页面加载中显示一些看起来像......

的代码
((MasterBase)this.Master).LanguageChanged += this.Page_OnLanguageChanged;
// Where Page_OnLanguageChanged has the signature of LanguageChangedEventHandler
// and has stuff like reloading options in a drop down using the new language.

相当复杂的'框架'=)

  1. 首先,新开发人员很难知道他们必须将方法连接到MasterBase的LanguageChanged事件来处理语言更改。是的,我们会记录下来。但它仍然不是直截了当且显而易见的。
  2. 其次,所有语言更改都是回发。这是有问题的,特别是当您想要使用浏览器后退按钮导航回来时。
  3. 我正在寻找更优雅的解决方案。一个既没有上述问题,也处理我当前的要求。

    非常感谢任何建议。感谢。

2 个答案:

答案 0 :(得分:1)

在我看来,最好在控件中实现它,设置一个所有页面都可以使用的应用程序变量。这样你就可以在一个地方实现代码,并且每个显示控件的页面都可以使用它(可以在你的master中,所以所有继承的页面都会自动获取)。我认为在控件中你会有一个处理程序来设置全局语言设置,然后重新加载页面。每个页面都会在page_load或prerender期间检查语言设置,并相应地加载正确的本地化字符串。

答案 1 :(得分:1)

我只想在基页上使用PreInit事件来设置当前的ui文化。我不清楚你为什么需要每个页面来知道语言何时被改变。