1、如下图,想要其随着国家的语言的变化而变化登录界面,接下来进行详细的说明

spring boot 登出处理 springboot登陆界面_spring

2、添加properties

首先我们先在application中添加下面的配置,用来不让SpringBoot进行自动配置

spring.messages.basename=i18n.login

其次如下图,添加多个login的时候,一定要符合语言代码标准,如zh_CN 这表示汉语/中国,只有这样写,springBoot才会识别出来,都给你放到Resource Bundle 下,因为我查看我的浏览器的请求头当前英语语言是en,所以我下面加了en

spring boot 登出处理 springboot登陆界面_spring boot 登出处理_02


国家/地区

语言代码

国家/地区

语言代码

简体中文(中国)

zh-cn

繁体中文(台湾地区)

zh-tw

繁体中文(香港)

zh-hk

英语(香港)

en-hk

英语(美国)

en-us

英语(英国)

en-gb

英语(全球)

en-ww

英国

en

英语(加拿大)

en-ca

英语(澳大利亚)

en-au

英语(爱尔兰)

en-ie

英语(芬兰)

en-fi

芬兰语(芬兰)

fi-fi

英语(丹麦)

en-dk

丹麦语(丹麦)

da-dk

英语(以色列)

en-il

希伯来语(以色列)

he-il

英语(南非)

en-za

英语(印度)

en-in

英语(挪威)

en-no

英语(新加坡)

en-sg

英语(新西兰)

en-nz

英语(印度尼西亚)

en-id

英语(菲律宾)

en-ph

英语(泰国)

en-th

英语(马来西亚)

en-my

英语(阿拉伯)

en-xa

韩文(韩国)

ko-kr

日语(日本)

ja-jp

荷兰语(荷兰)

nl-nl

荷兰语(比利时)

nl-be

葡萄牙语(葡萄牙)

pt-pt

葡萄牙语(巴西)

pt-br

法语(法国)

fr-fr

法语(卢森堡)

fr-lu

法语(瑞士)

fr-ch

法语(比利时)

fr-be

法语(加拿大)

fr-ca

西班牙语(拉丁美洲)

es-la

西班牙语(西班牙)

es-es

西班牙语(阿根廷)

es-ar

西班牙语(美国)

es-us

西班牙语(墨西哥)

es-mx

西班牙语(哥伦比亚)

es-co

西班牙语(波多黎各)

es-pr

德语(德国)

de-de

德语(奥地利)

de-at

德语(瑞士)

de-ch

俄语(俄罗斯)

ru-ru

意大利语(意大利)

it-it

希腊语(希腊)

el-gr

挪威语(挪威)

no-no

匈牙利语(匈牙利)

hu-hu

土耳其语(土耳其)

tr-tr

捷克语(捷克共和国)

cs-cz

斯洛文尼亚语

sl-sl

波兰语(波兰)

pl-pl

瑞典语(瑞典)

sv-se


我们可以通过查看请求头查看我们浏览器当前用的语言,看到的是en

spring boot 登出处理 springboot登陆界面_spring boot 登出处理_03


然后我们改变浏览器当前语言,为中文,

spring boot 登出处理 springboot登陆界面_Source_04


spring boot 登出处理 springboot登陆界面_Source_05

(3) 解决乱码问题

由于idea 对properties的编码格式不是utf_8因此我们需要对idea 进行设置,file–>other settings–>settings for new projects ,设置成下图,就是全局设置utf-8

spring boot 登出处理 springboot登陆界面_Source_06

(4) SpirngBoot 自动配置管理国际化的组件源码介绍
@Bean
	@ConfigurationProperties(prefix = "spring.messages")
	public MessageSourceProperties messageSourceProperties() {
		return new MessageSourceProperties();
	}

	@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;
	}

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 bundles encoding.
	 */
	private Charset encoding = StandardCharsets.UTF_8;

	/**
	 * Loaded resource bundle files cache duration. When not set, bundles are cached
	 * forever. If a duration suffix is not specified, seconds will be used.
	 */
	@DurationUnit(ChronoUnit.SECONDS)
	private Duration cacheDuration;

由上面的源码可知,如果不在application里面配置message的信息,那么就是默认从根路径下的message文件进行读取,此时设置application 的内容为,那么就会从i18n.login文件夹下进行读取信息。

spring.messages.basename=i18n.login
(5)下面的代码是对更改浏览器语言的信息,进行自动配置源码:

Locale(区域信息对象);LocaleResolver(获取区域信息对象);
在SpringBoot中的Webmvcconfiguration中有了自动配置,代码如下:

@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;
		}

点进去AcceptHeaderLocaleResolver找到方法resolveLocale

@Override
	public Locale resolveLocale(HttpServletRequest request) {
		Locale defaultLocale = getDefaultLocale();
		if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
			return defaultLocale;
		}
		Locale requestLocale = request.getLocale();
		List<Locale> supportedLocales = getSupportedLocales();
		if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
			return requestLocale;
		}
		Locale supportedLocale = findSupportedLocale(request, supportedLocales);
		if (supportedLocale != null) {
			return supportedLocale;
		}
		return (defaultLocale != null ? defaultLocale : requestLocale);
	}

由上可知默认就是根据请求头信息携带的区域信息获取Locale进行国际化

(6)点击连接实现国际化

我们看到源码中的接口LocaleResolver中依然带有ConditionalOnProperty注解,所以我们只需要自己注入一个LocaleResolver就不会走SpringBoot的自动配置了。

@Bean
		@ConditionalOnMissingBean
		@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
		public LocaleResolver localeResolver() {

代码:
thymeleaf代码

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

自己配置的加载区域对象类

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //获取请求参数信息
        String l = request.getParameter("l");
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(l)) {
            String[] split = l.split("_");
            locale=new Locale(split[0]);
        }
        return locale;
    }

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

    }
}

在webMvcConfigurationSupport注入localeResolver

@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport{
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
}