2020-11-25 springboot国际化

一、springmvc国际化步骤

1)、编写国际化配置文件;

2)、使用ResourceBundleMessageSource管理国际化资源文件

3)、在页面使用fmt:message取出国际化内容

二、springboot国际化步骤

1、编写国际化配置文件,抽取页面需要显示的国际化消息
(1)建立配置文件
在这里插入图片描述
(2)配置配置文件
在这里插入图片描述

2、SpringBoot自动配置好了管理国际化资源文件的组件
源码中:国际化获取国际化文件名称时是按this.basename获取的,而默认了国际化配置文件的基础名称为message,所以我们的配置文件可以有两种方式:
(1)直接放在类路径下叫messages.properties;
(2)按照自己的配置文件,再在配置文件中配置国际化的名称。例如:

spring.messages.basename=i18n.login
@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";  
    
    
    @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;
	}

3、在页面获取国际化的值
国际化原理:
如果配置了区域信息,去mvcProperties中获取locale的映射信息,按配置文件信息最后返回到localeResolver中。如果没有配置,则会根据AcceptHeaderLocaleResolver中的request.header()获取请求头中的区域信息

国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);
	@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;
	}

对于点击转换语言,我们可以在url中携带locale信息,并自定义区域解析器获取请求头中的区域信息,并返回区域信息。

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String language = httpServletRequest.getParameter("l");
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(language)){
            String[] s = language.split("_");
            locale = new Locale(s[0], s[1]);
        }
        return locale;

配置到Springboot容器中
此处需要注意的是LocaleResolver需要命名为localeResolver,因为bean的id就是方法名,否则会出现识别不到的情况。

  @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页