Struts2.0国际化 实现自动国际化旧项目

 

闲话少说,切入正题,接上一篇文章,分步实现自动国际化项目。

struts2的国际化分三种情况:前台页面的国际化,Action类中的国际化,配置文件的国际化。这其中最复杂的就是前台页面的国际化。

这包括JSP代码文件,js文件,struts标签的国际化,我想struts 怎样实现国际化的相关配置大家都很熟悉,或者很容易找到相关的资料,这里我讲一下个人在国际化

一个旧项目时,感觉比较费时的主要工作:如何在短时间内,实现java web 国际化。

Struts国际化、web国际化、jsp国际化、xml国际化、js国际化

1、编写一个main函数,读取指定类型的文件,把中文都找出来放在一个待修正的资源文件中。

1.1读文件,大致的代码是这样的

public static void getFiles(File path, List<File> fileList, String fileType) {
	File[] files = path.listFiles();
	if(files.length == 0){
	}
    for (File file : files)
        if (file.isDirectory() && !file.isHidden())
        	getFiles(file, fileList,fileType);
        else if (file.getName().toUpperCase().endsWith(fileType))
            fileList.add(file);
	
}

1.2解析文件内容,排除各种注释中的中文,毕竟还要维护方便查看呢;这里哪JS中的中文作了个例子,把中文放在Map里面去重,再排序后输出到文件中

private static void getJsWords() {
	List<File> fileList = new ArrayList<File>();
	getFiles(new File(srcPath), fileList, "JS");
	Map<String,String> cnMap = new HashMap<String, String>();
	try{
		BufferedReader br = null;
		System.out.println("start----------");
		 for (File file : fileList){
			 StringBuffer sb = new StringBuffer();
			 br = new BufferedReader(new InputStreamReader(new FileInputStream(file),encode));
			 String line = br.readLine();
			 while(line != null){
				 line = line.trim();
				 if(line.startsWith("/*") || line.startsWith("//") || line.startsWith("*")){
	    		}else{
	    			if(line.indexOf("//") > 0){
    					line = line.substring(0,line.indexOf("//"));
    				}
	    			//检测中文
				Matcher m = Pattern.compile("[\\u4e00-\\u9fa5]").matcher(line);
				if(m.find()){
				   if(line.indexOf("'") != -1 && line.indexOf("\"") != -1){
				   m = Pattern.compile("[\\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\u4e00-\\u9fa5]+[ \\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\pP‘’“”]*").matcher(line);
				   while(m.find()){
				   cnMap.put(m.group().replaceFirst(";", ""), "");
				   }
				}else if(line.indexOf("'") != -1){
				  m = Pattern.compile("[\\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\u4e00-\\u9fa5]+[ \\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\pP‘’“”]*").matcher(line);
				  while(m.find()){
				  cnMap.put(m.group(), "");
				  }
				}else if(line.indexOf("\"") != -1){
				  m = Pattern.compile("[\\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\u4e00-\\u9fa5]+[ \\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\pP‘’“”]*").matcher(line);
				  while(m.find()){
				  cnMap.put(m.group(), "");
				  }
				}else{
				  m = Pattern.compile("[\\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\u4e00-\\u9fa5]+[ \\w\\ufe30-\\uffa0\\u4e00-\\u9fa5]*[\\pP‘’“”]*").matcher(line);
				  while(m.find()){
				  cnMap.put(m.group(), "");
				  }
				}
			 }
	    		}
			  line = br.readLine();
		     }
		 }
		 List<String> sortList = new ArrayList<String>();
		for(Map.Entry<String, String> entry : cnMap.entrySet()){
			sortList.add(entry.getKey());
		}
		Collections.sort(sortList);
		saveList2File(sortList,srcPath+"cn.properties");
		System.out.println("end------");
	}catch (Exception e) {
	}
}

2、中文都找出来了,现在该是要翻译了,直接调用在线翻译Api翻译就是,翻译后生成国际化资源文件

com.google.api.translate.Translate.translate(line, Language.CHINESE_SIMPLIFIED, Language.ENGLISH);

一行一行的翻译,把翻译好的英文按照一定规则生成资源文件key,同时生成key.xxx.xxx.xxx=这里是中文,的资源文件resource_en_US.properties 和key.xxx.xxx.xxx=This is English,的英文资源文件。

3、有了资源文件以后,我们还要让代码中能够方便的动态引用,java中比较方便,js里面可能会遇到加载先后顺序的问题,建议将js文件初始化到web服务器中,待用户打开页面的时候,已json字符串格式输出到

客户端浏览器,在客户端使用js函数,通过key来读取json内容。

4、接下来要把翻译好的资源文件,替换到代码中

    这里只要把文件独成长字符串,然后拿中文作key去程序里面遍历搜索就可以了,搜索到的中文就替换成js函数名称和英文key。

这样就算基本完成了,程序毕竟是程序,不能代替所有人工,还需要检查遗漏,进行人工校正。

这种情况主要适用于旧项目改造的,新项目最好一开始设计时旧按照国际化的方法来作,这样可以避免项目中语言不通顺、用词用语不一致的问题,同时能够更快的翻译成其它的语种。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值