SpringBoot - Web开发 国际化

本章开始将围绕实际项目来学习,之后涉及到的学习的资料可以在Bootstrap的示例中找到。
要完成其实很简单,主要按以下步骤:

  1. 编写国际化配置文件
  2. 使用ResourceBundleMessageSource管理国际化资源文件
  3. 在页面取出国际化内容

一.编写国际化配置文件

SpringBoot - Web开发 国际化_第1张图片
配置

在开始编写国际化配置文件之前,需要做一个准备工作:
选择File-Other Setting-Default Setting-File Encodings 按照上图配置,防止乱码出现

SpringBoot - Web开发 国际化_第2张图片
国际化配置文件

文件名命名规则基础名+语言国家代码+.properties,默认可以不加语言国家代码如xxx.properties, xxx_zh_CN.properties,xxx_en_US.properties,当IDEA检测到你的国际化配置,就会转成上图的国际化视图。

二.管理国际化资源文件

有关ResourceBundleMessageSource配置当然SpringBoot已经帮你完成了,我们查看他对应的自动配置类MessageSourceAutoConfiguration

@Bean
    public MessageSource messageSource() {
        MessageSourceProperties properties = messageSourceProperties();
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
                if (StringUtils.hasText(properties.getBasename())) {
            messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
                    StringUtils.trimAllWhitespace(properties.getBasename())));
        }
        if (properties.getEncoding() != null) {
            messageSource.setDefaultEncoding(properties.getEncoding().name());
        }
        messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
        Duration cacheDuration = properties.getCacheDuration();
        if (cacheDuration != null) {
            messageSource.setCacheMillis(cacheDuration.toMillis());
        }
        messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
        messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
        return messageSource;
    }
public class MessageSourceProperties {

    /**
     * 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";
        //我们的配置文件可以直接放在类路径下叫message.properties,就不需要做任何配置就可以做国际化
    /**
     * Message bundles encoding.
     */

经过查看配置文件得知,假如我们需要使用的自己的国际化配置,需要在配置文件中写入包名

spring.messages.basename=inter.login

三.在页面取出国际化内容

我们继续查看Thymeleaf文档:

  • Variable Expressions: ${...}
  • Selection Variable Expressions: *{...}
  • Message Expressions: #{...}
  • Link URL Expressions: @{...}
  • Fragment Expressions: ~{...}

也就是Message内容是通过#{...}语句取出的,完成后网页就可以随着浏览器语言环境的变化切换语言了,代码在文章结尾给出。

原理:
国际化Locale(区域信息对象) ;通过LocaleResolver(区域信息解析器)去操作,当然SpringBoot也自动配置了区域信息解析器,看一下代码:

        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
        public LocaleResolver localeResolver() {
            if (this.mvcProperties
                    .getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
                return new FixedLocaleResolver(this.mvcProperties.getLocale());
            }
            AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
            localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
            return localeResolver;

        }

以上代码的逻辑:假如取到固定的WebMvcProperties.LocaleResolver.FIXED就使用固定的,否则就使用AcceptHeaderLocaleResolverAcceptHeaderLocaleResolver作用是根据请求头获取区域信息。

SpringBoot - Web开发 国际化_第3张图片
请求头

当我们想在代码中加入语言切换的功能,那么就要添加自己的区域信息解析器。

定义自己的区域信息解析器:

/**
 * @author BaoZhou
 * @date 2018/5/15
 */

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //根据得到参数重新构造locale
        String l = request.getParameter("l");
        Locale locale = Locale.getDefault();
        if(!StringUtils.isEmpty(l))
        {
            String[] split = l.split("_");
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }

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

    }
}

添加到容器中:

  @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }

网页代码:




    
    
    
    
    
    
    

    Signin Template for Bootstrap

    
    

    
    

    
    

    
    
    

    
    




@2018-2019

中文 English
SpringBoot - Web开发 国际化_第4张图片
运行结果

SpringBoot - Web开发 国际化_第5张图片
运行结果

大功告成,十分简单易懂。收工!

你可能感兴趣的:(SpringBoot - Web开发 国际化)