SpringBoot 实现国际化 SpringBoot配置国际化 SpringBoot 国际化 springboot实现国际化 springboot配置国际化 springboot国际化代码实现

配置

全局语言地区拦截器配置

这里使用 请求头参数 设置语言地区,也可以根据 客户端IP识别地区

import com.mh.jishi.i18n.LanguageMessage;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

/**
 * <h2>多语言拦截器</h2>
 * <p>
 *
 * </p>
 *
 * @author 扫楼 <[email protected]>
 * @since 2020年11月18日 17:11
 */
@Order(1)
public class LocalInterceptor implements HandlerInterceptor {
    
    
    private final Logger log = LoggerFactory.getLogger(LocalInterceptor.class);

    /**
     * 获取请求头参数设置 语种,请参考:{@link LanguageMessage#init()}
     * <h3>请求头 lang 有效值:</h3>
     * <li>zh_CN - 中文</li>
     * <li>en_US - 英文</li>
     *
     * @param request  current HTTP request
     * @param response current HTTP response
     * @param handler  chosen handler to execute, for type and/or instance evaluation
     * @return true
     *
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    
    
        // 根据请求头参数 切换地区
        String nowLang = request.getHeader("lang");

        if (StringUtils.isBlank(nowLang)) {
    
    
            // 设置默认地区为 中国 zh_CN
            LocaleContextHolder.setLocale(Locale.CHINA);

        } else if (nowLang.equalsIgnoreCase("zh_CN") || nowLang.equalsIgnoreCase("zh")) {
    
    
            // 中文
            LocaleContextHolder.setLocale(Locale.CHINA);

        } else if (nowLang.equalsIgnoreCase("en_US") || nowLang.equalsIgnoreCase("en")) {
    
    
            // 英语
            LocaleContextHolder.setLocale(Locale.US);
        }else{
    
    
            // 设置默认地区为 中国 zh_CN
            LocaleContextHolder.setLocale(Locale.CHINA);
        }

        log.info("当前语言:【{}】, 地区:【{}】", nowLang, LocaleContextHolder.getLocale());

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
    
    
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    
    
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

将拦截器注册

import com.mh.jishi.interceptor.CurrentLimitingInterceptor;
import com.mh.jishi.interceptor.LocalInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * <p>
 * web 配置
 * </p>
 *
 * @author 扫楼 <[email protected]>
 * @since 2020年11月18日 17:11
 */
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
        // 加入 swagger-ui.html 映射,不然会 404找不到页面
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        // 加入 swagger-ui.html 映射 结束
        super.addResourceHandlers(registry);
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
    
    
    	// 添加 语言地区拦截器
        registry.addInterceptor(new LocalInterceptor());
        super.addInterceptors(registry);
    }
}

多语言实现

多语言接口

/**
 * <h2>语言消息接口</h2>
 * <p>
 *
 * </p>
 *
 * @author 扫楼 <[email protected]>
 * @since 2020年11月18日 17:11
 */
public interface BaseLanguageMessage {
    
    

    /**
     * @return 获取 "请求成功" 对应语种消息
     */
    String getSuccessRequestMessage();


    /**
     * @return 获取 "系统繁忙!请稍后重试" 对应语种消息
     */
    String getTimeOutRequestMessage();

    /**
     * @return 获取 "请求失败" 对应语种消息
     */
    String getFailedRequestMessage();
}

中文语言接口实现类


/**
 * <h2>中文语言</h2>
 * <p>
 *
 * </p>
 *
 * @author 扫楼 <[email protected]>
 * @since 2020年11月18日 17:11
 */
public class ZhCnLanguageMessage implements BaseLanguageMessage{
    
    
    @Override
    public String getSuccessRequestMessage() {
    
    
        return "请求成功";
    }

    @Override
    public String getTimeOutRequestMessage() {
    
    
        return "系统繁忙!请稍后重试";
    }

    @Override
    public String getFailedRequestMessage() {
    
    
        return "请求失败";
    }
}

英文语言接口实现类

package com.mh.jishi.i18n;

/**
 * <h2>英文语言</h2>
 * <p>
 *
 * </p>
 *
 * @author 扫楼 <[email protected]>
 * @since 2020年11月18日 17:11
 */
public class EnUsLanguageMessage implements BaseLanguageMessage{
    
    

    @Override
    public String getSuccessRequestMessage() {
    
    
        return "Request successful";
    }

    @Override
    public String getTimeOutRequestMessage() {
    
    
        return "The system is busy! Please try again later";
    }

    @Override
    public String getFailedRequestMessage() {
    
    
        return "Request failed";
    }
}

初始化


import com.mh.jishi.interceptor.LocalInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Locale;

/**
 * <h2>初始化语言配置 </h2>
 * 配套拦截器使用 {@link LocalInterceptor}
 * <p>
 *
 * </p>
 *
 * @author 扫楼 <[email protected]>
 * @since 2020年11月18日 17:11
 */
@Component
public class LanguageMessage {
    
    

    private static HashMap<Locale, BaseLanguageMessage> messageHashMap;

    private final Logger logger = LoggerFactory.getLogger(LanguageMessage.class);

    private LanguageMessage(){
    
    }

    @PostConstruct
    public void init(){
    
    

        logger.info("开始初始化语言信息");
        messageHashMap = new HashMap<>();
        messageHashMap.put(Locale.CHINA, new ZhCnLanguageMessage());
        messageHashMap.put(Locale.US, new EnUsLanguageMessage());
        logger.info("完成初始化语言信息");
    }

    public static BaseLanguageMessage getLanguageMessage(){
    
    
        return messageHashMap.get(LocaleContextHolder.getLocale());
    }
}

使用

    @getMapping("/testLanguage")
    public String logout() {
    
    
        return LanguageMessage.getLanguageMessage().getSuccessRequestMessage();
    }

我不使用 Spring i18实现 主要是因为 我的需求要 语言是动态的,可以随意增删改查,后续可以将语言存入数据库或者缓存,因为 i18n 多语言实现也是 key - value 方式

猜你喜欢

转载自blog.csdn.net/qq_40739917/article/details/127927180