1)、编写国际化配置文件; 2)、使用ResourceBundleMessageSource管理国际化资源文件 3)、在页面使用fmt:message取出国际化内容
步骤: 1)、编写国际化配置文件,抽取页面需要显示的国际化消息
2)、SpringBoot自动配置好了管理国际化资源文件的组件;
@ConfigurationProperties(prefix?=?"spring.messages")
public?class?MessageSourceAutoConfiguration?{
???
????/**
?*?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";?? ???
????//我们的配置文件可以直接放在类路径下叫messages.properties;
???
????@Bean
public?MessageSource?messageSource()?{ ???
ResourceBundleMessageSource?messageSource?=?new?ResourceBundleMessageSource(); ???????
if?(StringUtils.hasText(this.basename))?{ ???????
????????????//设置国际化资源文件的基础名(去掉语言国家代码的)
messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray( ???????????
StringUtils.trimAllWhitespace(this.basename))); ???????????????????
} ???????
if?(this.encoding?!=?null)?{ ???????
messageSource.setDefaultEncoding(this.encoding.name()); ???????????
} ???????
messageSource.setFallbackToSystemLocale(this.fallbackToSystemLocale); ???????
messageSource.setCacheSeconds(this.cacheSeconds); ???????
messageSource.setAlwaysUseMessageFormat(this.alwaysUseMessageFormat); ???????
return?messageSource; ???????
}
3)、去页面获取国际化的值;
<!DOCTYPE?html>
<html?lang="en"??xmlns:th="http://www.thymeleaf.org">
<head> ???
<meta?http‐equiv="Content‐Type"?content="text/html;?charset=UTF‐8"> ???????
<meta?name="viewport"?content="width=device‐width,?initial‐scale=1,?shrink‐to‐
fit=no">
???????
<meta?name="description"?content=""> ???????
<meta?name="author"?content=""> ???????
<title>Signin?Template?for?Bootstrap</title> ???????
<!‐‐?Bootstrap?core?CSS?‐‐> ???????
<link?href="asserts/css/bootstrap.min.css"
th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}"?rel="stylesheet">
???????
<!‐‐?Custom?styles?for?this?template?‐‐> ???????
<link?href="asserts/css/signin.css"?th:href="@{/asserts/css/signin.css}"
rel="stylesheet">
???????
</head> ???
<body?class="text‐center"> ???
<form?class="form‐signin"?action="dashboard.html"> ???????
<img?class="mb‐4"?th:src="@{/asserts/img/bootstrap‐solid.svg}"
src="asserts/img/bootstrap‐solid.svg"?alt=""?width="72"?height="72">
???????????
<h1?class="h3?mb‐3?font‐weight‐normal"?th:text="#{login.tip}">Please?sign
in</h1>
???????????
<label?class="sr‐only"?th:text="#{login.username}">Username</label> ???????????
<input?type="text"?class="form‐control"?placeholder="Username"?th:placeholder="#
{login.username}"?required=""?autofocus="">
???????????
<label?class="sr‐only"?th:text="#{login.password}">Password</label> ???????????
<input?type="password"?class="form‐control"?placeholder="Password"
th:placeholder="#{login.password}"?required="">
???????????
<div?class="checkbox?mb‐3"> ???????????
<label> ???????????????
?????????? <input?type="checkbox"?value="remember‐me"/>?[[#{login.remember}]] ?????
????????</label>
</div> ???????????
<button?class="btn?btn‐lg?btn‐primary?btn‐block"?type="submit"?th:text="#
{login.btn}">Sign?in</button>
???????????
<p?class="mt‐5?mb‐3?text‐muted">??2017‐2018</p> ???????????
<a?class="btn?btn‐sm">中文</a> ???????????
<a?class="btn?btn‐sm">English</a> ???????????
</form> ???????
</body> ???
</html>
效果:根据浏览器语言设置的信息切换了国际化;
原理: 国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);
@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; ???????????
} ???????
默认的就是根据请求头带来的区域信息获取Locale进行国际化
4)、点击链接切换国际化
/**
?*?可以在连接上携带区域信息
?*/
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],split[1]);
????????}
????????return?locale;
????}
????@Override
????public?void?setLocale(HttpServletRequest?request,?HttpServletResponse?response,?Locale
locale)?{
????}
}
?@Bean
????public?LocaleResolver?localeResolver(){
????????return?new?MyLocaleResolver();
????}
}
?
|