【SpringBoot】实现登录页面国际化详解

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

在这里插入图片描述

2、添加properties

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

spring.messages.basename=i18n.login

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

国家/地区 语言代码 国家/地区 语言代码
简体中文(中国) 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
在这里插入图片描述
然后我们改变浏览器当前语言,为中文,
在这里插入图片描述
在这里插入图片描述

(3) 解决乱码问题

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

(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();
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值