Java Web Application 另类的国际化方式gettext – commons for Java

 

本文是用在window系统下面使用linux的国际化方式,来实现项目的国际化。
因为项目原本没有实现国际化,都是中文的硬编码,到后期的时候,才决定做国际化。
不想去抽取所有硬编码写到properties文件,所以只得考虑用gettext-commons工具来实现。
使用到的工具:
gettext – commons : https://code.google.com/p/gettext-commons/
GetText for Windows:
资源:http://gnuwin32.sourceforge.net/packages/gettext.htm
安装:http://blog.longwin.com.tw/2010/08/windows-gettext-2010/

附件包含所用到的jar
扫描的时候,也可以扫描js等文件,但是要是以单引号标志的字符串,是得不到支持的。
js国际化可以考虑:
1.gettext-js https://code.google.com/p/gettext-js/wiki/MainDocumentation
2.Javascript Gettext http://jsgettext.berlios.de/

大致过程:
——————————————————-
GNU Gettext – commons 大致过程:
过程:
—>修改java的硬编码
—>msginit得到po文件
—>msgfmt命令得到class文件
—>反编译class
—>替换原有的java文件(所有多语言内容都会放在java的数组里面)
—>运行

gettext-commono整理

步骤:
1.配置gettext-0.14.4-bin,记得dll文件存放到bin下面去,两个dll文件(libexpat.dll,libiconv2.dll)。
————————————————————————————————————————————————————

2.配置gettext-commons
————————————————————————————————————————————————————
https://code.google.com/p/gettext-commons/downloads/list下载gettext-commons-0.9.6.jar,gettext-ant-tasks-0.9.7.jar
gettext-commons-0.9.6.jar:就是国际化的工具,这个放到项目的lib下面去。
gettext-ant-tasks-0.9.7.jar:提供给Ant的来运行msginit,msgfmt命令,这个随便放,但是build.xml的时候会制定它的路径。

src/i18n.properties
说明:在com.i18n包下面,存在Message_zh_CN.class的文件
basename=com.i18n.messages.Messages
#说明class文件要存放在com/i18n/messages下面

3.修改源码:
————————————————————————————————————————————————————
先创建一个实例:I18n i18n = I18nFactory.getI18n(getClass());
然后用它的tr(string),tr(string,object[])方法来实现国际化。
只注意这里两个方法,其他的类似C语言里面的东西,代码只是测试,不用理会。
第一个方法是没有带参数的国际化方法,第二个是带参数的国际化方法。

4.在ant用gettext-extract命令生成po文件。build.xml文件
————————————————————————————————————————————————————

上面是编译命令,使用messages-extract命令,得到下面的po文件,存放在src/com/i18n/messages/Message_zh_CN.po,   这个路径会在生成class文件的时候用到,
记得修改版本号,不修改也不影响?没试过。

5.对po文件人工翻译。其实,因为源码本来都是硬编码,所以通常只需要直接把每一个msgid的东西,复制给msgstr。就可以了。
————————————————————————————————————————————————————

6.生成class文件:
————————————————————————————————————————————————————
生成class的第一种方式:
msgfmt –java2 -d D:\dev-workspace\workspace\ApplicationDemos\po -r com.i18n.Messages -l zh_CN D:\dev-workspace\workspace\ApplicationDemos\src\com\messages\messages.po
格式化po文件:格式化得到的class文件存放到po文件夹下面,按照com.i18n路径存放为Messages+zh_CN.class,po的存放位置:D:\dev-workspace\workspace\ApplicationDemos\src\com\messages\messages.po
po的路径在上面已经指定了。

生成class的第二种方式(推荐):
=====>可以在Ant下面用命令

7.原来class的java文件内容,要手动建立这个类,然后等待下面的步骤替换:这个在cygwin里面编译看见的java. 应该是一个标准的class模板。当我们用GetText for Windows,然后用ant命令得到class文件的时候,默认会删除java文件,直接给出class文件。要是没有发现cygwin里面的java文件,那么可能要傻傻的去做反编译。它得到两个class文件,其中一个class是另一个class的匿名类。

————————————————————————————————————————————————————
src/com/i18n/Messages_zh_CN.java

8.反编译得到的java去替换上面的java模板。
到ApplicationDemos\po\com\i18n去看到Messages_zh_CN.class,Messages_zh_CN$1.class两个class文件,后面的那个class其实是前面class的一个内部类。
————————————————————————————————————————————————————
反编译:Messages_zh_CN.class:

反编译:Messages_zh_CN$1.class:这个不需要什么特别注意的地方

可以看见Messages_zh_CN$1.class其实就是Messages_zh_CN.java的一部分。

9.替换java内容,Messages_zh_CN.class反编译得到的,去替换原来java的内容:
————————————————————————————————————————————————————

10.运行src/com/i18n/I18nTest.java类  查看国际化信息
————————————————————————————————————————————————————

最后输出:
=====================================>
翻译:第一句翻译
翻译:这句话是中文原文,第一个参数Pandy,第二个参数Brian
This is a test message2-2
this is a default message

这只是实现过程的记录,还没有完整整理,特别注意的地方是反编译后替换,这里最好写程序来实现编译后替换,就安全一点,不容易错误。