码农小汪-struts2学习6-国际化
2016-03-25 22:55
573 查看
国际化对于软件的意义重大,不同国家的不同的语言的形式更是不一样,国际化实在必行,但是真真的实行国际化还是有很多的不一样的地方,小汪呢,在大二的时候,专门发的给老师做苦力,国际化过一个网站,看上去不是挺简单的嘛,其实不然,有很多的地方值得思考的,一个简单的问题,中文和英文的长度不一样,我们配置属性的时候怎么做到恰倒好处,调试很久是必然的,对于不同的地方增加了,若干个if else的判断,到底是那种语言的呢,我们怎么处理呢。
在软件的处理过程中肯定会出现这些问题的,无法避免,在全局国际化的同时,还需要进行局部的判断,这样才会使得所有的都满足我们的定义。
Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。
如下是Java的支持包
基本的属性文件的命名规则都是差不多的
可以通过Locale类的getAvailableLocale方法获取支持的,该方法返回一个Locale数组,该数组中包含了所有支持的国家和语言。
中文的可以使用jdk的native2ascii 命令进行转码Unicode编码。这样不会乱码。也可以采用在线的工具进行处理,这种也是比较方便的,看你心情了。
就是这么的简单我们就可以直接的使用啦啦,高兴?根据local加载文件,getString 调用特定的字符串的key值。
如何实现呢?例如下面消息:
英文:welcome={0}!Today {1}.
中文:welcome={0}!今天{1}.
就是在我们使用的过程中还会在里面填充东西的时候,刚刚我们不是讲解了两个函数?还有个格式化消息的还没有使用哦。是不是?
- Struts 2提供了很多加载国际化资源文件的方式,最简单.最常用的就是加载全局的国际化资源文件,加载全局的国际化资源文件的方式通过配置常量来实现。不管在struts..xml文件中配置常量,还是在在struts.properties文件中配置常量,只需要配置struts.custom.i18n.resources常量即可。我们在属性的配置中讲解过的哦,没有看的可以去看哈Structs属性的配置说明–小汪配置struts.custom.i18n.resources常量时,该常量值为全局国际化资源文件的baseName。
为了在JSP页面中输出国际化消息,可以使用Struts2的< s:text…/>标签,该标签可以指定一个name 属性,该属性指定了国际化资源文件中的key.
这个也支持,通配符…………………………………………..
在软件的处理过程中肯定会出现这些问题的,无法避免,在全局国际化的同时,还需要进行局部的判断,这样才会使得所有的都满足我们的定义。
Java 对于国际化的支持
国际化(internationalization,经常被称做”i18n”,因为18是字母”i”和字母”n”之间的字母个数)Java程序的国际化思路是将程序中的标签、提示信息等放在资源文件中,程序需要支持国家/语言环境,则必须提供对应的资源文件。资源文件是key-value对,每个资源文件中的key不变,但value随不同的国家/语言变化。
如下是Java的支持包
java包 | 用途 |
---|---|
Java.util.ResourceBundle | 用于加载资源包 |
Java.util.Locale | 对应一个特定的国家/地区、语言环境 |
Java.text.MessageFormat | 用于将消息格式化 |
规则 |
---|
baseName_language_country.properties |
baseName_language.properties |
baseName.properties |
其中baseName是资源文件的基本名称,用户可以自由定义,而language和country都不可随意变化,必须是Java所支持的语言和国家。 |
Locale [ ] locales = Locale.getAvailableLocales(); 通过local的属性,获得一个locales[0].getCountry(),getLanguage()这两个属性
经常用的也就是中文英文啦。
resource_zh_CN.properties title=标题 key=value resource_en_US.properties title=title
中文的可以使用jdk的native2ascii 命令进行转码Unicode编码。这样不会乱码。也可以采用在线的工具进行处理,这种也是比较方便的,看你心情了。
native2ascii resource_zh_CN..properties teme.properties 然后在将转好的编码拷贝替换到resource_zh_CN.properties
package com.ascent.i18n.test; import java.util.*; public class ResourceBundleTest { public static void main(String[] args) { //设置本地区语言(默认),可以去查查javaAPi,很清楚的 Locale locale = Locale.getDefault(); //可以使用Local的常量设置具体的语言环境 //Locale locale = Locale.US; //根据地区不同加载不同的资源文件 ResourceBundle rb = ResourceBundle.getBundle("resource", locale); //根据key获得value值 String title = rb.getString("title"); System.out.println(title); } }
就是这么的简单我们就可以直接的使用啦啦,高兴?根据local加载文件,getString 调用特定的字符串的key值。
Java国际化包含占位符的消息
和上面的就感觉不太一样啦,是不是呢?如何实现呢?例如下面消息:
英文:welcome={0}!Today {1}.
中文:welcome={0}!今天{1}.
就是在我们使用的过程中还会在里面填充东西的时候,刚刚我们不是讲解了两个函数?还有个格式化消息的还没有使用哦。是不是?
我们需要使用MessageFormat类,该类有个很有用的静态的方法 format(String pattern,Object… values) 返回后面多个参数值填充前面pattern字符串,其中pattern字符串就是一个带占位符的字符串。 String result = MessageFormat.format(welcome, "汪吉","天气不错"); 这个样子我们就是替换掉了刚才的东西啦,是不是简单?
Struts 2的国际化
封装 |
---|
Struts 2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息—整个过程与Java程序的国际化完全相同,只是Struts2框架对Java程序国际化进行了进一步封装,从而简化了应用程序的国际化。 |
下面的两种方式都是可以得哦! struts.properties struts.custom.i18n.resources= properties.message struts.xml <constant name="struts.custom.i18n.resources" value="properties/message"/> src下添加properties文件夹,下面添加资源文件 message_zh_CN.properties message_en_US.properties
为了在JSP页面中输出国际化消息,可以使用Struts2的< s:text…/>标签,该标签可以指定一个name 属性,该属性指定了国际化资源文件中的key.
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <head> <!—使用s:text 标签输出国际化消息--> <title><s:text name="loginPage"/></title> </head> <body> <h3><s:text name="loginTip"/></h3> <!—在表单元素中使用key来指定国际化消息的key--> <s:form action="Login" method="post"> <s:textfield name="username" key="login.name"/> //这里就是在外面显示 姓名:——————,这种东西 <s:password name="password" key="login.password"/> <s:submit name="submit" key="submit" /> </s:form> </body> </html>
public String execute() { if ("xmh".equals(user.getName()) && "xmh".equals(user.getPassword())) { message = getText("login.succmessage")+", " + user.getName(); } else { message = getText("login.erromessage"); 这里也是访问的key } return SUCCESS; } login.name=name login.pass=pass login.submit=submit login.succmessage=welcome login.erromessage=Invalid user or password
这个也支持,通配符…………………………………………..
手动转换,传递过来一个参数,然后判断,设置就行了 Locale l = Locale.getDefault(); l = new Locale("zh", "CN"); l = new Locale("zh", "CN"); l = new Locale("en", "US"); ActionContext.getContext().setLocale(l);
相关文章推荐
- Java虚拟机解析篇之---内存模型
- Java中Comparable与Comparator的区别
- JAVA导入新项目代码中有乱码的解决办法
- Java虚拟机学习之类初始化
- 学习javaEE的每一天2016.3.25
- Java虚拟机解析篇之---垃圾回收器
- java读取excel文件数据
- java文件操作(读流)
- udp 广播 和 多播 java 代码
- 用java语言读取和写人c语音的结构体数据
- Java 运算符知识整理 学习笔记
- JAVAEE 框架 2016-3-25
- 五、初学SpringMVC+Mybatis之SpringMVC简介
- Java异常分类和统一处理
- Java 输出流中的flush方法
- Spring_Q_collect
- 【JAVA开发之IO流1-3】IO流之缓冲流
- Java内存分配
- super,this的区别和使用
- Java中普通代码块,构造代码块,静态代码块区别及代码示例