1

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

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

我当前的实现是有一个单一的母版页基类(我们称之为 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 继承的母版页上的 LinkBut​​ton。单击链接时,它会调用基本 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.

相当复杂的“框架”=)

  1. 首先,新开发人员很难知道他们必须将方法连接到 MasterBase 的 LanguageChanged 事件以处理语言更改。是的,我们确实记录了它。但这仍然不是简单明了的事情。
  2. 其次,所有语言更改都是回发。这是有问题的,尤其是当您想使用浏览器的“后退”按钮导航时。

我正在寻找更优雅的解决方案。一个既没有上述问题又能满足我当前要求的产品。

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

4

2 回答 2

1

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

于 2008-11-09T01:59:02.010 回答
1

我只会使用PreInit基本页面上的事件来设置当前的 ui 文化。我不清楚为什么您需要每个页面都知道何时更改语言。

于 2008-11-09T02:00:12.243 回答