用java写一个英汉翻译的函数,首先想一下需要完成几个步骤。

  1. 判断消息中是否含有英文。
  2. 读取词库文件。
  3. 将消息截取成单个的单词。
  4. 将单词与词库中相对应的汉语替换。
  5. 返回翻译好的消息。

        判断消息中是否含有英文,运用了正则表达式去匹配字符串中是否含有字母。
判断含有英文代码如下:

/**
	 * 日志消息是否含有英文
	 *
	 * @param str
	 * @return
	 */
	public boolean judgeContainsStr(String str) {
		if (StringUtils.isBlank(str)) {
			return false;
		}
		String regex = "[a-zA-Z]";
		Pattern p = Pattern.compile(regex);
		return p.matcher(str).find();
	}

        如果含有英文,那么进入翻译函数中进行英汉的转换。因为要应用在项目中,那么写死或者从本地读取词库都是不合适的,因此这里引入了properties类,应用了这种配置文件的方式进行词库的生成,这样放在项目中,将来添加新的单词就只需在配置文件中进行新增。

配置文件如下:translation.properties

#磁盘
disk=\u78c1\u76d8                 
#空间
space=\u7a7a\u95f4
#在
on=\u5728
#数据库
datastore=\u6570\u636e\u5e93
#不足
insufficient=\u4e0d\u8db3

        配置文件采用Key = Value 的格式,这里把汉字转换成了ASCLL码是为了防止发生乱码的问题,给大家提供一个比较好用的在线转码工具

        在翻译函数中,通过FileInputStream来获取配置文件中的内容,这里如果获取不到的话,最后会讲解一下相关问题。获取到词库后,通过构造一个解析str的StringTokenizer对象,根据分隔符分隔,再调用相关函数将传进来的消息分隔为单个单词。然后通过properties的方法properties.getProperty(key)方法搜索是否存在单词。如果存在,那么替换。这样,一个通过读取配置文件的英汉转换函数就完成了。
/font>

翻译函数代码如下:

/**
	 * 日志消息英译汉
	 *
	 * @param message
	 * @return
	 */
	public String operationResultMessageTranslate(String message) {
		if (StringUtils.isBlank(message)) {
			return null;
		}
		Properties properties = new Properties();
		FileInputStream fileInputStream =null;
		try {
			//获取配置文件中的词库
			fileInputStream = new FileInputStream("src/main/resources/translation.properties");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		try {
			//加载属性列表到properties对象中
			properties.load(fileInputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//指定分隔符
		String delim = " :,.!\n\t";
		//构造一个解析str的StringTokenizer对象,并提供指定的分隔符,同时,指定不返回分隔符
		StringTokenizer str = new StringTokenizer(message, delim, false);
		while (str.hasMoreTokens()) {
			//分割出的一个个单词
			String sub = str.nextToken();
			//统一转换为小写
			String lowerSub = sub.toLowerCase();
			//从词库中找匹配的项
			String newSub = properties.getProperty(lowerSub);
			//如果找到了匹配的汉字,则进行替换
			if (newSub != null) {
				message = message.replaceFirst(sub, newSub);
			}
		}
		return message;
	}

注意:如果properties获取不到配置文件,提示系统找不到相关文件的话,那么我们需要理解一下读取的方法。

为什么用FileInputStream找不到路径?
因为FileInputStream这个类读取的相对路径针对的是项目根目录的 。根目录工程包就是java语法这个包。
要找到person.xml,应该写成 src/res/person.xml .
如果用getResource,
InputStream is=getClass().getResourceAsStream("../res/person.properties");
这个是从当前java原文件处开始读的。
还有一种方法:资源文件db.properties放在ClassPath下(src目录中)
我们需要加"/",可以理解为在ClassPath下寻找,即src目录
InputStream in = Test1.class.getResourceAsStream("/res/db.properties");
上面3种方法都可以。。