Spring 3: Интернационализации и Локализации

В этом уроке мы поговорим о интернационализации и локализации в Spring 3.0 MVC. Мы добавим поддержку i18n с l10n для приложения Spring.

Что такое i18n и l10n?

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

В английском языке для слова «internationalization» принято сокращение «i18n». При этом число 18 означает количество пропущенных между «i» и «n» букв. Для Локализации «Localization» применяют сокращение «L10n». Заглавная буква «L» используется чтобы не путать с «i» в «i18n», число 10 — количество букв между «L» и «n».

Цель:

Наша цель заключается в добавлении интернационализации и локализации для нашего приложения Spring MVC. После завершения нашего приложения будет выглядеть.

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

Resouces File

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

Эти файлы хранятся в исходной папке под названием «resources».

Создадим два файла lable_en.properties and lable_ru.properties в папке resources.

language = en
label.registration = Registration
label.login = Log In
language = ru
label.registration = Регистрация
label.login = Войти на сайт

Настройка интернационализации (i18n) / локализации (l10n) в Spring MVC

Мы создали resource properties для нашего приложения. Теперь мы должны объявить эти файлы в конфигурационом файле spring *-servlet.xml.

Будем использовать класс org.springframework.context.support.ReloadableResourceBundleMessageSource для определения resource properties.

Кроме того, обратите внимание, что мы будем предоставлять функцию, где пользователь сможет выбрать язык для приложения в виде влагов. Это реализуется с помощью org.springframework.web.servlet.i18n.LocaleChangeInterceptor класс.

LocaleChangeInterceptor будет перехватывать любые изменения в локали. Эти изменения будут сохранены в cookies для будущего запроса.

org.springframework.web.servlet.i18n.CookieLocaleResolver класс будет использоваться для хранения локализации изменений в cookies.

Добавить следующий код в *-servlet.xml файл.

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:label" />
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en"/>
</bean>

<bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <ref bean="localeChangeInterceptor" />
    </property>
</bean>

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>
</mvc:interceptors>

Отметим, что в вышеуказанной конфигурации мы определили базовое свойство в MessageSource classpath:messages. По этому spring будет определить, что label_  ресурс и будет использоваться в этом приложении.

Изменить вид — JSP

Теперь, когда мы создали два message resources фала и настроить его в Spring MVC, мы будем использовать эти сообщения в файлах JSP. Откройте все файлы JSP вашего приложения и добавьте в начало каждого файла следующую строку:

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

эта библиотека которую мы подключили выше даст нам возможность использовать теги spring.

Для переключение локали добавьте следующий код:

<span style="float: right">
    <a href="?lang=en">en</a> 
    | 
    <a href="?lang=de">ru</a>
</span>

В *-servlet.xml мы указали <property name="paramName" value="lang" /> это значит что параметр передаваемый GET lang методом будет определять локаль.

И последний шаг, это вывод сообщений:

<p><spring:message code="label.registration"/></p>
<p><spring:message code="label.login"/></p>

Отметим, что в JSP выше, мы использовали <spring:message> теги для отображения сообщения от ресурсов.

Многоязычное приложение готово!

Урок создан: 29 октября 2012 | Просмотров: 23893 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 25 марта 2013 в 23:40

    Василий

    хорошая информация, спасибо!
    а не подскажите что надо сделать для вывода в строке адреса «/en/» или «/ru/», вместо «?lang=XX»

    • 25 марта 2013 в 23:41

      Александр Барчук

      Рад, что помог вам :)
      Попробуйте создать контроллер в котором вы будите мапить /en или /ru.

      • 25 марта 2013 в 23:42

        Василий

        хм, еще раз спасибо!
        честно, не ожидал ответа. благодарен :)

  • 27 апреля 2014 в 16:35

    panser

    а за что отвечает этот бин

    он случайно не лишний? у меня все норм заработало и без него.

    • 27 апреля 2014 в 16:37

      panser

      <bean id="handlerMapping"

  • 26 ноября 2015 в 10:29

    Kate

    Спасибо огромное, отличная статья. И не только эта)

  • 12 декабря 2016 в 16:56

    AndrewDark

    А что делать с get запросами типа http://localhost:8080/index?id=5 ___?
    ведь при смене языка нас перекинет сюда http://localhost:8080/indexr?lang=en
    и мы потеряем параметр id

  • 12 января 2017 в 00:33

    Владислав

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

  • 21 января 2017 в 08:18

    Аноним

    ru
    lable_ru.properties