SpringBoot 国际化-自定义 LocaleResolver

  1. 准备国际化文件
bash 复制代码
资源目录下创建 i18文件夹,
i18 下面创建两个文件:            预配置信息           
messages_en_US.preperties     | success=success
messages_zh_CN.properties     | success=操作成功
  1. 在application.yml中指定国际化文件的位置
yaml 复制代码
spring:
  messages:
    basename: i18/messages
  1. 创建一个自定义 local 解析器
java 复制代码
package com.shi.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

@Component
public class CustomLocalResolver implements LocaleResolver {

    @Autowired
    private HttpServletRequest request;

    public Locale getLocale() {
        return resolveLocale(request);
    }

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (ObjectUtils.isEmpty(cookies)) {
            return Locale.getDefault();
        }
        List<Cookie> cookieList = Arrays.stream(request.getCookies()).filter(cookie -> cookie.getName().equals("locale")).collect(Collectors.toList());
        if (ObjectUtils.isEmpty(cookieList)) {
            return Locale.getDefault();
        }
        Locale locale = StringUtils.parseLocale(cookieList.get(0).getValue());
        if (ObjectUtils.isEmpty(locale)){
            return Locale.getDefault();
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    }

}
  1. 准备工具类。

使用Set注入解决 静态属性不能注入的问题。

java 复制代码
package com.shi.demo.utils;

import com.shi.demo.config.CustomLocalResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class I18Utils {

    private static CustomLocalResolver localResolver;

    private static ApplicationContext context;
    public static String getMessage(String code,Object[] args){
        return context.getMessage(code,args,localResolver.getLocale());
    }

    @Autowired
    public void setLocalResolver(CustomLocalResolver localResolver) {
        I18Utils.localResolver = localResolver;
    }

    @Autowired
    public void setContext(ApplicationContext context) {
        I18Utils.context = context;
    }
}
  1. 测试 代码
java 复制代码
@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping
    public String get() {
        return "get请求:"+I18Utils.getMessage("success",null);
    }
}
  1. 发起请求
    使用的是idea 自带的http client 发送的请求
java 复制代码
###
GET http://localhost:8080/users
#Cookie: locale=zh-cn  # 由于上面使用了StringUtils.parseLocale(),所以这里的值不区分大小写以及'_'和'-'
Cookie: locale=en_US
相关推荐
好奇的候选人面向对象34 分钟前
企业微信接入自定义系统(Java+Vue3)实现共享文档创建与数据统计
java·状态模式·企业微信
橙露40 分钟前
Nginx Location配置全解析:从基础到实战避坑
java·linux·服务器
无敌最俊朗@7 小时前
STL-vector面试剖析(面试复习4)
java·面试·职场和发展
追逐时光者7 小时前
一款开源、现代化的 WinForm UI 控件库
后端·.net
PPPPickup7 小时前
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
java·前端·javascript
LiamTuc7 小时前
Java构造函数
java·开发语言
长安er8 小时前
LeetCode 206/92/25 链表翻转问题-“盒子-标签-纸条模型”
java·数据结构·算法·leetcode·链表·链表翻转
菜鸟plus+8 小时前
N+1查询
java·服务器·数据库
我要添砖java8 小时前
《JAVAEE》网络编程-什么是网络?
java·网络·java-ee
CoderYanger8 小时前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节