我试图实现一个典型的语言菜单,用户可以通过出现在网站所有页面中的菜单来选择他们想要查看网站的语言。
该菜单将出现在多个母版页上(当前一个用于用户登录的页面,一个用于用户未登录的页面)。
我当前的实现是有一个单一的母版页基类(我们称之为 MasterBase)。MasterBase 有活动
public event LanguageChangedEventHandler LanguageChanged;
其中 LanguagedChangedEventHandler 被简单地定义为
public delegate void LanguageChangedEventHandler(string NewCulture);
MasterBase 也有一个可覆盖的方法
protected virtual void OnLanguageChanged(string NewCulture)
这基本上会触发事件。
继承 MasterBase 的每个母版页都会覆盖 OnLanguageChanged 并执行通常的操作,例如设置线程的 CurrentUICulture 和语言 cookie 然后执行
Server.Transfer(this.Page.AppRelativeVirtualPath, true);
让页面重新加载新文化的本地化值。在登录用户的母版页上,它还会更新数据库中用户的语言首选项。
每个语言选项当前都是从 MasterBase 继承的母版页上的 LinkButton。单击链接时,它会调用基本 OnLanguagedChanged 方法,传入正确的文化信息。例如
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.
相当复杂的“框架”=)
- 首先,新开发人员很难知道他们必须将方法连接到 MasterBase 的 LanguageChanged 事件以处理语言更改。是的,我们确实记录了它。但这仍然不是简单明了的事情。
- 其次,所有语言更改都是回发。这是有问题的,尤其是当您想使用浏览器的“后退”按钮导航时。
我正在寻找更优雅的解决方案。一个既没有上述问题又能满足我当前要求的产品。
非常感谢任何建议。谢谢。