代码翻译尝试-使用Roaster解析和生成Java源码
此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考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;
}
}
相关实现比较简单. 因为侧重代码解析生成, 翻译部分最简化(采用纯映射表):
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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Java实现英汉词典API初版发布在Maven
在打算批量代码汉化工具 · Issue #86 · program-in-chinese/overview时, 发现没有现成的Java库实现英汉查询功能. 于是开此项目. 源码库: program-in-chinese/english-chinese-dictionary API使用中文命名. 源码也是. 使用时在Maven项目中添加依赖: <dependency> <groupId>com.codeinchinese</groupId> <artifactId>english-chinese-dictionary</artifactId> <version>0.0.1</version> </dependency> 词典数据来源于skywind3000/ECDICT. 77万个词条, 除不到2千词之外绝大多数有中文释义. 将这个词典数据(csv文件)封装的后果是这个jar包有22MB, 首次调用'查词'接口需要一段时间加载数据(本机测试十秒左右), 之后的查词是哈希表查询, 速度还能接受....
-
下一篇
Java源码英翻中库以及服务原型
服务很简单, 只为演示这个库, 源码在: program-in-chinese/code_translator_service. 在Postman测试效果: 演示服务地址: 74.91.17.250:8091 . POST请求的参数名是code, 值就是需要翻译的英文源码. 返回翻译后的源码. 注: 只支持语法正确的Java源码翻译. 否则直接返回分析错误信息. 现在汉化范围很有限, 主要集中在类型/方法名, 尚未处理其他如方法内容等 代码很粗放, 下面打算在继续改进之前先整理一下. 在前文代码翻译尝试-使用Roaster解析和生成Java源码的基础上, 作了一些改进. 主要有: 对一般词汇使用普通英汉词典进行直译(优先选取计算机领域词义或者第一个词义) 支持术语词典, 比如'instance', 上面的英汉词典中的第一个词义是'建议', 于是在术语词典中添加此项, 暂时译为'个例' 支持驼峰命名和下划线分隔法命名 各种忽略. 详见命名翻译.java: 一些歧义太多的词, 如to for of 单字符字段如M 对释义进行清理, 如括号中的内容, 特殊符号等等 接下去的改进方面: 提高翻...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程