Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n.

(Xem lại: Code ví dụ đa ngôn ngữ với Thymeleaf Internationalization i18n)

Các công nghệ sử dụng:

Tạo Spring Boot Project:

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Ở đây mình dùng thymeleaf để hiển thị.

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Cấu trúc Project

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

File run ứng dụng:

package stackjava.com.sbi18n;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootI18nApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringBootI18nApplication.class, args);
  }
}

File Controller:

package stackjava.com.sbi18n.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BaseController {

  @Autowired
  private MessageSource messageSource;

  @RequestMapping("/")
  public String index(Model model, HttpServletRequest request) {
    String message = messageSource.getMessage("hello", null, "default message", request.getLocale());
    model.addAttribute("message", message);
    return "index";
  }

}

Ngoài hiển thị đa ngôn ngữ ở view, bạn cũng có thể lấy ngôn ngữ theo locale, locale này có thể thấy từ locale mà request gửi lên hoặc dựa theo thông tin nào đó từ request để xác định request.

Thường locale này lấy từ ngôn ngữ của trình duyệt.

File Cấu hình message, đa ngôn ngữ:

package stackjava.com.sbi18n.config;

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
      
    @Bean(name = "localeResolver")
    public LocaleResolver getLocaleResolver()  {
        CookieLocaleResolver resolver= new CookieLocaleResolver();
        resolver.setCookieDomain("myAppLocaleCookie");
        resolver.setDefaultLocale(Locale.ENGLISH);
        // 60 minutes 
        resolver.setCookieMaxAge(60*60); 
        return resolver;
    } 
     
    @Bean(name = "messageSource")
    public MessageSource getMessageResource()  {
        ReloadableResourceBundleMessageSource messageResource= new ReloadableResourceBundleMessageSource();
         
        // Đọc vào file i18n/messages_xxx.properties
        // Ví dụ: i18n/messages_en.properties
        messageResource.setBasename("classpath:i18n/messages");
        messageResource.setDefaultEncoding("UTF-8");
        return messageResource;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
        localeInterceptor.setParamName("language");
        registry.addInterceptor(localeInterceptor).addPathPatterns("/*");
    }
     
}
  • Bean messageSource sẽ thực hiện khai báo các file properties
    • trong ví dụ này mình khai báo các file properties nằm ở folder i18n, có tên bắt đầu bằng messages
  • Bean localeResolver sẽ xác định ngôn ngữ hiển thị trên view bằng cách nào, ví dụ thông qua session, qua cookies
    • Trong ví dụ này, mình sẽ xác định ngôn ngữ hiển thị qua cookies với biến myAppLocaleCookies lưu trên trình duyệt
  • Method addInterceptors sẽ xác định thay đổi ngôn ngữ hiển thị thông qua param name nào trên trình duyệt. Ví dụ trên URL có param: ?language=en thì tiếng anh sẽ được hiển thị

Các file ngôn ngữ .properties:

hello=Hello
hello=Xin Chào
hello=Bonjour
hello=こんにちは

 File view:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot + Internationalization</title>
</head>
<body>
  <h1>Spring Boot + Internationalization</h1>
  Language :
  <a href="?language=en">English</a>|
  <a href="?language=vi_VN">Viet Nam</a>|
  <a href="?language=ja_JP">Japanese</a>|
  <a href="?language=fr_FR">France</a>

  <p th:text="${message}">User test</p>
  <p th:text="#{hello}"></p>
  <br />
</body>
</html>

Demo:

Mặc định hiển thị mặc ngôn ngữ tiếng anh, ở đây chrome mình để tiếng anh nên khi khi lấy locale từ request nó sẽ là tiếng anh

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Hiển thị tiếng việt

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Hiển thị tiếng nhật

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Hiển thị tiếng pháp

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Firefox của mình để ngôn ngữ hiển thị là tiếng việt nên message từ controller sẽ lấy theo locale tiếng việt.

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n

Code ví dụ Spring Boot đa ngôn ngữ Internationalization i18n stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References.

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#context-functionality-messagesource

stackjava.com