springboot实现国际化

在spring中提供了一个接口MessageSource来实现国际化。springboot中已经对国际化做了自动配置,自动配置MessageSourceAutoConfiguration,接下来我们看一下该类。

@Bean
@ConfigurationProperties(prefix = "spring.messages")
public MessageSourceProperties messageSourceProperties() {
	return new MessageSourceProperties();
}

其中有这一段代码,@ConfigurationProperties(prefix = “spring.messages”)表示从你的配置文件(application.properties或application.yml)中获取信息。

再进入MessageSourceProperties这个类中

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;
}
  • basename 指定了国际化文件存放的位置。如果没有具体指定,则存放在类的根路径
  • encoding 指定了文件所用编码,默认为UTF-8

所以我们可以通过设置basename和encoding的值来设置国际化文件存放的位置和编码类型。

在项目中建立国际化文件。
在这里插入图片描述
我放在了根目录的i18n文件夹下。

在配置文件中指定basename。

spring.messages.basename=i18n.login

这样我们就可以从国际化资源文件中获取信息了。

那么我们又是怎样实现切换页面的语言的呢?
MessageSourceAutoConfiguration这个类中有这样一个方法。

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

当缺少LocaleResolver 这个 Bean的时候,则从项目配置文件中读取spring.mvc.locale 获取语言。所以我们可以自定义一个类,实现LocaleResolver接口,来返回语言信息。

MyLocaleResolver 类

public class MyLocaleResolver implements LocaleResolver {
    public MyLocalResolver() {
    }

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String language = request.getParameter("language");
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(language)) {
            if (language.contains("CN"))
                locale = Locale.CHINA;
            else
                locale = Locale.US;
        }
        return locale;
    }

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

    }
}

login.html

<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	</head>
	<body class="text-center">
        <a th:href="@{/index.html(language='zh_CN')}">中文</a>
        <a th:href="@{/index.html(language='en_US')}">English</a>
	</body>

</html>

MyLocaleResolver 类中,通过request获取请求中的参数language,来判断用哪种语言。这样就可以实现页面语言的切换了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值