基于spring生态的后端i18n国际化实现

参考文献:https://www.cnblogs.com/yanghj/p/13692334.html

原理:获取请求中的语言信息,解析需要的语言环境,选取对应的语言文件,就可实现返回不同的语言,实现多语言切换的国际化需求。

步骤一:增加多语言文件

  在resources中,新增static.i18n文件夹,在里面新建新建三个文件:注意文件命名格式一定要规范

    messages.properties(默认的多语言文件)

    messages_zh_CN.properties(中文语言文件)

    messages_en_US.properties(英文语言文件)

   如图:

    

   在里面添加上相同键的不同语言翻译值;

  如zh_CN中:

  user.appname=中文语言

  en_US中:

  user.appname=China Language

步骤二:IDEA中设置文件的编码为utf-8(重要,一定要设置)

  在中文环境中,IDE一般默认配置文件为GBK编码,会导致中文变成乱码,所以需要在IDEA中设置一下

  设置--编辑器--文本编码,几处都改成utf-8;如图:

    

步骤三:配置文件中添加i18n相关配置

  

 

 

步骤四:代码配置部分,用于拦截解析请求的语言信息

  1,自定义一个解析器,实现LocaleResolver接口,重写方法

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

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

/**
* 此处有三种获取信息途径
* 1,从请求头中获取语言信息
* 2,从cookie中获取语言信息
* 3,从请求参数中获取语言信息
*/
public class MyLocaleResolver implements LocaleResolver {

@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {

/*//方式一:得到请求头参数,解析Accept-Language
String header = httpServletRequest.getHeader("Accept-Language");
Locale locale = Locale.getDefault();
if(header != null && header.length()>0){
System.out.println(header);
if (!StringUtils.isEmpty(header)) {
String[] s = header.split("-");
locale = new Locale(s[0],s[1]);
}
}*/


//方式二:得到cookie,解析locale
Cookie[] cookies = httpServletRequest.getCookies();
Locale locale = Locale.getDefault();
if(cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
if (cookie.getName().equals("lang")) {
String temp = cookie.getValue();
if (!StringUtils.isEmpty(temp)) {
String[] s = temp.split("-");
locale = new Locale(s[0],s[1]);
}
}
}
}

/*//方式三:通过参数解析locale
String temp = httpServletRequest.getParameter("lang");
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(temp)) {
String[] s = temp.split("-");
locale = new Locale(s[0],s[1]);
}*/

return locale;
}


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

}
}

  2,通过@Bean标签,将解析器注入到容器中


@Configuration
@EnableAspectJAutoProxy
public class WebMvcConfig implements WebMvcConfigurer {
  @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }

}

步骤五:写个工具类,主要是为了方便获取相应语言环境中的键值

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;


/**
 * 国际化工具类*/
@Component
public class LocalUtil
{

    private static MessageSource messageSource;

    public LocalUtil(MessageSource messageSource)
    {
        LocalUtil.messageSource = messageSource;
    }

    /**
     * 获取单个国际化翻译值
     */
    public static String get(String msgKey)
    {
        try
        {
            return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
        }
        catch (Exception e)
        {
            return msgKey;
        }
    }
}

步骤六:使用,在需要的地方,直接调用工具类传入键值即可

@RestController
@RequestMapping("/test")
public class TestController {


    @GetMapping("/getmsg")
    public String language() {
        String message = LocalUtil.get("user.appname");
        return message;
    }
}

步骤七:测试

  

 

posted @ 2021-10-28 18:44  junc0125  阅读(544)  评论(0编辑  收藏  举报