[series Spring Boot] 11. Message

quydtkt

Administrator
1/11/19
367
35
28
26
Trong bài này, chúng ta sẽ cùng tìm hiểu về message resource trong Spring Boot.

1. Internationalization

- Trong các demo trước của mình, text hiển thị trên view templete thường là các text cố định và không thể thay đổi. Việc sử dụng text cố định, làm cho trang web do bạn tạo ra chỉ có duy nhất 1 ngôn ngữ.​
- Hiện tại, Internationalization (i18n) (Quốc tế hóa) đang là một xu thế, nó trái ngược với Localization (L10n) (Nội địa hóa).​

2. Internationalization trong Spring Boot

- Spring cung cấp các hỗ trợ mở rộng cho quốc tế hóa (Internationalization) (i18n) thông qua việc sử dụng Spring Interceptor, Locale Resolvers và Resource Bundles cho các địa phương khác nhau.​
- Các message được khai báo trong các file message.properties.​
- Trong project Spring Boot, các file message.properties thường được tạo với cấu trúc như sau:​
  • message.properties: Chứa các message mặc định. Được Spring sử dụng khi không tìm được file message.properties của tương ứng với locale chỉ định
  • message_[locale].properties: Các file message.properties ứng với locale (địa phương cụ thể
    • message_en.properties: Anh
    • message_fr properties: Pháp
    • message_vi properties: Việt Nam
- Trong bài học này, tôi sẽ hướng dẫn các tạo ra một web đơn giản, có sử dụng đa ngôn ngữ​

ApplicationConfig.java
Java:
package vn.congdongjava.config;

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.i18n.SessionLocaleResolver;

import java.nio.charset.StandardCharsets;
import java.util.Locale;

@Configuration
public class ApplicationConfig {

    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource;

        messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:message/message");
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());

        return messageSource;
    }

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.US);
        return slr;
    }
}
- Đây là nơi config các Spring Bean với annotation @Configuration​
- Trong class có khai báo 2 method để tạo Spring Bean​

  • messageSource: Load các file message có nằm tại thư mực \src\main\resources\message, Các file message có tên message.properties
  • localeResolver: Xác định locale chỉ định từ client. Resource Bundles sẽ dủng thông tin này để load các message tại file message tương ứng
WebMvcConfig.java
Java:
package vn.congdongjava.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor lci;

        lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");

        registry.addInterceptor(lci);
    }
}
- WebMvcConfig cũng là một class được đánh đấu bằng annotation @Configuration để Spring Boot tự động quét khi khởi động.​
- Đây là nơi đăng kí các thông tin cho mô hình MVC như interceptor, web Resolvers, …​
- Tại method addInterceptors, có đăng kí một interceptor dùng cho việc xác định locale qua request param “lang”​

HomeController.java
Java:
package vn.congdongjava.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String show() {
        return "index";
    }
}
\resources\message\message_en.properties
Code:
username=Username
password=Password
\resources\message\message_vi.properties
Code:
username=Tên đăng nhập
password=Mật mã
- Các message được khai báo theo dạng key=value như trong các file .properties khác​

index.html
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
[[#{username}]] <input type="text" name="username"><br/>
[[#{password}]] <input type="password" name="password"><br/>
</body>
</html>
- Để sử dụng message trong message resource tại thymeleaf, ta dùng cú pháp [[#{key}]]​
Chạy project và truy cập link http://localhost:8080?lang=en

http://localhost:8080?lang=vi



Cám ơn các bạn đã theo dõi. Hẹn gặp lại trong bài viết tiếp theo :)
 

Attachments

Sửa lần cuối: