1、思路:java文件中的string硬编码无法像layout文件中的string硬编码那样可以批量替换,所以换种思路,我们只做抽取,不做替换。假如我们有一个hashmap,key是繁体中文,value是简体中文,我们在代码中的string硬编码都写成getStr("测试")这样。getStr方法的伪代码如下:
public static String getStr(String key) {
if (curLang.equals("繁体中文")) {//如果当前语言是繁体中文,则直接返回key
return key;
} else {
String value = hashmap.get(key);//否则获取value,返回简体中文
if (value == null) {//如果为null,则直接用繁体中文
return key;
} else {
return value;
}
}
}
这样,问题的关键就是hashmap的生成了。生成hashmap初始化代码的字符串:使用正则表达式getStr\\(\".*?\"\\)拿到所有的中文硬编码,然后使用System.out.print打印。
2、主要代码:SearchAndroidCodeText 类
package com.ivan.demo;
import com.ivan.demo.utils.ZHConverter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//查找java目录下的java文件的中文硬编码,打印hashmap初始化代码字符串
public class SearchAndroidCodeText {
private static List<String> stringList = new ArrayList<>();
public static void readToString(String fileName, String keyWord) {
String encoding = "UTF-8";
File file = new File(fileName);
Long filelength = file.length();
byte[] filecontent = new byte[filelength.intValue()];
FileInputStream in = null;
try {
in = new FileInputStream(file);
in.read(filecontent);
in.close();
String content = new String(filecontent, encoding);
Pattern pat = Pattern.compile(keyWord);
Matcher mat = pat.matcher(content);
while (mat.find()) {
String resultStr = mat.group(0);
String resultKey = resultStr.replace("getStr(", "");
resultKey = resultKey.substring(0, resultKey.length() - 1);
stringList.add(resultKey);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
File[] subFiles = folder.listFiles();
if (subFiles == null) {
return;
}
for (int i = 0; i < subFiles.length; i++) {// 循环遍历文件夹或文件
if (subFiles[i].isFile()) {
if (subFiles[i].getName().endsWith(".java")) {
//System.out.println(subFiles[i].getName());
readToString(subFiles[i].getAbsolutePath(), keyWord);
}
} else if (subFiles[i].isDirectory()) {// 如果是文件夹,则递归调用本方法
searchFile(subFiles[i], keyWord);
}
}
}
//去掉重复string
public static List<String> removeDuplicate(List<String> list) {
List<String> listTemp = new ArrayList();
for (int i = 0; i < list.size(); i++) {
if (!listTemp.contains(list.get(i))) {
listTemp.add(list.get(i));
}
}
return listTemp;
}
public static void main(String[] args) throws Exception {// java程序的主入口处
String dirPath = "D:\\code\\studio\\StringInternationalDemo\\app\\src\\main\\java";
File folder = new File(dirPath);// 默认目录
String keyword = "getStr\\(\".*?\"\\)";//?表示贪婪模式
if (!folder.exists()) {// 如果文件夹不存在
System.out.println("目录不存在:" + folder.getAbsolutePath());
return;
}
//第一步:查找java文件中的中文硬编码
searchFile(folder, keyword);
stringList = removeDuplicate(stringList);
//第二步:生成hashmap的初始化代码字符串
ZHConverter converter = ZHConverter.getInstance(ZHConverter.SIMPLIFIED);//将繁体中文改成简体中文
for (String key : stringList) {
String value = converter.convert(key);
System.out.println("data.put(" + key + "," + value + ");");
}
}
}
3、代码下载地址