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
相关推荐
星星点点洲2 分钟前
【Java】应对高并发的思路
java
LDM>W<4 分钟前
黑马点评-用户登录
java·redis
保利九里10 分钟前
数据类型转换
java·开发语言
Uranus^14 分钟前
使用Spring Boot与Spring Security构建安全的RESTful API
java·spring boot·spring security·jwt·restful api
蚂蚁在飞-15 分钟前
Golang基础知识—cond
开发语言·后端·golang
Aiden Targaryen15 分钟前
Windows/MacOS WebStorm/IDEA 中开发 Uni-App 配置
java·uni-app·webstorm
啾啾Fun25 分钟前
【Java微服务组件】分布式协调P1-数据共享中心简单设计与实现
java·分布式·微服务
神经毒素1 小时前
WEB安全--Java安全--shiro550反序列化漏洞
java·安全·web安全·shiro
Coding宇航员1 小时前
玩转 AI · 思考过程可视化
spring boot·ai·可视化
hnlucky1 小时前
Windows 上安装下载并配置 Apache Maven
java·hadoop·windows·学习·maven·apache