ASP.NET 2.0 предоставляет функции многоязычного преобразования и преобразования нескольких стилей. Эти две формы реализации относительно схожи, поэтому они будут объясняться вместе.
1. Переключатель языка. Переключение нескольких языков. В кратком руководстве описано, как сохранять и применять язык, выбранный пользователем. Обычно DropDownList используется для отображения поддерживаемых языков, которые может выбрать пользователь. Обычно он размещается на главной странице, и здесь сохраняется выбранный пользователем язык. его также можно сохранить в сеансе cookie или строке запроса. Переопределите метод InitializeCulture на странице, чтобы использовать язык, ранее выбранный пользователем. Поскольку операция установки языка (здесь событие SelectedIndexChanged) происходит после времени InitializeCulture, чтобы текущая страница вступила в силу сразу после завершения операции настройки, необходимо перенаправление для перезагрузки этой страницы и запуска события InitializeCulture. Ниже приведена часть кода быстрого запуска, обратите внимание на красную часть. Поскольку за некоторыми адресами страниц может стоять строка запроса, я лично считаю, что красную часть кода лучше всего заменить на Response.Redirect(Request.Url.PathAndQuery);.
protected void DropDownLanguage_SelectedIndexChanged (отправитель объекта, EventArgs e)
{
строка SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//Сохраняем выбранный язык пользователя в профиле
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage //
Принудительная повторная инициализация страницы для запуска InitializeCulture());
Response.Redirect(Request.Url.LocalPath);
}
защищенное переопределение void InitializeCulture()
{
// переопределяем виртуальный метод InitializeCulture(), чтобы проверить, содержит ли профиль настройку языка пользователя
строка UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
если (UserCulture != "")
{
// в профиле есть настройка языка пользователя: переключитесь на нее
Thread.CurrentThread.CurrentUICulture = новая CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
Чтобы уменьшить дублирование кода, класс базовой страницы клиента обычно настраивается: он наследует класс Page, а затем повторно инициализируется метод InitializeCulture в базовом классе настроенной страницы. Наконец, унаследуйте каждую страницу от базового класса пользовательской страницы. Таким образом, вам не нужно переопределять метод InitializeCulture на каждой странице.
Но описанный выше метод по-прежнему не очень удовлетворителен, поскольку каждый раз, когда вы добавляете страницу, вам приходится изменять почтовый индекс, чтобы наследовать базовый класс пользовательской страницы.
Мы заметили, что в методе InitializeCulture фактически изменяются только Culture и UICulture текущего потока. Итак, можно ли изменить эти два атрибута в глобальном событии, например в событии Application? Я попробовал это давным-давно, реализовав детали InitializeCulture при запуске события BeginRequest приложения, аналогично следующему коду:
void Application_BeginRequest (отправитель объекта, EventArgs e)
{
string lang = string.Empty;//по умолчанию используется инвариантная культура
язык = Профиль.PreferredCulture;
если (string.IsNullOrEmpty(язык))
{
язык = строка.Пусто;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Обратите внимание, что красная часть должна быть заменена другими методами, поскольку объект профиля еще не был создан asp.net на этапе запуска запроса. Можно заменить печеньем.
Я помню, что после этого после установки языка это не сработало. В то время я думал, что это будет обработано в глобальном событии и может быть перезаписано позже, поэтому это может не сработать. Таким образом, метод InitializeCulture в то время все еще использовался. Сегодня я видел, как кто-то на форуме asp.net делал это.
void Application_BeginRequest (отправитель объекта, EventArgs e) {
string lang = string.Empty;//по умолчанию используется инвариантная культура
HttpCookie cookie = Request.Cookies["DropDownName"];
if (cookie!= null && cookie.Value!= null)
язык = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Поэтому я подумал, что в тот момент что-то могло быть установлено неправильно, поэтому попробовал еще раз. Это оказалось причиной команды заголовка страницы <%@ Page UICulture="auto" Culture="auto" %>. Культура установлена на странице. Они переопределяют глобальные настройки. После его удаления глобальные настройки вступили в силу. Похоже, что настройки культуры на странице переопределят глобальные настройки, а настройки метода InitializeCulture на странице (точнее, все элементы управления, поддерживающие этот метод) переопределят настройки страницы. Фактически реализация метода InitializeCulture в классе Page по умолчанию пуста, поэтому после удаления инструкции заголовка страницы UICulture="auto" Culture="auto" настройки в Global вступят в силу.
Кроме того, если вы действительно хотите использовать Profile (как я) для хранения выбора пользователя, вы не сможете обработать его на этапе Beginrequest. Я обрабатываю это, когда срабатывает событие PreRequestHandlerExecute:
void Application_PreRequestHandlerExecute (отправитель объекта, EventArgs e)
{
string lang = string.Empty;//по умолчанию используется инвариантная культура
язык = Профиль.PreferredCulture;
если (string.IsNullOrEmpty(язык))
{
язык = строка.Пусто;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
На данный момент профиль создан, поэтому его можно использовать.
2. Переключение тем в нескольких стилях. Переключатель тем.
В этой статье говорится о переключении тем, и я думаю, что эта форма очень похожа на переключение языка. Он использует HttpModule, думаю, его можно разместить прямо под соответствующей обработкой и раздачей событий в файле Global.asax. В итоге то же самое. Он использует файлы cookie для хранения. Я все же считаю, что лучше использовать профиль. Поскольку он предусмотрен, используйте его, поэтому производительность не должна быть проблемой.
Источник: Плотное накопление и цветущий БЛОГ