Лучший способ реализовать меню языков в приложении ASP.NET - PullRequest
1 голос
/ 09 ноября 2008

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

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

Моя текущая реализация имеет один базовый класс главной страницы (назовем его 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.

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

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

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

Очень ценю любые предложения. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 ноября 2008

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

1 голос
/ 09 ноября 2008

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

...