Spring Boot学习笔记10——web开发05(国际化)

1. 国际化

国际化就是我们平时页面上切换中英文的按钮,按下中文按钮,整个页面都显示中文,反之显示英文,当然,也可以做多种语言

1.1 步骤

  1. 编写国际化配置文件,抽取页面需要显示的国际化消息
    先分析页面中什么部分需要国际化
    Spring Boot学习笔记10——web开发05(国际化)_第1张图片
    编写国际化配置文件(在资源目录下创建i18n文件夹然后创建对应文件)
    Spring Boot学习笔记10——web开发05(国际化)_第2张图片 然后根据要国际化的内容编写配置
    Spring Boot学习笔记10——web开发05(国际化)_第3张图片
  2. SpringBoot自动配置好了管理国际化资源文件的组件
    @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;
    }
    
    到配置文件中修改国际化默认访问的路径
    spring.messages.basename=i18n.login
  3. 去页面获取国际化的值
    Spring Boot学习笔记10——web开发05(国际化)_第4张图片
运行

Spring Boot学习笔记10——web开发05(国际化)_第5张图片
因为我们浏览器默认设置显示中文(根据浏览器语言设置的信息切换了国际化),我们只需到浏览器的设置中调整语言优先级即可
Spring Boot学习笔记10——web开发05(国际化)_第6张图片
如果运行后显示乱码,去idea-setting-file encoding 设置
Spring Boot学习笔记10——web开发05(国际化)_第7张图片

1.2 原理

默认的就是根据请求头带来的区域信息获取Locale进行国际化(国际化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;
	}

1.3 实现点击链接切换国际化

先修改首页的国际化按钮,使其按下之后携带超链接参数l
Spring Boot学习笔记10——web开发05(国际化)_第8张图片

自己编写区域信息解析器component.MyLocaleResolver(注意:StringUtils用的是org.springframework.util

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {

        String l=request.getParameter("l");
        Locale locale= Locale.getDefault();
        if(!StringUtils.isEmpty(l)){
            //分割,得到zh/en和CN/US
            String[] split=l.split("_");
            locale=new Locale(split[0],split[1]);
        }
        //如果获取的l为空,则返回默认的Locale
        return locale;
    }

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

    }
}

在配置类中将 MyLocaleResolver添加到容器中

	@Bean
    public LocaleResolver localeResolver(){//MyLocaleResolver对象组件加到容器中
        return new MyLocaleResolver();
    }

该SpringBoot学习笔记学习自雷神前辈,是对知识点的整理和自我认识的梳理,如有不当之处,欢迎指出

你可能感兴趣的:(spring,boot,自学,java,spring,boot,spring,web)