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 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
- let translateReady = true;
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({}, zhCNVXETable);
163
+ messages["zh_CN"] = Object.assign(zhCNBase, zhCNVXETable);
154
164
  break;
155
165
  case "en_US":
156
- messages["en_US"] = Object.assign({}, enUSVXETable);
166
+ messages["en_US"] = Object.assign(enUSBase, enUSVXETable);
157
167
  break;
158
168
  case "th":
159
- messages["th"] = Object.assign({}, thVXETable);
169
+ messages["th"] = Object.assign(thBase, thVXETable);
160
170
  break;
161
171
 
162
172
  case "vi":
163
- messages["vi"] = Object.assign({}, viVXETable);
173
+ messages["vi"] = Object.assign(viBase, viVXETable);
164
174
  break;
165
175
 
166
176
  case "tr":
167
- messages["tr"] = Object.assign({}, trVXETable);
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] = val;
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
 
@@ -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
+ };
@@ -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
- <el-link v-if="isDev" type="warning" href="/#/translate">翻译管理</el-link>
17
+ &nbsp;&nbsp;&nbsp;
18
+ <el-link v-if="isDev" type="warning" href="/#/translate">{{
19
+ ct("翻译管理")
20
+ }}</el-link>
21
+ &nbsp;&nbsp;&nbsp;
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 :data="dataList" row-key="adTranslateId">
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-size="listForm.pageSize"
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: 100,
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
- resetList();
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",
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
  },