Я пытаюсь реализовать типичное языковое меню, в котором пользователи могут выбирать язык, на котором они хотят просматривать сайт, через меню, которое появляется на всех страницах сайта.
Меню будет отображаться на нескольких главных страницах (в настоящее время одно для страниц, на которых пользователи вошли в систему, и одно для страниц, на которых нет пользователей).
Моя текущая реализация имеет один базовый класс главной страницы (назовем его 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);
чтобы перезагрузить страницу с локализованными значениями для новой культуры. На главной странице для вошедших в систему пользователей также обновляются языковые предпочтения пользователя в БД.
Каждый языковой параметр в настоящее время является LinkButton на главной странице, которая наследуется от MasterBase. Когда ссылка нажата, она вызывает базовый метод 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.
Довольно запутанный «каркас» =)
- Во-первых, новым разработчикам трудно понять, что им нужно подключить метод к событию MasterCase LanguageChanged для обработки языковых изменений. Да, мы это документируем. Но все же это не что-то прямое и очевидное.
- Во-вторых, все языковые изменения - постбэк. Это проблематично, особенно если вы хотите вернуться назад с помощью кнопки «Назад» браузера.
Я ищу более элегантное решение. Тот, у которого нет обеих проблем, описанных выше, а также отвечает моим текущим требованиям.
Очень ценю любые предложения. Спасибо.