试编写一个翻译程序Translate.java,实现用Java命令行输入一个小于100的整数,将其翻译成英文表示,输入英文则输出相应的整数。

该博客介绍了如何编写一个名为Translate.java的Java程序,该程序能够接收命令行输入的小于100的整数或其英文表示,并相互翻译。通过3个数组x、y和z来存储0-99的英文单词,实现了数字到英文和英文到数字的转换功能。例如,输入32会输出“thirty two”,输入“eight”则输出8。

设有3个数组定义如下:
String x[]={“zero”,“one”,“two”,“three”,”four“,”five“,“six”,“seven”,“eight”,“nine”};
String y[]={“ten”,“eleven”,“twelve”,“thirteen”,”fourteen“,”fifteen“,“sixteen”,“seventeen”,“eighteen”,“nineteen”};
String z[]={“twenty”,“thirty”,“fourty”,“fifty”,“sixty”,”seventy“,“eighty”,“ninety”};
试编写一个翻译程序Translate.java,实现用Java命令行输入一个小于100的整数,将其翻译成英文表示,输入英文则输出相应的整数。
示例:
输入32,输出:thirty two
输入8,输出 eight
输入fourteen,输出14

import java.util.Scanner;
import java.util.StringTokenizer;
public class Translate {
   
   
	public static void main(String[] args) {
   
   
		String x[]={
   
   "zero","one","two", "three","four", "five","six","seven","eight","nine"} ;
		String y[]={
   
   "ten","eleven","twelve","thirteen","fourteen","fifteen", "sixteen","seventeen","eighteen","nineteen" };
		String z[]={
   
   "twenty","thirty",
虽然你的需求是“一个 Java 程序,将 `.java` 文件中所有字符串翻译为英文并替换(注释除外)”,但需要明确几点: > ⚠️ **警告与限制:** - 自动翻译代码中的中文字符串存在**语义错误风险**(机器翻译不准) - 直接修改源文件有丢失数据的风险,必须先备份 - 不能翻译注释,只能处理 **字符串字面量中的文本** - 推荐做法是:提取到资源文件做国际化,而不是硬编码英文 --- ### ✅ 目标 我们实现一个 Java 程序: 1. 遍历指定目录下的所有 `.java` 文件 2. 解析 AST(抽象语法树),仅识别 **字符串字面量中的中文** 3. 使用翻译 API(如百度翻译、Google Translate 或阿里云)将其翻译成英文 4. 将原字符串替换为英文,并保存文件 5. 跳过注释、跳过非字符串内容 --- ## ✅ 技术选型 | 工具 | 说明 | |------|------| | [JavaParser](https://javaparser.org/) | 开源库,用于解析和修改 Java 源码的 AST | | 百度翻译开放平台 | 免费额度够用,支持批量请求 | | UTF-8 编码 | 所有文件读使用 UTF-8 | --- ## ✅ 第一步:添加依赖(Maven) ```xml <dependencies> <!-- JavaParser 核心 --> <dependency> <groupId>com.github.javaparser</groupId> <artifactId>javaparser-core</artifactId> <version>3.25.9</version> </dependency> <!-- Apache HttpClient 发送 HTTP 请求 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> </dependency> <!-- JSON 处理 --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20230618</version> </dependency> </dependencies> ``` --- ## ✅ 第二步:注册百度翻译 API(免费) 1. 访问:[https://fanyi-api.baidu.com/](https://fanyi-api.baidu.com/) 2. 注册账号,创建应用,获取: - `APP_ID`: 如 `20250405001234567` - `SECURITY_KEY`: 如 `abcd1234efgh5678ijkl` 3. 支持中文 → 英文 > 注意:每天免费 200 万字符,足够测试和小项目使用。 --- ## ✅ 完整 Java 程序代码 ```java import com.github.javaparser.JavaParser; import com.github.javaparser.ParseResult; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.NodeList; import com.github.javaparser.ast.expr.StringLiteralExpr; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONObject; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.security.MessageDigest; import java.util.*; public class JavaStringTranslator { // =============== 百度翻译配置 =============== private static final String APP_ID = "your_app_id"; // 替换为你自己的 private static final String SECURITY_KEY = "your_security_key"; // 替换为你自己的 private static final String TRANS_API_URL = "http://api.fanyi.baidu.com/api/trans/vip/translate"; private static final CloseableHttpClient httpClient = HttpClients.createDefault(); private static final Map<String, String> TRANSLATION_CACHE = new HashMap<>(); public static void main(String[] args) throws IOException { Path rootDir = Paths.get("src"); // 修改为你项目的 src 目录路径 Files.walk(rootDir) .filter(path -> path.toString().endsWith(".java")) .forEach(JavaStringTranslator::processFile); httpClient.close(); } private static void processFile(Path filePath) { try { String content = Files.readString(filePath, StandardCharsets.UTF_8); ParseResult<CompilationUnit> result = new JavaParser().parse(content); if (!result.isSuccessful() || result.getResult().isEmpty()) { System.err.println("Failed to parse: " + filePath); return; } CompilationUnit cu = result.getResult().get(); boolean modified = false; List<StringLiteralExpr> strings = cu.findAll(StringLiteralExpr.class); for (StringLiteralExpr expr : strings) { String value = expr.getValue(); if (containsChinese(value)) { String translated = translateToEnglish(value); if (translated != null && !translated.equals(value)) { expr.setValue(translated); modified = true; System.out.printf("Translated: '%s' -> '%s'%n", value, translated); } } } if (modified) { // 回文件 try (BufferedWriter writer = Files.newBufferedWriter(filePath, StandardCharsets.UTF_8)) { writer.write(cu.toString()); } System.out.println("Updated file: " + filePath); } } catch (Exception e) { System.err.println("Error processing file: " + filePath + ", Error: " + e.getMessage()); e.printStackTrace(); } } // 判断字符串是否包含中文 private static boolean containsChinese(String str) { return str != null && str.chars().anyMatch(ch -> ch >= 0x4E00 && ch <= 0x9FFF); } // 百度翻译核心方法 private static String translateToEnglish(String query) { if (TRANSLATION_CACHE.containsKey(query)) { return TRANSLATION_CACHE.get(query); } try { String salt = UUID.randomUUID().toString(); String signStr = APP_ID + query + salt + SECURITY_KEY; String sign = md5(signStr); String url = String.format( "%s?q=%s&from=zh&to=en&appid=%s&salt=%s&sign=%s", TRANS_API_URL, URLEncoder.encode(query, "UTF-8"), APP_ID, salt, sign ); HttpGet request = new HttpGet(url); HttpResponse response = httpClient.execute(request); String body = EntityUtils.toString(response.getEntity(), "UTF-8"); JSONObject json = new JSONObject(body); if (json.has("trans_result")) { JSONArray results = json.getJSONArray("trans_result"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < results.length(); i++) { sb.append(results.getJSONObject(i).getString("dst")); } String result = sb.toString(); TRANSLATION_CACHE.put(query, result); // 缓存结果 return result; } else { System.err.println("Translation failed for: " + query + ", Response: " + body); TRANSLATION_CACHE.put(query, query); // 失败也缓存避免重试 return query; // 翻译失败保留原文 } } catch (Exception e) { System.err.println("Translation error for: " + query + ", " + e.getMessage()); return query; // 出错时返回原文 } } private static String md5(String input) throws java.security.NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb.append(String.format("%02x", b & 0xff)); } return sb.toString(); } } ``` --- ## ✅ 使用说明 ### 1. 替换配置 ```java private static final String APP_ID = "your_app_id"; private static final String SECURITY_KEY = "your_security_key"; ``` 替换成你在 [百度翻译开放平台](https://fanyi-api.baidu.com/) 注册的应用信息。 --- ### 2. 设置源码路径 ```java Path rootDir = Paths.get("src"); ``` 改为你的实际 Java 源码根目录,例如: ```java Path rootDir = Paths.get("../my-project/src/main/java"); ``` --- ### 3. 运行程序 编译运行后,它会: - 自动扫描所有 `.java` 文件 - 找出含中文的字符串 - 调用百度 API 翻译为英文 - 修改 AST 并回源文件 --- ### ✅ 示例转换 #### 原始代码: ```java String msg = "操作成功"; System.out.println("用户不存在"); ``` #### 翻译后: ```java String msg = "Operation successful"; System.out.println("User does not exist"); ``` > ✅ 注释不会被处理! --- ## ✅ 注意事项 | 项目 | 建议 | |------|------| | 📁 备份代码 | 运行前务必 `git commit` 或备份整个项目 | | 🔤 翻译准确性 | 机器翻译可能不准确,建议人工复核关键提示 | | 🧹 清理缓存 | `TRANSLATION_CACHE` 可持久化为文件避免重复调用 | | ⏱️ 限流处理 | 百度 API 有 QPS 限制,可加 `Thread.sleep(100)` 控速 | | 🌐 网络要求 | 需要联网访问翻译接口 | --- ## ✅ 更优方案建议(推荐替代) 与其直接替换字符串,不如生成资源文件: ```properties # messages_zh.properties msg.success=操作成功 # messages_en.properties msg.success=Operation succeeded ``` 然后代码改为: ```java String msg = messageSource.getMessage("msg.success", null, Locale.ENGLISH); ``` 这才是真正的国际化(i18n)标准做法。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值