编译生成代码
This commit is contained in:
19
pom.xml
19
pom.xml
@@ -190,6 +190,25 @@
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- 编译执行 Java 脚本 -->
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>run-code-generator</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>com.cool.core.plugin.I18nGenerator</mainClass>
|
||||
<classpathScope>compile</classpathScope>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
157
src/main/java/com/cool/core/plugin/I18nGenerator.java
Normal file
157
src/main/java/com/cool/core/plugin/I18nGenerator.java
Normal file
@@ -0,0 +1,157 @@
|
||||
package com.cool.core.plugin;
|
||||
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class I18nGenerator {
|
||||
public static void main(String[] args) {
|
||||
new I18nGenerator().run();
|
||||
}
|
||||
public void run() {
|
||||
System.out.println("i18n translate ...");
|
||||
// 要生成的文件路径
|
||||
File msgfile = FileUtil.file(System.getProperty("user.dir"),
|
||||
"src", "main", "resources", "cool", "i18n", "msg", "en.json");
|
||||
if (!msgfile.exists()) {
|
||||
JSONObject jsonObject = genExceptionMsg();
|
||||
|
||||
// 确保父目录存在
|
||||
FileUtil.mkParentDirs(msgfile);
|
||||
// 写入内容
|
||||
FileUtil.writeUtf8String(JSONUtil.toJsonStr(jsonObject), msgfile);
|
||||
}
|
||||
// 要生成的文件路径
|
||||
File menufile = FileUtil.file(System.getProperty("user.dir"),
|
||||
"src", "main", "resources", "cool", "i18n", "menu", "en.json");
|
||||
if (!menufile.exists()) {
|
||||
JSONObject jsonObject = genBaseMenu();
|
||||
// 确保父目录存在
|
||||
FileUtil.mkParentDirs(menufile);
|
||||
// 写入内容
|
||||
FileUtil.writeUtf8String(JSONUtil.toJsonStr(jsonObject), menufile);
|
||||
}
|
||||
System.out.println("✅i18n translate success !!!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成菜单信息国际化
|
||||
*/
|
||||
private JSONObject genBaseMenu() {
|
||||
try {
|
||||
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
|
||||
Resource[] resources = resolver.getResources("classpath:cool/data/menu/*.json");
|
||||
Map<String, String> map = new HashMap<>();
|
||||
List<String> list = new ArrayList<>();
|
||||
// 遍历所有.json文件
|
||||
for (Resource resource : resources) {
|
||||
String jsonStr = IoUtil.read(resource.getInputStream(), StandardCharsets.UTF_8);
|
||||
// 使用 解析 JSON 字符串
|
||||
JSONArray jsonArray = JSONUtil.parseArray(jsonStr);
|
||||
// 遍历 JSON 数组
|
||||
for (Object obj : jsonArray) {
|
||||
JSONObject jsonObj = (JSONObject) obj;
|
||||
parseMenu(jsonObj, list);
|
||||
}
|
||||
}
|
||||
for (String value : list) {
|
||||
map.put(value, value);
|
||||
}
|
||||
return invokeTranslate(map, "en");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void parseMenu(JSONObject jsonObj, List<String> list) {
|
||||
list.add(jsonObj.getStr("name"));
|
||||
// 递归处理子菜单
|
||||
JSONArray childMenus = jsonObj.getJSONArray("childMenus");
|
||||
if (childMenus != null) {
|
||||
for (Object obj : childMenus) {
|
||||
JSONObject childObj = (JSONObject) obj;
|
||||
parseMenu(childObj, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成异常信息国际化
|
||||
*/
|
||||
private JSONObject genExceptionMsg() {
|
||||
Path rootPath = Paths.get(System.getProperty("user.dir"));
|
||||
try {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
Files.walk(rootPath)
|
||||
.filter(Files::isRegularFile)
|
||||
.filter(path -> path.toString().endsWith(".java"))
|
||||
.filter(path -> !path.toString().contains("/target/") && !path.toString().contains("/.git/"))
|
||||
.forEach(path -> map.putAll(processFile(path)));
|
||||
return invokeTranslate(map, "en");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private JSONObject invokeTranslate(Map<String, String> map, String language) {
|
||||
if (map.isEmpty()) {
|
||||
return new JSONObject();
|
||||
}
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
data.put("label", "i18n-node");
|
||||
data.put("params", Map.of("text", JSONUtil.toJsonStr(map), "language", language));
|
||||
data.put("stream", false);
|
||||
String res = HttpUtil.post("https://service.cool-js.com/api/open/flow/run/invoke", JSONUtil.toJsonStr(data));
|
||||
JSONObject jsonObject = JSONUtil.parseObj(res);
|
||||
return jsonObject.getJSONObject("data").getJSONObject("result").getJSONObject("data");
|
||||
}
|
||||
|
||||
// 匹配 CoolPreconditions 抛异常语句中的中文字符串
|
||||
private static final Pattern EXCEPTION_PATTERN = Pattern.compile(
|
||||
"CoolPreconditions\\.(\\w+)\\s*\\([^;]*?\"([^\"]*[\u4e00-\u9fa5]+[^\"]*)\"", Pattern.MULTILINE
|
||||
);
|
||||
|
||||
private static Map<String, String> processFile(Path path) {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
try {
|
||||
String content = Files.readString(path, StandardCharsets.UTF_8);
|
||||
// 去掉注释
|
||||
content = removeComments(content);
|
||||
|
||||
// 仅查找方法体内的 CoolPreconditions 调用
|
||||
Matcher matcher = EXCEPTION_PATTERN.matcher(content);
|
||||
while (matcher.find()) {
|
||||
String chineseText = matcher.group(2).trim();
|
||||
map.put(chineseText, chineseText);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
// 移除注释(单行与多行)
|
||||
private static String removeComments(String code) {
|
||||
String noMultiLine = code.replaceAll("/\\*.*?\\*/", ""); // 多行注释
|
||||
return noMultiLine.replaceAll("//.*", ""); // 单行注释
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user