«1. Обзор

В этом кратком руководстве мы рассмотрим, как мы можем добавить интернационализацию в приложение Spring Boot.

2. Зависимости Maven

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

Последнюю версию spring-boot-starter-thymeleaf можно загрузить с Maven Central.

3. LocaleResolver

Чтобы наше приложение могло определить, какая локаль используется в данный момент, нам нужно добавить bean-компонент LocaleResolver:

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.US);
    return slr;
}

Интерфейс LocaleResolver имеет реализации, определяющие текущую локаль на основе сеанса, файлов cookie, заголовка Accept-Language или фиксированного значения.

В нашем примере мы использовали преобразователь на основе сеанса SessionLocaleResolver и установили локаль по умолчанию со значением US.

4. LocaleChangeInterceptor

Далее нам нужно добавить bean-компонент-перехватчик, который будет переключаться на новую локаль на основе значения параметра lang, добавленного к запросу:

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName("lang");
    return lci;
}

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

Для этого наш класс @Configuration должен реализовать интерфейс WebMvcConfigurer и переопределить метод addInterceptors():

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(localeChangeInterceptor());
}

5. Определение источников сообщений

По умолчанию приложение Spring Boot будет искать файлы сообщений, содержащие ключи и значения интернационализации, в папке src/main/resources.

Файл для локали по умолчанию будет иметь имя messages.properties, а файлы для каждой локали будут называться messages_XX.properties, где XX — код локали.

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

Если ключ не существует в определенной запрошенной локали, приложение вернется к значению локали по умолчанию.

Давайте определим файл сообщений по умолчанию для английского языка с именем messages.properties:

greeting=Hello! Welcome to our website!
lang.change=Change the language
lang.eng=English
lang.fr=French

Затем давайте создадим файл с именем messages_fr.properties для французского языка с теми же ключами:

greeting=Bonjour! Bienvenue sur notre site!
lang.change=Changez la langue
lang.eng=Anglais
lang.fr=Francais

6 Контроллер и HTML-страница

Давайте создадим сопоставление контроллера, которое будет возвращать простую HTML-страницу с именем international.html, которую мы хотим видеть на двух разных языках:

@Controller
public class PageController {

    @GetMapping("/international")
    public String getInternationalPage() {
        return "international";
    }
}

Поскольку мы используем тимелеаф для отображения HTML-страницы , доступ к значениям, зависящим от локали, будет осуществляться с помощью ключей с синтаксисом #{key}:

<h1 th:text="#{greeting}"></h1>

Если используются файлы JSP, синтаксис будет следующим:

<h1><spring:message code="greeting" text="default"/></h1>

Если мы хотим получить доступ к странице с помощью В двух разных локалях мы должны добавить параметр lang к URL-адресу в форме: /international?lang=fr

Если в URL-адресе нет параметра lang, приложение будет использовать локаль по умолчанию, в нашем случае локаль США.

Давайте добавим на нашу HTML-страницу раскрывающийся список с двумя локалями, имена которых также локализованы в наших файлах свойств:

<span th:text="#{lang.change}"></span>:
<select id="locales">
    <option value=""></option>
    <option value="en" th:text="#{lang.eng}"></option>
    <option value="fr" th:text="#{lang.fr}"></option>
</select>

Затем мы можем добавить скрипт jQuery, который будет вызывать /international URL с соответствующим lang в зависимости от того, какая опция раскрывающегося списка выбрана:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js">
</script>
<script type="text/javascript">
$(document).ready(function() {
    $("#locales").change(function () {
        var selectedOption = $('#locales').val();
        if (selectedOption != ''){
            window.location.replace('international?lang=' + selectedOption);
        }
    });
});
</script>

7. Запуск приложения

Чтобы инициализировать наше приложение, мы должны добавить основной класс, аннотированный @SpringBootApplication:

@SpringBootApplication
public class InternationalizationApp {
    
    public static void main(String[] args) {
        SpringApplication.run(InternationalizationApp.class, args);
    }
}

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

Давайте посмотрим английскую версию:

screen shot in English
And now let’s see the French version:
screen shot in French

8. Заключение

В этом уроке мы показали, как мы можем использовать поддержку интернационализации в приложении Spring Boot.

Полный исходный код примера можно найти на GitHub.