SpringBoot之国际化

这里省去搭建项目步骤。

第一步:创建国际化文件
这里写图片描述

login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名
login.btn=Sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=Username

第二步:配置国际化文件位置
application.properties

spring.messages.basename=i18n.login

第三步:自定义国际化解析器

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        // 从参数中取l的值作为语言和国家代码
        String paramLanguage = httpServletRequest.getParameter("l");

        if(!StringUtils.isEmpty(paramLanguage)){
            String[] splits = paramLanguage.split("-");
            return new Locale(splits[0], splits[1]);
        }else{
            // 从请求头中取Accept-Language的首个语言和国家代码
            String acceptLanguage = httpServletRequest.getHeader("Accept-Language").split(",")[0];
            String[] splits = acceptLanguage.split("-");
            return new Locale(splits[0], splits[1]);
        }
        // 如果想使用当前系统的语言,则使用Locale.getDefault()
    }

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

    }
}

注意:在SpringBoot中,自动配置好了管理国际化资源文件的组件MessageSourceAutoConfiguration

@ConfigurationProperties(prefix = "spring.messages")
public class MessageSourceAutoConfiguration {

    /**
     * Comma-separated list of basenames (essentially a fully-qualified classpath
     * location), each following the ResourceBundle convention with relaxed support for
     * slash based locations. If it doesn't contain a package qualifier (such as
     * "org.mypackage"), it will be resolved from the classpath root.
     */
    private String basename = "messages";  
    //我们的配置文件可以直接放在类路径下叫messages.properties;

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        if (StringUtils.hasText(this.basename)) {
            //设置国际化资源文件的基础名(去掉语言国家代码的)
            messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
                    StringUtils.trimAllWhitespace(this.basename)));
        }
        if (this.encoding != null) {
            messageSource.setDefaultEncoding(this.encoding.name());
        }
        messageSource.setFallbackToSystemLocale(this.fallbackToSystemLocale);
        messageSource.setCacheSeconds(this.cacheSeconds);
        messageSource.setAlwaysUseMessageFormat(this.alwaysUseMessageFormat);
        return messageSource;
    }

第四步:将自定义国际化解析器加入容器

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

第五步:在页面中使用方式,我这里是使用了Tymeleaf语法,使用普通html语法也一样

<h1 th:text="#{login.tip}">Please sign in</h1>
<a th:href="@{/login.html(l='zh-CN')}">中文</a>
<a th:href="@{/login.html(l='en-US')}">English</a>

猜你喜欢

转载自blog.csdn.net/code_shadow/article/details/81147294