Spring Boot 2.x的国际化

一、Spring时代实现国际化步骤

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

二、Spring Boot中的国际化实现

(1)编写国际化配置文件

  如图所示,在/resources目录下创建i18n文件夹,在该文件夹下创建以.properties结尾的配置文件。以中英文切换为例:在i18n目录下创建index.properties(默认语言)index_zh_CN.properties(中文),此时,系统会自动识别到是配置国际化,就会切换到国际化视图,可以右键 Resource Bundle ‘index’——Add——Add Propertie Files To Resource Bundle 快速添加其他国际化文件index_en_US.proerties(英语)
在这里插入图片描述
  此时实现的国际化配置是半自动的,它需要通过手动调整浏览器的语言而实现国际化。
  以goole浏览器为例,它需要依次点击设置——高级,找到语言,手动设置网页语言选项。
在这里插入图片描述
(2)实现点击链接切换语言
在这里插入图片描述
在html页面使用超链接传递参数:

<a class="btn btn-sm" th:href="@{/index.html(lang='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(lang='en_US')}">English</a>

自定义国际化语言解释器,获取在链接上携带的国际化区域信息:

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

public class MyLocaleResolver implements LocaleResolver {

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String language = request.getParameter("lang");
        Locale locale = Locale.getDefault();
        if(!StringUtils.isEmpty(language)){
            String[] split = language.split("_");
            /* param0:语言代码   param1:国家代码  */
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }

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

    }
}

注册我们自己的国际化语言组件:

import com.zm.webrestfulcrud.component.MyLocaleResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//放置各种组件的容器
@Configuration
public class MyConfig implements WebMvcConfigurer{
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
}

在application.properties文件中设置basename的值:

spring.messages.basename=i18n.index

三、Spring Boot 2.x国际化实现原理

(1).查看MessageSourceAutoConfiguration类,Spring Boot默认自动已经配置好了管理国际化资源文件的组件

@Bean
@ConfigurationProperties(prefix = "spring.messages")
public class MessageSourceAutoConfiguration {
     private String basename = "messages";    
}

  默认配置文件为messages,所以,我们的配置文件可以直接放在类路径下叫messages.properties

(2)查看该类下的MessageSource 方法

 @Bean
 public MessageSource messageSource(MessageSourceProperties properties) {
    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;
    }

  该方法使用了springMVC的ResourceBundleMessageSource,通过该方法设置国际化资源文件的基础名(去掉语言国家代码),如果基础名不为根路径下的messages.properties就需要手动添加自定义的基础名,如果有多个就用逗号分隔。

在application.properties配置文件中进行国际化配置文件的设置:

# 国际化基础路径目录的设置
spring.messages.basename=i18n.xxxx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值