代码翻译尝试-使用Roaster解析和生成Java源码

简介: 解析Java源码, 并将标识符翻译为中文. Parse Java source code and translate the identifiers to Chinese.

此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and Refactoring, 选了一个综合代价看来最小的, forge/roaster, 因为它同时具备解析和生成两方面功能.

初步汉化后代码效果如下(尚未有语法高亮, 仅作演示用. 之后的在线翻译结果也是同样处理):

package com.company.example;

import java.io.Serializable;

public class 人 implements Serializable {

    private static final long serialVersionUID = 1L;
    private final 整型 号;
    private 字符串 全名;

    public 整型 get号() {
        return 号;
    }

    public 字符串 get全名() {
        return 全名;
    }

    public void set全名(字符串 全名) {
        this.全名 = 全名;
    }

    public 人(java.lang.Integer id) {
        this.id = id;
    }
}

实现的源码在: https://github.com/program-in-chinese/java_code_translator/blob/8c038261bd797d9738de182f3e0f8ac111402704/src/main/java/com/codeinchinese/code_translator/%E7%BF%BB%E8%AF%91Java%E4%BB%A3%E7%A0%81.java

相关实现比较简单. 因为侧重代码解析生成, 翻译部分最简化(采用纯映射表):

  static Map<String, String> 字典 = new HashMap<>();
  static {
    字典.put("id", "号");
    字典.put("fullName", "全名");
    字典.put("getId", "取号");

    字典.put("Integer", "整型");
    字典.put("String", "字符串");

    字典.put("Person", "人");
  }

  public static void main(String[] 参数) throws Exception {
    String 源码 = 文件功用.取源文件文本("测试.java");
    JavaClassSource 分析结果 = Roaster.parse(JavaClassSource.class, 源码);

    // 汉化类名
    分析结果.setName(查词(分析结果.getName()));

    // 汉化Bean属性名, 以及属性的类型名
    for (PropertySource<JavaClassSource> 某属性 : 分析结果.getProperties()) {
      String 属性名 = 某属性.getName();
      某属性.setName(查词(属性名));

      String 属性类型名 = 某属性.getType().getName();
      某属性.setType(查词(属性类型名));
    }

    System.out.println(分析结果);
  }

  private static String 查词(String 英文) {
    return 字典.containsKey(英文) ? 字典.get(英文) : 英文;
  }

Roaster一大缺陷是, 还不支持对方法内容的解析: ROASTER-1: Java Statement Fluent Model by sotty · Pull Request #27 · forge/roaster 貌似主创最近不很活跃, 很可能需要另辟蹊径.

顺便把源码用在线翻译服务翻译一下进行比较.

谷歌几乎没有翻译:

package com.company.example;

import java.io.Serializable;

public class Person实现Serializable {

     private static final long serialVersionUID = 1L;
     private final Integer id;
     private String fullName;

     public Integer getId(){
         返回id;
    }

     public String getFullName(){
         return fullName;
    }

     public void setFullName(String fullName){
         this.fullName = fullName;
    }

     public Person(java.lang.Integer id){
         this.id = id;
    }
}

百度改变源码太大:

包装公司。
导入JavaIO.SerialCalab化;
公共类人谓词可序列化{
私有静态最终的长序列化版本UID=1L;
私有最终整数ID;
私有字符串全名;
公共整数gTiID()
序列标识;
}
公共字符串GETFuleNAMEL()
返回全名;
}
公共空隙设置FULL NULL(String FulnNeX){
全名=全名;
}
公共人(java.郎.整数ID){
这个ID=ID;
}
}

个人感觉即使是这样初步的翻译, 也是有优势的. 至于编程语言关键词不翻译, 尚不是致命问题, 毕竟下面打算与英汉词典API结合一下试试(这里有一点初步尝试, 对释义的选取还需改进). 如效果还可以接受就上线做一下内测.

2018-09-13

相关文章
|
1天前
|
安全 前端开发 Java
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
12 3
|
1天前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
8 0
【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
|
3天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
3天前
|
Serverless C++ 容器
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
|
3天前
|
C++ 芯片
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
|
3天前
|
编译器 C++
【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】
|
3天前
|
C++
【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】
|
3天前
|
供应链 Java API
Java 8新特性解析及应用区块链技术在供应链管理中的应用与挑战
【4月更文挑战第30天】本文将深入探讨Java 8的新特性,包括Lambda表达式、Stream API和Optional类等。通过对这些新特性的详细解析和应用实例,帮助读者更好地理解和掌握Java 8的新技术。
|
3天前
|
Java Spring
Java 效率编码 必备插件 Lombok 让代码更优雅
该内容是一个关于Lombok插件的教程摘要:介绍了Lombok用于减少Java开发中的模板代码,提升效率;讲解了如何在IntelliJ IDEA中安装Lombok插件,以及在pom.xml中添加依赖;并提到了@Data注解能自动生成getter/setter、equals、hashCode和toString方法,@Slf4j注解自动处理日志,@Builder用于构建对象,以及@AllArgsConstructor和@NoArgsConstructor注解生成构造函数。还鼓励探索更多Lombok的注解用法。

推荐镜像

更多