发表于: 2017-08-26 20:18:36

2 1071


今天完成的事情;

任务2提交了,接口我自己测过了都能用。json才发现还没写上去,因为我这个项目配置的时候莫名其妙出问题,就换了个项目写json。

准备小课堂,本来打算讲讲c标签的,但是发现自己也不怎么会,只会简单的使用,还是算了。。

讲了SpringMVC的国际化,这个是在弄jsp页面时候碰到的问题,我觉得很有用就记了下来

国际化I18N

指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问。国际化的英文Internationalization,但是由于拼写过长,老外想了一个简单的写法叫做I18N,代表的是Internationalization这个单词,以I开头,以N结尾,而中间是18个字母,所以简写为I18N。以后我们说I18N和国际化是一个意思。当然国际化不仅仅是语言的国际化,还包括日期、时间、数字等。

流程:

首先我们需要知道,用户使用的是哪种语言,这个问题最好解决,因为浏览器在发送请求时会发送如下请求头:Accept-Language: zh-CN,en-US,通过这个就可以判断当前使用的是简体中文了。然后我们需要动态的获取国际化信息。我们一般采取的方式是将这些需要国际化的内容写到一个资源配置文件中,然后程序根据不同的语言加载不同的文件,就达到了一个国际化的目的。

在springmvc-servlet.xml配置国际化资源文件

<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
   <property name="basename" value="i18n"></property>
   <property name="useCodeAsDefaultMessage" value="true"></property>
</bean>

value是路径,定义消息资源文件的位置

底下那个userCodeAsDefaultMessage的值为true,意思是当在其他语言区域里,没有找到对应的国际化文件,默认使用i18n.properties文件,如果是false的话就显示有问题

配置i18n.properties和两个国际化资源文件,中文和英文

i18n.user=User
i18n.password=Password

i18n.user=用户名
i18n.password=密码

配置一个i18n的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
   <title>Title</title>
</head>
<body>

   <fmt:message key="i18n.user"></fmt:message>
<fmt:message key="i18n.password"></fmt:message>

</body>
</html>

这里为了使用国际化消息,需要用到fmt标签。JSTL提供了对国际化的支持,可以根据发出请求的客户端地域的不同来显示不同的语言信息

fmt:message 读取消息资源,key是一个关键字

在index.jsp上做一个跳转

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>

<a href="/i18n">i18n</a>

</body>
</html>

然后发现没有controller来处理请求,这里要做一个视图控制器,使它不通过controller直接访问jsp页面

<mvc:view-controller path="i18n" view-name="i18n"></mvc:view-controller>

基本配置完了,这是实现了页面的中英文的切换显示信息,运行一下

chrome浏览器中文情况下,改一下英文

刷新一下界面

这样就完成了最基础的国际化。

之后回去又用了点时间学习一个加上controller的国家化,通过localeResolver可以实现在页面上点击按钮切换语言

<mvc:interceptors>
   <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
       <property name="paramName" value="lang"></property>
   </bean>
</mvc:interceptors>

<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
   <property name="defaultLocale" value="en"/>
</bean>
@RequestMapping(value="/")
public String welcome(){
return "TestPage";
}

@RequestMapping(value="changeLang")
public String changeLanguage(Model model, HttpServletRequest request,HttpServletResponse response,HttpSession session){
WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext());
   Locale locale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);
   String testMsg = applicationContext.getMessage("test.msg",null,locale);
   System.out.println(testMsg);
   model.addAttribute("i18n_msg",testMsg);
   return "TestPage";

}

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" scope="session"/>
<c:set var="currentLocale" value="${pageContext.response.locale}" scope="session"/>
<html>
<body>
<h1>Spring MVC internationalization example</h1>

Language : <a href="${contextPath}/?lang=en">English</a>|
<a href="${contextPath}/?lang=zh">Chinese</a>|<a href="${contextPath}/changeLang">Change</a>

<h3>
welcome.springmvc : <spring:message code="welcome.springmvc"/>
</h3>


Current Locale : ${pageContext.response.locale}

<c:if test="${not empty i18n_msg}">
<h1>${i18n_msg}</h1>
</c:if>
</body>
</html>
<script src="${contextPath}/js/i18n/messages_${currentLocale}.js" type="text/javascript"></script>

遇到的问题:

properties文件一开始中文读取出来是乱码,然后我发现网上写的都是Unicode码,但他们都是用的eclipse写的,所以我就打开了快一个月没用过的eclipse,发现在eclipse中,在properties文件中输入中文会自动转换成Unicode码,这是为了防止乱码。又查了很多,发现idea可以进行全局的utf-8设置,在setting底下的编译器的文件编码中,改完之后发现还是不行_(:з」∠)_

然后重启idea之后莫名其妙就好了,页面就会显示中文了。。当然输入Unicode码也可以,不过需要手动转换一下,很麻烦

收获:

做一次小课堂才发现有压力的时候学习效率贼高,我是从上午开始正式准备的,中午又出现了乱码问题,然后一路各种解决问题,学到了很多东西,清楚的看到了自己的进步。



返回列表 返回列表
评论

    分享到