SpringBoot项目如何国际化操作,让你可以随意切换语言

1.前言

最近接触的项目需要中文/英文或者其他国家语言的切换,在后台的时候有一个选择,你可以选择中文还是英文,或者其他语言,选择完毕界面语言就都变了,咱不知道前端怎么操作的,但是后台在处理提示语的时候也要对应改变为不同的语言,这怎么办呢?

别担心,Spring和java都有相关国际化的操作,只要按照相应的规则去使用就可以了。

2.定义配置文件

首先我们要定义双语环境,如果有多个语言就建立多个语言的配置文件,如下图片

我定义了两个语言配置文件,一个是英语国家美国的,一个是中华国家是中国的配置文件。

那我们在resources下添加一个i18n目录,这个i18n就是internationalization,国际化英文去掉前面i和后面n是18个字母,所以i18n,代表国际化。

然后在i18n目录下添加bundle的文件

文件名类似如下,文件名字en代表英文,这个位置也就是语言文化代码,US代表国家,这个位置就代表国家地区。中文就是zh_CN。

 

messages_en_US.properties 里放的是英语,假如我放的是这个提示语,我们需要定义对应的key,然后值就是对应的提示输出,这里的目的方便后面设置的时候找key,对应不同的输出(因为有很多提示语要用哪个需要指定)。

USER_NAME_ISNOT_NULL=User name cannot be empty

messages_zh_CN.properties里放的是中文,那就放对应的中文

USER_NAME_ISNOT_NULL=用户名称不能为空

 3.代码说明

然后就需要语言的配置,通过bean注入,默认设置中文

@Configuration
public class LocaleConfig {
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        // 汉语
        final Locale locale = new Locale("zh","CN");
        slr.setDefaultLocale(locale);
        return slr;
    }
}

然后定义一个Controller,模拟前端访问接口时返回对应不同语言的提示,

定义了一个test/i18n的接口,让用户在header里传递language参数,en代表英语,zh代表汉语,然后正常是请求接口时进行拦截,拦截后去设置语言,如代码:localeResolver.setLocale,但是咱们是模拟吗,就都写在Controller这个方法了。

这里就判断对应不同的语言类型,直接设置语言类型就可以啦。

@RestController
public class i18nTestController {

    @Autowired
    private LocaleResolver localeResolver;

    @GetMapping("/test/i18n")
    public I18nResponse TestI18n(HttpServletRequest request, HttpServletResponse response,
                                 @RequestHeader(value = "language",required = false) String language) {

        // 假如这是一个拦截器,拿到了语言就可以设置使用哪种语言
        Locale locale = null;

        // 根据传入值的不同设置不同的语言
        if (language!=null&&language.equals("en")) locale = new Locale("en", "US");
        if (language!=null&& language.equals("zh")) locale = new Locale("zh", "CN");
        if (locale!=null)localeResolver.setLocale(request, response, locale);

        // 这里是就是执行完逻辑给前端的提示
        return new I18nResponse("0001", I18nEnum.USER_NAME_ISNOT_NULL);
    }
}

返回提示类,在用户调用返回类时,直接通过ResourceBundle.getBundle获取对应不同语言环境并取到对应语言值。

public class I18nResponse{
    private String code;
    private String msg;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public I18nResponse(String code, I18nEnum i18nEnum) {
        this.code = code;
        // 拿到配置文件设置语言
        final ResourceBundle bundle = ResourceBundle.getBundle("i18n/messages", LocaleContextHolder.getLocale());
        // 根据key值获取对应语言的数据
        this.msg = bundle.getString(i18nEnum.name());
    }
}

枚举值,这里枚举名称要对应配置文件里的key,其实你也可以不用枚举,也可以用字符串传递,只不过规范来说还是单独定义一个枚举更好,改动的时候也方便查找。

public enum I18nEnum {

    USER_NAME_ISNOT_NULL;
}

4.测试

然后就可以测试了,在选择英文的时候,返回提示是英文。

切换中文情况下

什么都不选,默认的是中文

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值