# 国际化 i18n

boot 版本:2.4.4

它的作用范围(根据传递的语言获取对应的信息)目前笔者发现的有:

  • 可以手动获取资源文件中对应 code 的信息
  • @Validated  验证抛出的信息

依赖

implementation 'org.springframework.boot:spring-boot-starter-web'
1

默认已经有资源文件的自动配置了

# 自动配置类是这个  
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration

spring:
  messages:
    # messages 是默认的资源包前缀,意味着只能在 classpath 下存在 messages[_en].properties 这样的文件
    # 想要放到其他路径下可以这样写 i18n/messages
    basename: 'messages'  # 这个是默认的资源包前缀
1
2
3
4
5
6
7
8

首先准备两个资源文件

# messages.properties
username=张三 {0}

# messages_en.properties
username=zhangsan {0}
1
2
3
4
5

编写工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

@Component
public class I18nServices {
    // 直接注入资源包
    @Autowired
    private MessageSource messageSource;

    public String get(String code, Object... args) {
        // LocaleContextHolder 会拿到相关的解析器获取到的 local 
        // 关于这个解析器参考下面的说明
        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
    }

    public String get(String code) {
        return messageSource.getMessage(code, null, LocaleContextHolder.getLocale());
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Locale 有几种解析器,可以查看 官方文档 (opens new window),有一个默认配置好的 请求头解析器 (opens new window)org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver ),它只能通过 Accept-Language  头来改变当前访问接口的语言信息。

前端请求的时候如下携带上指定的语言信息,就能被解析到

GET  {{host}}/test/i18n
Authorization: bearer {{access_token}}
Accept-Language: en
1
2
3

对应的 controller 测试

@Autowired
private I18nServices i18nServices;

@ApiOperation("测试")
@GetMapping("i18n")
public Result i18n() {
    final String username = i18nServices.get("username", 2);
    return ResultHelper.ok(username);
}
1
2
3
4
5
6
7
8
9

这里的语言信息与资源文件的对应关系是:

messages_[en].properties
# 方括号中的就是标头携带的
# 很多文档都定义的是 en_US ,那么如果要想找到这个资源,你的标头就必须写 en_US
1
2
3

# IDEA 中的 i18n 支持

官方文档 (opens new window)

idea 提供了一个 Resource Bundle Editor(资源编辑器),这个是需要我们自己在插件市场中安装的,它提供的功能就是方便你编辑多个语言版本,如下图所示 image.png 上面的界面在任意一个资源文件下侧部分都有入口,点击级可切换到对照页面 image.png