yh-i18n 1.0.3 → 1.1.0
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/index.js +22 -12
- package/lang/baseEnUS.js +17 -0
- package/lang/baseTh.js +17 -0
- package/lang/baseTr.js +17 -0
- package/lang/baseVi.js +17 -0
- package/lang/baseZhCn.js +17 -0
- package/language.vue +21 -3
- package/list.vue +65 -12
- package/package.json +1 -2
package/index.js
CHANGED
|
@@ -3,6 +3,12 @@ import { defineStore } from "pinia";
|
|
|
3
3
|
import { createI18n } from "vue-i18n";
|
|
4
4
|
import axios from "@/libs/api.request";
|
|
5
5
|
|
|
6
|
+
// base
|
|
7
|
+
import zhCNBase from "./lang/baseZhCn.js";
|
|
8
|
+
import enUSBase from "./lang/baseEnUS.js";
|
|
9
|
+
import thBase from "./lang/baseTh.js";
|
|
10
|
+
import viBase from "./lang/baseVi.js";
|
|
11
|
+
import trBase from "./lang/baseTr.js";
|
|
6
12
|
// vxe table
|
|
7
13
|
import zhCNVXETable from "vxe-table/lib/locale/lang/zh-CN";
|
|
8
14
|
import enUSVXETable from "vxe-table/lib/locale/lang/en-US";
|
|
@@ -24,8 +30,7 @@ const initlang = localStorage.local || localLang || "zh_CN";
|
|
|
24
30
|
|
|
25
31
|
export let i18n = null;
|
|
26
32
|
const isDev = import.meta.env.DEV;
|
|
27
|
-
|
|
28
|
-
window.translateReady = translateReady;
|
|
33
|
+
window.translateReady = false;
|
|
29
34
|
function addTranslate(key) {
|
|
30
35
|
if (key.indexOf("vxe") === -1) {
|
|
31
36
|
try {
|
|
@@ -43,9 +48,13 @@ function addTranslate(key) {
|
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
50
|
const keySet = new Set();
|
|
51
|
+
Object.keys(zhCNBase).forEach((key) => {
|
|
52
|
+
keySet.add(key);
|
|
53
|
+
});
|
|
54
|
+
|
|
46
55
|
export const ct = (key, args) => {
|
|
47
56
|
if (isDev) {
|
|
48
|
-
if (!keySet.has(key) && translateReady) {
|
|
57
|
+
if (!keySet.has(key) && window.translateReady) {
|
|
49
58
|
keySet.add(key);
|
|
50
59
|
addTranslate(key);
|
|
51
60
|
}
|
|
@@ -114,6 +123,7 @@ export const useI18nStore = defineStore("i18nStore", () => {
|
|
|
114
123
|
}
|
|
115
124
|
});
|
|
116
125
|
}
|
|
126
|
+
|
|
117
127
|
const title = computed(() => {
|
|
118
128
|
return langList[lang.value];
|
|
119
129
|
});
|
|
@@ -150,21 +160,21 @@ async function createMessage(list) {
|
|
|
150
160
|
list.forEach((item) => {
|
|
151
161
|
switch (item) {
|
|
152
162
|
case "zh_CN":
|
|
153
|
-
messages["zh_CN"] = Object.assign(
|
|
163
|
+
messages["zh_CN"] = Object.assign(zhCNBase, zhCNVXETable);
|
|
154
164
|
break;
|
|
155
165
|
case "en_US":
|
|
156
|
-
messages["en_US"] = Object.assign(
|
|
166
|
+
messages["en_US"] = Object.assign(enUSBase, enUSVXETable);
|
|
157
167
|
break;
|
|
158
168
|
case "th":
|
|
159
|
-
messages["th"] = Object.assign(
|
|
169
|
+
messages["th"] = Object.assign(thBase, thVXETable);
|
|
160
170
|
break;
|
|
161
171
|
|
|
162
172
|
case "vi":
|
|
163
|
-
messages["vi"] = Object.assign(
|
|
173
|
+
messages["vi"] = Object.assign(viBase, viVXETable);
|
|
164
174
|
break;
|
|
165
175
|
|
|
166
176
|
case "tr":
|
|
167
|
-
messages["tr"] = Object.assign(
|
|
177
|
+
messages["tr"] = Object.assign(trBase, trVXETable);
|
|
168
178
|
break;
|
|
169
179
|
|
|
170
180
|
default:
|
|
@@ -191,16 +201,16 @@ async function createMessage(list) {
|
|
|
191
201
|
}
|
|
192
202
|
Object.entries(itemObj).forEach(([key, val]) => {
|
|
193
203
|
if (list.includes(key)) {
|
|
194
|
-
messages[key][mKey]
|
|
204
|
+
if (!messages[key][mKey]) {
|
|
205
|
+
messages[key][mKey] = val;
|
|
206
|
+
}
|
|
195
207
|
}
|
|
196
208
|
});
|
|
197
209
|
} catch (err) {
|
|
198
210
|
console.error(err);
|
|
199
211
|
}
|
|
200
212
|
});
|
|
201
|
-
} catch (error) {
|
|
202
|
-
translateReady = false;
|
|
203
|
-
}
|
|
213
|
+
} catch (error) {}
|
|
204
214
|
return messages;
|
|
205
215
|
}
|
|
206
216
|
|
package/lang/baseEnUS.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
翻译键名: "Translate key names",
|
|
3
|
+
翻译管理: "Translation management",
|
|
4
|
+
键入以筛选键名: "filter key names",
|
|
5
|
+
搜索: "search",
|
|
6
|
+
新增: "New addition",
|
|
7
|
+
批量删除: "Batch deletion",
|
|
8
|
+
重置: "reset",
|
|
9
|
+
编辑: "edit",
|
|
10
|
+
删除: "delete",
|
|
11
|
+
操作: "operation",
|
|
12
|
+
中文简体: "Simplified Chinese",
|
|
13
|
+
English: "English",
|
|
14
|
+
ไทย: "Thailand.",
|
|
15
|
+
"Việt nam": "Vietnamese",
|
|
16
|
+
Türkçe: "Turkish",
|
|
17
|
+
};
|
package/lang/baseTh.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
翻译键名: "ชื่อคีย์การแปล",
|
|
3
|
+
翻译管理: "การจัดการการแปล",
|
|
4
|
+
键入以筛选键名: "พิมพ์เพื่อกรองชื่อคีย์",
|
|
5
|
+
搜索: "ค้นหา",
|
|
6
|
+
新增: "เพิ่มใหม่",
|
|
7
|
+
批量删除: "ลบแบทช์",
|
|
8
|
+
重置: "รีเซ็ต",
|
|
9
|
+
编辑: "บรรณาธิการ",
|
|
10
|
+
删除: "ลบ",
|
|
11
|
+
操作: "การดำเนินงาน",
|
|
12
|
+
中文简体: "ภาษาจีนตัวย่อ",
|
|
13
|
+
English: "ภาษาอังกฤษ",
|
|
14
|
+
ไทย: "ไทย",
|
|
15
|
+
"Việt nam": "เวียดนาม",
|
|
16
|
+
Türkçe: "ตุรกี",
|
|
17
|
+
};
|
package/lang/baseTr.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
翻译键名: "Anahtar isimlerini çevir",
|
|
3
|
+
翻译管理: "Çeviri Yönetimi",
|
|
4
|
+
键入以筛选键名: "Anahtar isimlerini silmek için yazın",
|
|
5
|
+
搜索: "arama",
|
|
6
|
+
新增: "Yeni ekleme",
|
|
7
|
+
批量删除: "Toplu silme",
|
|
8
|
+
重置: "Sıfırla",
|
|
9
|
+
编辑: "edit",
|
|
10
|
+
删除: "Sil",
|
|
11
|
+
操作: "operasyon",
|
|
12
|
+
中文简体: "Basitleştirilmiş Çince",
|
|
13
|
+
English: "İngilizce",
|
|
14
|
+
ไทย: "Tayland.",
|
|
15
|
+
"Việt nam": "Vietnamca",
|
|
16
|
+
Türkçe: "Türkçe",
|
|
17
|
+
};
|
package/lang/baseVi.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
翻译键名: "Tên khóa dịch",
|
|
3
|
+
翻译管理: "Quản lý phiên dịch",
|
|
4
|
+
键入以筛选键名: "Nhập để lọc các tên khóa",
|
|
5
|
+
搜索: "Tìm kiếm",
|
|
6
|
+
新增: "Mới",
|
|
7
|
+
批量删除: "Xóa hàng loạt",
|
|
8
|
+
重置: "Đặt lại",
|
|
9
|
+
编辑: "Chỉnh sửa",
|
|
10
|
+
删除: "Xoá",
|
|
11
|
+
操作: "Hoạt động",
|
|
12
|
+
中文简体: "Trung Quốc",
|
|
13
|
+
English: "Tiếng Việt",
|
|
14
|
+
ไทย: "Thái Lan.",
|
|
15
|
+
"Việt nam": "Việt nam",
|
|
16
|
+
Türkçe: "Thổ Nhĩ Kỳ",
|
|
17
|
+
};
|
package/lang/baseZhCn.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
翻译键名: "翻译键名",
|
|
3
|
+
翻译管理: "翻译管理",
|
|
4
|
+
键入以筛选键名: "键入以筛选键名",
|
|
5
|
+
搜索: "搜索",
|
|
6
|
+
新增: "新增",
|
|
7
|
+
批量删除: "批量删除",
|
|
8
|
+
重置: "重置",
|
|
9
|
+
编辑: "编辑",
|
|
10
|
+
删除: "删除",
|
|
11
|
+
操作: "操作",
|
|
12
|
+
中文简体: "中文简体",
|
|
13
|
+
English: "英语",
|
|
14
|
+
ไทย: "泰语",
|
|
15
|
+
"Việt nam": "越南语",
|
|
16
|
+
Türkçe: "土耳其语",
|
|
17
|
+
};
|
package/language.vue
CHANGED
|
@@ -14,17 +14,35 @@
|
|
|
14
14
|
</el-dropdown-menu>
|
|
15
15
|
</template>
|
|
16
16
|
</el-dropdown>
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
<el-link v-if="isDev" type="warning" href="/#/translate">{{
|
|
19
|
+
ct("翻译管理")
|
|
20
|
+
}}</el-link>
|
|
21
|
+
|
|
22
|
+
<el-switch
|
|
23
|
+
active-text="收集"
|
|
24
|
+
inactive-text="不收集"
|
|
25
|
+
inline-prompt
|
|
26
|
+
v-if="isDev"
|
|
27
|
+
v-model="isCollect"
|
|
28
|
+
></el-switch>
|
|
18
29
|
</template>
|
|
19
30
|
|
|
20
31
|
<script setup>
|
|
21
|
-
import { useI18nStore } from "yh-i18n";
|
|
32
|
+
import { useI18nStore, ct } from "yh-i18n";
|
|
22
33
|
import { storeToRefs } from "pinia";
|
|
23
|
-
import { ref } from "vue";
|
|
34
|
+
import { ref, watch } from "vue";
|
|
24
35
|
|
|
25
36
|
const isDev = ref(import.meta.env.DEV);
|
|
26
37
|
|
|
27
38
|
const i18nStore = useI18nStore();
|
|
39
|
+
const isCollect = ref(window.translateReady);
|
|
40
|
+
watch(
|
|
41
|
+
() => isCollect.value,
|
|
42
|
+
(val) => {
|
|
43
|
+
window.translateReady = val;
|
|
44
|
+
}
|
|
45
|
+
);
|
|
28
46
|
|
|
29
47
|
const { localList, title } = storeToRefs(i18nStore);
|
|
30
48
|
|
package/list.vue
CHANGED
|
@@ -5,11 +5,16 @@
|
|
|
5
5
|
<i class="iconfont icon-add"></i>
|
|
6
6
|
{{ ct("新增") }}
|
|
7
7
|
</el-button>
|
|
8
|
+
<el-button type="danger" @click="delMore">
|
|
9
|
+
<i class="iconfont icon-delete"></i>
|
|
10
|
+
{{ ct("批量删除") }}
|
|
11
|
+
</el-button>
|
|
8
12
|
<div class="yh-i18n-list-conditions">
|
|
9
13
|
<el-form inline>
|
|
10
14
|
<el-form-item :label="ct('翻译键名')">
|
|
11
15
|
<el-input
|
|
12
16
|
v-model="listForm.key"
|
|
17
|
+
@keyup.enter.stop.prevent="getDataList(true)"
|
|
13
18
|
:placeholder="ct('键入以筛选键名')"
|
|
14
19
|
></el-input>
|
|
15
20
|
</el-form-item>
|
|
@@ -20,7 +25,18 @@
|
|
|
20
25
|
}}</el-button>
|
|
21
26
|
<el-button @click="resetList">{{ ct("重置") }}</el-button>
|
|
22
27
|
</div>
|
|
23
|
-
<el-table
|
|
28
|
+
<el-table
|
|
29
|
+
ref="i18nList"
|
|
30
|
+
:data="dataList"
|
|
31
|
+
row-key="adTranslateId"
|
|
32
|
+
@row-click="rowClickHandler"
|
|
33
|
+
>
|
|
34
|
+
<el-table-column
|
|
35
|
+
type="selection"
|
|
36
|
+
width="60"
|
|
37
|
+
align="center"
|
|
38
|
+
fixed="left"
|
|
39
|
+
></el-table-column>
|
|
24
40
|
<el-table-column
|
|
25
41
|
type="index"
|
|
26
42
|
label="#"
|
|
@@ -53,12 +69,12 @@
|
|
|
53
69
|
></el-table-column>
|
|
54
70
|
</el-table>
|
|
55
71
|
<el-pagination
|
|
56
|
-
small
|
|
57
72
|
background
|
|
58
|
-
:page-
|
|
73
|
+
:page-sizes="[100, 200, 1000, 10000]"
|
|
74
|
+
v-model:page-size="listForm.pageSize"
|
|
59
75
|
:total="listForm.total"
|
|
60
76
|
v-model:current-page="listForm.pageNum"
|
|
61
|
-
layout="prev,pager,next,total"
|
|
77
|
+
layout="sizes,prev,pager,next,total"
|
|
62
78
|
></el-pagination>
|
|
63
79
|
</div>
|
|
64
80
|
<el-dialog
|
|
@@ -105,11 +121,10 @@
|
|
|
105
121
|
</template>
|
|
106
122
|
<script setup lang="ts">
|
|
107
123
|
import { reactive, ref, onMounted, watch } from "vue";
|
|
108
|
-
import { ElMessage, ElMessageBox } from "element-plus";
|
|
124
|
+
import { ElLoadingService, ElMessage, ElMessageBox } from "element-plus";
|
|
109
125
|
import { useI18nStore, ct } from "yh-i18n";
|
|
110
126
|
import http from "@/libs/api.request";
|
|
111
127
|
import { VxeFormInstance, VxeFormPropTypes } from "vxe-table";
|
|
112
|
-
import { nextTick } from "vue";
|
|
113
128
|
|
|
114
129
|
const i18nStore = useI18nStore();
|
|
115
130
|
const vxeFormRef = ref<VxeFormInstance>();
|
|
@@ -118,16 +133,20 @@ const insertUrl = "/translate/insert";
|
|
|
118
133
|
const updateUrl = "/translate/edit";
|
|
119
134
|
const deleteUrl = "/translate/deleteTranslate";
|
|
120
135
|
|
|
136
|
+
const i18nList = ref();
|
|
121
137
|
const listForm = reactive({
|
|
122
138
|
key: "",
|
|
123
139
|
pageNum: 1,
|
|
124
|
-
pageSize:
|
|
140
|
+
pageSize: 200,
|
|
125
141
|
total: 0,
|
|
126
142
|
});
|
|
127
143
|
const listColumns = reactive<any>([]);
|
|
128
144
|
const dataList = ref<any>([]);
|
|
129
|
-
function getDataList() {
|
|
145
|
+
function getDataList(isReset = false) {
|
|
130
146
|
let { key, pageNum, pageSize } = listForm;
|
|
147
|
+
if (isReset) {
|
|
148
|
+
pageNum = 1;
|
|
149
|
+
}
|
|
131
150
|
http
|
|
132
151
|
.request({
|
|
133
152
|
url: "/translate/select",
|
|
@@ -162,6 +181,17 @@ function getDataList() {
|
|
|
162
181
|
listForm.total = total;
|
|
163
182
|
});
|
|
164
183
|
}
|
|
184
|
+
|
|
185
|
+
watch(
|
|
186
|
+
() => listForm.pageNum,
|
|
187
|
+
() => {
|
|
188
|
+
getDataList();
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
function rowClickHandler(row) {
|
|
193
|
+
i18nList.value?.toggleRowSelection(row);
|
|
194
|
+
}
|
|
165
195
|
function resetList() {
|
|
166
196
|
listForm.key = "";
|
|
167
197
|
listForm.pageNum = 1;
|
|
@@ -263,13 +293,39 @@ function delOne(id) {
|
|
|
263
293
|
.then((res) => {
|
|
264
294
|
if (res?.data?.status === 200) {
|
|
265
295
|
ElMessage.success(res.data.msg);
|
|
266
|
-
|
|
296
|
+
getDataList();
|
|
267
297
|
} else {
|
|
268
298
|
ElMessage.error(res.data.msg);
|
|
269
299
|
}
|
|
270
300
|
});
|
|
271
301
|
});
|
|
272
302
|
}
|
|
303
|
+
function delMore() {
|
|
304
|
+
ElMessageBox.confirm("确认删除选中的翻译记录吗?").then(async () => {
|
|
305
|
+
let ids = i18nList.value
|
|
306
|
+
?.getSelectionRows()
|
|
307
|
+
.map((row) => row.adTranslateId);
|
|
308
|
+
if (ids && ids.length) {
|
|
309
|
+
let len = ids.length;
|
|
310
|
+
let loading = ElLoadingService({
|
|
311
|
+
text: "正在删除选中的翻译……",
|
|
312
|
+
});
|
|
313
|
+
for (let i = 0; i < ids.length; i++) {
|
|
314
|
+
const id = ids[i];
|
|
315
|
+
loading.setText(`正在删除... ${i + 1}/${len}`);
|
|
316
|
+
await http.request({
|
|
317
|
+
url: deleteUrl,
|
|
318
|
+
method: "POST",
|
|
319
|
+
data: {
|
|
320
|
+
id,
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
loading.close();
|
|
325
|
+
getDataList();
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
273
329
|
|
|
274
330
|
const formItems = reactive<VxeFormPropTypes.Items>([
|
|
275
331
|
{
|
|
@@ -307,9 +363,6 @@ watch(
|
|
|
307
363
|
props: { class: "i18n-form-item", id: `i18nFormItem${index + 2}` },
|
|
308
364
|
},
|
|
309
365
|
});
|
|
310
|
-
fromRules[item.value] = [
|
|
311
|
-
{ required: true, type: "string", message: `请输入${item.label}` },
|
|
312
|
-
];
|
|
313
366
|
});
|
|
314
367
|
}
|
|
315
368
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yh-i18n",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "对于国际化的封装",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
14
|
"vue": "3.2.47",
|
|
15
|
-
"pinia": "2.0.35",
|
|
16
15
|
"vxe-table": "4.3.10",
|
|
17
16
|
"element-plus": "2.4.4"
|
|
18
17
|
},
|