-
Notifications
You must be signed in to change notification settings - Fork 1
/
script.js
143 lines (126 loc) · 4.69 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
* file chạy chính của trương trình
*/
// import thư viện
import util from "util";
// import file
import config from "./config.js";
import mergeJson from "./src/mergeJson.js";
import translateByOpenAI from "./src/translateByOpenAI.js";
import { logFile, logResultText, clearResultText } from "./src/logFile.js";
import checkFlag from "./src/checkFlag.js";
import { replaceSpecialKey } from "./src/handleSpecialKey.js";
import originalLangObject from "./input/originalLangObject.js";
import testObject from "./input/test.js";
import {
undoSimplifiedObject,
makeSimplifiedObject,
} from "./src/simplifiedKey.js";
// thêm cờ nhận biết có gọi vào chat gpt không
let notCallChatGPT = checkFlag(config.notCallChatGPT);
let runTest = checkFlag(config.runTest);
/**
* hàm chạy chính của chương trình
*/
async function runTool() {
try {
// bắt đầu đo hiệu năng
let startTime = performance.now();
let targetObject = runTest ? testObject : originalLangObject;
if (!notCallChatGPT) {
if (config && targetObject) {
// xóa trắng file output thô đi để ghi nhiều lần
await clearResultText();
await logFile(config.startLog);
// trải phẳng object nhiều cấp thành object 1 cấp, chỉ giữ lại key value cấp nhỏ nhất
let flattenObject = await prepareDataBeforeTranslate(targetObject);
// bổ sung remove tất cả ký tự đặc biệt
if (flattenObject && typeof flattenObject == "object") {
flattenObject = await replaceSpecialKey(flattenObject);
}
if (config.limitLine && flattenObject) {
// tính toán số lần gọi openAI
let objectKeys = Object.keys(flattenObject);
let pages = Math.ceil(objectKeys.length / config.limitLine);
if (pages > 0) {
let count = 0;
let countSuccess = 0;
// chia queue để đẩy lên dịch theo limit
for (let i = 0; i < pages; i++) {
let queueObject = Object.fromEntries(
Object.entries(flattenObject).slice(
i * config.limitLine,
i * config.limitLine + config.limitLine
)
);
let simplifiedKeyObject = {};
// rút gọn key của object để dịch cho nhanh
await makeSimplifiedObject(queueObject, simplifiedKeyObject);
let result = await translateByOpenAI(queueObject, count);
// khôi phục key đã rút gọn của object
result = await undoSimplifiedObject(result, simplifiedKeyObject);
count++;
// lưu vào file kết quả
if (result) {
countSuccess++;
await logResultText(
util.inspect(result, { depth: Infinity, compact: false })
);
// Thêm log đã chạy thành công bao nhiêu %
let logSuccessMes = config.logTranslateSuccess.replace(
config.keyReplace,
((count / pages) * 100).toFixed(2)
);
await logFile(logSuccessMes);
}
}
}
}
}
}
// convert từ nhiều result json thành 1 file object js
await mergeJson();
// kết thúc đo hiệu năng
let endTime = performance.now();
let messageLog = config.logTime.replace(
config.keyReplace,
Math.floor((endTime - startTime) / 1000 / 60)
);
await logFile(messageLog);
} catch (error) {
await logFile(error, "runTool");
}
}
/**
* hàm trải phẳng object từ nhiều cấp về object 1 cấp duy nhất, chỉ giữ lại cặp key value nhỏ nhất
* @param {*} originalObject object chưa được trải phẳng
* @returns object đã trải phẳng
*/
async function prepareDataBeforeTranslate(originalObject) {
let result = {};
try {
for (const key in originalObject) {
if (!originalObject.hasOwnProperty(key)) {
continue;
}
if (
typeof originalObject[key] == "object" &&
originalObject[key] !== null
) {
// nếu là object thì gọi đệ quy ddeer trải phẳng
let flatObject = await prepareDataBeforeTranslate(originalObject[key]);
for (let x in flatObject) {
if (!flatObject.hasOwnProperty(x)) continue;
result[key + config.seperateLevelChar + x] = flatObject[x];
}
} else {
result[key] = originalObject[key];
}
}
} catch (error) {
await logFile(error, "prepareDataBeforeTranslate");
}
return result;
}
// điểm bắt đầu chạy của chương trình
runTool();