`
weihong01267
  • 浏览: 48191 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

国际化半自动工具(想偷懒的来!)

 
阅读更多

最近做个项目 字段 超级多 但是 大多数功能有很多相同的字段,比如a.jsp 里面有 名字 性别  等等,b.jsp也有相同字段需国际化 ,页面又很多

而我做功能又没有国际化,但是发现同事又做了部分国际化了,我就想能不能拿过来用 但是 字段太多 一个个copy 真是要累死人。于是 我就想到了写个小程序来 比对国际化文件和jsp文件相同的中文字段,然后用国际化中的标签进行替换。于是花了点时间做了这个小工具(其实我还在想是否能做到全自动国际化,想过利用拼音做标签,首先搜索jsp中所有中文,然后替换到国际化文件中nihao=你好,这样 但是貌似一般都不用拼音,似乎不太好。所以作罢,如果考虑翻译成英文,就必须找google翻译api或者其他了 需要在线翻译,有兴趣的朋友可以试试。也算创新吧 哈哈)。(有部分代码参考网上的资料 ,如有知识产权问题,请联系我 将删除)

public class i18nJspConvert {
    public static void main(String[] args) throws Exception {
        String msg_zh_cn = "F:\\workspace\\proj\\i18n\\msg_zh_CN.properties";
        File ff = new File("F:\\workspace\\proj\\web\\WEB-INF\\jsp\\invoice\\add");
        List<String> l = new ArrayList<String>();
        l = printAllFile(ff, l);
        System.out.println(l);
        for (int i = 0; i < l.size(); i++) {
            runConvert(msg_zh_cn, l.get(i));
        }
    }

    public static void runConvert(String msg_zh_cn, String con_jsp) throws Exception {

               File conJ = new File(con_jsp);
        File f = new File(msg_zh_cn);
        //第一步打开国际化文件如msg_zh_cn.properties
        StringBuffer sb = new StringBuffer();
        if (f.exists() && conJ.exists()) {
            // System.out.print(stringInMsg("新增", f));
            FileReader fr = new FileReader(conJ);
            List<String> msgList = new ArrayList<String>();
            BufferedReader br = new BufferedReader(fr);
            String line = br.readLine();
            while (line != null)

            {

                System.out.println(line);
                String tempx = replaceToI18nLine(line, f);
                sb.append(tempx + "\n");
                line = br.readLine();

            }

            br.close();
            fr.close();
        }
        System.out.println(sb.toString());
        //String s = "Java语言";
        writeToOldFile(sb.toString(), conJ);

    }

    public static List<String> printAllFile(File f, List<String> l) {

        //打印当前文件名
        if (f.getName().endsWith(".jsp")) {
            System.out.println(f.getAbsolutePath());
            l.add(f.getAbsolutePath());
        }

        //是否是文件夹

        if (f.isDirectory()) {

            //获得该文件夹下所有子文件和子文件夹

            File[] f1 = f.listFiles();

            //循环处理每个对象

            int len = f1.length;

            for (int i = 0; i < len; i++) {

                //递归调用,处理每个文件对象

                printAllFile(f1[i], l);

            }

        }
        return l;
    }


    public static void writeToOldFile(String sb, File conJ) {

        //声明流对象

        FileOutputStream fos = null;

        try {

            //创建流对象

            fos = new FileOutputStream(conJ);

            //转换为byte数组

            byte[] b1 = sb.toString().getBytes();


            fos.write(b1);


        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                fos.close();

            } catch (Exception e) {
            }

        }

    }

    /**
     * param str line String每一行的字符串
     * param f  国际化文件
     */
    public static String replaceToI18nLine(String str, File f) throws Exception {
        // String str = "23423432423>新增<23423432423>新增<23423432423>你號你好<";
        String regex = ">[\u4e00-\u9fa5]*<";
        System.out.println(str.matches(regex));
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        List<String> listMacher = new ArrayList<String>();
        while (m.find()) {
            System.out.print(m.group(0));
            listMacher.add(m.group(0));
        }
        for (int i = 0; i < listMacher.size(); i++) {
            String temp = listMacher.get(i);
            temp = temp.replace(">", "");
            temp = temp.replace("<", "");
            String r = stringInMsg(temp, f);
            if (r != null && !r.trim().equals("")) {
                System.out.println("这些文字在国际化文件中的表示式:" + r);
                str = str.replaceAll(temp, "<s:text name=\"" + r.trim() + "\" />");
            }

        }
        System.out.print("str:" + str);
        return str;
    }

    public static String stringInMsg(String chinese, File f) throws Exception {
        FileReader fr = new FileReader(f);
        List<String> msgList = new ArrayList<String>();
        BufferedReader br = new BufferedReader(fr);

        String line = br.readLine();
        String returns = "";
        while (line != null)

        {

            //System.out.println(decodeUnicode(line));
            String temp = decodeUnicode(line);
            String[] teA = temp.split("=");
            for (int i = 0; teA.length == 2 && i < teA.length; i++) {
                if (teA[1].trim().equals(chinese)) {
                    returns = teA[0];
                }
            }
            //msgList.add(decodeUnicode(line));
            line = br.readLine();

        }

        br.close();
        fr.close();
        return returns;
    }

    /**
     * 一行行读取文件
     */
    public void readLineFile(String filePath, String fileName) throws IOException

    {

        FileReader fr = new FileReader(filePath + fileName);

        BufferedReader br = new BufferedReader(fr);

        String line = br.readLine();

        while (line != null)

        {

            System.out.println(decodeUnicode(line));

            line = br.readLine();

        }

        br.close();

        fr.close();

    }

    public static String decodeUnicode(String theString) {
        char aChar;
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int x = 0; x < len; ) {
            aChar = theString.charAt(x++);
            if (aChar == '\\') {
                aChar = theString.charAt(x++);
                if (aChar == 'u') {
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = theString.charAt(x++);
                        switch (aChar) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed      encoding.");
                        }

                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't') {
                        aChar = '\t';
                    } else if (aChar == 'r') {
                        aChar = '\r';
                    } else if (aChar == 'n') {
                        aChar = '\n';
                    } else if (aChar == 'f') {
                        aChar = '\f';
                    }
                    outBuffer.append(aChar);
                }
            } else {
                outBuffer.append(aChar);
            }

        }
        return outBuffer.toString();

    }


}

分享到:
评论

相关推荐

    窗口置顶快捷隐藏小工具(偷懒神器)

    窗口置顶快捷隐藏小工具(偷懒神器),把视频或网页缩小后放到桌面一角,ctrl + Q 隐藏,Ctrl + E 显示,上班看片小工具

    虚拟化程序多桌面软件工具C++源码 成品 偷懒神器 切换不同虚拟桌面

    开启虚拟化桌面后,自动生成10个电脑桌面。使用ctrl+alt+0、ctrl+alt+1-9,快速切换到不同虚拟桌面。提供成品和源码。

    偷懒道具,分页工具

    不跳转页面分页工具,依赖于jQuery,默认样式依赖于bootstrap3.0,通过最大行数和显示 行数计算出分页总数,通过设置的样式结构决定前台展示出现的样式,目前存在两种展出模式,可通过定义扩展方式,增加展出样式。

    “偷懒”的技术:打造财务Excel达人 pdf

    “偷懒”的技术:打造财务Excel达人 pdf

    UPS断电后服务器自动关机工具+源码

    想偷懒从网上下载同类工具,却都有毒,真TMD不厚道,被逼自行开发,使用C#。 文件说明: ServerAutoShutDown.exe---服务程序 SRVINSTW.EXE--服务安装工具,使用方法请网上查 Config.ini--配置文件 IP---要检查的IP...

    封U盘的key(想偷懒的人可以下下)

    封U盘的注册表文件,只封大容量的U盘,usb键盘鼠标不会被封 想偷懒的人可以下下

    偷懒注册机编写源码

    就是“注册机偷懒写法”四篇博客的源码,发出来赚点积分,以前赞的积分都被清掉了

    android 开发框架,码农偷懒专用

    喜欢偷懒,对于一个码农来说,能够偷懒,并且在不影响项目质量的情况下,是不容易的。 这个叫不上框架,只能说是一个工具类。 框架大小在400KB 包括源码在600KB 里面分为两个架包一个是有源码的 这样就直接可以查看...

    偷懒的程序员

    做一个会偷懒的程序员

    子网计算工具V1.0

    很好用的子网掩码计算器,呵呵 针对一些网络工程师偷懒使用!

    桌签生成工具1.0.3最新安装版

    桌签生成工具是我们生活中经常会使用到的一个小软件,事务繁多或者...于是,想“偷懒”的人打算编写一个小工具来代替人工。 使用方法 1、首先将与会人员的名字整理成文档 2、采用一行一个的方式导入到工具中 3、点击

    超级单片机工具V7.0中文免费绿色版

    超级单片机工具,本程序是作者在自己工作需要的基础上,为了方便使用,提高工作效率(实际上是为了偷懒:)),将一些经常不经常使用的功能做成工具,最后集成到一块儿组成的。 放到网上本来是想让那些跟自己一样小米...

    逗@游doyo重命名工具

    好吧,没事对压缩包分析了下,嗯,原来把一些后缀隐藏掉了,这样偷懒的?!!研究了皮毛的bat脚本,写了一个方便的工具。运行一下,问题解决! 此工具Bgk编码,可txt编写,下载后修改一下功能大大的,就看你会不会...

    进程管理,限制工具 限制外部程序只能运行一次

    另外就是设置一下[自动化配置] : 看个人需要设置吧; 这些功能相信不用详细介绍了, 一看大家都懂了. PS: 程序里增加了一个自动隐藏自身程序的功能,所以会被一些杀软拦截, 使用注意一下,信任通过就行了,绝对无毒...

    数据库表结构管理工具 v1.0.rar

    附赠Database.asp程序 该程序是我以前做的一个只适合ASP数据库操作的自动生成代码的偷懒工具 http://***/TableList.asp 通过该页面演示添加 修改 删除 程序免费开源 任意使用 修改请注明原作者 数据库表结构管理...

    《C#简易计算器软件》

    简易计算器,windows制作,c#编程,仅供参考,不要偷懒哦!!!

    mybatis代码自动生成

    mybatis代码自动生成工具,偷懒的利器。

    自动循环打印kernel的log,方便偷懒操作,提高效率

    自动循环打印kernel的log,方便偷懒操作,提高效率。 平常在研发的时候,需要打印log,重启机器,再打印log,纯手工操作略显麻烦,所以专门写了一个脚本

    易语言偷懒实现md5加密

    易语言偷懒实现md5加密源码,偷懒实现md5加密,md5

Global site tag (gtag.js) - Google Analytics