Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Сегодня никого не удивишь мультиязычными сайтами. Благодаря мультиязычночти сайт становится доступным гораздо большему числу потенциальных пользователей, то сулит большие выгоды, например, увеличение дохода, увеличение аудитории и т.д. Посмотрим, как в ASP.NET MVC 4 мы можем создать мультиязычный сайт.
Перед созданием мультиязычного сайта надо определиться с концепцией.
Мы можем сделать для каждой отдельной культуры свое представление и затем в зависимости от выбранной культуры рендерить его в ответ клиенту.
Второй вариант предполагает использование ресурсов, когда у нас одно представление для всех культур, и в зависимости от выбранной культуры подгружаются определенные для нее ресурсы.
Используем второй вариант. Создадим проект по типу Basic (в моем случае он будет называться MultilingualSite). И первым делом создадим модель. Допустим, наше приложение будет работать со списком пользователей. Добавим в папку Models модель Person:
using System; using System.ComponentModel.DataAnnotations; namespace MultilingualSite.Models { public class Person { public int Id { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resource), ErrorMessageResourceName = "NameRequired")] [Display(Name = "Name", ResourceType = typeof(Resources.Resource))] public string Name { get; set; } [Required(ErrorMessageResourceType = typeof(Resources.Resource), ErrorMessageResourceName = "CountryRequired")] [Display(Name = "Country", ResourceType = typeof(Resources.Resource))] public string State { get; set; } } }
В данном случае для упрощения примера я использовал всего три поля. К двоим применены атрибуты Required и Display. Только в данном случае атрибут Required указывает на тип ресурса, который будет применяться (ErrorMessageResourceType) и имя ресурса (ErrorMessageResourceName).
Определение ErrorMessageResourceType = typeof(Resources.Resource), ErrorMessageResourceName = "CountryRequired"
по сути говорит о том, что у нас есть некоторое пространство имен ресурсов Resources, в нем определен тип Resource. А имя ресурса представляет
уже конкретный ресурс, значение которого будет использоваться в качестве сообщения об ошибке при валидации. То же самое можно прописать и для других атрибутов валидации, например, для атрибута StringLength.
Пока у нас нет никаких ресурсов, но сейчас мы их создадим.
То же самое характерно и для атрибута Display
, только в данном случае его свойство Name
указывает на имя ресурса,
который будет использоваться в качестве названия для соответствующего поля.
Также создадим какой-нибудь простенький контекст данных PersonContext
:
sing System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; namespace MultilingualSite.Models { public class PersonContext : DbContext { public DbSet<Person> Persons { get; set; } } }
Теперь создадим ресурсы. Ресурсы могут содержать не только сообщения об ошибках валидации, но и другие данные, например, заголовки страниц и т.д.
Создадим в проекте папку Resources. В эту папку добавим файл ресурсов Resource.resx. Это будет файл ресурсов по умолчанию, который будет использоваться для русского языка:
Перед использованием ресурсов укажем некоторые их настройки для каждого ресурса в окне Свойств (Propertires) внизу под окном проекта:
Здесь нам надо установить следующие параметры:
Build Action - в качестве типа построения выберем значение Embedded Resource
Custom Tool - в качестве инструмента создания ресурсов введем в поле PublicResXFileCodeGenerator
Custom Tool Namespace - в качестве пространства имен укажем Resources.
В данном случае важно указать именно то пространство имен, которое мы собираемся использовать. Используя выше атрибуты при определении модели,
мы указали ErrorMessageResourceType = typeof(Resources.Resource)
, где в качестве пространства имен выступает Resources.
Теперь перейдем к заполнению самих ресурсов. Нажмем на файл Resource.resx и в открывшуюся таблицу внесем названия ресурсов и их значения:
Это и есть весь набор используемых ресурсов, и мы можем определить множество разных ресурсов. Подобный набор надо указать и у других ресурсов,
только указав значения на соответствующем языке. Так, на рисунке указан ресурс NameRequired
. При определении модели в атрибуте я указал,
что именно этот ресурс будет использоваться в качестве сообщения об ошибке валидации.
Кроме того, мы можем в коде представлений обратиться к ресурсам, например: @Resources.Resource.NameRequired
. Здесь
Resources - пространство имен, Resource - тип ресурса (образуется от названия файла ресурсов), а NameRequired - имя. В таком же формате можно
использовать и другие ресурсы.
Теперь добавим ресурсы для других культур. Для этого можно скопировать файл Resource.resx и вставить его копии в папку Resources. Я сделал две копии файла и переименовал их следующим образом:
Resource.en.resx : файл ресурсов для английского языка
Resource.de.resx : файл ресурсов для немецкого языка
Можно ограничиться и одним, например, только для английского языка.
Теперь структура проекта выглядит так:
При локализации имеют значение в наименовании ресурсов суффиксы, обозначающие локали. Так, мы можем использовать нейтральные культуры,
например: Resource.en.resx
. Здесь суффикс en
обозначает английский язык в целом, все англоязычные культуры.
Но мы можем конкретизировать культуру, например, задать ресурс только для американской версии английского: Resource.en-US.resx
.
Суффикс культуры имеет следующий формат: languagecode-country/regioncode
, где languagecode
- код языка, а
country/regioncode
- код субкультуры. В моем случае я использую только нейтральные культуры без субкультур.
Откроем файл Resource.en.resx и переведем все ресурсы на английский язык:
С ресурсами мы завершили, теперь перейдем к построению самой логики приложения.