Руководство по интернационализации в Spring Boot

Руководство по интернационализации в Spring Boot

1. обзор

В этом кратком руководстве мы рассмотрим, как можноadd internationalization to a Spring Boot application.

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

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


    org.springframework.boot
    spring-boot-starter-thymeleaf
    1.5.2.RELEASE

Последнюю версию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;
}

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

Для этого наш класс@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}:

При использовании файлов JSP синтаксис:

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

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

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

:

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


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

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

@SpringBootApplication
public class InternationalizationApp {

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

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

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

screen shot in English

А теперь давайте посмотрим на французскую версию:

screen shot in French

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

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

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