Мировые информационные ресурсы

Интернациональные приложения ASP.NET

Показывать лекцию целиком

Проблемы разработки интернациональных приложений и решение задачи в рамках платформы Microsoft .NET

При разработке приложения, разработчики, несомненно, сталкиваются с вопросами создания пользовательских интерфейсов. Кроме самого внешнего оформления, пользовательский интерфейс всегда содержит информацию, написанную на каком-то из языков (английский, русский, немецкий и т.д.). Логично, что если приложение разрабатывается для российских пользователей, то интерфейс приложения будет выполнен на русском языке, если для американских – на английском и т.д. Кроме того, для категорий пользователей из разных стран может отличаться не только язык, но и формат календаря (например, первый день недели – понедельник или воскресенье), способ написания даты, времени, чисел, и т.д. Обычно приложение учитывает всю эту специфику для пользователя той категории, для которой это приложение разрабатывается. Однако, что делать, если необходимо поддерживать несколько языков одновременно?

Для этой цели платформа .NET Framework и ASP.NET в частности содержит встроенные механизмы по созданию интернациональных приложений. Это означает, что в рамках платформы уже заложены все необходимые инструменты, при этом не нужно разрабатывать какую-либо собственную библиотеку по созданию интернациональных приложений.

Среда исполнения .NET Framework поддерживает интернациональные приложения на уровне платформы. Это означает, что создавать многоязычные приложения можно не только в рамках ASP.NET, но и в приложениях на сопутствующих платформах (Windows Forms, WPF, и др.).

.NET Framework вводит понятие культуры. Культура – это вся информация, относящаяся к определенной категории пользователей по географическому признаку. Информация о культуре – это больше, чем просто определение языка, который необходимо использовать, культура также содержит следующую информацию:

  • формат календаря;
  • формат даты;
  • формат времени;
  • формат чисел;
  • язык;
  • способ написания текста (слева-направо или справа-налево).
  • Эта и другая информация содержится при определении конкретной культуры в .NET Framework. Имя культуры содержит общий идентификатор культуры, а также может содержать уточняющий идентификатор. Примерами имен культур, содержащих только общий идентификатор могут служить следующие названия:

    ru - русскоязычная культура;
    en - англоязычная культура;
    de - немецкоязычная культура.

    Список культур можно продолжать очень долго.

    Однако, в рамках каждой культуры содержатся субкультуры. Например, культура для США может отличаться от культуры Великобритании, хотя обе эти культуры используют английский язык. Аналогично, культура Австрии может отличаться от культуры Германии, хотя обе эти культуры используют немецкий язык. Для уточнения культуры следует указать уточняющий идентификатор. Например, имя культуры может выглядеть в этом случае следующим образом:

    en - англоязычная культура;
    en-US - культура для США;
    en-UK - культура для Великобритании;
    en-AU - культура для Австралии;
    de - немецкоязычная культура;
    de-DE - культура для Германии;
    de-AT - культура для Австрии;
    de-CH - культура для Швейцарии.

    Кроме того, каждая культура имеет свой уникальный числовой идентификатор.

    В рамках .NET Framework содержится описание для каждой культуры страны. Для работы с различными культурами используются объекты из пространства имен "System.Globalization". Каждая культура представляется объектом CultureInfo. Этот объект как раз содержит всю информацию о культуре, о чем мы говорили ранее.

    Для получения информации о культуре используется статический метод GetCultureInfo класса CultureInfo. Этот метод может принимать как числовой, так и строковой идентификатор культуры. Например, для получения информации о русскоязычной культуре можно использовать следующий программный код.

    В результате выполнения этого метода будет получен объект CultureInfo, который будет содержать информацию о требуемой культуре. Если посмотреть содержимое этого объекта, можно увидеть следующую информацию

    Как видно, этот объект содержит исчерпывающую информацию о культуре.

    При запуске приложения .NET Framework автоматически пытается определить культуру пользователя. Если запускается Windows-приложение, то этот выбор делается на основе региональных настроек операционной системы. Если речь идет о веб-приложениях на базе ASP.NET, то среда исполнения в этом случае также определяет культуру пользователя, который обратился к веб-приложению. Эта информация изымается из HTTP-заголовков текущего запроса, если их выдает браузер. Браузер, обычно, берет эту информацию также из региональных настроек операционной системы.

    После определения текущей культуры пользователя, эта информация сохраняется в объекте текущего потока. Для этих целей объект Thread (поток) содержит свойство CurrentUICulture, который хранит объект CultureInfo (рассмотренный нами ранее). Таким образом, после запуска приложения, среда исполнения определит текущую культуру пользователя и сохранит ее в свойстве CurrentUICulture текущего потока. Далее, в процессе работы приложения можно использовать эту информацию для отображения данных на странице.

    После того, как приложение способно определять текущую культуру пользователя, необходимо определиться где следует хранить информацию для различных культур. Например, если страница содержит некоторый текст (или изображение), то этот текст должен изменяться в соответствии с тем языком, который использует пользователь. Конечно, эту информацию можно хранить внутри страницы и выводить тот блок информации, который соответствует текущей культуре. При этом выбор будет делаться с помощью условных операторов.

    Такой подход будет работать, однако, при увеличении количества требуемых языков разметка страницы будет существенно разрастаться. Поэтому обычно такой подход не используется на практике. Вместо этого, используются файлы ресурсов. Файлы ресурсов содержат различные данные, ассоциированные с определенным ключом. Когда на странице требуется отобразить какие-то данные, она обращается к файлу ресурсов и отображает эти данные. Разметка страницы при этом остается простой. Основная идея файлов ресурсов заключается в том, что файл ресурсов можно подменить для каждой культуры. Это означает, что можно создать несколько одинаковых файлов ресурсов, которые будут содержать данные на различных языках. При этом среда исполнения .NET Framework автоматически выберет нужный файл ресурса и будет использовать из него данные.

    Файл ресурса – это файл с расширением "resx", который, по сути, представляет собой файл XML, в котором хранятся соответствующие данные. Предположим, мы создали файл ресурсов "ResourceName.resx", в котором расположены строки, отображаемые на странице. Для того, чтобы создать аналогичные файлы для других культур, следует добавить соответствующий культуре суффикс в имя файла ресурса. Например, имя файла ресурсов для русскоязычной культуры будет иметь вид "ResourceName.ru-RU.resx". При этом файл ресурсов без суффикса будет считаться файлом ресурсов по умолчанию и будет использован, если файл ресурсов для текущей культуры не найден. Таким образом, структура файлов ресурсов может выглядеть следующим образом.

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

    Краткие итоги

    Создание интернациональных приложений в общем случае задача непростая. Однако, платформа ASP.NET содержит уже готовые механизмы, которые позволяют разработчику создавать интернациональные приложения. Для этого текущий поток содержит информацию о текущей культуре, которая определяется автоматически средой исполнения. Для использования этой информации, создается несколько файлов ресурсов, которые содержат одну и ту же информацию, но на разных языках. При выполнении такого приложения, среда исполнения автоматически выберет файл ресурсов, на основании информации о текущей культуре. Таким образом, создание пользовательского интерфейса на нескольких языка сводится к созданию копии файла ресурсов для этой культуры.

    Глобальные ресурсы

    Глобальные ресурсы – это файлы ресурсов, которые размещены в приложении и доступны в рамках всего проекта. Глобальные файлы ресурсов являются наиболее часто используемым типом ресурсов в приложениях на базе .NET Framework. Файлы ресурсов могут содержать строки, изображения и бинарное содержимое (например, содержимое файла). При этом каждый ресурс имеет собственное имя. Имя необходимо для того, чтобы к этому ресурсу можно было обратиться.

    Файлы ресурсов имеют расширение "resx". В одном приложении может содержаться несколько файлов ресурсов. Для добавления файла ресурсов необходимо выбрать пункт "Add new item" в контекстном меню проекта.

    В появившемся диалоге следует выбрать шаблон "Resource File".

    После создания файла ресурсов его можно открыть в Visual Studio встроенным редактором ресурсов и добавить туда необходимые значения. Добавление строковых ресурсов выглядит следующим образом.

    Также в файл ресурсов можно добавить изображения и другие ресурсы. Для этого нужно выбрать соответствующую опцию.

    При добавлении изображений, они также появятся в списке файла ресурса.

    Однако, физически файл изображения хранится в проекте в специальной папке для хранения ресурсов. Файл ресурсов содержит только ссылку на это изображение.

    После добавления всех необходимых ресурсов в файл ресурса в проекте будет содержаться файл "Resource1.resx". Содержимое этого ресурсного файла будет использоваться по умолчанию при обращении к этому ресурсу. Если необходимо создать файл ресурсов для конкретной культуры, следует скопировать файл ресурсов и создать в проекте одноименный файл, но содержащий суффикс в имени, соответствующий определенной культуре. Например, можно создать два файла ресурсов – для русскоязычной и англоязычной культуры.

    В этом случае следует изменить содержимое файлов для каждой культуры. Имена ресурсов внутри ресурсного файла должны оставаться неизменными.

    Аналогичным образом можно создать файлы ресурсов для всех необходимых культур.

    Для получения доступа к информации из ресурсного файла используется объект "ResourceManager" из пространства имен "System.Resources". Однако, использовать этот класс не всегда удобно, поскольку для обращения к содержимому ресурсного файла требуется написать некоторое количество избыточного программного кода.

    Для того, чтобы сделать работу с файлами ресурсов более удобной, при создании файла ресурсов, наряду с файлом "resx" создается автогенерируемый код на языке C#, который содержит весь необходимый код для обращения к данным из файла ресурсов. В нашем случае этот файл называется "Resource1.Designer.cs".

    Таким образом, для обращения к файлу ресурсов следует пользоваться уже готовыми классами, которые позволяют получить информацию из файла ресурсов. Имя класса, который позволяет обратиться к ресурсам в данном случае будет эквивалентно имени файла ресурсов. Поскольку в нашем случае мы создали ресурсный файл с именем "Resource1.resx", то для обращения к ресурсам следует использовать класс "Resource1". Этот класс содержит свойства для всех значений файла ресурсов. Обращаясь к этим свойствам можно получить содержимое файла ресурсов.

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

    Аналогичным образом можно обратиться к файлу ресурсов из разметки страницы.

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

  • пользователи с русскоязычной культурой – значение из файла "Resource1.ru.resx";
  • пользователи с англоязычной культурой – значение из файла "Resource1.en.resx";
  • остальные пользователи – значение из основного файла "Resource1.resx".
  • Таким образом, файлы ресурсов позволяют отделить логику приложения от данных, которые должны быть представлены на различных языках.

    Краткие итоги

    Глобальные ресурсы – это файлы ресурсов, информация из который доступна для всех программных компонентов приложения. Глобальные ресурсы могут содержать данные различных типов – строки, изображения и бинарные данные. Для обращения к глобальным ресурсам используется объект "ResourceManager". Однако, для более удобного обращения к ресурсным файлам используется автоматически генерируемый класс для данного файла ресурсов. Этот класс содержит набор статических свойств, которые позволяют получить данные для конкретного ключа файла ресурсов.

    Локальные ресурсы

    Локальные ресурсы – это особый тип ресурсных файлов, которые содержат значения для конкретной страницы, а не для всего приложения. Этот тип ресурсов удобно использовать когда требуется создать мультиязычный интерфейс для конкретной страницы.

    Перевести страницу на несколько языков можно также используя глобальные ресурсы. Однако, в этом случае придется вручную задавать соответствие ключей ресурсного файла и элементов веб-формы. Если веб-форма большая по размеру, это может занимать длительное время. Поэтому в этом случае процесс разработки формы становится менее эффективным.

    Вместо использования глобальных ресурсов, можно воспользоваться локальными ресурсами. Локальные ресурсы не могут быть использованы в рамках других программных компонент приложения, они доступны только в рамках той формы, для которой они были созданы.

    Для создания формы, поддерживающей одновременно несколько языков, используется следующая последовательность действий:

  • создается стандартная веб-форма с определенным набором элементов управления;
  • для веб-формы генерируется файл ресурсов;
  • при необходимости создаются дополнительные ресурсные файлы для поддержки дополнительных культур.
  • Давайте рассмотрим каждый из этапов создания формы, поддерживающей несколько культур.

    Для начала необходимо определить веб-форму, которая будет содержать необходимый набор элементов управления.

    Как видно, эта форма содержит достаточно стандартное определение. При этом форма будет имееть следующий внешний вид.

    Созданная форма содержит метку, поле ввода и кнопку. Как видно, для данной формы значения метки и кнопки подлежат переводу на другой язык, если культура пользователя не является русскоязычной. Как упоминалось ранее, для этого можно воспользоваться глобальными ресурсами: самостоятельно определить значения ключей ресурсного файла и связать их с элементами формы. Однако, в данном случае будет правильно воспользоваться локальными ресурсами.

    Для создания локальных ресурсов необходимо переключить режим редактирования страницы в режим "Design". После этого в главном меню "Tools" появится элемент "Generate Local Resource".

    Воспользовавшись этим пунктом меню, мы можем создать файл локальных ресурсов для страницы. В этом случае в проект будет добавлена папка "App_LocalResources", в которой появится файл ресурсов, соответствующий данной странице.

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

    Если теперь обратиться к разметке страницы, то можно обнаружить изменения, которые сделала среда разработки при генерации файла ресурсов.

    Как видно, при определении каждого элемента управления в данном случае задается соответствие ключу в файле ресурсов.

    После этого можно скопировать файл ресурсов, добавив к его имени суффикс, соответствующий той культуре, для которой создается многоязычный интерфейс. Например, можно определить несколько ресурсных файлов для английского, русского, немецкого и др. языков. В этом случае среда исполнения также в автоматическом режиме будет определять текущую культуру пользователя, и использовать соответствующий файл ресурсов.

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

    Краткие итоги

    Локальные ресурсы – это особый тип ресурсных файлов, которые ассоциируются с конкретной страницей веб-приложения. Данные из файлов локальных ресурсов могут использоваться только на той странице, к которой привязан файл ресурсов. Файл ресурсов генерируется средой разработки и автоматически привязывается к элементам управления веб-формы.

    Контрольные вопросы

  • Что такое культура?
  • Какой класс содержит информацию о культуре?
  • Какую информацию включает в себя класс, определяющий культуру?
  • Каким образом задается культура? Какие бывают идентификаторы культуры?
  • Каким образом среда исполнения ASP.NET узнает какой именно файл ресурсов следует использовать в данный момент?
  • Каким образом среда исполнения ASP.NET определяет культуру для текущего пользователя?
  • Что такое глобальные ресурсы?
  • Каким образом осуществляется доступ к значениям из файла глобальных ресурсов?
  • Что такое локальные ресурсы?
  • Чем отличаются локальные ресурсы от глобальных?
  • В каких случаях следует использовать глобальные ресурсы, а в каких локальные?
  • Как осуществляется генерация локальных ресурсов?
  • Как осуществляется связывание элементов формы с локальными ресурсами?
  • В какой папке хранятся файлы локальных ресурсов?
  • Вернуться к учебному плану