yh-i18n 2.2.15 → 2.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/excelTool.ts +256 -256
- package/index.d.ts +33 -33
- package/index.js +339 -339
- package/lang/baseEnUS.js +26 -26
- package/lang/baseTh.js +26 -26
- package/lang/baseTr.js +26 -26
- package/lang/baseVi.js +26 -26
- package/lang/baseZhCn.js +26 -26
- package/lang/en.js +310 -310
- package/lang/th.js +313 -313
- package/lang/tr.js +314 -314
- package/lang/vi.js +314 -314
- package/lang/zh.js +310 -310
- package/language.vue +79 -79
- package/list.vue +526 -526
- package/package.json +19 -19
- package/readme.md +73 -73
package/excelTool.ts
CHANGED
|
@@ -1,256 +1,256 @@
|
|
|
1
|
-
import ExcelJS from "exceljs";
|
|
2
|
-
import Config from "@/config";
|
|
3
|
-
import { ElMessage, ElLoading } from "element-plus";
|
|
4
|
-
import http from "@/libs/api.request";
|
|
5
|
-
import { useI18nStore } from "./index";
|
|
6
|
-
|
|
7
|
-
const verificationCode = "lkyhtranslateexcel";
|
|
8
|
-
export async function exportExcel ( total ) {
|
|
9
|
-
const loading = ElLoading.service( {
|
|
10
|
-
lock: true,
|
|
11
|
-
text: "正在获取所有翻译字段……",
|
|
12
|
-
background: "rgba(255, 255, 255, 0.2)",
|
|
13
|
-
} );
|
|
14
|
-
const i18nStore = useI18nStore();
|
|
15
|
-
let records = await http
|
|
16
|
-
.request( {
|
|
17
|
-
url: "/translate/select",
|
|
18
|
-
method: "post",
|
|
19
|
-
data: {
|
|
20
|
-
pageNum: 1,
|
|
21
|
-
pageSize: total,
|
|
22
|
-
},
|
|
23
|
-
} )
|
|
24
|
-
.then( ( res ) => {
|
|
25
|
-
let localKeys = i18nStore.localList.map( ( item ) => item.value );
|
|
26
|
-
let { records } = res.data.data;
|
|
27
|
-
records = records.map( ( item ) => {
|
|
28
|
-
try {
|
|
29
|
-
let content = JSON.parse( item.content );
|
|
30
|
-
let keys = Object.keys( content );
|
|
31
|
-
|
|
32
|
-
keys.forEach( ( key ) => {
|
|
33
|
-
let val = content[ key ];
|
|
34
|
-
item[ key ] = val;
|
|
35
|
-
} );
|
|
36
|
-
localKeys.forEach( ( k ) => {
|
|
37
|
-
if ( !keys.includes( k ) ) {
|
|
38
|
-
item[ k ] = "";
|
|
39
|
-
}
|
|
40
|
-
} );
|
|
41
|
-
} catch ( error ) { }
|
|
42
|
-
return item;
|
|
43
|
-
} );
|
|
44
|
-
return records;
|
|
45
|
-
} );
|
|
46
|
-
loading.setText( "正在序列化表格数据……" );
|
|
47
|
-
const workbook = new ExcelJS.Workbook();
|
|
48
|
-
workbook.creator = "力控远海";
|
|
49
|
-
workbook.lastModifiedBy = "力控远海技术中心前端";
|
|
50
|
-
workbook.keywords = verificationCode;
|
|
51
|
-
workbook.created = new Date();
|
|
52
|
-
workbook.modified = new Date();
|
|
53
|
-
const sheet = workbook.addWorksheet( `${ Config.title }-系统待翻译文字` );
|
|
54
|
-
|
|
55
|
-
let columns: any[] = [
|
|
56
|
-
{ width: 0, hidden: true },
|
|
57
|
-
{ width: 0, hidden: true },
|
|
58
|
-
];
|
|
59
|
-
let title: string[] = [ "", "" ];
|
|
60
|
-
let titleObj = {
|
|
61
|
-
zh_CN: "中文",
|
|
62
|
-
en_US: "英语",
|
|
63
|
-
th: "泰语",
|
|
64
|
-
vi: "越南语",
|
|
65
|
-
tr: "土耳其语",
|
|
66
|
-
};
|
|
67
|
-
Config.i18nList.forEach( ( item ) => {
|
|
68
|
-
columns.push( {
|
|
69
|
-
width: 30,
|
|
70
|
-
alignment: { vertical: "middle", horizontal: "center", wrapText: true },
|
|
71
|
-
value: item,
|
|
72
|
-
} );
|
|
73
|
-
title.push( titleObj[ item ] );
|
|
74
|
-
} );
|
|
75
|
-
|
|
76
|
-
sheet.columns = columns;
|
|
77
|
-
sheet.addRow( title );
|
|
78
|
-
sheet.addRows(
|
|
79
|
-
records.map( ( item ) => {
|
|
80
|
-
let { adTranslateId, key } = item;
|
|
81
|
-
let row = [ adTranslateId, key ];
|
|
82
|
-
Config.i18nList.forEach( ( valKey ) => {
|
|
83
|
-
row.push( item[ valKey ] );
|
|
84
|
-
} );
|
|
85
|
-
return row;
|
|
86
|
-
} )
|
|
87
|
-
);
|
|
88
|
-
sheet.getRows( 1, 1 )?.forEach( ( row, index ) => {
|
|
89
|
-
row.height = 25;
|
|
90
|
-
row.eachCell( { includeEmpty: true }, ( cell, cellIndex ) => {
|
|
91
|
-
cell.font = { bold: true };
|
|
92
|
-
cell.alignment = {
|
|
93
|
-
vertical: "middle",
|
|
94
|
-
horizontal: "center",
|
|
95
|
-
wrapText: true,
|
|
96
|
-
};
|
|
97
|
-
cell.border = {
|
|
98
|
-
top: { style: "thin" },
|
|
99
|
-
left: { style: "thin" },
|
|
100
|
-
bottom: { style: "thin" },
|
|
101
|
-
right: { style: "thin" },
|
|
102
|
-
};
|
|
103
|
-
} );
|
|
104
|
-
} );
|
|
105
|
-
sheet.getRows( 2, records.length )?.forEach( ( row, index ) => {
|
|
106
|
-
row.height = 25;
|
|
107
|
-
row.eachCell( { includeEmpty: true }, ( cell, cellIndex ) => {
|
|
108
|
-
cell.alignment = {
|
|
109
|
-
vertical: "middle",
|
|
110
|
-
horizontal: "left",
|
|
111
|
-
wrapText: true,
|
|
112
|
-
};
|
|
113
|
-
cell.border = {
|
|
114
|
-
top: { style: "thin" },
|
|
115
|
-
left: { style: "thin" },
|
|
116
|
-
bottom: { style: "thin" },
|
|
117
|
-
right: { style: "thin" },
|
|
118
|
-
};
|
|
119
|
-
} );
|
|
120
|
-
} );
|
|
121
|
-
sheet.views = [ { state: "frozen", xSplit: 0, ySplit: 1, activeCell: "C2" } ];
|
|
122
|
-
loading.setText( "正在生成表格文件……" );
|
|
123
|
-
workbook.xlsx.writeBuffer().then( ( data ) => {
|
|
124
|
-
const blob = new Blob( [ data ], {
|
|
125
|
-
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8",
|
|
126
|
-
} );
|
|
127
|
-
let downloadA = document.createElement( "a" );
|
|
128
|
-
downloadA.download = `${ Config.title }-系统待翻译文字.xlsx`;
|
|
129
|
-
downloadA.href = window.URL.createObjectURL( blob );
|
|
130
|
-
downloadA.click();
|
|
131
|
-
loading.close();
|
|
132
|
-
ElMessage.success( "导出成功,请到下载目录查看" );
|
|
133
|
-
} );
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
async function getFile () {
|
|
137
|
-
// @ts-ignore
|
|
138
|
-
let fileHandle = await window.showOpenFilePicker( {
|
|
139
|
-
id: "importTranslateExcel",
|
|
140
|
-
types: [
|
|
141
|
-
{
|
|
142
|
-
description: "请选择之前导出的文件",
|
|
143
|
-
accept: {
|
|
144
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ ".xlsx", ".xls" ],
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
} );
|
|
149
|
-
if ( Array.isArray( fileHandle ) ) {
|
|
150
|
-
fileHandle = fileHandle[ 0 ];
|
|
151
|
-
}
|
|
152
|
-
let state = await fileHandle.queryPermission( { mode: "read" } );
|
|
153
|
-
if ( state === "denied" ) {
|
|
154
|
-
return false;
|
|
155
|
-
} else {
|
|
156
|
-
if ( state === "prompt" ) {
|
|
157
|
-
fileHandle.requestPermission( {
|
|
158
|
-
mode: "read",
|
|
159
|
-
} );
|
|
160
|
-
}
|
|
161
|
-
return await fileHandle.getFile();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
async function saveData ( dataList ) {
|
|
167
|
-
return await http
|
|
168
|
-
.request( {
|
|
169
|
-
url: "/translate/save",
|
|
170
|
-
type: "json",
|
|
171
|
-
method: "POST",
|
|
172
|
-
data: dataList,
|
|
173
|
-
} )
|
|
174
|
-
.then( ( res ) => {
|
|
175
|
-
return res?.data?.status === 200;
|
|
176
|
-
} );
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export async function importExcel ( e, getDataList ) {
|
|
180
|
-
// if (!window["showOpenFilePicker"]) {
|
|
181
|
-
// ElMessage({
|
|
182
|
-
// message: "请使用Chrome(Edge) 102 及以上版本的浏览器",
|
|
183
|
-
// type: "warning",
|
|
184
|
-
// });
|
|
185
|
-
// return false;
|
|
186
|
-
// }
|
|
187
|
-
// let file = await getFile();
|
|
188
|
-
const file = e.target.files[ 0 ];
|
|
189
|
-
if ( !( file instanceof File ) ) {
|
|
190
|
-
ElMessage( {
|
|
191
|
-
message: "请选择文件",
|
|
192
|
-
type: "warning",
|
|
193
|
-
} );
|
|
194
|
-
return false;
|
|
195
|
-
} else {
|
|
196
|
-
try {
|
|
197
|
-
const workbook = new ExcelJS.Workbook();
|
|
198
|
-
// @ts-ignore
|
|
199
|
-
await workbook.xlsx.load( file );
|
|
200
|
-
if ( workbook.keywords !== verificationCode ) {
|
|
201
|
-
ElMessage( {
|
|
202
|
-
message: "您选择的文件不是系统导出的文件",
|
|
203
|
-
type: "warning",
|
|
204
|
-
} );
|
|
205
|
-
return false;
|
|
206
|
-
}
|
|
207
|
-
const loading = ElLoading.service( {
|
|
208
|
-
lock: true,
|
|
209
|
-
text: "开始读取已翻译的字段",
|
|
210
|
-
background: "rgba(255, 255, 255, 0.5)",
|
|
211
|
-
customClass: "yh-i18n-loading"
|
|
212
|
-
} );
|
|
213
|
-
let sheet = workbook.worksheets[ 0 ];
|
|
214
|
-
// @ts-ignore
|
|
215
|
-
let len = sheet._rows.length - 1;
|
|
216
|
-
let dataList: any[] = [];
|
|
217
|
-
sheet.getRows( 2, len )?.forEach( ( row ) => {
|
|
218
|
-
let id = row.getCell( 1 ).value;
|
|
219
|
-
let key = row.getCell( 2 ).value;
|
|
220
|
-
let content: any = {};
|
|
221
|
-
Config.i18nList.forEach( ( item, index ) => {
|
|
222
|
-
content[ item ] = row.getCell( index + 3 ).value;
|
|
223
|
-
} );
|
|
224
|
-
dataList.push( {
|
|
225
|
-
id,
|
|
226
|
-
key,
|
|
227
|
-
content: JSON.stringify( content ),
|
|
228
|
-
} );
|
|
229
|
-
} );
|
|
230
|
-
loading.setText( "读取完成,正在更新" );
|
|
231
|
-
|
|
232
|
-
let dataLen = dataList.length;
|
|
233
|
-
let flag = true;
|
|
234
|
-
let saveLength = 200;
|
|
235
|
-
while ( flag ) {
|
|
236
|
-
if ( dataList.length > saveLength ) {
|
|
237
|
-
let perCent = ( dataLen - dataList.length ) / dataLen;
|
|
238
|
-
let fillIndex = parseInt( ( perCent / 0.5 * 10 ).toFixed( 0 ) );
|
|
239
|
-
let loadingText = new Array( 20 );
|
|
240
|
-
loadingText.fill( '◇', 0, 20 - fillIndex );
|
|
241
|
-
loadingText.fill( '◆', 20 - fillIndex );
|
|
242
|
-
loading.setText( `${ ( perCent * 100 ).toFixed( 2 ) }% ${ loadingText.join( '' ) } 正在更新…………` );
|
|
243
|
-
await saveData( dataList.splice( 0, saveLength ) );
|
|
244
|
-
} else {
|
|
245
|
-
await saveData( dataList );
|
|
246
|
-
flag = false;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
loading.close();
|
|
250
|
-
ElMessage.success( "导入数据保存成功" );
|
|
251
|
-
getDataList();
|
|
252
|
-
} catch ( error ) {
|
|
253
|
-
ElMessage.error( "导入保存翻译数据遇到错误:", error.message );
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
1
|
+
import ExcelJS from "exceljs";
|
|
2
|
+
import Config from "@/config";
|
|
3
|
+
import { ElMessage, ElLoading } from "element-plus";
|
|
4
|
+
import http from "@/libs/api.request";
|
|
5
|
+
import { useI18nStore } from "./index";
|
|
6
|
+
|
|
7
|
+
const verificationCode = "lkyhtranslateexcel";
|
|
8
|
+
export async function exportExcel ( total ) {
|
|
9
|
+
const loading = ElLoading.service( {
|
|
10
|
+
lock: true,
|
|
11
|
+
text: "正在获取所有翻译字段……",
|
|
12
|
+
background: "rgba(255, 255, 255, 0.2)",
|
|
13
|
+
} );
|
|
14
|
+
const i18nStore = useI18nStore();
|
|
15
|
+
let records = await http
|
|
16
|
+
.request( {
|
|
17
|
+
url: "/translate/select",
|
|
18
|
+
method: "post",
|
|
19
|
+
data: {
|
|
20
|
+
pageNum: 1,
|
|
21
|
+
pageSize: total,
|
|
22
|
+
},
|
|
23
|
+
} )
|
|
24
|
+
.then( ( res ) => {
|
|
25
|
+
let localKeys = i18nStore.localList.map( ( item ) => item.value );
|
|
26
|
+
let { records } = res.data.data;
|
|
27
|
+
records = records.map( ( item ) => {
|
|
28
|
+
try {
|
|
29
|
+
let content = JSON.parse( item.content );
|
|
30
|
+
let keys = Object.keys( content );
|
|
31
|
+
|
|
32
|
+
keys.forEach( ( key ) => {
|
|
33
|
+
let val = content[ key ];
|
|
34
|
+
item[ key ] = val;
|
|
35
|
+
} );
|
|
36
|
+
localKeys.forEach( ( k ) => {
|
|
37
|
+
if ( !keys.includes( k ) ) {
|
|
38
|
+
item[ k ] = "";
|
|
39
|
+
}
|
|
40
|
+
} );
|
|
41
|
+
} catch ( error ) { }
|
|
42
|
+
return item;
|
|
43
|
+
} );
|
|
44
|
+
return records;
|
|
45
|
+
} );
|
|
46
|
+
loading.setText( "正在序列化表格数据……" );
|
|
47
|
+
const workbook = new ExcelJS.Workbook();
|
|
48
|
+
workbook.creator = "力控远海";
|
|
49
|
+
workbook.lastModifiedBy = "力控远海技术中心前端";
|
|
50
|
+
workbook.keywords = verificationCode;
|
|
51
|
+
workbook.created = new Date();
|
|
52
|
+
workbook.modified = new Date();
|
|
53
|
+
const sheet = workbook.addWorksheet( `${ Config.title }-系统待翻译文字` );
|
|
54
|
+
|
|
55
|
+
let columns: any[] = [
|
|
56
|
+
{ width: 0, hidden: true },
|
|
57
|
+
{ width: 0, hidden: true },
|
|
58
|
+
];
|
|
59
|
+
let title: string[] = [ "", "" ];
|
|
60
|
+
let titleObj = {
|
|
61
|
+
zh_CN: "中文",
|
|
62
|
+
en_US: "英语",
|
|
63
|
+
th: "泰语",
|
|
64
|
+
vi: "越南语",
|
|
65
|
+
tr: "土耳其语",
|
|
66
|
+
};
|
|
67
|
+
Config.i18nList.forEach( ( item ) => {
|
|
68
|
+
columns.push( {
|
|
69
|
+
width: 30,
|
|
70
|
+
alignment: { vertical: "middle", horizontal: "center", wrapText: true },
|
|
71
|
+
value: item,
|
|
72
|
+
} );
|
|
73
|
+
title.push( titleObj[ item ] );
|
|
74
|
+
} );
|
|
75
|
+
|
|
76
|
+
sheet.columns = columns;
|
|
77
|
+
sheet.addRow( title );
|
|
78
|
+
sheet.addRows(
|
|
79
|
+
records.map( ( item ) => {
|
|
80
|
+
let { adTranslateId, key } = item;
|
|
81
|
+
let row = [ adTranslateId, key ];
|
|
82
|
+
Config.i18nList.forEach( ( valKey ) => {
|
|
83
|
+
row.push( item[ valKey ] );
|
|
84
|
+
} );
|
|
85
|
+
return row;
|
|
86
|
+
} )
|
|
87
|
+
);
|
|
88
|
+
sheet.getRows( 1, 1 )?.forEach( ( row, index ) => {
|
|
89
|
+
row.height = 25;
|
|
90
|
+
row.eachCell( { includeEmpty: true }, ( cell, cellIndex ) => {
|
|
91
|
+
cell.font = { bold: true };
|
|
92
|
+
cell.alignment = {
|
|
93
|
+
vertical: "middle",
|
|
94
|
+
horizontal: "center",
|
|
95
|
+
wrapText: true,
|
|
96
|
+
};
|
|
97
|
+
cell.border = {
|
|
98
|
+
top: { style: "thin" },
|
|
99
|
+
left: { style: "thin" },
|
|
100
|
+
bottom: { style: "thin" },
|
|
101
|
+
right: { style: "thin" },
|
|
102
|
+
};
|
|
103
|
+
} );
|
|
104
|
+
} );
|
|
105
|
+
sheet.getRows( 2, records.length )?.forEach( ( row, index ) => {
|
|
106
|
+
row.height = 25;
|
|
107
|
+
row.eachCell( { includeEmpty: true }, ( cell, cellIndex ) => {
|
|
108
|
+
cell.alignment = {
|
|
109
|
+
vertical: "middle",
|
|
110
|
+
horizontal: "left",
|
|
111
|
+
wrapText: true,
|
|
112
|
+
};
|
|
113
|
+
cell.border = {
|
|
114
|
+
top: { style: "thin" },
|
|
115
|
+
left: { style: "thin" },
|
|
116
|
+
bottom: { style: "thin" },
|
|
117
|
+
right: { style: "thin" },
|
|
118
|
+
};
|
|
119
|
+
} );
|
|
120
|
+
} );
|
|
121
|
+
sheet.views = [ { state: "frozen", xSplit: 0, ySplit: 1, activeCell: "C2" } ];
|
|
122
|
+
loading.setText( "正在生成表格文件……" );
|
|
123
|
+
workbook.xlsx.writeBuffer().then( ( data ) => {
|
|
124
|
+
const blob = new Blob( [ data ], {
|
|
125
|
+
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8",
|
|
126
|
+
} );
|
|
127
|
+
let downloadA = document.createElement( "a" );
|
|
128
|
+
downloadA.download = `${ Config.title }-系统待翻译文字.xlsx`;
|
|
129
|
+
downloadA.href = window.URL.createObjectURL( blob );
|
|
130
|
+
downloadA.click();
|
|
131
|
+
loading.close();
|
|
132
|
+
ElMessage.success( "导出成功,请到下载目录查看" );
|
|
133
|
+
} );
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function getFile () {
|
|
137
|
+
// @ts-ignore
|
|
138
|
+
let fileHandle = await window.showOpenFilePicker( {
|
|
139
|
+
id: "importTranslateExcel",
|
|
140
|
+
types: [
|
|
141
|
+
{
|
|
142
|
+
description: "请选择之前导出的文件",
|
|
143
|
+
accept: {
|
|
144
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ ".xlsx", ".xls" ],
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
} );
|
|
149
|
+
if ( Array.isArray( fileHandle ) ) {
|
|
150
|
+
fileHandle = fileHandle[ 0 ];
|
|
151
|
+
}
|
|
152
|
+
let state = await fileHandle.queryPermission( { mode: "read" } );
|
|
153
|
+
if ( state === "denied" ) {
|
|
154
|
+
return false;
|
|
155
|
+
} else {
|
|
156
|
+
if ( state === "prompt" ) {
|
|
157
|
+
fileHandle.requestPermission( {
|
|
158
|
+
mode: "read",
|
|
159
|
+
} );
|
|
160
|
+
}
|
|
161
|
+
return await fileHandle.getFile();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
async function saveData ( dataList ) {
|
|
167
|
+
return await http
|
|
168
|
+
.request( {
|
|
169
|
+
url: "/translate/save",
|
|
170
|
+
type: "json",
|
|
171
|
+
method: "POST",
|
|
172
|
+
data: dataList,
|
|
173
|
+
} )
|
|
174
|
+
.then( ( res ) => {
|
|
175
|
+
return res?.data?.status === 200;
|
|
176
|
+
} );
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export async function importExcel ( e, getDataList ) {
|
|
180
|
+
// if (!window["showOpenFilePicker"]) {
|
|
181
|
+
// ElMessage({
|
|
182
|
+
// message: "请使用Chrome(Edge) 102 及以上版本的浏览器",
|
|
183
|
+
// type: "warning",
|
|
184
|
+
// });
|
|
185
|
+
// return false;
|
|
186
|
+
// }
|
|
187
|
+
// let file = await getFile();
|
|
188
|
+
const file = e.target.files[ 0 ];
|
|
189
|
+
if ( !( file instanceof File ) ) {
|
|
190
|
+
ElMessage( {
|
|
191
|
+
message: "请选择文件",
|
|
192
|
+
type: "warning",
|
|
193
|
+
} );
|
|
194
|
+
return false;
|
|
195
|
+
} else {
|
|
196
|
+
try {
|
|
197
|
+
const workbook = new ExcelJS.Workbook();
|
|
198
|
+
// @ts-ignore
|
|
199
|
+
await workbook.xlsx.load( file );
|
|
200
|
+
if ( workbook.keywords !== verificationCode ) {
|
|
201
|
+
ElMessage( {
|
|
202
|
+
message: "您选择的文件不是系统导出的文件",
|
|
203
|
+
type: "warning",
|
|
204
|
+
} );
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
const loading = ElLoading.service( {
|
|
208
|
+
lock: true,
|
|
209
|
+
text: "开始读取已翻译的字段",
|
|
210
|
+
background: "rgba(255, 255, 255, 0.5)",
|
|
211
|
+
customClass: "yh-i18n-loading"
|
|
212
|
+
} );
|
|
213
|
+
let sheet = workbook.worksheets[ 0 ];
|
|
214
|
+
// @ts-ignore
|
|
215
|
+
let len = sheet._rows.length - 1;
|
|
216
|
+
let dataList: any[] = [];
|
|
217
|
+
sheet.getRows( 2, len )?.forEach( ( row ) => {
|
|
218
|
+
let id = row.getCell( 1 ).value;
|
|
219
|
+
let key = row.getCell( 2 ).value;
|
|
220
|
+
let content: any = {};
|
|
221
|
+
Config.i18nList.forEach( ( item, index ) => {
|
|
222
|
+
content[ item ] = row.getCell( index + 3 ).value;
|
|
223
|
+
} );
|
|
224
|
+
dataList.push( {
|
|
225
|
+
id,
|
|
226
|
+
key,
|
|
227
|
+
content: JSON.stringify( content ),
|
|
228
|
+
} );
|
|
229
|
+
} );
|
|
230
|
+
loading.setText( "读取完成,正在更新" );
|
|
231
|
+
|
|
232
|
+
let dataLen = dataList.length;
|
|
233
|
+
let flag = true;
|
|
234
|
+
let saveLength = 200;
|
|
235
|
+
while ( flag ) {
|
|
236
|
+
if ( dataList.length > saveLength ) {
|
|
237
|
+
let perCent = ( dataLen - dataList.length ) / dataLen;
|
|
238
|
+
let fillIndex = parseInt( ( perCent / 0.5 * 10 ).toFixed( 0 ) );
|
|
239
|
+
let loadingText = new Array( 20 );
|
|
240
|
+
loadingText.fill( '◇', 0, 20 - fillIndex );
|
|
241
|
+
loadingText.fill( '◆', 20 - fillIndex );
|
|
242
|
+
loading.setText( `${ ( perCent * 100 ).toFixed( 2 ) }% ${ loadingText.join( '' ) } 正在更新…………` );
|
|
243
|
+
await saveData( dataList.splice( 0, saveLength ) );
|
|
244
|
+
} else {
|
|
245
|
+
await saveData( dataList );
|
|
246
|
+
flag = false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
loading.close();
|
|
250
|
+
ElMessage.success( "导入数据保存成功" );
|
|
251
|
+
getDataList();
|
|
252
|
+
} catch ( error ) {
|
|
253
|
+
ElMessage.error( "导入保存翻译数据遇到错误:", error.message );
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
package/index.d.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { I18n } from "vue-i18n";
|
|
2
|
-
import { Plugin, Component } from "vue";
|
|
3
|
-
import { StoreDefinition } from "pinia";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* zh_CN 简体中文
|
|
7
|
-
* en_US 英语(美国)
|
|
8
|
-
* th 泰语(泰国)
|
|
9
|
-
* vi 越南语(越南)
|
|
10
|
-
* tr 土耳其语(土耳其)
|
|
11
|
-
*/
|
|
12
|
-
type I18nList = "zh_CN" | "en_US" | "th" | "vi" | "tr";
|
|
13
|
-
|
|
14
|
-
declare global {
|
|
15
|
-
interface Window {
|
|
16
|
-
/** 国际化翻译组件是否准备好 */
|
|
17
|
-
translateReady: boolean;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
/** 国际化组件实例 */
|
|
21
|
-
export const i18n: I18n;
|
|
22
|
-
|
|
23
|
-
/** 自定义的翻译函数,这个函数包装了 t 函数,在翻译的前提下,可以帮忙手机键 */
|
|
24
|
-
export const ct: (key: string, args: any[]) => void;
|
|
25
|
-
|
|
26
|
-
/** 国际化相关 Pinia Store 实例 */
|
|
27
|
-
export const useI18nStore: StoreDefinition;
|
|
28
|
-
|
|
29
|
-
/** 力控远海 vue-i18n 插件封装 */
|
|
30
|
-
export const yhI18n: Plugin;
|
|
31
|
-
|
|
32
|
-
/** 多语言选择插件 */
|
|
33
|
-
export const Language: Component;
|
|
1
|
+
import { I18n } from "vue-i18n";
|
|
2
|
+
import { Plugin, Component } from "vue";
|
|
3
|
+
import { StoreDefinition } from "pinia";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* zh_CN 简体中文
|
|
7
|
+
* en_US 英语(美国)
|
|
8
|
+
* th 泰语(泰国)
|
|
9
|
+
* vi 越南语(越南)
|
|
10
|
+
* tr 土耳其语(土耳其)
|
|
11
|
+
*/
|
|
12
|
+
type I18nList = "zh_CN" | "en_US" | "th" | "vi" | "tr";
|
|
13
|
+
|
|
14
|
+
declare global {
|
|
15
|
+
interface Window {
|
|
16
|
+
/** 国际化翻译组件是否准备好 */
|
|
17
|
+
translateReady: boolean;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** 国际化组件实例 */
|
|
21
|
+
export const i18n: I18n;
|
|
22
|
+
|
|
23
|
+
/** 自定义的翻译函数,这个函数包装了 t 函数,在翻译的前提下,可以帮忙手机键 */
|
|
24
|
+
export const ct: (key: string, args: any[]) => void;
|
|
25
|
+
|
|
26
|
+
/** 国际化相关 Pinia Store 实例 */
|
|
27
|
+
export const useI18nStore: StoreDefinition;
|
|
28
|
+
|
|
29
|
+
/** 力控远海 vue-i18n 插件封装 */
|
|
30
|
+
export const yhI18n: Plugin;
|
|
31
|
+
|
|
32
|
+
/** 多语言选择插件 */
|
|
33
|
+
export const Language: Component;
|