和印度团队开了几次会扯皮,真服他们的英语口语,想着来弄个国际化试试把
1. 国际化
当产品有多语言环境的需求时,我们就需要为不同的语言提供不同的处理。前端解决了绝大多数的国际化问题,偶尔后端也需要一些国际化需求,刚好 Java 就支持这种操作
1.1 语言资源包
资源包是 properties 文件,以键值对报文对应的国际化信息。必须创建默认的语言资源包(其命名为 baseName.proerties ),而其他语言资源包其命名为 baseName
_
语言类型
_
国家地区.properties。下面举例 baseName 为 messages:
- messages.properties
- messages_zh_CN.properties
- messages_en_US.properties
1.2 Locale
本身是标签,用于表示本地化对象。本地化信息要由 语言类型 和 国家/地区 二者才能唯一确定,比如中文加上中国是简体,中文加上中国台湾是繁体
1.3 ResourceBundle
用于加载对应的资源包,并获取资源包内部的信息。其根据 资源包地址 和 本地化对象 来确认加载哪个语言的资源包
1.4 使用
// 中文简体Locale CNLocale = new Locale("zh", "CN");// 输出:zh_CNString tag = CNLocale.toLanguageTag();// 获取资源包ResourceBundle bundle = ResourceBundle.getBundle(messagesPath, locale);// 获取资源包内部的值bundle.getString("key");
2. 示例
展示没有 SpringBoot 集成的使用方式
2.1 创建国际化文件
在 resources/i18n 下创建国际化文件,填入对应的国际化信息,并在配置文件中填入国际化文件的路径方便统一管理
messages:path: i18n/messages
2.2 创建工具类
@Componentpublic class MessagesUtil {@Value("${messages.path}")private String messagesPath;public String getMessages(String key) {return getMessages(key, Locale.getDefault());}public String getMessages(String key, Locale locale) {ResourceBundle bundle = ResourceBundle.getBundle(messagesPath, locale);return bundle.getString("greet");}}
2.3 使用
@RestController@RequestMapping("/i18n")public class I18nController {@Autowiredprivate MessagesUtil messagesUtil;@GetMapping("/message")public String message() {String message = messagesUtil.getMessages("greet");return message;}}
3. SpringBoot 集成
SpringBoot 集成了国际化,有自动化配置等处理,让我们使用更加方便快捷
3.1 国际化配置
下面是默认值可不设置,也可自行设置命名
server:port: 8080spring:messages:basename: messagesencoding: UTF-8
3.2 创建国际化文件
message.properties 缺省的文件必须要有,然后创建各种语言国际化文件,并放入 resource/i18n 下
3.3 使用
自动注入 MessageSource 类即可,然后根据 key 可以获取对应的国际化信息
@RestController@RequestMapping("/i8n")public class I8nController {@Autowiredprivate MessageSource messageSource;@GetMapping("/message")public String message() {String message = messageSource.getMessage("greet", null, new Locale("en", "US"));return message;}}
3.4 MessageSource 分析
- SpringBoot 自动加载 MessageSource 组件,组件内有 ResourceBundleMessageSource 来加载国际化资源
- MessageSource 组件使用配置文件 MessageSourceProperties,内有默认值:basename = messages
- encoding = StandardCharsets.UTF_8