springboot国际化i18n

springboot国际化

    支持多国语言展示

1、自动式国际化:通过浏览器发送请求头携带的信息自动使用国际化

2、手动式国际化:通过点击按钮,动态更改国际化

        由于springboot自动配置中已集成国际化,直接使用即可

1、创建语言包:(文件编码为:ascii)

/src/main/resources/
static/i18n/messages.properties                默认配置
static/i18n/messages_zh_CN.properties          中文配置
static/i18n/messages_en_US.properties          英文配置
static/i18n/messages_zh_TW.properties          中文繁体

2、配置文件内容:(可以为空,但key不能不写)

messages_zh_CN.properties
   user.title=用户登录
   user.welcome=欢迎使用

messages_en_US.properties
   user.title=User Login
   user.welcome=Welcome

3、初始化配置:

spring.messages.basename=static/i18n/messages

4、取国际化内容:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<fmt:message key="user.welcome" />

注:

        此种方法是根据浏览器请求中的Accept-Language决定的

        Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4

切换语言:

        谷歌--设置--高级--语言--等

2.1

        通过点击按钮,动态更改国际化

1、增加自定义区域解析器

import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

/**
 * @title: 自定义区域解析器
 * @time: 2019年11月19日
 *
 * <msg>
 *    SpringBoot默认的Locale解析器是根据请求头的区域信息进行解析的(浏览器语言)
 *    使用自定义的Locale解析器对url的区域信息进行解析达到点击切换区域效果
 *    一旦我们自定义的区域解析器注册到Spring容器中,则SpringBoot提供的将不自动注册
 * </msg>
 *
 */

public class LocaleResolverConfig implements LocaleResolver {

    /**
     * 获取页面传输信息,执行对应的国际化
     */

    @Override
    public Locale resolveLocale(HttpServletRequest request) {

       String lang = request.getParameter("lang");

       if (!StringUtils.isEmpty(lang)) {
           String[] langSplit = lang.split("_");
           return new Locale(langSplit[0],langSplit[1]);
       }

       return Locale.getDefault();//使用默认配置

    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

        // 增加新语言时使用
        //SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        //localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);

    }

}

 

2、将自定义区域解析器注入容器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
/**
 *
 * @title: 初始化自定义bean
 * @time: 2019年11月19日
 *
 */

@Configuration
public class InitLocalConfig {

   /**
    * 注入-自定义区域解析器
    * @return
    */
   @Bean
   public LocaleResolver localeResolver() {

      return new LocaleResolverConfig();

   }

}

 

3、通过点击,使用对应的国际化

<a href="<%=request.getContextPath()%>/?lang=zh_CN" >中文简体</a>
<a href="<%=request.getContextPath()%>/?lang=zh_TW" >中文繁体</a>      
<a href="<%=request.getContextPath()%>/?lang=en_US" >English</a>

存在的问题一:

        存在iframe跳转时,请求中的Accept-Language会改变原来解析,利用session转存即可

import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import com.axa.pricingplatform.constants.CommonConstant;

/**
 *
 * @title: 自定义区域解析器
 * @time: 2019年11月19日
 *
 * <msg>
 *    SpringBoot默认的Locale解析器是根据请求头的区域信息进行解析的(浏览器语言)
 *    使用自定义的Locale解析器对url的区域信息进行解析达到点击切换区域效果
 *    一旦我们自定义的区域解析器注册到Spring容器中,则SpringBoot提供的将不自动注册
 * </msg>
 *
 */

public class LocaleResolverConfig implements LocaleResolver {

    /**
     * 获取页面传输信息,执行对应的国际化
     */
    @Override
    public Locale resolveLocale(HttpServletRequest request) {

        String lang = request.getParameter("lang");

        if (!StringUtils.isEmpty(lang)) {

            request.getSession().setAttribute(CommonConstant.LOGIN_LANG, lang);

             String[] langSplit = lang.split("_");

             return new Locale(langSplit[0],langSplit[1]);

        }

        lang = (String) request.getSession().getAttribute(CommonConstant.LOGIN_LANG);

        if(!StringUtils.isEmpty(lang)){

             String[] langSplit = lang.split("_");

             return new Locale(langSplit[0],langSplit[1]);

        }

        return Locale.getDefault();//使用默认配置

    }

}

问题二:

        jstl在单独的js文件中,获取不到国际化的值

原因:

        jstl、el的标签会转化为服务器端的代码执行,而js代码则在客户端执行

       如果是单独的js文件,jstl、el表达式是不起作用的,

jstl、EL表达式是在服务端执行的,服务端执行完成后再传给客户端的,js是在客户端执行的,el在js前就被执行了

 

解决办法:

       将单独的js合并至对应的jsp页面即可

上一篇:kibana汉化


下一篇:react 国际化了解一下