w-web-perm 1.0.83 → 1.0.85

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.
Files changed (86) hide show
  1. package/dist/css/{chunk-vendors.034f7a87.css → chunk-vendors.18034562.css} +1 -1
  2. package/dist/index.tmp +1 -1
  3. package/dist/js/app-legacy.aaaa3681.js +1 -0
  4. package/dist/js/app.aaaa3681.js +1 -0
  5. package/dist/js/{chunk-vendors-legacy.d0596078.js → chunk-vendors-legacy.7b6ae0b0.js} +3 -3
  6. package/dist/js/{chunk-vendors.d0596078.js → chunk-vendors.7b6ae0b0.js} +3 -3
  7. package/dist/w-web-perm.umd.js +2 -2
  8. package/dist/w-web-perm.umd.js.map +1 -1
  9. package/docs/WWebPerm.html +1 -1
  10. package/docs/global.html +1 -1
  11. package/docs/index.html +1 -1
  12. package/docs/server_WWebPerm.mjs.html +1 -1
  13. package/docs/server_procCore.mjs.html +1 -1
  14. package/docs/src_fetchJson.mjs.html +1 -1
  15. package/package.json +2 -2
  16. package/server/procLang.mjs +12 -4
  17. package/src/components/LayoutContentGrups.vue +6 -6
  18. package/src/components/LayoutContentPemis.vue +6 -6
  19. package/src/components/LayoutContentTargets.vue +2 -2
  20. package/src/components/LayoutContentUsers.vue +5 -3
  21. package/src/components/ModeSelectChip.vue +182 -0
  22. package/src/components/RelationChip.vue +114 -0
  23. package/src/components/RelationChips.vue +375 -0
  24. package/src/components/VeCgrups.vue +23 -20
  25. package/src/components/VeCpemis.vue +21 -20
  26. package/src/components/VeCrules.vue +8 -1
  27. package/src/components/VeGrupBlngUsers.vue +40 -51
  28. package/src/components/VePemiBlngGrups.vue +27 -41
  29. package/tableTags-web-perm.json +1 -1
  30. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/README.md +58 -0
  31. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/server_procLang.mjs.diff +31 -0
  32. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_App.vue.diff +19 -0
  33. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentGrups.vue.diff +40 -0
  34. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentPemis.vue.diff +40 -0
  35. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_ModeSelectChip.vue.new.diff +124 -0
  36. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_RelationChip.vue.new.diff +116 -0
  37. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_RelationChips.vue.new.diff +152 -0
  38. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCgrups.vue.diff +76 -0
  39. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCpemis.vue.diff +76 -0
  40. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCrules.vue.diff +14 -0
  41. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeGrupBlngUsers.vue.diff +121 -0
  42. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VePemiBlngGrups.vue.diff +121 -0
  43. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/server/procLang.mjs +1049 -0
  44. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/App.vue +204 -0
  45. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentGrups.vue +1260 -0
  46. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentPemis.vue +1262 -0
  47. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/ModeSelectChip.vue +121 -0
  48. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChip.vue +113 -0
  49. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChips.vue +149 -0
  50. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCgrups.vue +943 -0
  51. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCpemis.vue +943 -0
  52. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCrules.vue +848 -0
  53. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeGrupBlngUsers.vue +1157 -0
  54. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VePemiBlngGrups.vue +1157 -0
  55. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/A-/347/256/241/347/220/206/346/254/212/351/231/220/344/270/273/350/241/250.png +0 -0
  56. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/A-/347/256/241/347/220/206/346/254/212/351/231/220/347/276/244/347/265/204/344/270/273/350/241/250.png +0 -0
  57. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B1-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/260/215/350/251/261/346/241/206.png +0 -0
  58. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B2-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-hover/346/234/254/351/240/205chip.png +0 -0
  59. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B3-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/346/234/254/351/240/205chip/346/270/205/345/226/256.png +0 -0
  60. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B4-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/346/234/254/351/240/205chip/345/267/262/347/202/272AND.png +0 -0
  61. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B5-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/345/205/250/351/203/250/346/265/256/345/261/244.png +0 -0
  62. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B6-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/213/276/351/201/270/345/276/214/346/234/254/351/240/205chip/345/234/250/351/246/226/344/275/215.png +0 -0
  63. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/C1-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220-/345/260/215/350/251/261/346/241/206.png +0 -0
  64. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/C2-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220-hover/345/267/262/345/213/276/351/201/270/345/210/227/346/216/247/345/210/266/351/240/205.png +0 -0
  65. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/C3-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220-/345/261/225/351/226/213/346/270/205/345/226/256.png +0 -0
  66. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/D1-/347/267/250/350/274/257/346/211/200/345/261/254/344/275/277/347/224/250/350/200/205-/345/260/215/350/251/261/346/241/206.png +0 -0
  67. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/E1-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220/347/276/244/347/265/204-hover.png +0 -0
  68. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/E2-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/346/270/205/345/226/256.png +0 -0
  69. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/F1-/345/261/225/347/244/272/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/224/257/350/256/200/346/205/213.png +0 -0
  70. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/F2-/345/261/225/347/244/272/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/345/205/250/351/203/250.png +0 -0
  71. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/G1-zoom-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/211/215/345/205/255/345/210/227.png +0 -0
  72. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/G2-zoom-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-hover/346/234/254/351/240/205chip.png +0 -0
  73. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/G3-zoom-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/346/270/205/345/226/256.png +0 -0
  74. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/verify.json +390 -0
  75. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/build.log +93 -0
  76. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/lint.log +23 -0
  77. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/zz_perm_probe.mjs +321 -0
  78. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/zz_perm_zoom.mjs +173 -0
  79. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/zz_wwp_verify.mjs +330 -0
  80. package//345/273/272/350/255/260w-aggrid-vue/350/252/277/346/225/264.md +193 -0
  81. package//345/273/272/350/255/260w-component-vue/350/210/207wsemi/350/252/277/346/225/264.md +76 -0
  82. package//345/273/272/350/255/260w-web-perm/350/252/277/346/225/264.md +244 -0
  83. package//346/226/275/345/267/245/345/226/256_/345/273/272/350/255/260w-web-perm/350/252/277/346/225/264.md +166 -0
  84. package/dist/index.html +0 -4
  85. package/dist/js/app-legacy.04fa72c9.js +0 -1
  86. package/dist/js/app.04fa72c9.js +0 -1
@@ -0,0 +1,1049 @@
1
+ import get from 'lodash-es/get.js'
2
+ import each from 'lodash-es/each.js'
3
+ import iseobj from 'wsemi/src/iseobj.mjs'
4
+
5
+
6
+ let kpLang = {
7
+
8
+ csIng: {
9
+ eng: 'Connecting...',
10
+ cht: '連線中...',
11
+ },
12
+ csLogin: {
13
+ eng: 'Logged in',
14
+ cht: '已登入',
15
+ },
16
+ csLogout: {
17
+ eng: 'Logged out',
18
+ cht: '已登出',
19
+ },
20
+ csErrConn: {
21
+ eng: 'Unable to connect',
22
+ cht: '無法連線',
23
+ },
24
+ csErrLogin: {
25
+ eng: 'Login denied',
26
+ cht: '拒絕登入',
27
+ },
28
+
29
+ aggridLanguage: {
30
+ eng: 'en',
31
+ cht: 'zh-tw',
32
+ },
33
+
34
+ systemMessage: {
35
+ eng: 'System message',
36
+ cht: '系統確認訊息',
37
+ },
38
+ ok: {
39
+ eng: 'OK',
40
+ cht: '確認',
41
+ },
42
+ no: {
43
+ eng: 'No',
44
+ cht: '取消',
45
+ },
46
+ yes: {
47
+ eng: 'Yes',
48
+ cht: '確定',
49
+ },
50
+
51
+ empty: {
52
+ eng: 'Empty',
53
+ cht: '無',
54
+ },
55
+ waitingData: {
56
+ eng: 'Waiting data...',
57
+ cht: '等待數據中...',
58
+ },
59
+
60
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
61
+ // isEditabled: {
62
+ // eng: 'Editable',
63
+ // cht: '是否編輯',
64
+ // },
65
+ saveChanges: {
66
+ eng: `Save changes`,
67
+ cht: `儲存變更`,
68
+ },
69
+ id: {
70
+ eng: `Id`,
71
+ cht: `主鍵`,
72
+ },
73
+ from: {
74
+ eng: `From`,
75
+ cht: `來源`,
76
+ },
77
+ save: {
78
+ eng: `Save`,
79
+ cht: `儲存`,
80
+ },
81
+ close: {
82
+ eng: `Close`,
83
+ cht: `關閉`,
84
+ },
85
+ delete: {
86
+ eng: `Delete`,
87
+ cht: `刪除`,
88
+ },
89
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
90
+ // cancel: {
91
+ // eng: `Cancel`,
92
+ // cht: `取消`,
93
+ // },
94
+ screenFull: {
95
+ eng: `Max size`,
96
+ cht: `最大化尺寸`,
97
+ },
98
+ screenNormal: {
99
+ eng: `Normal size`,
100
+ cht: `預設尺寸`,
101
+ },
102
+ checkAllYes: {
103
+ eng: `Check all`,
104
+ cht: `全選使用`,
105
+ },
106
+ checkAllNo: {
107
+ eng: `Uncheck all`,
108
+ cht: `全不選使用`,
109
+ },
110
+ checkAllInv: {
111
+ eng: `Reverse all`,
112
+ cht: `全反選使用`,
113
+ },
114
+ operEnable: { //關聯表 enable 欄表頭(是否使用)
115
+ eng: `Enable`,
116
+ cht: `是否使用`,
117
+ },
118
+ operPemiMode: { //關聯表 mode 欄表頭(權限之 OR/AND 合併模式)
119
+ eng: `Operator`,
120
+ cht: `合併權限模式`,
121
+ },
122
+ operGrupMode: { //關聯表 mode 欄表頭(權限群組之 OR/AND 合併模式)
123
+ eng: `Operator`,
124
+ cht: `合併權限群組模式`,
125
+ },
126
+
127
+ processing: {
128
+ eng: `Processing...`,
129
+ cht: `處理中請稍後...`,
130
+ },
131
+ anUnexpectedErrorOccurred: {
132
+ eng: `An unexpected error occurred, please contact the administrator`,
133
+ cht: `發生非預期錯誤,請洽管理員`,
134
+ },
135
+
136
+ //後端 reject 之 err key (eng + cht), 前端 .catch 依 lang 用 $tErr 反查顯示
137
+ cannotConnectServer: {
138
+ eng: `Cannot connect to server`,
139
+ cht: `無法連線至伺服器`,
140
+ },
141
+ saveRowFieldInvalid: {
142
+ eng: `Invalid field value in saved data`,
143
+ cht: `儲存資料的欄位值無效`,
144
+ },
145
+ saveRowFieldDuplicate: {
146
+ eng: `Duplicate field value in saved data`,
147
+ cht: `儲存資料的欄位值重複`,
148
+ },
149
+ saveTabItemsSuccess: {
150
+ eng: `Saved successfully`,
151
+ cht: `儲存成功`,
152
+ },
153
+ cannotGetUserId: {
154
+ eng: `Cannot get the user id`,
155
+ cht: `無法取得使用者 Id`,
156
+ },
157
+ cannotGetUserEmail: {
158
+ eng: `Cannot get the email of user`,
159
+ cht: `無法取得使用者 Email`,
160
+ },
161
+ cannotGetUserName: {
162
+ eng: `Cannot get the name of user`,
163
+ cht: `無法取得使用者名稱`,
164
+ },
165
+ cannotGetUserRole: {
166
+ eng: `Cannot get the role of user`,
167
+ cht: `無法取得使用者角色`,
168
+ },
169
+ cannotFindUserFromToken: {
170
+ eng: `Cannot identify the user from token`,
171
+ cht: `無法由 token 識別使用者`,
172
+ },
173
+ cannotGetUserProp: {
174
+ eng: `Cannot get the property of user`,
175
+ cht: `無法取得使用者對應屬性`,
176
+ },
177
+ cannotGetUserFromPerm: {
178
+ eng: `Cannot find the user in permission system`,
179
+ cht: `無法於權限系統取得使用者`,
180
+ },
181
+ userNoPermission: {
182
+ eng: `User does not have permission`,
183
+ cht: `使用者權限不足`,
184
+ },
185
+ invalidPayload: {
186
+ eng: `Invalid payload in request`,
187
+ cht: `請求內容無效`,
188
+ },
189
+ invalidFromInPayload: {
190
+ eng: `Invalid from in payload`,
191
+ cht: `請求來源欄位無效`,
192
+ },
193
+ invalidRowsInPayload: {
194
+ eng: `Invalid rows in payload`,
195
+ cht: `請求資料列無效`,
196
+ },
197
+ invalidFrom: {
198
+ eng: `Invalid from`,
199
+ cht: `來源欄位無效`,
200
+ },
201
+ invalidRows: {
202
+ eng: `Invalid rows`,
203
+ cht: `資料列無效`,
204
+ },
205
+ cannotGetUserRules: {
206
+ eng: `Cannot get rules of user`,
207
+ cht: `無法取得使用者權限規則`,
208
+ },
209
+ tokenNoPermission: {
210
+ eng: `Token does not have permission`,
211
+ cht: `權限不足`,
212
+ },
213
+ userIdNoPermrules: {
214
+ eng: `The user id does not have permission rules`,
215
+ cht: `此使用者沒有權限規則`,
216
+ },
217
+ invalidKeyTable: {
218
+ eng: `Invalid key table`,
219
+ cht: `資料表名稱無效`,
220
+ },
221
+ cannotFindUserId: {
222
+ eng: `Cannot find the user id`,
223
+ cht: `無法找到使用者 Id`,
224
+ },
225
+
226
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
227
+ // unknow: {
228
+ // eng: `Unknow`,
229
+ // cht: `未知`,
230
+ // },
231
+
232
+ username: {
233
+ eng: `Username`,
234
+ cht: `使用者姓名`,
235
+ },
236
+ email: {
237
+ eng: `Email`,
238
+ cht: `電子郵件`,
239
+ },
240
+ name: {
241
+ eng: `Name`,
242
+ cht: `名稱`,
243
+ },
244
+ description: {
245
+ eng: `Description`,
246
+ cht: `說明`,
247
+ },
248
+ // noDescription: {
249
+ // eng: `No description`,
250
+ // cht: `無說明`,
251
+ // },
252
+ modeEdit: {
253
+ eng: `Edit mode`,
254
+ cht: `編輯模式`,
255
+ },
256
+ showTabCols: {
257
+ eng: `Show columns`,
258
+ cht: `顯示欄位`,
259
+ },
260
+
261
+ belongUsers: {
262
+ eng: `Use users`,
263
+ cht: `管控所屬使用者`,
264
+ },
265
+ belongGrups: { //與 belongUsers(管控所屬使用者)同類之反向參照欄, 中文補「管控」以對稱(2026-09-15 業主指正)
266
+ eng: `Use groups`,
267
+ cht: `管控所屬權限群組`,
268
+ },
269
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
270
+ // belongPemis: {
271
+ // eng: `Use permissions`,
272
+ // cht: `所屬權限`,
273
+ // },
274
+ belongGrupsNames: {
275
+ eng: `Use permission groups`,
276
+ cht: `所屬權限群組名稱`,
277
+ },
278
+ belongPemisNames: {
279
+ eng: `Use permissions`,
280
+ cht: `所屬權限名稱`,
281
+ },
282
+ chipsShowAll: { //關聯 chip 列表(RelationChips)之「展開全部」鈕提示
283
+ eng: `Show all`,
284
+ cht: `展開全部`,
285
+ },
286
+ chipsPopupTitle: { //關聯 chip 列表之展開浮層標題, {title} 為欄名(belongGrupsNames/belongPemisNames), {n} 為數量
287
+ eng: `{title} ({n} in total)`,
288
+ cht: `{title}:共 {n} 項`,
289
+ },
290
+
291
+ isAdmin: {
292
+ eng: `Administrator`,
293
+ cht: `是否為系統管理員`,
294
+ },
295
+ isActive: {
296
+ eng: `Active`,
297
+ cht: `是否有效`,
298
+ },
299
+
300
+ errInNames: {
301
+ eng: `Name errors`,
302
+ cht: `名稱出現錯誤待修復`,
303
+ },
304
+ errInIds: {
305
+ eng: `ID errors`,
306
+ cht: `ID 出現錯誤待修復`,
307
+ },
308
+ errInEmails: {
309
+ eng: `Email errors`,
310
+ cht: `Email出現錯誤待修復`,
311
+ },
312
+
313
+ menuTreeShow: {
314
+ eng: `Show menu`,
315
+ cht: `顯示選單`,
316
+ },
317
+ menuTreeHide: {
318
+ eng: `Hide menu`,
319
+ cht: `隱藏選單`,
320
+ },
321
+
322
+ mmTargets: {
323
+ eng: `Targets`,
324
+ cht: `管理對象`,
325
+ },
326
+ mmTargetsMsg: {
327
+ eng: `Targets generally refer to entities such as pages, data, etc., and can also include features or services.`,
328
+ cht: `對象泛指實體的頁面、數據等,亦可為的功能或服務。`,
329
+ },
330
+
331
+ mmPemis: {
332
+ eng: `Permissions`,
333
+ cht: `管理權限`,
334
+ },
335
+ mmPemisMsg: {
336
+ eng: `Permissions are primarily used to set rules for enabling or disabling various objects.`,
337
+ cht: `權限主要為用來設定各種對象之使用或禁用規則。`,
338
+ },
339
+
340
+ mmGrups: {
341
+ eng: `Permission groups`,
342
+ cht: `管理權限群組`,
343
+ },
344
+ mmGrupsMsg: {
345
+ eng: `Permission groups are primarily used to configure combinations of different permissions.`,
346
+ cht: `權限群組主要為用來設定組合各種權限。`,
347
+ },
348
+
349
+ mmUsers: {
350
+ eng: `Users`,
351
+ cht: `管理使用者`,
352
+ },
353
+ mmUsersMsg: {
354
+ eng: `Users are primarily for providing or extending user information and can be configured with combinations of various permission groups.`,
355
+ cht: `使用者主要為提供或擴充使用者資訊,並可設定組合各種權限群組。`,
356
+ },
357
+
358
+ targetId: {
359
+ eng: `Target`,
360
+ cht: `對象名稱`,
361
+ },
362
+ targetIdEmpty: {
363
+ eng: `Invalid name`,
364
+ cht: `尚未給予有效對象名稱`,
365
+ },
366
+ targetIdDuplicate: {
367
+ eng: `Duplicate target`,
368
+ cht: `對象名稱出現重複`,
369
+ },
370
+ targetAddEmpty: {
371
+ eng: `No target`,
372
+ cht: `尚未新增管理資料`,
373
+ },
374
+ targetAdd: {
375
+ eng: `Add target`,
376
+ cht: `新增對象`,
377
+ },
378
+ targetAddNameNew: {
379
+ eng: `New target`,
380
+ cht: `新對象`,
381
+ },
382
+ targetAddIdNew: {
383
+ eng: `Waiting generation`,
384
+ cht: `待自動給予`,
385
+ },
386
+ targetCopy: {
387
+ eng: `Copy target`,
388
+ cht: `複製對象`,
389
+ },
390
+ targetCopyNameNew: {
391
+ eng: `copy`,
392
+ cht: `複製`,
393
+ },
394
+ targetDeleteCheckTargets: {
395
+ eng: `Delete target(s)`,
396
+ cht: `刪除勾選對象`,
397
+ },
398
+ targetEnable: {
399
+ eng: `Enable`,
400
+ cht: `是否使用`,
401
+ },
402
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
403
+ // targetClearTargetsFail: {
404
+ // eng: `Failed to clear existing targets`,
405
+ // cht: `清除既有對象數據失敗`,
406
+ // },
407
+ targetSaveTargetsFail: {
408
+ eng: `Failed to save targets`,
409
+ cht: `儲存對象數據失敗`,
410
+ },
411
+ targetSaveTargetsSuccess: {
412
+ eng: `Save targets successfully`,
413
+ cht: `儲存對象數據成功`,
414
+ },
415
+
416
+ pemiName: {
417
+ eng: `Name of permission`,
418
+ cht: `權限名稱`,
419
+ },
420
+ pemiNameEmpty: {
421
+ eng: `Invalid name of permission`,
422
+ cht: `尚未給予有效權限名稱`,
423
+ },
424
+ pemiNameDuplicate: {
425
+ eng: `Duplicate name of permission`,
426
+ cht: `權限名稱出現重複`,
427
+ },
428
+ pemiAddEmpty: {
429
+ eng: `No permission`,
430
+ cht: `尚未新增權限資料`,
431
+ },
432
+ pemiAdd: {
433
+ eng: `Add permission`,
434
+ cht: `新增權限`,
435
+ },
436
+ pemiAddNameNew: {
437
+ eng: `New permission`,
438
+ cht: `新權限`,
439
+ },
440
+ pemiAddIdNew: {
441
+ eng: `Waiting generation`,
442
+ cht: `待自動給予`,
443
+ },
444
+ pemiCopy: {
445
+ eng: `Copy permission`,
446
+ cht: `複製權限`,
447
+ },
448
+ pemiCopyNameNew: {
449
+ eng: `copy`,
450
+ cht: `複製`,
451
+ },
452
+ pemiDeleteCheckPemis: {
453
+ eng: `Delete permission(s)`,
454
+ cht: `刪除勾選權限`,
455
+ },
456
+ pemiCrules: {
457
+ eng: `Rules of permission`,
458
+ cht: `管控對象`,
459
+ },
460
+ pemiEditBlngGrupsNoPemiId: {
461
+ eng: `Can not find the id of permission`,
462
+ cht: `無法找到權限Id`,
463
+ },
464
+ pemiEditBlngGrupsNoPemiData: {
465
+ eng: `Can not find the data of permission`,
466
+ cht: `無法找到權限資料`,
467
+ },
468
+ pemiEditCrules: {
469
+ eng: `Edit rules of permission`,
470
+ cht: `編輯使用對象`,
471
+ },
472
+ pemiEditCrulesForDisplay: {
473
+ eng: `Rules of permission`,
474
+ cht: `展示使用對象`,
475
+ },
476
+ // pemiEditCrulesSimple: {
477
+ // eng: `Edit rules`,
478
+ // cht: `編輯對象`,
479
+ // },
480
+ pemiEditCrulesNoPemiId: {
481
+ eng: `Can not find the id of permission`,
482
+ cht: `無法找到權限Id`,
483
+ },
484
+ pemiEditCrulesNoPemiData: {
485
+ eng: `Can not find the data of permission`,
486
+ cht: `無法找到權限資料`,
487
+ },
488
+ pemiRnderCrulesNoRule: {
489
+ eng: `No rule`,
490
+ cht: `無使用任何對象`,
491
+ },
492
+ pemiRnderCrulesHasNRule: {
493
+ eng: `Has {n} rule(s){nms}`,
494
+ cht: `使用共 {n} 項對象{nms}`,
495
+ },
496
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
497
+ // pemiClearPemisFail: {
498
+ // eng: `Failed to clear existing permissions`,
499
+ // cht: `清除既有權限數據失敗`,
500
+ // },
501
+ pemiSavePemisFail: {
502
+ eng: `Failed to save permissions`,
503
+ cht: `儲存權限數據失敗`,
504
+ },
505
+ pemiSavePemisSuccess: {
506
+ eng: `Save permissions successfully`,
507
+ cht: `儲存權限數據成功`,
508
+ },
509
+
510
+ pemiBlngEditGrups: {
511
+ eng: `Edit permission groups`,
512
+ cht: `編輯所屬權限群組`,
513
+ },
514
+ pemiBlngEditGrupsForDisplay: {
515
+ eng: `Permission groups`,
516
+ cht: `展示所屬權限群組`,
517
+ },
518
+ pemiBlngRnderNoGrup: {
519
+ eng: `No users`,
520
+ cht: `無所屬權限群組`,
521
+ },
522
+ pemiBlngRnderGrups: {
523
+ eng: `Has {n} permission group(s){nms}`,
524
+ cht: `共被 {n} 個權限群組{nms}使用`,
525
+ },
526
+ pemiBlngPemiNow: {
527
+ eng: `Now permission`,
528
+ cht: `目前權限`,
529
+ },
530
+ pemiBlngEditNoName: {
531
+ eng: `Can not find the name of permission`,
532
+ cht: `無法找到權限名稱`,
533
+ },
534
+ pemiBlngEditNoPemi: {
535
+ eng: `Can not find the data of permission`,
536
+ cht: `無法找到權限資料`,
537
+ },
538
+ pemiBlngDeleteCheckPemis: {
539
+ eng: `Delete permission(s)`,
540
+ cht: `刪除勾選權限`,
541
+ },
542
+
543
+ cruleEditNoTargetId: {
544
+ eng: `Can not find the id of target`,
545
+ cht: `無法找到對象Id`,
546
+ },
547
+ cruleEditNoTargetData: {
548
+ eng: `Can not find the data of target`,
549
+ cht: `無法找到對象資料`,
550
+ },
551
+ cruleDeleteCheckTargets: {
552
+ eng: `Delete target(s)`,
553
+ cht: `刪除勾選對象`,
554
+ },
555
+
556
+ grupName: {
557
+ eng: `Name of permission group`,
558
+ cht: `權限群組名稱`,
559
+ },
560
+ grupNameEmpty: {
561
+ eng: `Invalid name of permission group`,
562
+ cht: `尚未給予有效權限群組名稱`,
563
+ },
564
+ grupNameDuplicate: {
565
+ eng: `Duplicate name of permission group`,
566
+ cht: `權限群組名稱出現重複`,
567
+ },
568
+ grupAddEmpty: {
569
+ eng: `No permission group`,
570
+ cht: `尚未新增權限群組資料`,
571
+ },
572
+ grupAdd: {
573
+ eng: `Add permission group`,
574
+ cht: `新增權限群組`,
575
+ },
576
+ grupAddNameNew: {
577
+ eng: `New permission group`,
578
+ cht: `新權限群組`,
579
+ },
580
+ grupAddIdNew: {
581
+ eng: `Waiting generation`,
582
+ cht: `待自動給予`,
583
+ },
584
+ grupCopy: {
585
+ eng: `Copy permission group`,
586
+ cht: `複製權限群組`,
587
+ },
588
+ grupCopyNameNew: {
589
+ eng: `copy`,
590
+ cht: `複製`,
591
+ },
592
+ grupDeleteCheckGrups: {
593
+ eng: `Delete permission group(s)`,
594
+ cht: `刪除勾選權限群組`,
595
+ },
596
+ grupCpemis: {
597
+ eng: `Permissions`,
598
+ cht: `管控使用權限`,
599
+ },
600
+ grupEditBlngNoGrupId: {
601
+ eng: `Can not find the id of permission group`,
602
+ cht: `無法找到權限群組Id`,
603
+ },
604
+ grupEditBlngNoGrupData: {
605
+ eng: `Can not find the data of permission group`,
606
+ cht: `無法找到權限群組資料`,
607
+ },
608
+ grupEditCpemis: {
609
+ eng: `Edit list of permission group`,
610
+ cht: `編輯使用權限`,
611
+ },
612
+ grupEditCpemisForDisplay: {
613
+ eng: `List of permission group`,
614
+ cht: `展示使用權限`,
615
+ },
616
+ grupRnderCpemisNoPermission: {
617
+ eng: `No permission`,
618
+ cht: `無使用任何權限`,
619
+ },
620
+ grupRnderCpemisHasNPermissions: {
621
+ eng: `Has {n} permission(s){nms}`,
622
+ cht: `使用 {n} 項權限{nms}`,
623
+ },
624
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
625
+ // grupClearGrupsFail: {
626
+ // eng: `Failed to clear existing permission groups`,
627
+ // cht: `清除既有權限群組數據失敗`,
628
+ // },
629
+ grupSaveGrupsEmpty: {
630
+ eng: `No user`,
631
+ cht: `未有變更權限群組資料`,
632
+ },
633
+ grupSaveGrupsFail: {
634
+ eng: `Failed to save permission groups`,
635
+ cht: `儲存權限群組數據失敗`,
636
+ },
637
+ grupSaveGrupsSuccess: {
638
+ eng: `Save permission groups successfully`,
639
+ cht: `儲存權限群組數據成功`,
640
+ },
641
+
642
+ grupBlngEditUsers: {
643
+ eng: `Edit permission group of users`,
644
+ cht: `編輯所屬使用者`,
645
+ },
646
+ grupBlngEditUsersForDisplay: {
647
+ eng: `Permission group of users`,
648
+ cht: `展示所屬使用者`,
649
+ },
650
+ grupBlngRnderNoUser: {
651
+ eng: `No users`,
652
+ cht: `無所屬使用者`,
653
+ },
654
+ grupBlngRnderUsers: {
655
+ eng: `Has {n} user(s){nms}`,
656
+ cht: `共被 {n} 位使用者{nms}使用`,
657
+ },
658
+ grupBlngGrupNow: {
659
+ eng: `Now permission group`,
660
+ cht: `目前權限群組`,
661
+ },
662
+ grupBlngEditNoGrupName: {
663
+ eng: `Can not find the name of permission group`,
664
+ cht: `無法找到權限群組名稱`,
665
+ },
666
+ grupBlngEditNoGrupData: {
667
+ eng: `Can not find the data of permission group`,
668
+ cht: `無法找到權限群組資料`,
669
+ },
670
+ grupBlngDeleteCheckGrups: {
671
+ eng: `Delete permission group(s)`,
672
+ cht: `刪除勾選權限群組`,
673
+ },
674
+
675
+ cpemiEditNoName: {
676
+ eng: `Can not find the name of target`,
677
+ cht: `無法找到對象名稱`,
678
+ },
679
+ cpemiEditNoTarget: {
680
+ eng: `Can not find the data of target`,
681
+ cht: `無法找到對象資料`,
682
+ },
683
+ cpemiDeleteCheckTargets: {
684
+ eng: `Delete targets(s)`,
685
+ cht: `刪除勾選對象`,
686
+ },
687
+
688
+ userName: {
689
+ eng: `Name of user`,
690
+ cht: `使用者名稱`,
691
+ },
692
+ userNameEmpty: {
693
+ eng: `Invalid name of user`,
694
+ cht: `尚未給予有效使用者名稱`,
695
+ },
696
+ userNameDuplicate: {
697
+ eng: `Duplicate name of user`,
698
+ cht: `使用者名稱出現重複`,
699
+ },
700
+ userEmailEmpty: {
701
+ eng: `Empty email of user`,
702
+ cht: `尚未給予使用者Email`,
703
+ },
704
+ userEmailError: {
705
+ eng: `Invalid email of user`,
706
+ cht: `使用者Email格式錯誤`,
707
+ },
708
+ userEmailDuplicate: {
709
+ eng: `Duplicate email of user`,
710
+ cht: `使用者Email出現重複`,
711
+ },
712
+ userAddEmpty: {
713
+ eng: `No user`,
714
+ cht: `尚未新增使用者資料`,
715
+ },
716
+ userAdd: {
717
+ eng: `Add user`,
718
+ cht: `新增使用者`,
719
+ },
720
+ userAddNameNew: {
721
+ eng: `New user`,
722
+ cht: `新使用者`,
723
+ },
724
+ userAddIdNew: {
725
+ eng: `Waiting generation`,
726
+ cht: `待自動給予`,
727
+ },
728
+ userCopy: {
729
+ eng: `Copy user`,
730
+ cht: `複製使用者`,
731
+ },
732
+ userCopyNameNew: {
733
+ eng: `copy`,
734
+ cht: `複製`,
735
+ },
736
+ userDeleteCheckUsers: {
737
+ eng: `Delete user(s)`,
738
+ cht: `刪除勾選使用者`,
739
+ },
740
+ userCgrups: {
741
+ eng: `Permission groups`,
742
+ cht: `管控使用權限群組`,
743
+ },
744
+ userEditCgrups: {
745
+ eng: `Edit list of user`,
746
+ cht: `編輯使用權限群組`,
747
+ },
748
+ userEditCgrupsForDisplay: {
749
+ eng: `Permission groups of user`, //展示版不帶 Edit 動詞(2026-07-10 訂正: 原誤與編輯版同值, 唯讀對話框標題顯示「Edit...」且 e2e 無法以標題區分模式)
750
+ cht: `展示使用權限群組`,
751
+ },
752
+ userEditCgrupsNoUserId: {
753
+ eng: `Can not find the id of user`,
754
+ cht: `無法找到使用者Id`,
755
+ },
756
+ userEditCgrupsNoUserData: {
757
+ eng: `Can not find the data of user`,
758
+ cht: `無法找到使用者資料`,
759
+ },
760
+ // userClearUsersFail: {
761
+ // eng: `Failed to clear existing users`,
762
+ // cht: `清除既有使用者數據失敗`,
763
+ // },
764
+ userSaveUsersEmpty: {
765
+ eng: `No user`,
766
+ cht: `未有變更使用者資料`,
767
+ },
768
+ userSaveUsersFail: {
769
+ eng: `Failed to save users`,
770
+ cht: `儲存使用者數據失敗`,
771
+ },
772
+ userSaveUsersSuccess: {
773
+ eng: `Save users successfully`,
774
+ cht: `儲存使用者數據成功`,
775
+ },
776
+ userEditNoUserId: {
777
+ eng: `Can not find the id of user`,
778
+ cht: `無法找到使用者Id`,
779
+ },
780
+ userEditNoUserData: {
781
+ eng: `Can not find the data of user`,
782
+ cht: `無法找到使用者數據`,
783
+ },
784
+ userRnderCgrupsNoGroup: {
785
+ eng: `No permission group`,
786
+ cht: `無使用任何權限群組`,
787
+ },
788
+ userRnderCgrupsHasNGroups: {
789
+ eng: `Has {n} permission group(s){nms}`,
790
+ cht: `使用 {n} 項權限群組{nms}`,
791
+ },
792
+
793
+ cgrupEditNoName: {
794
+ eng: `Can not find the name of permission`,
795
+ cht: `無法找到權限名稱`,
796
+ },
797
+ cgrupEditNoPemi: {
798
+ eng: `Can not find the data of permission`,
799
+ cht: `無法找到權限資料`,
800
+ },
801
+ cgrupDeleteCheckPemis: {
802
+ eng: `Delete permission(s)`,
803
+ cht: `刪除勾選權限`,
804
+ },
805
+
806
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
807
+ // allDefaults: {
808
+ // eng: `All defaults`,
809
+ // cht: `全部項目預設值`,
810
+ // },
811
+ show: {
812
+ eng: `Show`,
813
+ cht: `顯示`,
814
+ },
815
+ active: {
816
+ eng: `Active`,
817
+ cht: `啟用`,
818
+ },
819
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
820
+ // showChildren: {
821
+ // eng: `Show children`,
822
+ // cht: `所屬顯示`,
823
+ // },
824
+ // hideChildren: {
825
+ // eng: `Hide children`,
826
+ // cht: `所屬不顯示`,
827
+ // },
828
+ // activateChildren: {
829
+ // eng: `Activate children`,
830
+ // cht: `所屬啟用`,
831
+ // },
832
+ // deactivateChildren: {
833
+ // eng: `Deactivate children`,
834
+ // cht: `所屬不啟用`,
835
+ // },
836
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
837
+ // isUsernameEmpty: {
838
+ // eng: `Username is empty`,
839
+ // cht: `使用者名稱不得為空`,
840
+ // },
841
+ // failedToSaveUser: {
842
+ // eng: `Failed to save the user`,
843
+ // cht: `變更使用者失敗`,
844
+ // },
845
+ // successfulToSaveUser: {
846
+ // eng: `Save the user successfully`,
847
+ // cht: `變更使用者成功`,
848
+ // },
849
+
850
+ userId: {
851
+ eng: `ID of the created user`,
852
+ cht: '創建使用者主鍵',
853
+ },
854
+ timeCreate: {
855
+ eng: `Created time`,
856
+ cht: '創建時間',
857
+ },
858
+ userIdUpdate: {
859
+ eng: `ID of the updated user`,
860
+ cht: '最新變更使用者主鍵',
861
+ },
862
+ timeUpdate: {
863
+ eng: `Updated time`,
864
+ cht: '更新時間',
865
+ },
866
+
867
+ invalidUrl: {
868
+ eng: `Invalid url`,
869
+ cht: `網址無效`,
870
+ },
871
+ invalidTokenTar: {
872
+ eng: `Invalid target token`,
873
+ cht: `目標 token 無效`,
874
+ },
875
+ invalidTokenSelf: {
876
+ eng: `Invalid self token`,
877
+ cht: `自身 token 無效`,
878
+ },
879
+ invalidUserIdTar: {
880
+ eng: `Invalid target user id`,
881
+ cht: `目標使用者 Id 無效`,
882
+ },
883
+ noTokenInUrl: {
884
+ eng: `Missing token in url`,
885
+ cht: `網址缺少 token`,
886
+ },
887
+ noTokenUserIdInUrl: {
888
+ eng: `Missing token or userId in url`,
889
+ cht: `網址缺少 token 或 userId`,
890
+ },
891
+ cannotGetUserByUrl: {
892
+ eng: `Cannot get user by url`,
893
+ cht: `無法由網址取得使用者`,
894
+ },
895
+ cannotGetUserDataByUrl: {
896
+ eng: `Cannot get user data by url`,
897
+ cht: `無法由網址取得使用者資料`,
898
+ },
899
+ noUserDataByUrl: {
900
+ eng: `No user data by url`,
901
+ cht: `該網址無使用者資料`,
902
+ },
903
+ noUserDataAfterConvert: {
904
+ eng: `No user data after permission conversion`,
905
+ cht: `權限轉換後無使用者資料`,
906
+ },
907
+
908
+ mmStaInfor: {
909
+ eng: `Statistics`,
910
+ cht: `統計資訊`,
911
+ },
912
+ staEventTitle: {
913
+ eng: `Event Frequency`,
914
+ cht: `事件發生頻率`,
915
+ },
916
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
917
+ // staTimeGroup: {
918
+ // eng: `Time grouping`,
919
+ // cht: `時間分組`,
920
+ // },
921
+ staTimeHr: {
922
+ eng: `Hourly`,
923
+ cht: `每小時`,
924
+ },
925
+ staTimeDay: {
926
+ eng: `Daily`,
927
+ cht: `每日`,
928
+ },
929
+ staTotal: {
930
+ eng: `Total`,
931
+ cht: `全部加總`,
932
+ },
933
+ staNoData: {
934
+ eng: `No event data`,
935
+ cht: `尚無事件資料`,
936
+ },
937
+ getDataError: {
938
+ eng: `Failed to load data`,
939
+ cht: `資料載入失敗`,
940
+ },
941
+ staTableTitle: {
942
+ eng: `Event Statistics`,
943
+ cht: `事件統計表`,
944
+ },
945
+ staColEvent: {
946
+ eng: `Event`,
947
+ cht: `事件`,
948
+ },
949
+ staColLast1Day: {
950
+ eng: `Last 1 Day`,
951
+ cht: `最近1日`,
952
+ },
953
+ staColLast8Hour: {
954
+ eng: `Last 8 Hours`,
955
+ cht: `最近8小時`,
956
+ },
957
+ staColLast4Hour: {
958
+ eng: `Last 4 Hours`,
959
+ cht: `最近4小時`,
960
+ },
961
+ staColLast1Hour: {
962
+ eng: `Last 1 Hour`,
963
+ cht: `最近1小時`,
964
+ },
965
+
966
+ }
967
+
968
+
969
+ let init = (opt = {}) => {
970
+
971
+ //kpLangExt
972
+ let kpLangExt = get(opt, 'kpLangExt')
973
+ if (!iseobj(kpLangExt)) {
974
+ kpLangExt = {}
975
+ }
976
+
977
+ //webName
978
+ let webName = get(opt, 'webName')
979
+ if (!iseobj(webName)) {
980
+ webName = {}
981
+ }
982
+
983
+ //webDescription
984
+ let webDescription = get(opt, 'webDescription')
985
+ if (!iseobj(webDescription)) {
986
+ webDescription = {}
987
+ }
988
+
989
+ //kp
990
+ let kp = {}
991
+
992
+ //kpLang
993
+ kp = {
994
+ ...kp,
995
+ ...kpLang,
996
+ }
997
+
998
+ //ext kpLangExt
999
+ if (iseobj(kpLangExt)) {
1000
+ kp = {
1001
+ ...kp,
1002
+ ...kpLangExt,
1003
+ }
1004
+ }
1005
+
1006
+ //webName
1007
+ if (iseobj(webName)) {
1008
+ kp = {
1009
+ ...kp,
1010
+ webName: {
1011
+ ...webName,
1012
+ },
1013
+ }
1014
+ }
1015
+
1016
+ //webDescription
1017
+ if (iseobj(webDescription)) {
1018
+ kp = {
1019
+ ...kp,
1020
+ webDescription: {
1021
+ ...webDescription,
1022
+ },
1023
+ }
1024
+ }
1025
+
1026
+ let langs = [
1027
+ 'eng',
1028
+ 'cht',
1029
+ ]
1030
+
1031
+ let r = {}
1032
+ each(langs, (lang) => {
1033
+
1034
+ //kpText
1035
+ let kpText = {}
1036
+ each(kp, (v, k) => {
1037
+ kpText[k] = v[lang]
1038
+ })
1039
+
1040
+ //save
1041
+ r[lang] = kpText
1042
+
1043
+ })
1044
+
1045
+ return r
1046
+ }
1047
+
1048
+
1049
+ export default init