Internacjonalizacja w Spring Boot

Internacjonalizacja w Spring Boot

Internacjonalizacja w skrócie i18n to możliwość wykorzystania różnych tłumaczeń w aplikacji. Pliki tłumaczeń zamieszczamy w katalogu ./resources/i18n. Nie jest to regułą ale jest to zdecydowanie zalecany sposób. Dodajemy zatem dwa przykładowe pliki tłumaczeń:

  • messages_en.properties

zawartość:

welcome_msg = This is a Spring Boot application using i18n feature

  • messages_pl.properties

zawartość:

welcome_msg = To jest Aplikacja Spring Boot wykorzystuj\u0105ca mechanizm internacjonalizacji

Klasa konfiguracyjna:

@Configuration
public class Config {
 
    @Bean
    public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() {
        ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
        reloadableResourceBundleMessageSource.setBasename("classpath:i18n/messages");
        reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
        return reloadableResourceBundleMessageSource;
    }
}

Przykładowy kontroler:

@RestController
public class MyTestController {
 
    private ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource;
 
    @Autowired
    public MyTestController(ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource) {
        this.reloadableResourceBundleMessageSource = reloadableResourceBundleMessageSource;
    }
 
    @GetMapping("/welcome_en")
    public String welcomeEn() {
        return reloadableResourceBundleMessageSource.getMessage("welcome_msg", null, Locale.ENGLISH);
    }
 
    @GetMapping("/welcome_pl")
    public String welcomePl() {
        Locale locale = new Locale("pl", "PL");
        return reloadableResourceBundleMessageSource.getMessage("welcome_msg", null, locale);
    }
}

Testy:

  • http://localhost:8080/welcome_pl -> wynik w języku polskim,
  • http://localhost:8080/welcome_en -> wynik w języku angielskim.

Internacjonalizacja z użyciem Thymeleafa:

Do pliku pom.xml dodajemy zależność do Thymeleafa:

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

Zmodyfikujmy beana:

@Bean
public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() {
    ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
    reloadableResourceBundleMessageSource.setBasename("classpath:i18n/messages");
    reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
    return reloadableResourceBundleMessageSource;
}

na:

@Bean
public MessageSource messageSource() {
    final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
    reloadableResourceBundleMessageSource.setBasename("classpath:i18n/messages");
    reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
    return reloadableResourceBundleMessageSource;
}

Zmodyfikujmy klasę MyTestController w następujący oto sposób:

@RestController
public class MyTestController {
 
    private MessageSource messageSource;
 
    @Autowired
    public MyTestController(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
 
    @GetMapping("/welcome_en")
    public String welcomeEn() {
        return messageSource.getMessage("welcome_msg", null, Locale.ENGLISH);
    }
 
    @GetMapping("/welcome_pl")
    public String welcomePl() {
        Locale locale = new Locale("pl", "PL");
        return messageSource.getMessage("welcome_msg", null, locale);
    }
}

Dodajmy klasę w której skonfigurujemy interceptor:

@Configuration
public class ApplicationI18NConfig implements WebMvcConfigurer {
 
    @Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.US);
        return  localeResolver;
    }
 
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang");
        return localeChangeInterceptor;
    }
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

Plik index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="#{welcome_msg}"></p>
</body>
</html>

Testy:

  • http://localhost:8080/welcome_pl -> wynik w języku polskim,
  • http://localhost:8080/welcome_en -> wynik w języku angielskim,
  • http://localhost:8080/?lang=pl -> wynik w języku polskim z użyciem parametru żądania lang,
  • http://localhost:8080/?lang=en -> wynik w języku angielskim z użyciem parametru żądania lang.

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*