Мультиязычный сайт и локализация

Введение в мультиязычные сайты. Ресурсы

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Сегодня никого не удивишь мультиязычными сайтами. Благодаря мультиязычночти сайт становится доступным гораздо большему числу потенциальных пользователей, то сулит большие выгоды, например, увеличение дохода, увеличение аудитории и т.д. Посмотрим, как в 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. Это будет файл ресурсов по умолчанию, который будет использоваться для русского языка:

Добавление ресурса в проект ASP.NET MVC

Перед использованием ресурсов укажем некоторые их настройки для каждого ресурса в окне Свойств (Propertires) внизу под окном проекта:

Параметры ресурсов в ASP.NET MVC

Здесь нам надо установить следующие параметры:

  • 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 : файл ресурсов для немецкого языка

Можно ограничиться и одним, например, только для английского языка.

Теперь структура проекта выглядит так:

Структура мультиязычного сайта в ASP.NET MVC

Условности при создании ресурсов

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

Суффикс культуры имеет следующий формат: languagecode-country/regioncode, где languagecode - код языка, а country/regioncode - код субкультуры. В моем случае я использую только нейтральные культуры без субкультур.

Откроем файл Resource.en.resx и переведем все ресурсы на английский язык:

С ресурсами мы завершили, теперь перейдем к построению самой логики приложения.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850