java 项目国际化完全实现
2011-02-17 16:25
525 查看
项目应对外国和中国客户,就要求通过配置,实现文字的转换,这个过程,在java实现非常简单,
主要通过一个配置文件定义language.txt,使用的语言:
文件内容为:
language=zh_CN
在把编辑好的国际化的文件放到java的package下面.
如图:
resource.properties中的内容为:
请注意, 在{0} 发生 {1} 事故, 车辆行驶缓慢!
需要转换成unicode的编码方式,转换的命令为:
native2ascii -encoding gb2312 resource.properties resource_cn.properties
可以通过java.text.MessageFormat来对文字进行实时的渲染,修改。
代码如下:
package app.language.global;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
public class globalLanguageImpl {
static String defaultMessage;
static Locale currentLocale;
static ResourceBundle messages;
static InputStream is;
static Properties prop;
public static void getProp(){
is = globalLanguageImpl.class.getClassLoader().getResourceAsStream("app/language/global/language.txt");
prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String formatMessage(String template, Object[] params, Locale currentLocale) {
MessageFormat formatter = new MessageFormat("");
formatter.setLocale(currentLocale);
formatter.applyPattern(template);
String output = formatter.format(params);
return output;
}
public static void main(String[] args) {
getProp();
String[] resource = ((String)prop.get("language")).split("_");
String language = resource[0].toLowerCase();
String country = resource[1].toUpperCase();
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("app.language.global.resource", currentLocale);
defaultMessage = messages.getString("default_message");
Object[] params = { "London golden road", "road works" };
String alertInfo = formatMessage(defaultMessage, params, currentLocale);
System.out.println("======================" + language + "_" + country);
System.out.println("======================" + alertInfo);
}
}
生成的结果为:
======================zh_CN
======================请注意, 在 London golden road 发生 road works 事故, 车辆行驶缓慢!
通过以上的工作,就可以通过修改配置文件language.txt中的内容,来达到改变显示语言的目的了。
由于不用重新编译,由客户自己就能修改配置,
如英语国家可以修改为:
language=en_US
在重新起动项目就可以了。
在国际化的过程中,由ResourceBundle来负责寻找复合条件的国际化文字文件,开发人员的工作就是在后台和页面有文字显示的部分全部换成messages.getString("default_message"); 的形式即可。
如果是jsp页面,基本结构如下:
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:bundle basename="app.language.global.resource">
在需要用到文字的地方的写法:
<fmt:message key='copyright'/>
<fmt:message key='logout'/>
很简单的,pageEncoding="UTF-8"这样既可以支持中文,也可以支持英文,不错的选择,否则国际化也就没有意义了。
主要通过一个配置文件定义language.txt,使用的语言:
文件内容为:
language=zh_CN
在把编辑好的国际化的文件放到java的package下面.
如图:
resource.properties中的内容为:
请注意, 在{0} 发生 {1} 事故, 车辆行驶缓慢!
需要转换成unicode的编码方式,转换的命令为:
native2ascii -encoding gb2312 resource.properties resource_cn.properties
可以通过java.text.MessageFormat来对文字进行实时的渲染,修改。
代码如下:
package app.language.global;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
public class globalLanguageImpl {
static String defaultMessage;
static Locale currentLocale;
static ResourceBundle messages;
static InputStream is;
static Properties prop;
public static void getProp(){
is = globalLanguageImpl.class.getClassLoader().getResourceAsStream("app/language/global/language.txt");
prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String formatMessage(String template, Object[] params, Locale currentLocale) {
MessageFormat formatter = new MessageFormat("");
formatter.setLocale(currentLocale);
formatter.applyPattern(template);
String output = formatter.format(params);
return output;
}
public static void main(String[] args) {
getProp();
String[] resource = ((String)prop.get("language")).split("_");
String language = resource[0].toLowerCase();
String country = resource[1].toUpperCase();
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("app.language.global.resource", currentLocale);
defaultMessage = messages.getString("default_message");
Object[] params = { "London golden road", "road works" };
String alertInfo = formatMessage(defaultMessage, params, currentLocale);
System.out.println("======================" + language + "_" + country);
System.out.println("======================" + alertInfo);
}
}
生成的结果为:
======================zh_CN
======================请注意, 在 London golden road 发生 road works 事故, 车辆行驶缓慢!
通过以上的工作,就可以通过修改配置文件language.txt中的内容,来达到改变显示语言的目的了。
由于不用重新编译,由客户自己就能修改配置,
如英语国家可以修改为:
language=en_US
在重新起动项目就可以了。
在国际化的过程中,由ResourceBundle来负责寻找复合条件的国际化文字文件,开发人员的工作就是在后台和页面有文字显示的部分全部换成messages.getString("default_message"); 的形式即可。
如果是jsp页面,基本结构如下:
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:bundle basename="app.language.global.resource">
在需要用到文字的地方的写法:
<fmt:message key='copyright'/>
<fmt:message key='logout'/>
很简单的,pageEncoding="UTF-8"这样既可以支持中文,也可以支持英文,不错的选择,否则国际化也就没有意义了。
相关文章推荐
- jsp struts实现的Java web信息供求系统项目源码
- JavaWeb项目:整合(Lucene+Redis+SSM)实现搜索功能
- Ant实现Java项目的自动构建和部署
- C/C++ 在 Java 项目、Android 和 Objective-C 三大平台下实现混合编程
- JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式
- S6.6_Struts2_I18n 项目如何实现国际化 I18n
- 用Ant实现Java项目的自动构建和部署
- 【项目实战】——Java根据奖品权重计算中奖概率实现抽奖(适用于砸金蛋、大转盘等抽奖活动)
- java在线聊天项目 swt可视化窗口Design 登录框注册按钮点击改变窗口大小——出现注册面板 实现打开登录框时屏幕居中
- java swing实现蜘蛛纸牌项目源码
- 用Ant实现Java项目的自动构建和部署
- java实现连接mysql数据库单元测试查询数据项目分享
- java实现的项目管理中的关键路径的算法
- JAVAWEB项目如何实现验证码 (转)
- JavaWeb项目实现上传文件动态显示进度百分比
- 基于rsync同步算法的文件同步系统JAVA实现(一)——项目介绍
- 【项目实战】——Java实现伪静态——urlrewrite
- java实现ireport动态报表导出与国际化
- 用Ant实现Java项目的自动构建和部署
- 用Ant实现Java项目的自动构建和部署