Springboot国际化配置Demo

Springboot支持国际化很简单,只需要简单的配置就可以使用了,下面是一个简单的后端国际化Demo

项目结构图
在这里插入图片描述

代码清单:

创建国际化资源 i18n 文件夹,在下面创建三个配置文件分别是:messages.properties,messages_en_US.properties ,messages_zh_CN.properties,内容分别为:

#注意中文的编码方式为ASCII
success.message=成功

success.message=success

success.message=成功

修改配置文件,指定国际化资源路径和编码

spring.messages.basename=i18n/messages
spring.messages.encoding=utf-8

创建国际化配置 WebConfig.java 实现 WebMvcConfigurer 接口

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    

    @Bean
    public LocaleResolver localeResolver() {
    
    
        return new MyLocaleResolver();
    }

}

创建MyLocaleResolver.java实现LocaleResolver接口 ,通过http请求头添加语言字段来判断当前的语言环境

public class MyLocaleResolver implements LocaleResolver {
    
    

    private static final String LANG = "lang";

    private static final String LANG_SESSION = "lang_session";

    public static final String DELIMITER = "_";

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
    
    
        String lang = request.getHeader(LANG);
        //默认语言 简体中文
        Locale locale = Locale.CHINA;
        if (StringUtils.isNotBlank(lang) && lang.contains(DELIMITER)) {
    
    
            String[] langueagea = lang.split(DELIMITER);
            locale = new Locale(langueagea[0], langueagea[1]);
            HttpSession session = request.getSession();
            session.setAttribute(LANG_SESSION, locale);
        } else {
    
    
            HttpSession session = request.getSession();
            Locale localeInSession = (Locale) session.getAttribute(LANG_SESSION);
            if (localeInSession != null) {
    
    
                locale = localeInSession;
            }
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
    
    

    }
}

创建i18n配置文件 MessageConfig.java ,读取i18n目录下的资源

@PropertySource(value = {
    
    "classpath:i18n/messages*.properties"})
public class MessageConfig {
    
    


    /**
     * 国际化信息map
     */
    private static final Map<String, ResourceBundle> MESSAGES = new HashMap<>();

    /**
     * 获取国际化信息
     * 只配置了 zh en 语言
     */
    public static String getMessage(String key) {
    
    
        //获取当前语言环境
        Locale locale = LocaleContextHolder.getLocale();
        if (!Locale.CHINA.getLanguage().equals(locale.getLanguage())
                && !Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
    
    
            //其他语言一律为中文
            locale = Locale.CHINA;
        }
        ResourceBundle message = MESSAGES.get(locale.getLanguage());
        if (message == null) {
    
    
            //根据语言读取配置
            message = MESSAGES.get(locale.getLanguage());
            if (message == null) {
    
    
                message = ResourceBundle.getBundle("i18n/messages", locale);
                MESSAGES.put(locale.getLanguage(), message);
            }
        }
        return message.getString(key);
    }

    /**
     * 清除国际化信息
     */
    public static void flushMessage() {
    
    
        MESSAGES.clear();
    }


}

创建LoginEnum.java枚举,根据语言环境返回对应语言的提示信息

public enum LoginEnum {
    
    

    /**
     * 成功
     */
    SUCCESS(1, "成功", "success"),
    ;

    public Integer code;

    public String desc;

    public String descEn;

    LoginEnum(Integer code, String desc, String descEn) {
    
    
        this.code = code;
        this.desc = desc;
        this.descEn = descEn;
    }

    public static String getMessage(Integer key) {
    
    
        LoginEnum loginEnum = null;
        LoginEnum[] values = LoginEnum.values();
        for (LoginEnum object : values) {
    
    
            if (object.code.equals(key)) {
    
    
                loginEnum = object;
            }
        }
        //获取当前语言环境
        Locale locale = LocaleContextHolder.getLocale();
        if (!Locale.CHINA.getLanguage().equals(locale.getLanguage())
                && !Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
    
    
            //其他语言一律为中文
            locale = Locale.CHINA;
        }
        if (loginEnum == null) {
    
    
            return "未知";
        }
        if (locale.getLanguage().equals(Locale.CHINA.getLanguage())) {
    
    
            return loginEnum.desc;
        } else {
    
    
            return loginEnum.descEn;
        }
    }

}

创建测试接口 LoginController.java

@RestController
public class LoginController {
    
    


    /**
     * 获取枚举中的提示信息
     */
    @GetMapping("/login1")
    public String login1() {
    
    
        return "login1  " + LoginEnum.getMessage(1);
    }


    /**
     * 根据key获取配置文件中的信息
     */
    @GetMapping("/login2")
    public String login2() {
    
    
        return "login2  " + MessageConfig.getMessage("success.message");
    }


}

通过postman调用接口

在这里插入图片描述
源码地址:https://github.com/qinming99/tugos-demo

猜你喜欢

转载自blog.csdn.net/qq_33505611/article/details/111873634