springboot集成i18n实现国际化

简介

In computing, internationalization and localization are means of adapting computer software to different languages, regional peculiarities and technical requirements of a target locale.
i18n
internationalization 英 [ˌɪntəˌnæʃnəlaɪ'zeɪʃn] ,国际化。
由于首字母"i"和末尾字母"n"间有18个字符,所以简称i18n
 
常用配置:
  • i18n_zh_CN.properties:中国大陆的,中文语言的资源
  • i18n_en_US.properties:美国地区,英文语言的资源
  • i18n.properties:默认资源文件,如果请求相应的资源文件不存在,将使用此资源文件
java代码实战
1.MessageSource类的注入方式,二者选其一
1.1 yml方式的注入:

1.2 代码配置。配置类需添加注解@Configuration才能被spring识别

2.配置文件创建

3.代码实现
public class MessageHolder {
 
/**
* 消息资源对象
*/
private MessageSource messageSource;
 
/**
* 本地化
*/
private Locale locale;
 
/**
* 消息缓存器
*/
private Map<String, String> messageContainer;
 
/**
* 私有构造函数
*
* @param messageSource 消息资源对象
*/
private MessageHolder(MessageSource messageSource) {
this(messageSource, null);
}
 
/**
* 私有构造函数
*
* @param messageSource 消息资源对象
* @param locale 本地化
*/
private MessageHolder(MessageSource messageSource, Locale locale) {
this.messageSource = messageSource;
if (CommonTools.isNotNull(locale)) {
this.locale = locale;
} else {
this.locale = Locale.getDefault();
}
this.messageContainer = new HashMap<>();
}
 
/**
* 获取实例
*
* @param messageSource 消息资源对象
* @return
*/
public static MessageHolder getInstance(MessageSource messageSource) {
return new MessageHolder(messageSource);
}
 
/**
* 获取实例
*
* @param messageSource 消息资源对象
* @param locale 本地化
* @return
*/
public static MessageHolder getInstance(MessageSource messageSource, Locale locale) {
return new MessageHolder(messageSource, locale);
}
 
/**
* 获取消息,此方法为了方便将取值的key对应的value值封装成了枚举,一边接口实现调用
*
* @param messageKey 消息键
* @return
*/
public String getMessage(MessageKey messageKey) {
String key = messageKey.getMessageKey();
if (messageContainer.containsKey(key)) {
return messageContainer.get(key);
}
String message = getMessageFromMessageSource(key);
messageContainer.put(key, message);
return message;
}
 
 
 
/**
* 获取消息 此方法为了方便将取值的key对应的value值封装成了枚举,一边接口实现调用
*
* @param messageKey 消息键
* @param args 消息格式化参数
* @return
*/
public String getMessage(MessageKey messageKey, Object... args) {
String key = messageKey.getMessageKey();
String mapKey = analysisMessageContainerKey(key, args);
if (messageContainer.containsKey(mapKey)) {
return messageContainer.get(mapKey);
}
String message = getMessageFromMessageSource(key, args);
messageContainer.put(mapKey, message);
return message;
}
 
 
/**
* 设置本地化
*
* @param locale
*/
public void setLocale(Locale locale) {
if (!this.locale.equals(locale)) {
this.messageContainer.clear();
this.locale = locale;
}
}
 
//消息分析器
private String analysisMessageContainerKey(String key, Object[] args) {
StringBuilder sb = new StringBuilder(key);
for (Object arg : args) {
sb.append("-").append(arg);
}
return sb.toString();
}
 
//原始的方法封装,可以直接调用此方法即可
 
 
private String getMessageFromMessageSource(MessageSourceResolvable resolvable) {
return messageSource.getMessage(resolvable, locale);
}
 
private String getMessageFromMessageSource(String key) {
return getMessageFromMessageSource(key, null);
}
 
private String getMessageFromMessageSource(String key, Object[] args) {
return messageSource.getMessage(key, args, locale);
}
 
 
}
1.实现获取消息的顶级接口,所有的类都可以实现此接口获取对应的message的key
public interface MessageKey {
 
/**
* 获取消息键
*
* @return
*/
String getMessageKey();
 
}
枚举类,可以不使用:
public enum AppMessageKey implements MessageKey {
 
COMMON_PARAMETER_VERIFICATION_EMPTY("common.parameter.verification.empty"),
COMMON_PARAMETER_VERIFICATION_NONEXISTENT("common.parameter.verification.non-existent"),
COMMON_PARAMETER_PRESENTATION_ERROR("common.parameter.presentation.error"),
COMMON_INFORMATION_GET_SUCCESS("common.information.get.success"),
COMMON_INFORMATION_GET_FAIL("common.information.get.fail"),
COMMON_SUBMIT_SUCCESS("common.submit.success"),
COMMON_SUBMIT_FAIL("common.submit.fail"),
COMMON_INFORMATION_UPDATE_SUCCESS("common.information.update.success"),
COMMON_INFORMATION_UPDATE_FAIL("common.information.update.fail"),
COMMON_DELETE_SUCCESS("common.delete.success"),
COMMON_DELETE_FAIL("common.delete.fail"),
COMMON_RESET_SUCCESS("common.reset.success"),
COMMON_RESET_FAIL("common.reset.fail"),
COMMON_ENABLE_SUCCESS("common.enable.success"),
COMMON_ENABLE_FAIL("common.enable.fail"),
COMMON_DISABLE_SUCCESS("common.disable.success"),
COMMON_DISABLE_FAIL("common.disable.fail"),
COMMON_SYNC_DATA_FAIL("common.sync.data.fail"),
COMMON_SYNC_DATA_SUCCESS("common.sync.data.success");
private String messageKey;
 
AppMessageKey(String messageKey) {
this.messageKey = messageKey;
}
 
@Override
public String getMessageKey() {
return messageKey;
}
}
最终实现
@Slf4j
public class BaseService4App extends BaseService {
 
@Autowired
protected MessageHolder messageHolder;
 
/**
* 信息获取成功提示
*
* @return
*/
protected String getInformationGetSuccessMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_INFORMATION_GET_SUCCESS);
}
 
 
/**
* 信息获取失败提示
*
* @return
*/
protected String getInformationGetFailMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_INFORMATION_GET_FAIL);
}
 
/**
* 提交成功提示
*
* @return
*/
protected String getSubmitSuccessMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_SUBMIT_SUCCESS);
}
 
/**
* 提交失败提示
*
* @return
*/
protected String getSubmitFailMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_SUBMIT_FAIL);
}
 
 
/**
* 信息更新成功提示
*
* @return
*/
protected String getInfomationUpdateSuccessMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_INFORMATION_UPDATE_SUCCESS);
}
 
/**
* 信息更新失败提示
*
* @return
*/
protected String getInfomationUpdateFalilMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_INFORMATION_UPDATE_FAIL);
}
 
 
/**
* 获取信息提示共用接口
*
* @return
*/
protected String getMessage(MessageKey messageKey) {
return messageHolder.getMessage(messageKey);
}
 
/**
* 信息参数为空提示
*
* @return
*/
protected String getParameterEmptyMessage(String messageInfo) {
return messageHolder.getMessage(AppMessageKey.COMMON_PARAMETER_VERIFICATION_EMPTY, messageInfo);
}
 
/**
* 信息删除成功提示
*
* @return
*/
protected String getDeleteSuccessMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_DELETE_SUCCESS);
}
 
/**
* 重置成功提示
*
* @return
*/
protected String getResetSuccessMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_RESET_SUCCESS);
}
 
 
/**
* 重置失败提示
*
* @return
*/
protected String getResetFailMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_RESET_FAIL);
}
 
/**
* 信息删除失败提示
*
* @return
*/
protected String getDeleteFailMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_DELETE_FAIL);
}
 
 
/**
* 同步数据成功提示
*
* @return
*/
protected String getSyncDataSuccessMessage() {
return messageHolder.getMessage(AppMessageKey.COMMON_SYNC_DATA_SUCCESS);
}
}
 
测试:
 
@Slf4j
@RestController
@RequestMapping("test/")
public class Test {
@Autowired
private MessageHolder messageHolder;
 
@GetMapping("test")
public void editInfo() {
System.out.println(messageHolder.getMessageFromMessageSource("common.parameter.verification.empty"));
}
 
@GetMapping("test1")
public void test1() {
System.out.println(messageHolder.getMessageFromMessageSource("common.parameter.verification.empty", new Object[]{"javac"}));
}
 
}
 
posted @   莫等闲xr  阅读(591)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示