因为我是纯小白来做的国际化,所以网上找了些资料,完成了国际化的开发,很多文章把大致过程都总结出来了,但是有些细节地方还不完整,所以这里做一个记录,并且把国际化的异常自己做了一个工具类封装,还从前端大神那里总结了一套对于很多国际化字符如何分类的问题。
目录
一、参考文章,此篇基本的代码都有了
SpringBoot国际化配置_DH大黄的博客-CSDN博客
二、详细操作步骤
完成之后的截图
1、在resource下新建文件夹i18n
2、在i18n下新建‘Resource Bundle’文件
输入‘message’
此时结构和正式的不一样,不要慌(我当时在这里纠结过),再次在i18n新建语言文件,idea会自动帮我们调整成正式文件的样子
在i18n下再次新建‘Resource Bundle’文件,文件名‘message_en_US’,新建成功之后,文件结果会自动变成如下,此后要添加语言,就新建对应的文件提示就行了
2、文件编辑
我最开始是直接手动修改每一个语言文件,甚至message.properties都没有往里面写过东西,导致东西又杂又乱,后来知道了语言文件的编写方式,我忘记是那片博客了,具体如下
注(如果资源文件message.properties打开之后,下面没有‘Text Resource Bundle’的选项,可能是idea还没有反应过来,试下关闭所有打开的文件,然后再打开资源文件,再不行重新启动idea)
输入完成之后,就可以对应输入各种语言的翻译了,刚开始写会有点不习惯,写习惯了会发现很快,比一个个文本写快多了
3、在国际化配置文件中加上配置
(如果没有新建i18n文件夹,spring.messages.basename=message就行了)
spring.messages.basename=i18n.message
spring.messages.encoding=utf-8
4、添加国际化解析文件
public class MyLocaleResolver implements LocaleResolver {
private static final String LANG = "lang";
private static final String LANG_SESSION = "lang_session";
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = request.getLocale();
String language = locale.getLanguage();
//中文language=zh_CN
if("en".equals(language)){
locale = new Locale("en_US");
}
HttpSession session = request.getSession();
session.setAttribute(LANG_SESSION, locale);
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
在springmvc中加上加上解析类
注意这两个注解都要@Configuration @EnableWebMvc
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 国际化
* @return
*/
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
5、自己封装的国际化工具类
@Component
public class InternationalizationUtil {
@Autowired
private MessageSource messageSource;
public void languageException(String code) {
throw new CommonException(messageSource.getMessage(code, null, LocaleContextHolder.getLocale()));
}
public void languageExceptionAnd(String andString, String code) {
throw new CommonException(andString + messageSource.getMessage(code, null, LocaleContextHolder.getLocale()));
}
public void languageExceptionTwoCode(String code1, String andString, String code2) {
throw new CommonException(messageSource.getMessage(code1, null, LocaleContextHolder.getLocale()) + andString + messageSource.getMessage(code2, null, LocaleContextHolder.getLocale()));
}
}
6、代码中的使用,一般是在跑送给前端的异常消息中使用
@Service
public class XXServiceImpl implements XXService {
//注入 依赖
@Autowired
private InternationalizationUtil internationalizationUtil;
@Override
public PageResult<UserAbnormalRecordVo> getUserAbnormalRecord() {
if (loginUser == null) {
//以前是直接抛出中文异常
//throw new CommonException("登陆超时,请重新登陆");
//使用国际化工具
internationalizationUtil.languageException("login.timeout.please.login.again");
}
}
三、关于国际化数量多了之后,如何很好的区分他们的一些想法
后台的分法
1、根据类名作为前缀区分
比如,把每个类的名字作为前缀名区分+中文翻译的英文以.号分隔
actuatorService.wrong.equipment.number=设备号有误
sysUserService.fishing.ground=的场地
2、根据功能区分
比如登录功能以login做前缀,注册就以register做前缀,然后是具体的中文翻译
login.Authorization.code.is.invalid,.please.obtain.wechat.authorization.code.again=授权码失效,请重新获取微信授权码
3、我自己用的时候是吧这两种融合在一起使用的
前台的分法
这是我看了前端大神的多语言之后,做的总结,受益匪浅。
主要是通过功能点来区分的,这样逻辑很清晰
{
"menu": {
"record": {
"record": "菜单1",
"monitor": "菜单1",
"operate": "菜单1",
"warning": "菜单1"
}
},
"button": {
"search": "搜索"
},
"title": {
"remark": "备注"
},
"placeHolder": {
"username": "请输入用户账号"
},
"option": {
"normal": "正常"
},
"text": {
"theme": "物联网解决方案"
},
"tableLabel": {
"recordTime": "记录时间"
},
"operate": {
"delete": "删除"
},
"message" :{
"unbindMessage": "确认为该用户解绑当前设备?"
},
"abnormalType": {
"powerFailure": "疑似断电"
},
"changePwd": {
"title": "修改密码"
}
}