最近在用rcp 做公司产品的控制端,正好要用到i18n,虽然java有resouceBundle,但资源文件只能放到classes目录或lib目录下,很不方便,所以就写了一个新的,记在这里!!
这里主要有4个类,关键的有3个。
FilePath 类,获得相对文件路径
Lang 类 和 Resource类 真正实现 i18n.
IFiles 类,单纯方便的记录文件的相对路径。
IFiles 代码:
FilePath 类 代码:
Lang 类 代码:
Resource 类 代码:
使用格式要简单的多,Lang.getInstance().get("key value");
当然,每次更换语言还是要刷新界面的,而且刷新前要调用 Lang.delRes();方法,但我做的时候是在登录界面直接选择语言环境,所以可以只需要刷新登录界面就可以了,而不需要重新启动程序。
另外使用方法上也有 规则。
1。有一个总的properties 文件 来记录当前使用的语言。格式如下:
LANG_CODE 必须 是正确的字符编码,因为这个数值 是和
code 的数值一致,实际上就是同一个数值。
除次之外,资源文件名有格式,程序里是拼接起来的。
i18n_[LANG_CODE].properties 这样使用时可以只需要更换字符编码就可以,方便使用。
这里主要有4个类,关键的有3个。
FilePath 类,获得相对文件路径
Lang 类 和 Resource类 真正实现 i18n.
IFiles 类,单纯方便的记录文件的相对路径。
IFiles 代码:
java 代码
- public interface IFiles {
- public static final String SYS_PATH = "sys/";
- public static final String LOGIN_FILE = SYS_PATH+"global_login.xml";
- public static final String SYS_PROP_FILE = SYS_PATH+"global.properties";
- }
FilePath 类 代码:
java 代码
- import java.net.URL;
- import org.eclipse.core.runtime.Platform;
- import org.eclipse.osgi.service.datalocation.Location;
- import org.eclipse.ui.internal.util.BundleUtility;
- import org.osgi.framework.Bundle;
- public class FilePath {
- private static URL getAbsUrlFromPlugIn(String plugin, String name) {
- try {
- try {
- Bundle bundle = Platform.getBundle(plugin);
- if (!BundleUtility.isReady(bundle)) {
- return null;
- }
- URL url = BundleUtility.find(bundle, name);
- return url;
- } catch (Throwable e) {
- }
- } catch (Throwable e) {
- }
- return null;
- }
- public static URL getAbsUrl(String name) {//获得文件绝对路径
- try {
- try {
- URL url = getAbsUrlFromPlugIn(IAppContents.APPLICATION_ID,name);
- return url;
- } catch (Throwable e) {
- e.printStackTrace();
- }
- } catch (Throwable e) {
- e.printStackTrace();
- }
- return null;
- }
- public static URL getLocalUrl() {//发布前获得eclipse所在安装路径,发布后是发布的绝对路径
- Location location = Platform.getInstallLocation();
- return location.getURL();
- }
- }
Lang 类 代码:
java 代码
- import java.util.Properties;
- import java.io.File;
- import java.io.FileInputStream;
- import java.net.URL;
- import (包名).IFiles;
- public class Lang {
- private static Resources res = null;
- private static String fPath = "";
- private static String fCode = "";
- public static Resources getinstance() {
- if(res==null) {
- getLangProps();
- res = new Resources(fPath,fCode);
- }
- return res;
- }
- public static void delRes() {
- Lang.res = null;
- }
- private static void getLangProps() {
- Properties props = new Properties();
- try {
- URL url = FilePath.getLocalUrl();//这里用的是获得绝对路径,而不是相对于工程的路径
- String path = url.getFile()+IFiles.SYS_PROP_FILE;
- File file = new File(path);
- FileInputStream input = new FileInputStream(file);
- props.load(input);
- fPath = props.getProperty("LANG_FILE");
- fCode = props.getProperty("LANG_CODE");
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
Resource 类 代码:
java 代码
- import java.util.Properties;
- import java.net.URL;
- public class Resources {
- private Properties prop;
- private String code;
- private String fPath;
- public Resources(String fPath,String code) {
- this.prop = new Properties();
- this.fPath = fPath;
- this.code = code;
- init();
- }
- public void init() {
- try {
- fPath = fPath+"i18n_"+code+".properties";
- URL url = FilePath.getAbsUrl(fPath);//这里就获得是相对于工程的绝对路径。因为文件放在工程下了
- prop.load(url.openConnection().getInputStream());
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- public String get(String key) {
- String value = "";
- try {
- if(prop.containsKey(key)) {
- value = prop.getProperty(key);
- return new String(value.getBytes("iso-8859-1"),code);
- }
- }catch(Exception e) {
- return "!wrong!";
- }
- return value;
- }
- public Properties getProperties() {
- return prop;
- }
- public void clear() {
- prop.clear();
- }
- }
使用格式要简单的多,Lang.getInstance().get("key value");
当然,每次更换语言还是要刷新界面的,而且刷新前要调用 Lang.delRes();方法,但我做的时候是在登录界面直接选择语言环境,所以可以只需要刷新登录界面就可以了,而不需要重新启动程序。
另外使用方法上也有 规则。
1。有一个总的properties 文件 来记录当前使用的语言。格式如下:
java 代码
- LANG_CODE=GBK
- LANG_FILE=/res/i18n/
LANG_CODE 必须 是正确的字符编码,因为这个数值 是和
java 代码
- return new String(value.getBytes("iso-8859-1"),code);
code 的数值一致,实际上就是同一个数值。
除次之外,资源文件名有格式,程序里是拼接起来的。
i18n_[LANG_CODE].properties 这样使用时可以只需要更换字符编码就可以,方便使用。