2008-11-09 3 views
1

Я пытаюсь реализовать типичное меню языков, в котором пользователи могут выбрать язык, на котором они хотят просмотреть сайт, через меню, которое появляется на всех страницах сайта.Лучший способ реализовать меню языков в приложении ASP.NET

Меню будет отображаться на нескольких основных страницах (в настоящее время для страниц, на которых пользователи вошли в систему, и на страницах, где нет пользователей).

В моей текущей реализации есть базовый класс основной страницы (назовем его MasterBase). MasterBase имеет событие

public event LanguageChangedEventHandler LanguageChanged; 

где LanguagedChangedEventHandler просто определяется как

public delegate void LanguageChangedEventHandler(string NewCulture); 

MasterBase также имеет Overridable метод

protected virtual void OnLanguageChanged(string NewCulture) 

, который только в основном запускает событие.

Каждый мастер-страница, которая наследует MasterBase переопределяет OnLanguageChanged и делает обычные вещи, как набор CurrentUICulture Нити и язык печенье затем делает

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

получить перезагрузку страницы с локализованными значениями для новой культуры. На главной странице для зарегистрированных пользователей он также обновляет язык пользователя pref в db.

Каждый языковой параметр в настоящее время является 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. 

Довольно запутанный «рамки» =)

  1. Во-первых, новым разработчикам сложно понять, что они должны подключить метод к событию LanguageChanged MasterBase для обработки изменений языка. Да, мы это документируем. Но все же это не что-то прямое и очевидное.
  2. Во-вторых, все языковые изменения - это обратная связь. Это особенно проблематично, если вы хотите вернуться назад с помощью кнопки «Назад» браузера.

Я ищу более элегантное решение. Тот, у которого нет проблем, описанных выше, а также обрабатывает мои текущие требования.

Большое спасибо за любые предложения. Благодарю.

ответ

1

Мне кажется, что было бы лучше реализовать это в элементе управления, который устанавливает переменную приложения, которую могут использовать все страницы. Таким образом, вы можете просто реализовать код в одном месте и всегда иметь доступную на каждой странице, которая отображает элемент управления (может быть на вашем хозяине, чтобы все страницы, которые наследуют, автоматически получают его). Я думаю, что в элементе управления у вас будет обработчик, который устанавливает глобальный язык, а затем перезагружает страницу. На каждой странице будут проверяться языковые настройки во время page_load или prerender и соответственно загружать соответствующие локализованные строки.

+0

Полезно, но по-прежнему не решает проблему не требовать обратной передачи. – Fung 2008-11-09 14:35:58

1

Я бы просто использовал событие PreInit на базовой странице, чтобы установить текущую культуру ui. Я не понимаю, почему вам нужна каждая страница, чтобы знать, когда язык изменен.

Смежные вопросы