yh-i18n 2.2.13 → 2.2.15
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 +0 -0
- package/index.d.ts +0 -0
- package/index.js +11 -13
- package/lang/baseEnUS.js +0 -0
- package/lang/baseTh.js +0 -0
- package/lang/baseTr.js +0 -0
- package/lang/baseVi.js +0 -0
- package/lang/baseZhCn.js +0 -0
- package/lang/en.js +0 -0
- package/lang/th.js +0 -0
- package/lang/tr.js +0 -0
- package/lang/vi.js +0 -0
- package/lang/zh.js +0 -0
- package/language.vue +0 -0
- package/list.vue +60 -54
- package/package.json +1 -1
- package/readme.md +0 -0
package/excelTool.ts
CHANGED
|
File without changes
|
package/index.d.ts
CHANGED
|
File without changes
|
package/index.js
CHANGED
|
@@ -37,10 +37,10 @@ const initlang = localStorage.translateLanguage || navLang || "zh_CN";
|
|
|
37
37
|
|
|
38
38
|
export let i18n = null;
|
|
39
39
|
window.translateReady = localStorage.translateReady ? localStorage.translateReady === "1" : import.meta.env.DEV;
|
|
40
|
-
const isDev = window.translateReady;
|
|
41
40
|
let contentReady = false;
|
|
42
41
|
|
|
43
42
|
const keySet = new Set();
|
|
43
|
+
window.keySet = keySet;
|
|
44
44
|
Object.keys(zhCNBase).forEach((key) => {
|
|
45
45
|
keySet.add(key);
|
|
46
46
|
});
|
|
@@ -48,7 +48,7 @@ Object.keys(zhCNBase).forEach((key) => {
|
|
|
48
48
|
const unHandle = [];
|
|
49
49
|
|
|
50
50
|
function addTranslate (key) {
|
|
51
|
-
if (key.indexOf("vxe") === -1) {
|
|
51
|
+
if (key && key.indexOf("vxe") === -1) {
|
|
52
52
|
try {
|
|
53
53
|
axios.request({
|
|
54
54
|
url: "/translate/insert",
|
|
@@ -78,7 +78,6 @@ function recursionAddTranslate () {
|
|
|
78
78
|
}
|
|
79
79
|
// 通过延时降低任务密度,避免挤兑正常逻辑的运算资源
|
|
80
80
|
recursionAddTimer = setTimeout(() => {
|
|
81
|
-
// cLog(`${unHandle.length} ${key}`);
|
|
82
81
|
recursionAddTimer = null;
|
|
83
82
|
recursionAddTranslate();
|
|
84
83
|
}, 150);
|
|
@@ -86,14 +85,14 @@ function recursionAddTranslate () {
|
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
export const ct = (key, args) => {
|
|
89
|
-
if (
|
|
88
|
+
if (key && window.translateReady && window.translateCollect) {
|
|
90
89
|
// 将 键的处理全部放入队列中,避免挤兑正常逻辑的运算资源
|
|
91
|
-
if (!unHandle.includes(key)) {
|
|
90
|
+
if (!keySet.has(key) && !unHandle.includes(key)) {
|
|
92
91
|
unHandle.push(key);
|
|
93
92
|
recursionAddTranslate();
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
|
-
if (i18n) {
|
|
95
|
+
if (key && i18n) {
|
|
97
96
|
return i18n.global.t(key, args);
|
|
98
97
|
} else {
|
|
99
98
|
return key;
|
|
@@ -180,7 +179,6 @@ export const useI18nStore = defineStore("i18nStore", () => {
|
|
|
180
179
|
});
|
|
181
180
|
|
|
182
181
|
return {
|
|
183
|
-
isDev,
|
|
184
182
|
lang,
|
|
185
183
|
setLang,
|
|
186
184
|
langList,
|
|
@@ -214,7 +212,7 @@ async function getRemoteMessage (list) {
|
|
|
214
212
|
try {
|
|
215
213
|
let itemObj = JSON.parse(item);
|
|
216
214
|
let mKey = itemObj.zh_CN;
|
|
217
|
-
if (
|
|
215
|
+
if (window.translateReady && !keySet.has(mKey)) {
|
|
218
216
|
keySet.add(mKey);
|
|
219
217
|
}
|
|
220
218
|
Object.entries(itemObj).forEach(([key, val]) => {
|
|
@@ -223,7 +221,7 @@ async function getRemoteMessage (list) {
|
|
|
223
221
|
}
|
|
224
222
|
});
|
|
225
223
|
} catch (err) {
|
|
226
|
-
if (
|
|
224
|
+
if (window.translateReady) {
|
|
227
225
|
// console.count("翻译数据格式不对");
|
|
228
226
|
}
|
|
229
227
|
}
|
|
@@ -268,7 +266,7 @@ function createLocalMessage (list) {
|
|
|
268
266
|
}
|
|
269
267
|
|
|
270
268
|
export function addI18nPage (router) {
|
|
271
|
-
if (
|
|
269
|
+
if (window.translateReady) {
|
|
272
270
|
router.addRoute("Index", {
|
|
273
271
|
path: "translate",
|
|
274
272
|
name: "翻译管理",
|
|
@@ -304,10 +302,10 @@ export const yhI18n = {
|
|
|
304
302
|
app.use(i18n);
|
|
305
303
|
app.config.globalProperties.$T = ct;
|
|
306
304
|
|
|
307
|
-
if (!
|
|
308
|
-
cLog("没有开启翻译管理,可以在开发环境或者在控制台运行后面的代码再刷新页面: `localStorage.
|
|
305
|
+
if (!window.translateReady) {
|
|
306
|
+
cLog("没有开启翻译管理,可以在开发环境或者在控制台运行后面的代码再刷新页面: `localStorage.translateReady = '1'`");
|
|
309
307
|
}
|
|
310
|
-
if (router &&
|
|
308
|
+
if (router && window.translateReady) {
|
|
311
309
|
addI18nPage(router);
|
|
312
310
|
} else {
|
|
313
311
|
if (!router) {
|
package/lang/baseEnUS.js
CHANGED
|
File without changes
|
package/lang/baseTh.js
CHANGED
|
File without changes
|
package/lang/baseTr.js
CHANGED
|
File without changes
|
package/lang/baseVi.js
CHANGED
|
File without changes
|
package/lang/baseZhCn.js
CHANGED
|
File without changes
|
package/lang/en.js
CHANGED
|
File without changes
|
package/lang/th.js
CHANGED
|
File without changes
|
package/lang/tr.js
CHANGED
|
File without changes
|
package/lang/vi.js
CHANGED
|
File without changes
|
package/lang/zh.js
CHANGED
|
File without changes
|
package/language.vue
CHANGED
|
File without changes
|
package/list.vue
CHANGED
|
@@ -14,34 +14,34 @@
|
|
|
14
14
|
<el-button
|
|
15
15
|
type="primary"
|
|
16
16
|
@click="getDataList">
|
|
17
|
-
{{ ct(
|
|
17
|
+
{{ ct('搜索') }}
|
|
18
18
|
</el-button>
|
|
19
|
-
<el-button @click="resetList">{{ ct(
|
|
19
|
+
<el-button @click="resetList">{{ ct('重置') }}</el-button>
|
|
20
20
|
</div>
|
|
21
21
|
<div class="yh-i18n-list-actions">
|
|
22
22
|
<el-button
|
|
23
23
|
type="primary"
|
|
24
24
|
@click="addOne">
|
|
25
25
|
<i class="iconfont icon-add"></i>
|
|
26
|
-
{{ ct(
|
|
26
|
+
{{ ct('新增') }}
|
|
27
27
|
</el-button>
|
|
28
28
|
<el-button
|
|
29
29
|
type="danger"
|
|
30
30
|
@click="delMore">
|
|
31
31
|
<i class="iconfont icon-delete"></i>
|
|
32
|
-
{{ ct(
|
|
32
|
+
{{ ct('批量删除') }}
|
|
33
33
|
</el-button>
|
|
34
34
|
<el-button
|
|
35
35
|
text
|
|
36
36
|
@click="exportExcel(listForm.total)">
|
|
37
|
-
{{ ct(
|
|
37
|
+
{{ ct('导出') }}
|
|
38
38
|
</el-button>
|
|
39
39
|
<div class="el-button is-text import-excel-button">
|
|
40
40
|
<input
|
|
41
41
|
class="import-excel-input"
|
|
42
42
|
type="file"
|
|
43
43
|
@change="importExcel($event, getDataList)" />
|
|
44
|
-
{{ ct(
|
|
44
|
+
{{ ct('导入') }}
|
|
45
45
|
</div>
|
|
46
46
|
</div>
|
|
47
47
|
<el-table
|
|
@@ -66,18 +66,18 @@
|
|
|
66
66
|
width="140"
|
|
67
67
|
align="center"
|
|
68
68
|
fixed="left">
|
|
69
|
-
<template #default="{
|
|
69
|
+
<template #default="{row, $index}">
|
|
70
70
|
<el-button
|
|
71
71
|
link
|
|
72
72
|
type="primary"
|
|
73
73
|
@click="editOne(row, $index)">
|
|
74
|
-
{{ ct(
|
|
74
|
+
{{ ct('编辑') }}
|
|
75
75
|
</el-button>
|
|
76
76
|
<el-button
|
|
77
77
|
link
|
|
78
78
|
type="danger"
|
|
79
79
|
@click="delOne(row.adTranslateId)">
|
|
80
|
-
{{ ct(
|
|
80
|
+
{{ ct('删除') }}
|
|
81
81
|
</el-button>
|
|
82
82
|
</template>
|
|
83
83
|
</el-table-column>
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
</el-table>
|
|
96
96
|
<el-pagination
|
|
97
97
|
background
|
|
98
|
-
:page-sizes="[10, 100, 200, 500,
|
|
98
|
+
:page-sizes="[10, 100, 200, 500, 10000]"
|
|
99
99
|
v-model:page-size="listForm.pageSize"
|
|
100
100
|
:total="listForm.total"
|
|
101
101
|
v-model:current-page="listForm.pageNum"
|
|
@@ -121,46 +121,46 @@
|
|
|
121
121
|
@click="prevOne"
|
|
122
122
|
text
|
|
123
123
|
:disabled="!isNaN(formDataIndex) && formDataIndex <= 0">
|
|
124
|
-
{{ ct(
|
|
124
|
+
{{ ct('上一个') }}(←)
|
|
125
125
|
</el-button>
|
|
126
126
|
<el-button
|
|
127
127
|
type="primary"
|
|
128
128
|
plain
|
|
129
129
|
@click="cancelForm">
|
|
130
|
-
{{ ct(
|
|
130
|
+
{{ ct('取消') }}
|
|
131
131
|
</el-button>
|
|
132
132
|
<el-button
|
|
133
133
|
type="primary"
|
|
134
134
|
@click="saveOne">
|
|
135
|
-
{{ ct(
|
|
135
|
+
{{ ct('保存') }}
|
|
136
136
|
</el-button>
|
|
137
137
|
<el-button
|
|
138
138
|
@click="nextOne"
|
|
139
139
|
text
|
|
140
140
|
:disabled="!isNaN(formDataIndex) && formDataIndex >= dataList.leng - 1">
|
|
141
|
-
{{ ct(
|
|
141
|
+
{{ ct('下一个') }}(→)
|
|
142
142
|
</el-button>
|
|
143
143
|
</div>
|
|
144
144
|
</template>
|
|
145
145
|
</el-dialog>
|
|
146
146
|
</template>
|
|
147
147
|
<script setup lang="ts">
|
|
148
|
-
import {
|
|
149
|
-
import {
|
|
150
|
-
import {
|
|
151
|
-
import http from
|
|
152
|
-
import {
|
|
153
|
-
import {
|
|
148
|
+
import {reactive, ref, onMounted, watch} from 'vue';
|
|
149
|
+
import {ElLoadingService, ElMessage, ElMessageBox} from 'element-plus';
|
|
150
|
+
import {useI18nStore, ct} from 'yh-i18n';
|
|
151
|
+
import http from '@/libs/api.request';
|
|
152
|
+
import {VxeFormInstance, VxeFormPropTypes} from 'vxe-table';
|
|
153
|
+
import {exportExcel, importExcel} from './excelTool';
|
|
154
154
|
const i18nStore = useI18nStore();
|
|
155
155
|
const vxeFormRef = ref<VxeFormInstance>();
|
|
156
156
|
|
|
157
|
-
const insertUrl =
|
|
158
|
-
const updateUrl =
|
|
159
|
-
const deleteUrl =
|
|
157
|
+
const insertUrl = '/translate/insert';
|
|
158
|
+
const updateUrl = '/translate/edit';
|
|
159
|
+
const deleteUrl = '/translate/deleteTranslate';
|
|
160
160
|
|
|
161
161
|
const i18nList = ref();
|
|
162
162
|
const listForm = reactive({
|
|
163
|
-
key:
|
|
163
|
+
key: '',
|
|
164
164
|
pageNum: 1,
|
|
165
165
|
pageSize: 10,
|
|
166
166
|
total: 0,
|
|
@@ -168,14 +168,17 @@ const listForm = reactive({
|
|
|
168
168
|
const listColumns = reactive<any>([]);
|
|
169
169
|
const dataList = ref<any>([]);
|
|
170
170
|
function getDataList(isReset = false) {
|
|
171
|
-
let {
|
|
171
|
+
let {key, pageNum, pageSize} = listForm;
|
|
172
172
|
if (isReset) {
|
|
173
173
|
pageNum = 1;
|
|
174
174
|
}
|
|
175
|
+
let loading = ElLoadingService({
|
|
176
|
+
text: '获取列表数据中……',
|
|
177
|
+
});
|
|
175
178
|
http
|
|
176
179
|
.request({
|
|
177
|
-
url:
|
|
178
|
-
method:
|
|
180
|
+
url: '/translate/select',
|
|
181
|
+
method: 'post',
|
|
179
182
|
data: {
|
|
180
183
|
key,
|
|
181
184
|
pageNum,
|
|
@@ -184,7 +187,7 @@ function getDataList(isReset = false) {
|
|
|
184
187
|
})
|
|
185
188
|
.then((res) => {
|
|
186
189
|
let localKeys = i18nStore.localList.map((item) => item.value);
|
|
187
|
-
let {
|
|
190
|
+
let {records, total} = res.data.data;
|
|
188
191
|
records = records.map((item) => {
|
|
189
192
|
try {
|
|
190
193
|
let content = JSON.parse(item.content);
|
|
@@ -196,7 +199,7 @@ function getDataList(isReset = false) {
|
|
|
196
199
|
});
|
|
197
200
|
localKeys.forEach((k) => {
|
|
198
201
|
if (!keys.includes(k)) {
|
|
199
|
-
item[k] =
|
|
202
|
+
item[k] = '';
|
|
200
203
|
}
|
|
201
204
|
});
|
|
202
205
|
} catch (error) {}
|
|
@@ -204,6 +207,9 @@ function getDataList(isReset = false) {
|
|
|
204
207
|
});
|
|
205
208
|
dataList.value = records;
|
|
206
209
|
listForm.total = total;
|
|
210
|
+
})
|
|
211
|
+
.finally(() => {
|
|
212
|
+
loading.close();
|
|
207
213
|
});
|
|
208
214
|
}
|
|
209
215
|
|
|
@@ -225,7 +231,7 @@ function rowClickHandler(row) {
|
|
|
225
231
|
}
|
|
226
232
|
|
|
227
233
|
function resetList() {
|
|
228
|
-
listForm.key =
|
|
234
|
+
listForm.key = '';
|
|
229
235
|
listForm.pageNum = 1;
|
|
230
236
|
listForm.total = 0;
|
|
231
237
|
getDataList();
|
|
@@ -266,8 +272,8 @@ function editOne(item, index) {
|
|
|
266
272
|
}
|
|
267
273
|
formShow.value = true;
|
|
268
274
|
setTimeout(() => {
|
|
269
|
-
(document.querySelector(
|
|
270
|
-
inputs = Array.from(document.querySelectorAll(
|
|
275
|
+
(document.querySelector('#i18nFormItem1 input') as HTMLInputElement)?.focus();
|
|
276
|
+
inputs = Array.from(document.querySelectorAll('.i18n-form-item input'));
|
|
271
277
|
}, 500);
|
|
272
278
|
}
|
|
273
279
|
|
|
@@ -294,7 +300,7 @@ function saveOne() {
|
|
|
294
300
|
data.id = formData.adTranslateId;
|
|
295
301
|
}
|
|
296
302
|
for (const key in formData) {
|
|
297
|
-
if (key !==
|
|
303
|
+
if (key !== 'key' && langList.includes(key)) {
|
|
298
304
|
const val = formData[key];
|
|
299
305
|
data.content[key] = val;
|
|
300
306
|
}
|
|
@@ -303,7 +309,7 @@ function saveOne() {
|
|
|
303
309
|
http
|
|
304
310
|
.request({
|
|
305
311
|
url,
|
|
306
|
-
method:
|
|
312
|
+
method: 'POST',
|
|
307
313
|
data,
|
|
308
314
|
})
|
|
309
315
|
.then((res) => {
|
|
@@ -326,11 +332,11 @@ function saveOne() {
|
|
|
326
332
|
}
|
|
327
333
|
|
|
328
334
|
function delOne(id) {
|
|
329
|
-
ElMessageBox.confirm(
|
|
335
|
+
ElMessageBox.confirm('确认删除这条翻译记录吗?').then(() => {
|
|
330
336
|
http
|
|
331
337
|
.request({
|
|
332
338
|
url: deleteUrl,
|
|
333
|
-
method:
|
|
339
|
+
method: 'POST',
|
|
334
340
|
data: {
|
|
335
341
|
id,
|
|
336
342
|
},
|
|
@@ -347,19 +353,19 @@ function delOne(id) {
|
|
|
347
353
|
}
|
|
348
354
|
|
|
349
355
|
function delMore() {
|
|
350
|
-
ElMessageBox.confirm(
|
|
356
|
+
ElMessageBox.confirm('确认删除选中的翻译记录吗?').then(async () => {
|
|
351
357
|
let ids = i18nList.value?.getSelectionRows().map((row) => row.adTranslateId);
|
|
352
358
|
if (ids && ids.length) {
|
|
353
359
|
let len = ids.length;
|
|
354
360
|
let loading = ElLoadingService({
|
|
355
|
-
text:
|
|
361
|
+
text: '正在删除选中的翻译……',
|
|
356
362
|
});
|
|
357
363
|
for (let i = 0; i < ids.length; i++) {
|
|
358
364
|
const id = ids[i];
|
|
359
365
|
loading.setText(`正在删除... ${i + 1}/${len}`);
|
|
360
366
|
await http.request({
|
|
361
367
|
url: deleteUrl,
|
|
362
|
-
method:
|
|
368
|
+
method: 'POST',
|
|
363
369
|
data: {
|
|
364
370
|
id,
|
|
365
371
|
},
|
|
@@ -373,18 +379,18 @@ function delMore() {
|
|
|
373
379
|
|
|
374
380
|
const formItems = reactive<VxeFormPropTypes.Items>([
|
|
375
381
|
{
|
|
376
|
-
field:
|
|
382
|
+
field: 'key',
|
|
377
383
|
span: 24,
|
|
378
|
-
title:
|
|
384
|
+
title: '翻译键值',
|
|
379
385
|
itemRender: {
|
|
380
|
-
name:
|
|
381
|
-
props: {
|
|
386
|
+
name: '$input',
|
|
387
|
+
props: {class: 'i18n-form-item', id: `i18nFormItem${1}`},
|
|
382
388
|
},
|
|
383
389
|
},
|
|
384
390
|
]);
|
|
385
391
|
|
|
386
392
|
const fromRules = reactive<VxeFormPropTypes.Rules>({
|
|
387
|
-
key: [{
|
|
393
|
+
key: [{required: true, type: 'string', message: '请输入翻译键值'}],
|
|
388
394
|
});
|
|
389
395
|
|
|
390
396
|
let needInit = true;
|
|
@@ -397,15 +403,15 @@ watch(
|
|
|
397
403
|
listColumns.push({
|
|
398
404
|
field: item.value,
|
|
399
405
|
title: item.label,
|
|
400
|
-
minWidth:
|
|
406
|
+
minWidth: '200',
|
|
401
407
|
});
|
|
402
408
|
formItems.push({
|
|
403
409
|
field: item.value,
|
|
404
410
|
span: 24,
|
|
405
411
|
title: item.label,
|
|
406
412
|
itemRender: {
|
|
407
|
-
name:
|
|
408
|
-
props: {
|
|
413
|
+
name: '$input',
|
|
414
|
+
props: {class: 'i18n-form-item', id: `i18nFormItem${index + 2}`},
|
|
409
415
|
},
|
|
410
416
|
});
|
|
411
417
|
});
|
|
@@ -419,24 +425,24 @@ watch(
|
|
|
419
425
|
|
|
420
426
|
onMounted(() => {
|
|
421
427
|
getDataList();
|
|
422
|
-
window.addEventListener(
|
|
423
|
-
let {
|
|
424
|
-
if (key ===
|
|
428
|
+
window.addEventListener('keydown', (e) => {
|
|
429
|
+
let {key, ctrlKey, altKey} = e;
|
|
430
|
+
if (key === 's' && ctrlKey) {
|
|
425
431
|
e.preventDefault();
|
|
426
432
|
e.stopPropagation();
|
|
427
433
|
saveOne();
|
|
428
434
|
}
|
|
429
|
-
if (key ===
|
|
435
|
+
if (key === 'ArrowRight' && (ctrlKey || altKey)) {
|
|
430
436
|
e.preventDefault();
|
|
431
437
|
e.stopPropagation();
|
|
432
438
|
nextOne();
|
|
433
439
|
}
|
|
434
|
-
if (key ===
|
|
440
|
+
if (key === 'ArrowLeft' && (ctrlKey || altKey)) {
|
|
435
441
|
e.preventDefault();
|
|
436
442
|
e.stopPropagation();
|
|
437
443
|
prevOne();
|
|
438
444
|
}
|
|
439
|
-
if (key ===
|
|
445
|
+
if (key === 'Tab') {
|
|
440
446
|
e.preventDefault();
|
|
441
447
|
e.stopPropagation();
|
|
442
448
|
if (
|
|
@@ -456,7 +462,7 @@ onMounted(() => {
|
|
|
456
462
|
} else {
|
|
457
463
|
setTimeout(() => {
|
|
458
464
|
if (!document.activeElement || !inputs.includes(document.activeElement as HTMLInputElement)) {
|
|
459
|
-
(document.querySelector(
|
|
465
|
+
(document.querySelector('#i18nFormItem1 input') as HTMLInputElement)?.focus();
|
|
460
466
|
}
|
|
461
467
|
}, 100);
|
|
462
468
|
}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
File without changes
|