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。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值