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