@Bean
public MessageSource messageSource(MessageSourceProperties properties) {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
if (StringUtils.hasText(properties.getBasename())) {
//设置国际化资源的基础名[去掉语言代码 (exp:login_en_US.properties)----->login]
//其baseName为messages; 我们的配置文件可以直接放在类路径的的Message.properties下
//如果包含指定的包名,则需在xxx.properties指定【包名的基础名】< < spring.message.basename=包名.基础名>>
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;
}
例子:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<form action="" method="post">
<label >Username</label>
<input type="text" name="username" placeholder="Username" >
<label >Password</label>
<input type="password" name="password" placeholder="Password" >
<br> <br>
<div>
<label>
<input type="checkbox" value="remember-me"/> Remember Me
</label>
</div>
<br>
<button type="submit">Sign in</button>
<br> <br>
<a>中文</a>
<a>English</a>
</form>
</body>
</html>
/**
* 如果要扩展SpringMvC建议
*/
@Configuration
public class mymvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
}
}
priperties
login.password=密码
login.remb=记住我
login.tip=请登录
login.username=用户名
login.sign=登录
login.password=Password
login.remb=Remember me
login.tip=Please sign in
login.username=Username
login.sign=Sign in
默认是类路径下的message.properties,如果有包名指定,则需在application.properties中表明...
--》包名+基础名
spring.messages.basename=i18n.login
4.1超链接实现语言的转换(根据地址参数)
自定义国际化语言解析器
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(
prefix = "spring.mvc",
name = {"locale"}
)
public LocaleResolver localeResolver() {
//获取默认的FIXED
if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
} else {
//否则从HttpRequest请求头的信息获取
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}
}
}
AcceptHeaderLocaleResolver:请求中获取
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = this.getDefaultLocale();
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
} else {
Locale requestLocale = request.getLocale();
List<Locale> supportedLocales = this.getSupportedLocales();
if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
if (supportedLocale != null) {
return supportedLocale;
} else {
return defaultLocale != null ? defaultLocale : requestLocale;
}
} else {
return requestLocale;
}
}
}
A:自定义LocaleResolver
public class LocalResolverMy implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
// Locale defaultLocale = new AcceptHeaderLocaleResolver().getDefaultLocale();
//获取地址上的参数
String parameter = httpServletRequest.getParameter("l");
Locale locale = Locale.getDefault();
//判断是否为空
if (!StringUtils.isEmpty(parameter)) {
String[] s = parameter.split("_");
locale = new Locale(s[0], s[1]);
}
return locale;
}
<a class="btn btn-sm" th:href="@{/index.html(l='zn_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
B;将自定义的LocaleResolver放到容器中
@Configuration
public class mymvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
}
//将LocalResolver添加到容器中
@Bean
public LocaleResolver localeResolver(){
return new LocalResolverMy();
}
}
运行结果:
WebMCXAutoConfiguration
localeResolver
AcceptHeaderLocaleResolver
resolverLocale
```
最后,如果国际化失效,可能是bean注入的问题,可以通过bean的name属性指定
@Bean(name = "localeResolver")
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}