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.
Leave a comment