【Java】利用Java对配置文件操作实现Java程序的国际化

【Java】利用Java对配置文件操作实现Java程序的国际化

标签: 国际化native2asciipropertiesi18njava

不仅仅是大名鼎鼎的Struts2,即便是小小的Java程序也能够实现国际化,根本就不用像网上大部分所说的那样,非西欧字符,例如我们的中文,岛国的日语之类的,必须使用native2ascii转码,坦诚,国际化字符串的配置文件xx_语言.propreties并不支持非西欧字符,只能转码存储,但你完全可以利用到我在《【Java】配置文件概念,Java对配置文件的操作》(点击打开链接)所介绍的方法,利用Java程序完成这个国际化的配置文件。Java会帮你自动转码。


一、基本目标

完成对大名鼎鼎的hello,world程序的国际化

【Java】利用Java对配置文件操作实现Java程序的国际化

有人看到这里就开始不满意了,这个烂程序分明就可以写三个Java文件,改一下输出就行了,比如中文的hello,world,不就这叼样吗?

[java] view plain copy
  1. public class helloWorld {  
  2.     public static void main(String[] args) {  
  3.         System.out.println("你好,世界");  
  4.     }  
  5. }  

确实,我也提倡这种做法,要多少国语言的国家化就写多少个Java,但是,如果有些脑残上司要求你必须用xx_语言.propreties实现国际化,说什么工程便于管理,有技术含量,那你就懵了。


二、基本思想

其实用xx_语言.propreties实现国际化真的好不了多少,要多少国语言的国家化就写多少个xx_语言.propreties国际化文件,但是,而且也不见得好在哪里,就是把key-value对中的key文件的value值改成不同国家的语言而已。由于机器根本就不懂得人类的语言,因此,根本就没有可能抽象成一个循环结构,最终还是要通过人类自己翻译。

【Java】利用Java对配置文件操作实现Java程序的国际化

同时,必须把xx_语言.propreties放在与源Java程序编译生成的.class的同一文件夹,你说你想指定一个文件夹专门放这类国际化文件,然后在Java制定国际化的路径是不可能的,亲自实践发现这样Java会提示找不到国际化文件。

国家化的文件必须严格遵守xx_语言.propreties这样的命名规则,xx你可以自己随便改,比如我就改成mess,也就是Message消息的意思,Java寻找国际化文件的过程如上图,大概过程就是从具体到抽象,先是简体中文->中文->大众语言mess。语言的代表字母具体见最后的附录,你在其中懂几门就很不错了。


三、制作过程

一个Java文件说明完毕:

[java] view plain copy
  1. //配置文件的输出的必须包  
  2. import java.io.*;  
  3. //里面包括配置文件与国际化  
  4. import java.util.*;  
  5. public class I18N {  
  6.     public static void main(String[] args) throws IOException {  
  7.         //以下是中文国际化的过程  
  8.         Properties properties = new Properties();  
  9.         //设置hello对应的值为"你好,世界!"  
  10.         properties.setProperty("hello""你好,世界!");  
  11.         //分别存储到.\bin\与同一目录,这样是因为如果你使用eclipse编译此原文件,本程序的.class会生成到bin中  
  12.         //一般bin是存放可运行文件也就是最终程序的,发布商一般发布bin下的文件夹内容就可以了,src是存放源代码的  
  13.         //.class文件是可以通过cmd里面的指令运行的哦,别用多了eclipse忘记了  
  14.         //如果你是用cmd指令运行的,这.class就会生成到与.java同一个目录  
  15.         //反正之所以保存两次仅仅是为了保证保存出来的mess_zh_CN.properties与本程序的.class文件同一目录  
  16.         properties.store(new FileOutputStream("mess_zh_CN.properties"), "i18N");  
  17.         properties.store(new FileOutputStream(".\\bin\\mess_zh_CN.properties"), "i18N");  
  18.         //以上是中文国际化的过程  
  19.         //以下是日语国际化的过程  
  20.         properties=new Properties();  
  21.         properties.setProperty("hello""こんにちは、世界(せかい)!");  
  22.         properties.store(new FileOutputStream("mess_ja_JP.properties"), "i18N");  
  23.         properties.store(new FileOutputStream(".\\bin\\mess_ja_JP.properties"), "i18N");  
  24.         //以上は、日本語の国際化  
  25.         //以下是英语国家化的过程  
  26.         properties=new Properties();  
  27.         properties.setProperty("hello""hello,world!");  
  28.         properties.store(new FileOutputStream("mess_en.properties"), "i18N");  
  29.         properties.store(new FileOutputStream(".\\bin\\mess_en.properties"), "i18N");  
  30.         //Above is internationilizing in English  
  31.         //下面加载国际化文件,第一个参数是国际化文件“xx_语言.propreties”中xx的部分,  
  32.         //第二个参数是语言,Locale.getDefault()的意思是取本操作系统的语言  
  33.         ResourceBundle resourceBundle=ResourceBundle.getBundle("mess",Locale.getDefault());  
  34.         //然后取得key:hello在所对应的属性值value,把它打印出来  
  35.         System.out.println(resourceBundle.getString("hello"));  
  36.         //Locale.JAPAN能够强行指定取出日语国际化的结果,再把它打印出来  
  37.         resourceBundle=ResourceBundle.getBundle("mess",Locale.JAPAN);  
  38.         System.out.println(resourceBundle.getString("hello"));  
  39.         //英语同理  
  40.         resourceBundle=ResourceBundle.getBundle("mess",Locale.ENGLISH);  
  41.         System.out.println(resourceBundle.getString("hello"));  
  42.     }  
  43. }  
大家观摩完毕,是否与我一样有同感,还不如写三个Java文件,把里面的输出部分改成相应的语言合适呢,但是,据说这样能够使翻译人员与程序员分离,翻译者能够专注翻译,你把你的程序中所含有的字符串输出到excel,他们自己就能够在excel上专心翻译,你再把一个写满各个语言的excel读入程序,再把其改造为国际化文件,就能够完成大型程序的各国语言N版齐发的工作。


四、附录

【Java】利用Java对配置文件操作实现Java程序的国际化