Internationalization trong Spring Boot

Trong bài viết trước, mình đã giới thiệu với các bạn cách hiện thực internationalization trong các ứng dụng Spring MVC. Đối với các ứng dụng Spring Boot thì cách hiện thực internationalization sẽ như thế nào? Mình sẽ hướng dẫn các bạn trong bài viết này, các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Spring Boot project:

Internationalization trong Spring Boot

với Spring Web dependency:

Internationalization trong Spring Boot

để làm ví dụ.

Kết quả:

Internationalization trong Spring Boot

Mình sẽ cấu hình để sử dụng InternalResourceViewResolver trong ví dụ này.

Mình sẽ khai báo tomcat-embed-jasper dependency để render các tập tin JSP:

và JSTL dependency để làm việc với trang JSP:

Tiếp theo, mình sẽ tạo mới HelloControler:

để hiển thị tập tin view home.jsp nằm trong thư mục src/main/webapp/WEB-INF/views với nội dung như sau:

Ở đây, mình đã khai báo sử dụng <spring:message /> để làm việc với internationalization trong Spring framework. Các bạn xem thêm bài viết Internationalization trong Spring MVC để hiểu thêm về nó nhé!

Mặc định, Spring Boot sẽ dùng Tomcat server để chạy nên các bạn để ý là để hiển thị đúng ngôn ngữ, chúng ta cần khai báo contentType với charset encoding UTF-8 nhé:

Có vẻ như các runtime server khác thì không cần!

Và mình cũng cần khai báo trong tập tin application.properties như sau:

Bây giờ, chúng ta sẽ khai báo các bean cần thiết của Spring cho internationalization: messageSource, localeResolver và localeChangeInterceptor các bạn nhé!

Để cấu hình cho messageSource, mình sẽ tạo mới 2 tập tin messages.properties và messages_vi.properties trong thư mục src/main/resources/i18n với nội dung của mỗi tập tin như sau:

messages.properties:

messages_vi.properties

Spring Boot hỗ trợ auto configuration cho messageSource với ResourceBundleMessageSource implementation. Các bạn có thể khai báo một số properties sau:

Internationalization trong Spring Boot

để sử dụng cấu hình mặc định của Spring Boot.

Ví dụ như mình có thể khai báo property:

để khai báo messageSource cho ứng dụng ví dụ của mình.

Ở đây, mình sẽ không sử dụng cấu hình mặc định mà sẽ khai báo bean để sử dụng class ReloadableResourceBundleMessageSource như sau:

Đối với localResolver mình cũng sẽ sử dụng CookieLocalResolver:

Còn localeChangeInterceptor sẽ được cấu hình như sau:

Ở đây, mình đang sử dụng WebMvcConfigurer để add LocaleChangeInterceptor vào ứng dụng của mình.

Chạy ứng dụng và click giữa các ngôn ngữ để xem kết quả nhé các bạn!

Của mình như sau:

Internationalization trong Spring Boot

và:

Internationalization trong Spring Boot

Add Comment