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;
}
Чтобы этот компонент вступил в силу, его необходимо добавить в реестр перехватчиков приложения.
Для этого наш класс @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, который будет вызывать URL-адрес /international
с соответствующим параметром 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);
}
}
В зависимости от выбранной локали мы будем просматривать страницу на английском или французском языках при запуске приложения.
Давайте посмотрим английскую версию:
А теперь давайте посмотрим французскую версию:
8. Заключение
В этом руководстве мы показали, как мы можем использовать поддержку интернационализации в приложении Spring Boot.
Полный исходный код примера можно найти на GitHub .