你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

springboot实现国际化居然可以这么简单,阿里java技术书籍

2021/12/28 14:09:24

我们新建一个提示信息,打开其中一个配置文件:

在这里插入图片描述

切换到resource bundle模式下,我们就可以同时编辑多个语言的提示信息,非常的方便。

3.新建国家化处理工具类

package com.ymy.utils;

import lombok.extern.slf4j.Slf4j;

import org.springframework.context.i18n.LocaleContextHolder;

import org.springframework.context.support.ResourceBundleMessageSource;

import java.util.Locale;

@Slf4j

public class I18nUtil {

/**

  • 通过code 返回对应的提示信息

  • @param code

  • @return

*/

public static String getMessage(String code) {

return getMessage(code, null);

}

/**

  • 返回带参数的提示信息

  • @param code

  • @param args

  • @return

*/

public static String getMessage(String code, Object[] args) {

return getMessage(code, args, “”);

}

/**

  • 根据语种查询信息

  • @param code code

  • @param args 参数

  • @param defaultMessage 默认的提示消息

  • @return

*/

public static String getMessage(String code, Object[] args, String defaultMessage) {

//这里使用比较方便的方法,不依赖request.

Locale locale = LocaleContextHolder.getLocale();

ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

messageSource.setBasename(“i18n/messages”);

String content;

try{

content = messageSource.getMessage(code, args, locale);

}catch (Exception e){

log.info(“获取提示消息失败: ->”,e);

content = defaultMessage;

}

return content;

}

}

不知道你有没有发现messageSource.setBasename(“i18n/messages”);这行代码,很重要,i18n表示你们文件目录,messages表示你配置文件的前缀,比如我的:messages_en_US.properties、messages_zh_CN.properties、messages_fr_FR.properties、messages.properties。

4.新建测试代码

package com.ymy.controller;

import com.ymy.vo.ResultVo;

import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

@Slf4j

public class TestController {

@GetMapping(value = “/test”)

public ResultVo test(){

ResultVo resultVo = ResultVo.faild(“code-0001”);

return resultVo;

}

}

这里我们看到引用了ResultVo,源码如下:

package com.ymy.vo;

import com.ymy.utils.I18nUtil;

import lombok.Getter;

@Getter

public class ResultVo {

private String code;

private String msg;

private T data;

private String createTime ;

private ResultVo(String code){

this.code = code;

setCode(code);

}

public void setCode(String code) {

String message = null;

try {

message =I18nUtil.getMessage(code);

}catch (Exception e){

message = code;

}

this.code = code;

this.msg = message;

}

/**

  • 默认成功返回

  • @param

  • @return

*/

public static ResultVo OK(){

return new ResultVo(“SUCCESS”);

}

/**

  • 返回只带code的信息

  • @param code

  • @param

  • @return

*/

public static ResultVo faild(String code){

return new ResultVo(code);

}

}

如果ResultVo中的@Getter报错的话,可以在pom.xml中引入lombok的依赖:

org.projectlombok

lombok

true

5.测试

中文:

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020031

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

5125026806.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMjIwMDg5,size_16,color_FFFFFF,t_70)

如果中文乱码,推荐你将中文转换成unicode,在写往配置文件中。

英文:

在这里插入图片描述

法文:

在这里插入图片描述

是不是很简单?就是这么的丝滑,我们现在在升级一下,我们现在需要提示:对不起,张三,密码错误,剩余5次,这里面有两个动态信息,张三、5 ,这两个都是会实时发生改变的,那我们如何处理呢?

不知道你还记得国际化工具类中的这个方法吗?

/**

  • 返回带参数的提示信息

  • @param code

  • @param args

  • @return

*/

public static String getMessage(String code, Object[] args) {

return getMessage(code, args, “”);

}

我们一起改造一下代码:

controller:

package com.ymy.controller;

import com.ymy.vo.PwdVo;

import com.ymy.vo.ResultVo;

import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.*;

@RestController

@Slf4j

public class TestController {

private static Integer count = 5;

/**

  • 密码校验

  • @param pwdVo

  • @return

*/

@RequestMapping(value = “checkPwd”,method = RequestMethod.POST)

public ResultVo checkPwd(@RequestBody PwdVo pwdVo){

//这里我就不做判空处理了,因为判空处理还需要往配置文件中添加控的提示信息,这里主要展示带参数的提示信息

if(!“123456”.equals(pwdVo.getPwd())){

count–;

return ResultVo.faild(“code-0002”,pwdVo.getUserName(),count);

}

count = 5;

return ResultVo.OK();

}

@GetMapping(value = “/test”)

public ResultVo test(){

ResultVo resultVo = ResultVo.faild(“code-0001”);

return resultVo;

}

}

PwdVo:

package com.ymy.vo;

import lombok.Getter;

import lombok.Setter;