一、国际化
在SpringBoot中已经自动帮我们配置管理国际化资源的组件,所以我们只需要编写代码就可。
@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()))); //获取基础名(login_zh_CN中的login部分)
}
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;
}
1.编写代码。
在类路径下创建一个i18n的文件夹,存放国际化配置(login.properties、login_zh_CN.properties、login_en_US.properties)分别填写对应的值即可。
2.在页面中获取国际化信息
在thymeleaf中获取值信息。通过#{键}获取国际化中的值。
3.在application.properties中配置如下代码。
#指定i18n从哪里配置
spring.messages.basename=i18n.login //位置
效果:会根据浏览器系统语言自动显示对应文字
二、点击超链接切换国家语言
原理:
@Bean @ConditionalOnMissingBean //前提是容器中不存在这个组件,
所以使用自己的对象就要配置@Bean让这个条件不成立(实现LocaleResolver 即可)
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale") public LocaleResolver localeResolver()
//如果在application.properties中有配置国际化就用配置文件的,没有配置就用AcceptHeaderLocaleResolver 默认request中获取
{
if (this.mvcProperties
.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
}
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = getDefaultLocale();
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
}
Locale requestLocale = request.getLocale(); //通过request对象获取请求头的国际化信息
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);
}
1.实现点击链接切换国家语言(链接上加入区域信息“language='zh_CN'))
通过原理知道可以通过request请求头中获取区域信息,所有我们在链接上加入区域信息“language='zh_CN')”,然后通过实现LocaleResolver重resolveLocale即可,并且将自己的实现类放在容器中,容器会自动加载这个组件。
2.编写代码
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String language = request.getParameter("language");
//获取系统的语言
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(language)){
//有值
String[] s = language.split("_");
locale=new Locale(s[0],s[1]);
}
return locale;
}