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 多言語実装も含まれるため、言語は後でデータベースまたはキャッシュに保存できます。キーと値のメソッドを使用します。

おすすめ

転載: blog.csdn.net/qq_40739917/article/details/127927180