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