spring boot 国际化

第一步:创建资源文件并配置资源文件地址

spring.messages.basename=i18n/messages

第二步:参考 org.springframework.web.servlet.i18n.LocaleChangeInterceptor 实现自己的拦截器

自己实现的拦截器可以添加自己的处理逻辑,比如我添加了从 request 的 header 参数中读取 Accept-Language 信息的功能

public class MyLocaleChangeInterceptor extends HandlerInterceptorAdapter {

    private Logger logger= LoggerFactory.getLogger(MyLocaleChangeInterceptor.class);

    private String paramName = "lang";

    private boolean ignoreInvalidLocale = false;

    private boolean getLanguageFromRequestHeader = false;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String newLocale = request.getParameter(this.getParamName());
        LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);

        if (StringUtils.hasText(newLocale)) {

            if (localeResolver == null) {
                throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
            }

            try {
                localeResolver.setLocale(request, response, this.parseLocaleValue(newLocale));
            } catch (IllegalArgumentException e) {
                if (!this.isIgnoreInvalidLocale()) {
                    throw e;
                }

                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + e.getMessage());
                }
            }
        } else if (this.getLanguageFromRequestHeader) {

            String acceptLanguage = request.getHeader("Accept-Language");
            if (null != localeResolver && StringUtils.hasText(acceptLanguage)) {
                try {
                    int index = acceptLanguage.indexOf(",");
                    String language_country = acceptLanguage.substring(0, index);
                    String [] array = language_country.split("-");
                    localeResolver.setLocale(request, response, this.parseLocaleValue(array[0] + "_" + array[1]));
                } catch (Exception e) {
                    if (!this.isIgnoreInvalidLocale()) {
                        throw e;
                    }

                    if (this.logger.isDebugEnabled()) {
                        this.logger.debug("doAcceptLanguage [" + acceptLanguage + "]: " + e.getMessage());
                    }
                }
            }
        }

        return true;
    }

    @Nullable
    protected Locale parseLocaleValue(String localeValue) {
        return StringUtils.parseLocale(localeValue);
    }

    public String getParamName() {
        return paramName;
    }

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    public boolean isIgnoreInvalidLocale() {
        return ignoreInvalidLocale;
    }

    public void setIgnoreInvalidLocale(boolean ignoreInvalidLocale) {
        this.ignoreInvalidLocale = ignoreInvalidLocale;
    }

    public boolean isGetLanguageFromRequestHeader() {
        return getLanguageFromRequestHeader;
    }

    public void setGetLanguageFromRequestHeader(boolean getLanguageFromRequestHeader) {
        this.getLanguageFromRequestHeader = getLanguageFromRequestHeader;
    }
}

第三步:创建一个配置类,用来设置默认信息

@Configuration
public class LocaleConfig {

    @Value("${spring.messages.default_language}")
    private String default_language = "zh";

    @Value("${spring.messages.default_country}")
    private String default_country = "CN";

    @Value("${spring.messages.default_paramName}")
    private String default_paramName = "lang";

    @Value("${spring.messages.getLanguageFromRequestHeader}")
    private boolean getLanguageFromRequestHeader = true;

    /**
     * 默认解析器 其中locale表示默认语言
     * @return
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        Locale defaultLocale = new Locale(default_language, default_country);
        Locale.setDefaultLocale(defaultLocale );
        localeResolver.setDefaultLocale(defaultLocale );
        return localeResolver;
    }

    /**
     * 默认拦截器 其中default_paramName表示切换语言的参数名
     */
    @Bean
    public WebMvcConfigurer localeInterceptor() {
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                MyLocaleChangeInterceptor localeInterceptor = new MyLocaleChangeInterceptor();
                localeInterceptor.setParamName(default_paramName);
                localeInterceptor.setGetLanguageFromRequestHeader(getLanguageFromRequestHeader);
                registry.addInterceptor(localeInterceptor);
            }
        };
    }

}

第四步,封装一个message 工具类

@Component
public class MessageUtils {

    @Autowired
    private MessageSource messageSource;

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

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值