Эта статья начнется с основных концепций глобализации и локализации ресурсов в Asp.net и объяснит шаги и методы достижения глобализации и локализации в Asp.net1.1 и Asp.net2.0.
один. Основные понятия
1. Зачем локализовать ресурсы?
Наш сайт могут просматривать люди из разных стран и регионов мира, и люди в каждой стране и регионе имеют свои языковые и культурные особенности. Возьмем, к примеру, нашу великую родину. В материковом Китае используется упрощенный китайский язык, а в Гонконге, Макао и Тайване – традиционный китайский. Кроме того, в каждой стране существуют разные форматы выражения валюты, чисел, календаря и другой информации. В нашей стране в основном используется формат года, месяца и дня, а в Соединенных Штатах — формат месяца, дня и года. Таких различий много, поэтому я не буду приводить много примеров. Чтобы предоставить посетителям нашего веб-сайта лучший пользовательский опыт, мы должны предоставить глобальное решение. Пока пользователь выбирает свой язык и регион, сайт будет отображать информацию на странице в соответствии с его языковыми и культурными привычками. Этот процесс можно назвать. локализация.
2. Культура, фиксированная культура, неспецифическая культура,
названия языковых стандартов, зависящие от культуры, соответствуют стандарту RFC 1766 и имеют формат «<код языка2>-<код страны/региона2>», где <код языка2> получен из ISO 639-1. двухбуквенный строчный код, Название культуры Идентификатор культуры Язык — страна zh-CN 0x0804 Китайский — Китай zh-TW 0x0404 Китайский — Тайвань zh-CHS 0x0004 Упрощенный китайский zh-CHT 0x
7С |
04 | Традиционный китайский | |
en | 0x0009 | Английский |
en - США | 0x0409 | Английский - США | en
- | GB | 0x0809 |
uz | - | UZ - Cyrl |
0x0843 | Узбекский (кириллица) - Узбекистан uz-UZ-Latn 0x0443 | Узбекский (латиница ) - Узбекистан |
Фиксированные культуры не поддерживаются чувствительный к культуре. Вы можете использовать пустую строку ("") для указания фиксированного языка и региональных параметров по имени или идентификатору языка и региональных параметров 0x007F. Экземпляры инвариантного языка и региональных параметров представлены свойством InvariantCulture класса CultureInfo. Фиксированные культуры связаны только с английским языком, а не с какой-либо страной. Его можно использовать практически в любом методе в «глобализированном» пространстве имен, требующем культуры. Если ваша программа выполняет сравнение строк или операции изменения регистра, она должна использовать InvariantCulture, чтобы гарантировать, что независимо от языка и региональных параметров, установленных системой, поведение будет выполняться в соответствии с фиксированным языком и региональными параметрами английского языка, представленными InvariantCulture. Однако фиксированная культура должна использоваться только процессами, которые требуют результатов, независимых от культуры (например, системных служб), в противном случае полученные результаты могут быть лингвистически неверными или культурно неподходящими; Пример: CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture Эти две строки кода имеют одинаковый эффект, их цель — получить инвариантный экземпляр культуры;
Например, теперь вы хотите выполнить метод dateTime.ToString() для экземпляра DateTime dateTime. Этот метод фактически использует CurrentCulture вашего текущего потока в качестве культуры по умолчанию и преобразует экземпляр даты в соответствующую строковую форму на основе этой культуры. Поэтому, если в данный момент нам не нужно выполнять операцию ToString в соответствии с культурой потока или системы, нам следует использовать этот метод dateTime.ToString("G", CultureInfo.InvariantCulture) или dateTime.ToString("G" , ДатаВремяФорматИнфо.ИнвариантИнфо) .
Нейтральная культура – это культура, которая связана с языком, но не со страной. Конкретная культура связана с определенным языком и определенной страной. Например, «en» — это нейтральная культура, а «en-US» — это конкретная культура. Обратите внимание, что «zh-CHS» (упрощенный китайский) и «zh-CHT» (традиционный китайский) не зависят от культуры.
Культуры имеют иерархическую структуру, то есть родительским элементом определенного языка и региональных параметров является неспецифический язык и региональные параметры, а родительским элементом неспецифического языка и региональных параметров является InvariantCulture. Свойство Parent класса CultureInfo возвращает неспецифическую культуру, связанную с конкретной культурой. Если ресурс, не зависящий от культуры, не существует в системе или недоступен по другой причине, используется ресурс, не зависящий от культуры, если ресурс, не зависящий от культуры, также недоступен, используется ресурс, встроенный в основную сборку;
3. Реализуйте общие типы, свойства и методы для локализации.
Класс CultureInfo представляет информацию о конкретной культуре, включая название культуры, систему письма и используемый календарь, а также информацию об общих операциях (таких как даты форматирования и т. д.). сортировка строк). Обеспечивает доступ к объектам информации, зависящим от культуры. Обычно существует два способа создания экземпляра класса CultureInfo:
CultureInfo культура = CultureInfo.
CultureInfo Culture = new CultureInfo(name);
Разница между ними заключается в том, что с помощью первого метода вы можете создать экземпляр CultureInfo только фиксированной культуры или конкретной культуры. Если имя — пустая строка, создается экземпляр фиксированного языка и региональных параметров. Если имя — это неспецифический язык и региональные параметры, создается экземпляр CultureInfo по умолчанию, связанный с именем. Второй метод — создать экземпляр CultureInfo культуры, указанной по имени, которое может быть фиксированным, неспецифичным или зависящим от культуры.
Свойство CurrentCulture класса Thread используется для получения или установки языка и региональных параметров текущего потока. Он должен быть установлен для определенной культуры. Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Если Thread.CurrentThread.CurrentCulture = new CultureInfo("en "); будет сообщено об ошибке!
Свойство CurrentUICulture класса Thread используется для получения или установки текущего языка и региональных параметров, используемого диспетчером ресурсов для поиска ресурсов, специфичных для языка и региональных параметров, во время выполнения. Менеджер ресурсов здесь может быть связан с классом ResourceManger.
Thread.CurrentThread.CurrentUICulture = новый CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Класс ResourceManger может находить ресурсы, специфичные для культуры, предоставлять замещающие ресурсы, если локализованные ресурсы не существуют, и поддерживать сериализацию ресурсов. Обычно используемый конструктор ResourceManager — public ResourceManager(string, Assembly). Его смысл заключается в инициализации нового экземпляра класса ResourceManager, который ищет файлы ресурсов из данной сборки, используя указанное корневое имя. Так называемое корневое имя — это, например, корневое имя файла ресурсов с именем «MyResource.en-US.resources» — «MyResource». К выражению корневого имени можно добавить пространство имен, например «MyWebSite.Resource.UserFolder.MyResource». Сборкой может быть сборка, на которой находится страница, которая должна вызывать файл ресурсов, например typeof(MyPage).Assembly. Метод GetString класса ResourceManager используется для получения значения указанного ключа в файле ресурсов. Пример. Если свойство CurrentUICulture потока установлено, выполните следующий метод.
ResourceManager rm = новый ResourceManager("элементы", Assembly.GetExecutingAssembly());
String str = rm.GetString("добро пожаловать");
Если вы хотите получить ресурсы в соответствии с указанной культурой, напишите следующее:
ResourceManager rm = новый ResourceManager("элементы", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("добро пожаловать",ci);
два. Чтобы реализовать локализацию ресурсов в Asp.net1.1,
необходимо сначала создать папку Resource в проекте веб-сайта WebTest и хранить в этой папке файлы ресурсов, общие для всего проекта. Например, мы создали следующие три файла ресурсов: MyResource.en.resx, MyResource.en-US.resx, MyResource.zh-CN.res. В каждом файле ресурсов есть две пары ключ-значение, значениями ключей являются State и Address. Вызовите файл ресурсов на странице MyPage.aspx, которая должна использовать файл ресурсов, как показано ниже:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = новый ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("Состояние");
Label2.Text = rm.GetString("Address");
В это время Label1 и Label2 будут отображать "состояние" и "адрес" в соответствии с правилами файла MyResource.zh-CN.resx. Вышеупомянутый самый простой и простой метод локализации. Здесь скрыты некоторые проблемы. Давайте решим и оптимизируем этот метод один за другим.
1. Как получить культуру пользователя по умолчанию,
можно настроить в разделе «Свойства» -> «Язык» браузера пользователя. Выберите верхний язык в качестве языка пользователя по умолчанию.
CultureInfo CultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo;
Thread.CurrentThread.CurrentUICulture = CultureInfo
Обычно для CurrentCulture и CurrentUICulture устанавливается одинаковая культура. Конечно, они также могут различаться. Например, вы указываете, что CurrentCulture — en-US, а CurrentUICulture — zh-CN. В результате валюта, дата и другая информация на странице отображаются в формате американского английского, а менеджер ресурсов получит контент, который необходимо получить из файла ресурса, из MyResource.zh-CN.resx. файл.
Если страница вашего сайта не предоставляет пользователям функцию выбора языка, то она будет отображаться в соответствии с культурой, установленной браузером пользователя по умолчанию, поэтому вы можете поместить приведенный выше код в метод Application_BeginRequest файла Global.asax. cs-файл. Таким образом, каждый раз, когда пользователь делает запрос на страницу, наша программа сначала устанавливает культуру.
2. Запомните настройки локали пользователя.
Настройки или выбор локали браузера можно запомнить во время сеанса. Но эту операцию невозможно выполнить в методе Application_BeginRequest в файле Global.asax.cs, поскольку сессия в это время еще недоступна. Если на вашем сайте не предусмотрена функция выбора языка пользователями, вам не нужно запоминать региональные настройки пользователя. Просто установите ее в методе Application_BeginRequest в файле Global.asax.cs, как описано выше. Не влияет. производительность. В основном это позволяет избежать конфликтов, при которых пользователь внезапно меняет языковые настройки в браузере на полпути, но веб-сайт по-прежнему отображает содержимое страницы пользователю в соответствии с культурой, сохраненной в сеансе.
Если вы упомянули функцию, позволяющую пользователю выбирать язык, то, очевидно, вам нужно использовать сеанс в страничной программе для записи выбора пользователем культуры. Поскольку каждый запрос от клиента к сегменту сервера, сегмент сервера будет открывать новый поток для обработки и ответа. Если ваша программа не запоминает выбор клиента, она ответит только культурой по умолчанию.
3. Как менеджер ресурсов находит соответствующие файлы ресурсов для указанной культуры?
При выполнении операции над значением, то есть при выполнении метода GetString класса ResourceManager, менеджер ресурсов будет искать соответствующий файл ресурса по свойству CurrentUICulture текущего потока. Есть несколько ситуаций:
(1), если культура, соответствующая текущему CurrentUICulture, — en-US, сначала проверьте, существует ли MyResource.en-US.resx. Если он существует, возьмите из него значение, если он не существует, проверьте. существует ли MyResource.en.resx.
(2) Например, культура, соответствующая текущему CurrentUICulture, — это en, поскольку en не является конкретной культурой, затем сначала найдите, связан ли с ним файл ресурсов MyResource.en-US.resx конкретной культуры en-US. по умолчанию существует. Если да, то получите из него значение, если оно не существует, проверьте, существует ли MyResource.en.resx.
(3) Например, если текущий язык CurrentUICulture — en-GB, сначала найдите файл ресурсов MyResource.en-GB.resx. Если он не существует, проверьте, существует ли MyResource.en.resx. он существует, получите из него значение; если он не существует, проверьте, существует ли файл ресурсов MyResource.en-US.resx для конкретной культуры по умолчанию en-US, связанной с en. Если MyResource.en-US.resx не существует. существует в настоящее время, но существует MyResource.en-CA, программа все равно выдаст исключение о том, что соответствующий файл ресурсов не найден.
Таким образом, можно подвести итог: если текущий поток CurrentUICulture соответствует определенной культуре, менеджер ресурсов сначала ищет файл ресурсов, соответствующий этой конкретной культуре. Если он не найден, он будет искать файл ресурсов, не относящийся к культуре. его еще не было. Найдите его, а затем найдите файл ресурсов языка и региональных параметров по умолчанию, связанный с его ассоциацией, не зависящей от языка и региональных параметров. Когда CurrentUICulture текущего потока соответствует неспецифической культуре, менеджер ресурсов сначала проверяет, существует ли файл ресурсов по умолчанию, соответствующий неспецифической культуре. Если он не существует, проверьте, соответствует ли файл ресурсов неспецифической культуре. -специфическая культура существует и выдает исключение, если она не существует.
4. Как бороться с культурами, которые не обеспечивают поддержку локализации?
Если сайт не предоставляет соответствующие файлы ресурсов для поддержки культуры пользователя по умолчанию, то CurrentUICulture текущего потока необходимо преобразовать в культуру вашего сайта по умолчанию, например en-US или zh-CN. Есть две возможности конвертации:
Во-первых, когда вы получаете Request.UserLanguages[0], сравните его с поддерживаемой предустановкой культуры в файле конфигурации. Если будет подтверждено, что она не поддерживается, немедленно установите CurrentUICulture в качестве культуры по умолчанию.
Второй — использовать структуру try catch для перехвата исключения MissingManifestResourceException при использовании метода GetString ResourceManager для получения значения. При обработке исключения сначала установите для CurrentUICulture культуру по умолчанию, а затем используйте GetString для повторного получения значения.
5. Установите культуру сайта по умолчанию и uiCulture через Web.config
Как показано выше: указано, что культура сайта по умолчанию — en-US (здесь должна быть определенная культура), а uiCulture — zh-CN.
Конечно, вы также можете установить его постранично в теге Page каждой страницы: <@Page Culture="zh-CN" UICulture="en">. Независимо от того, как здесь настроен web.config, страница будет отображаться согласно настройкам тега Page.
три. Реализация локализации ресурсов в Asp.net2.0
Asp.net2.0 предоставляет более разнообразные методы реализации локализации ресурсов. Здесь я сосредоточусь на отличиях от Asp.net1.1.
1. Установка культуры сайта по умолчанию и uiCulture через Web.config
уже обсуждалась в Asp.net1.1 с использованием файла web.config для установки культуры сайта, но в Asp.net2.0 это более гибко. Как правило, вам нужно, чтобы все страницы вашего сайта соответствовали одной и той же культуре. Просто присвойте общесайтовое значение «auto» атрибутам UICulture и Culture (cultural) элемента глобализации в web.config, как показано ниже. Обратите внимание, что это значение «auto» не используется в Asp.net1.1.
В дополнение к автоматическим настройкам вы также можете указать культуру сайта по умолчанию для Asp.net:
После того, как глобализация настроена в web.config, вашему приложению не нужно писать какой-либо код. CurrentUICulture и CurrentCulture потока получат настройки культуры в соответствии со значениями атрибутов uiCulture и Culture, установленными в элементе глобализации. Если глобализация не настроена, CurrentUICulture и CurrentCulture потока по умолчанию будут иметь значение en-US.
2. Используйте файл Web.config для отслеживания выбора региона пользователем.
В Asp.net1.1 сайты, обеспечивающие выбор региона, обычно используют сеансы для записи выбора пользователя, поэтому каждый раз, когда пользователь делает запрос на сайт, все. отображаемый контент локализуется в соответствии с культурой, выбранной пользователем. Другой метод, предусмотренный в Asp.net2.0, — использование файла web.config для отслеживания выбора пользователем культуры.
Вы можете поддержать анонимную идентификацию языка и региональных параметров пользователя, добавив строковое свойство профиля под названием LanguagePreference в файл web.config. Обратите внимание, что включенный атрибут элемента anonymousIdentification должен иметь значение «true», иначе функция анонимной идентификации будет недоступна.
<профиль>
<свойства>
свойства>
Ниже я объясню, как запрограммировать атрибут LanguagePreference в Asp.net2.0. Во-первых, вы можете написать класс PageBase, который наследуется от System.Web.UI.Page и служит базовым классом для всех классов страниц на сайте. Цель этого на самом деле очень проста: извлечь некоторые общие процессы обработки на каждой странице и поместить их в базовый класс, чтобы уменьшить дублирование кода и улучшить удобство обслуживания. Затем напишите следующий код в классе PageBase: protected override void InitializeCulture().
{
base.InitializeCulture();
строка LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
//Когда пользователь посещает этот сайт впервые и Profile.LanguagePreference пуст, определите языковую настройку браузера пользователя
если (string.IsNullOrEmpty (LanguagePreference))
{
если (this.Context.Request.UserLanguages!= null)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
}
}
еще
{
Thread.CurrentThread.CurrentUICulture = новый CultureInfo (LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}
Метод InitializeCulture класса System.Web.UI.Page был добавлен в Asp.net2.0. Он устанавливает Culture и UICulture для текущего потока. Жизненный цикл страницы спроектирован таким образом, что метод InitializeCulture выполняется до инициализации и загрузки страницы. В приведенном выше коде сначала используйте ((ProfileCommon)this.Context.Profile).LanguagePreference, чтобы получить значение текущего атрибута профиля LanguagePreference и определить, пуст ли он, то есть сохранены ли региональные настройки для пользователя; . Если это значение пусто, предпочтительный язык и региональные параметры пользователя получаются из заголовка Http и сохраняются через ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;. Если он не пуст, это означает, что настройки культуры пользователя были сохранены, а затем используйте эту культуру для установки свойств CurrentUICulture и CurrentCulture текущего потока.
Если
{
base.InitializeCulture();
строка LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = новый CultureInfo (LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
еще
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
}
Если сайт предоставляет функцию, позволяющую пользователям выбирать культуру, например размещение списка языков на главной странице сайта, то выбор пользователем культуры можно запомнить с помощью следующего оператора:
protected void lstLanguage_SelectedIndexChanged (отправитель объекта, EventArgs e)
{
if (lstLanguage.SelectedValue != "Авто") // Параметр по умолчанию — Авто
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
еще
{
Profile.LanguagePreference = ноль;
}
Response.Redirect(Request.Url.AbsolutePath);
}
Обратите внимание на строку кода Response.Redirect(Request.Url.AbsolutePath); поскольку код обработки события выполняется после Page_Load, если вы хотите, чтобы страница менялась быстро, необходимо выполнить операцию перенаправления.
При использовании файлов ресурсов для создания файлов глобальных ресурсов на сайте
в Asp.net2.0
VS.Net2005 автоматически создаст папку App_GlobalResources специально для хранения файлов глобальных ресурсов.Так называемый глобальный файл ресурсов — это файл ресурсов, используемый несколькими файлами страниц или главными страницами сайта. Предположим, мы создаем файлы с именами MyResource.resx и MyResource.zh-cn.resx. В программе мы можем использовать следующий код для получения значения в файле ресурсов: this.lblCountry.Text = Resources.MyResource.Country;
Где Страна — это ключ в файле ресурсов. Очевидно, это гораздо проще, чем получать значения из файлов ресурсов в Asp.net 1.1.
Здесь следует отметить две проблемы: во-первых, при создании группы файлов ресурсов с одинаковым корневым именем необходимо создавать файлы без идентификации культуры, например MyResource.resx, а также другие файлы, такие как MyResource.en-gb и MyResource. zh-cn.resx создаются по мере необходимости. Если MyResource.resx не создан, а создан только MyResource.zh-cn.resx, MyResource не будет отображаться в пространстве имен Resources в приведенном выше коде, поэтому компиляция приведенного выше кода не может быть выполнена. MyResource.resx должен хранить содержимое языка сайта по умолчанию на случай, если локализованный файл ресурсов, соответствующий CurrentUICulture текущего потока, не может быть найден или соответствующее значение ключа не может быть найдено в локализованном файле ресурсов. Asp.net основан на ключе в файле MyResource.resx. Если ключ Country не существует в MyResource.resx, но ключ Country существует в MyResource.zh-cn.resx, то приведенный выше код также сообщит об ошибке. при компиляции. Во-вторых, Asp.net не будет сообщать об исключении, если не сможет найти локализованный ресурс в соответствующей области. Он автоматически получит значение из файла MyResource.resx, но не изменит CurrentUICulture текущего потока.
При создании локальных файлов ресурсов на сайте VS.Net2005 автоматически создаст папку App_LocalResources специально для хранения локальных файлов ресурсов. Так называемые локальные файлы ресурсов — это файлы ресурсов, используемые для одного файла страницы на сайте. Его метод именования обычно — Default.aspx.resx и Default.aspx.zh-cn.resx. Теперь я добавляю три ключа Language, lblNavigation.Text и lblNavigation.ForeColor в файл ресурсов по умолчанию. Среди них я установил синий цвет для lblNavigation.ForeColor файла Default.aspx.resx и красный для lblNavigation.ForeColor файла Default.aspx.zh-cn.resx. Существует два способа получить содержимое из локальных файлов ресурсов в Default.aspx в файле подкачки:
(1).
(2).
Будьте осторожны и используйте символ $ при использовании первого метода. Использование второго метода более гибкое и позволяет задать значения сразу для многих свойств элемента управления.
Здесь все еще есть проблемы, на которые следует обратить внимание: необходимо создать локальный файл ресурсов страницы по умолчанию, например, требуется Default.aspx.resx и требуется Default.aspx.zh-cn.resx. Если вы не создаете локальный файл ресурсов по умолчанию, а используете локальные файлы ресурсов на странице, при использовании первого метода привязки произойдет ошибка компиляции, при использовании второго метода для привязки ошибка компиляции не возникнет. возникает ошибка, но настройки этих свойств не действуют, как будто их и не было написано.
4. Отображение локализованных изображений
Отображение локализованных изображений также является новой функцией Asp.net2.0. В Asp.net2.0 файлы ресурсов не ограничиваются комбинациями пар ключ-значение строкового типа. Они могут сохранять файлы нескольких типов. Используйте эту функцию для локализации изображений. По сути, так называемые локализованные изображения — это не что иное, как размещение изображений, подготовленных для разных регионов, в разные локализованные файлы ресурсов. Например, поместите LitwareSlogan.jpg в MyResource.resx и поместите LitwareSlogan.cn.jpg в MyResource.zh-cn.resx.
Если глобальные файлы ресурсов различных локализованных версий содержат локализованные версии файлов изображений, вы можете настроить файл-обработчик с именем MyLocalImage.ashx для его условной загрузки в зависимости от языковых предпочтений пользователя. Код выглядит следующим образом: Показать.
Метод вызова на странице:
Как написать обработчик MyLocalImage.ashx:
общедоступный класс MyLocalImage: IHttpHandler
{
public void ProcessRequest (контекст HttpContext)
{
context.Response.ContentType = "изображение/png";
строка LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
если (!string.IsNullOrEmpty(LanaguageReference))
{
Thread.CurrentThread.CurrentUICulture = новый CultureInfo(LanaguageReference);
}
Растровое изображение bm = Resources.Litware.LitwareSlogan;
Изображение MemoryStream = новый MemoryStream();
bm.Save(изображение,ImageFormat.Png);
context.Response.BinaryWrite(image.GetBuffer());
}
}
Класс пользовательского обработчика, определенный в MyLocalImage.ashx, использует аналогичную логику, которую вы видели ранее в пользовательском методе InitializeCulture, для инициализации параметров CurrentUICulture для текущего потока перед получением файла изображения из глобального файла ресурсов. Вы можете задаться вопросом, почему CurrentUICulture текущего потока был установлен в базовом классе страницы и его необходимо сбросить здесь. Это потому, что этот поток не является тем же потоком, что и поток, обрабатываемый в базовом классе. После того как пользовательский обработчик правильно инициализирует параметры CurrentUICulture, он сможет получить доступ к файлу изображения через строго типизированный класс ресурсов MyResource.resx. Тогда это просто вопрос записи битов файла изображения в поток ответов HTTP.