SpringColud Boot 国际化i18n

LocaleConfig.java

package com.xxxx.auth.config;

import java.util.Locale;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

@Configuration
public class LocaleConfig {

    /**
     * 默认本地化解析器
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        //指定默认语言
        localeResolver.setDefaultLocale(Locale.ENGLISH);
        return localeResolver;
    }

    /**
     * 默认本地化拦截器
     */
    @Bean("localeHandleInterceptor")
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleHandleInterceptor localeChangeInterceptor = new LocaleHandleInterceptor();
        //自定义国际化参数
        localeChangeInterceptor.setParamName("Lang");
        return localeChangeInterceptor;
    }


}

LocaleHandleInterceptor.java

package com.xxxx.auth.config;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.support.RequestContextUtils;

public class LocaleHandleInterceptor extends LocaleChangeInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws ServletException {
        //从URL参数获取
        //String newLocale = request.getParameter(getParamName());

        //从请求头获取
        String newLocale = request.getHeader(getParamName());

        if (newLocale != null) {
            if (checkHttpMethod(request.getMethod())) {
                LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
                if (localeResolver == null) {
                    throw new IllegalStateException(
                            "No LocaleResolver found: not in a DispatcherServlet request?");
                }
                try {
                    localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
                } catch (IllegalArgumentException ex) {
                    if (isIgnoreInvalidLocale()) {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
                        }
                    } else {
                        throw ex;
                    }
                }
            }
        }
        return true;

    }


    private boolean checkHttpMethod(String currentMethod) {
        String[] configuredMethods = getHttpMethods();
        if (ObjectUtils.isEmpty(configuredMethods)) {
            return true;
        }
        for (String configuredMethod : configuredMethods) {
            if (configuredMethod.equalsIgnoreCase(currentMethod)) {
                return true;
            }
        }
        return false;
    }


}

WebMvcConfig.java

package com.xxxx.auth.config;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Resource(name = "localeHandleInterceptor")
    LocaleChangeInterceptor localeChangeInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor);
    }


}

SpringLocaleUtil.java

package com.xxxx.common.util;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.NoSuchMessageException;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

public class SpringLocaleUtil {

    private static Logger logger  = LoggerFactory.getLogger(SpringLocaleUtil.class);

    public static String getI18NValue(String key) {  
        try {
            return SpringLocaleUtil.getI18NValue(key,null);
        } catch (NoSuchMessageException e) {
            logger.warn(key+" I18N not exsists,please check properties."+e.getMessage());
            return key;
        } 
    }

    public static String getI18NValue(String key,Locale locale) {  
        if(null== SpringUtil.getApplicationContext()) {
            logger.warn("I18N not exsists, please first config SpringUtil");
            return key;
        }
        try {
            String i18nValue =  "";
            if(null!=locale) {
                i18nValue = SpringUtil.getApplicationContext().getMessage(key, null, locale); 
            }else {
                if(RequestContextHolder.getRequestAttributes()!=null) {
                    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
                    locale = (Locale) request.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
                    i18nValue = SpringUtil.getApplicationContext().getMessage(key, null, locale); 
                }else {
                    i18nValue = SpringUtil.getApplicationContext().getMessage(key, null, Locale.CHINA);
                }
            }
            if(i18nValue==null || i18nValue.equals("")){
                return  key;
            }
            return i18nValue;
        } catch (NoSuchMessageException e) {
            logger.warn(key+" I18N not exsists,please check properties."+e.getMessage());
            return key;
        } 
    }
}

SpringUtil.java

package com.xxxx.common.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 * Spring上下文获取工具
 */
public class SpringUtil implements ApplicationContextAware {  
    private static ApplicationContext applicationContext;  

    public static ApplicationContext getApplicationContext() {  
        return applicationContext;  
    }  

    public void setApplicationContext(ApplicationContext arg0) throws BeansException {  
        applicationContext = arg0;  
    }  

    public static Object getBean(String id) {  
        Object object = null;  
        object = applicationContext.getBean(id);  
        return object;  
    }  
}

注入SpringUtil

@Import(com.xxxx.common.util.SpringUtil.class)

messages_zh_CN.properties

IPLimited=ip限制

messages_en_US.properties

IPLimited=ip limited

使用

SpringLocaleUtil.getI18NValue("IPLimited")
评论