第十章 国际化_概述
国际化_页面中获取国际化资源信息
- 在页面上能够根据浏 览器语言设置的情况对文本, 时间, 数值进行本地化处理
- 可以在 bean 中获取国际化资源文件 Locale 对应的消息
- 可以通过超链接切换 Locale, 而不再依赖于浏览器的语言设置情况
- 解决:
- 使用 JSTL 的 fmt 标签
- 在 bean 中注入 ResourceBundleMessageSource 的实例, 使用其对应的
getMessage 方法即可 - 配置 LocalResolver 和 LocaleChangeInterceptor
springMvc中国际化的区域信息是由区域信息解析器得到的;
private LocaleResolver localeResolver 默认初始化 org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver 对应的方法如下
现象:是按照浏览器带来语言信息决定
获取到浏览器的区域信息 Locale locale = request.getLocale()
实验代码
定义国际化资源文件
login_zh_CN.properties welcomeinfo=WELECOME TO HERE username=USERNAME password=PASSWORD loginBtn=LOGIN login_en_US.properties
注册springmvc组件
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="LoginProperties/login"></property> </bean>
获取jsp页面
<fmt:message key="welcomeinfo"></fmt:message> <form action=""> <fmt:message key="username"/>:<input /> <fmt:message key="password"/>:<input /> <input type="submit" value='<fmt:message key="loginBtn"/>'/> </form>
程序中获取国际化信息
jsr303 这么获取信息 原生表单就可以用了
@Controller public class MyController { @Autowired private MessageSource messageSource; @RequestMapping("/hello") public String getIndex(Locale locale,Model model ) { System.out.println(locale); String welcomeinfo = messageSource.getMessage("welcomeinfo", null, locale); System.out.println(welcomeinfo); model.addAttribute("msg", welcomeinfo);//可以绑定错误信息 return "hello"; } }
点击链接切换国际化
效果一
效果二
控制层
@Controller public class MyController { @Autowired private MessageSource messageSource; @RequestMapping("/hello") public String getIndex() { return "hello"; } }
自定义的国际化处理类
public class myLocaleResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { Locale locale = null; String localeStr = request.getParameter("locale"); if(localeStr!=null&&!"".equals(localeStr)) { locale = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]); }else { locale = request.getLocale(); //请求头 } return locale; } @Override//去别的继承子类 chao public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) { throw new UnsupportedOperationException( "Cannot change HTTP accept header - use a different locale resolution strategy"); } }
springmvc的配置信息
<bean id="localeResolver" class="com.project.service.myLocaleResolver"></bean>
页面代码
《a href="hello?locale=en_US">English《/a> 《a href="hello?locale=zh_CN">中文《/a>
①国际化概述
- 默认情况下,SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型。
- 当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver),找到后使用它获取请求所对应的本地化类型信息。
- SpringMVC 还允许装配一个动态更改本地化类型的***,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
- SessionLocaleResolver & LocaleChangeInterceptor 工作原理
②本地化解析器和本地化***
- AcceptHeaderLocaleResolver:根据 HTTP 请求头的 Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器, SpringMVC 使用该解析器。
- CookieLocaleResolver:根据指定的 Cookie 值确定本地化类型
- SessionLocaleResolver:根据 Session 中特定的属性确定本地化类型
LocaleChangeInterceptor:从请求参数中获取本次请求对应的本地化类型
sessionLocaleResolver
因为国际化通过配置后会去session中找对应locale中
配置文件的代码
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
控制层的代码
@Controller public class MyController { @RequestMapping("/hello") public String getIndex(@RequestParam(value="locale",defaultValue = "zh_CN")String localeStr, Locale locale ,HttpSession session) { locale = new Locale(localeStr.split("_")[0],localeStr.split("_")[1]); session.setAttribute(SessionLocaleResolver.class.getName() + ".LOCALE", locale); return "hello"; } }
效果
通过***来修改国际化 【SessionLocaleResolver+LocaleChangeInterceptor】
是特定专门解决该问题
配置文件信息
<mvc:interceptors> <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
控制器
@Controller public class MyController { @RequestMapping("/hello") public String getIndex() { return "hello"; } }