Spring Boot 12 国际化( 二 )

login1.html (Thymeleaf 视图)
<!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"><title th:utext="#{label.title}"></title></head><body><div style="text-align: right;padding:5px;margin:5px 0px;background:#ccc;"><a th:href=https://www.isolves.com/it/cxkf/kj/2020-09-03/"@{/login1?lang=en}">Login (En)|Login (Zh)

12.4 URL上的语言环境信息如果您要构建一个多语言网站,其语言环境信息位于URL上 。您需要更改一些配置:
  • http://localhost:8080/SomeContextPath/en/login2
  • http://localhost:8080/SomeContextPath/zh/login2
创建2个类UrlLocaleInterceptor和UrlLocaleResolver
UrlLocaleInterceptor.java
package me.laocat.i18n.interceptors;import java.util.Locale;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.LocaleResolver;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import org.springframework.web.servlet.support.RequestContextUtils;public class UrlLocaleInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);if (localeResolver == null) {throw new IllegalStateException(“找不到LocaleResolver:不在DispatcherServlet请求中??”);}// 从LocaleResolver获取区域设置Locale locale = localeResolver.resolveLocale(request);localeResolver.setLocale(request, response, locale);return true;}}UrlLocaleResolver.java
package me.laocat.i18n.resolver;import java.util.Locale;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.LocaleResolver;@Configurationpublic class UrlLocaleResolver implements LocaleResolver {private static final String URL_LOCALE_ATTRIBUTE_NAME = “URL_LOCALE_ATTRIBUTE_NAME”;@Bean(name = “messageSource”)@Overridepublic Locale resolveLocale(HttpServletRequest request) {// ==> /SomeContextPath/en/…// ==> /SomeContextPath/zh/…// ==> /SomeContextPath/WEB-INF/pages/…String uri = request.getRequestURI();System.out.println(“URI=” + uri);String prefixEn = request.getServletContext().getContextPath() + “/en/”;String prefixZh = request.getServletContext().getContextPath() + “/zh/”;Locale locale = null;// Englishif (uri.startsWith(prefixEn)) {locale = Locale.ENGLISH;}// Chinaelse if (uri.startsWith(prefixZh)) {locale = new Locale(“zh”, “CN”);}if (locale != null) {request.getSession().setAttribute(URL_LOCALE_ATTRIBUTE_NAME, locale);}if (locale == null) {locale = (Locale) request.getSession().getAttribute(URL_LOCALE_ATTRIBUTE_NAME);if (locale == null) {locale = Locale.ENGLISH;}}return locale;}@Overridepublic void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {// Nothing}}重新更改WebMvcConfig中的Interceptor配置 :
WebMvcConfig.java
package me.laocat.i18n.config;import org.springframework.context.MessageSource;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.support.ReloadableResourceBundleMessageSource;import org.springframework.web.servlet.LocaleResolver;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.springframework.web.servlet.i18n.CookieLocaleResolver;import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;import me.laocat.i18n.interceptors.UrlLocaleInterceptor;import me.laocat.i18n.resolver.UrlLocaleResolver;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {@Bean(name = “localeResolver”)public LocaleResolver getLocaleResolver() {// Cookie本地化解析器// CookieLocaleResolver resolver = new CookieLocaleResolver();// resolver.setCookieDomain(“myAppLocaleCookie”);// 60 分钟// resolver.setCookieMaxAge(60 * 60);LocaleResolver resolver = new UrlLocaleResolver();return resolver;}@Bean(name = “messageSource”)public MessageSource getMessageResource() {// 可重新加载的资源包消息源ReloadableResourceBundleMessageSource messageResource = new ReloadableResourceBundleMessageSource();// 读 i18n/messages_xxx.properties file.// 例如: i18n/messages_en.propertiesmessageResource.setBasename(“classpath:i18n/messages”);messageResource.setDefaultEncoding(“UTF-8”);return messageResource;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 本地化修改拦截器// LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();// localeInterceptor.setParamName(“lang”);// registry.addInterceptor(localeInterceptor).addPathPatterns(“/*”);UrlLocaleInterceptor localeInterceptor = new UrlLocaleInterceptor();registry.addInterceptor(localeInterceptor).addPathPatterns(“/en/*”, “/zh/*”);}}


推荐阅读