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
相关推荐
卷无止境1 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
\光辉岁月/1 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang2 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
狼爷2 小时前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理2 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071572 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat2 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源2 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog2 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
专业程序开发源3 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计