dashboard-shell-shell 3.0.5-test.17 → 3.0.5-test.19
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/assets/styles/base/_variables.scss +2 -2
- package/assets/styles/global/_select.scss +1 -1
- package/assets/translations/zh-hans.yaml +8 -1
- package/components/Resource/Detail/TitleBar/composables.ts +16 -1
- package/components/Resource/Detail/TitleBar/index.vue +1 -1
- package/components/SideNav.vue +1 -1
- package/components/auth/RoleDetailEdit.vue +10 -6
- package/components/breadcrumb/index.vue +9 -202
- package/components/form/Select.vue +6 -1
- package/package.json +1 -1
- package/scripts/publish-shell.sh +1 -1
- package/utils/errorTranslate.json +151 -1
|
@@ -593,6 +593,8 @@ assignTo:
|
|
|
593
593
|
workspace: 工作空间
|
|
594
594
|
|
|
595
595
|
stateLabel:
|
|
596
|
+
VM error: 错误
|
|
597
|
+
Locked: 锁定
|
|
596
598
|
Bound: 已绑定
|
|
597
599
|
Running: 运行中
|
|
598
600
|
Off: 关闭
|
|
@@ -3170,7 +3172,7 @@ login:
|
|
|
3170
3172
|
label: 记住用户名
|
|
3171
3173
|
|
|
3172
3174
|
logout:
|
|
3173
|
-
message:
|
|
3175
|
+
message: 正在退出登录...
|
|
3174
3176
|
|
|
3175
3177
|
managementNode:
|
|
3176
3178
|
customName: 自定义名称
|
|
@@ -6511,6 +6513,11 @@ typeDescription:
|
|
|
6511
6513
|
management.cattle.io.user: 用于管理用户账号,支持创建、维护用户信息,可设置用户权限、管理密码等,保障系统资源仅由授权用户访问,提升系统安全性。
|
|
6512
6514
|
harvesterhci.io.management.cluster: 提供虚拟化集群的实时健康状态监控、版本号管理及资源负载管理,支持批量导入/删除集群、配置调优与权限分级功能,实现高效运维管控。
|
|
6513
6515
|
typeLabel:
|
|
6516
|
+
management.cattle.io.project: |-
|
|
6517
|
+
{count, plural,
|
|
6518
|
+
one { 项目 }
|
|
6519
|
+
other { 项目 }
|
|
6520
|
+
}
|
|
6514
6521
|
management.cattle.io.token: |-
|
|
6515
6522
|
{count, plural,
|
|
6516
6523
|
one { API 密钥 }
|
|
@@ -14,7 +14,22 @@ export const useDefaultTitleBarProps = (resource: any, resourceSubtype?: Ref<str
|
|
|
14
14
|
const resourceSubtypeValue = toValue(resourceSubtype);
|
|
15
15
|
const currentStore = store.getters['currentStore'](resourceValue.type);
|
|
16
16
|
const schema = store.getters[`${ currentStore }/schemaFor`](resourceValue.type);
|
|
17
|
-
|
|
17
|
+
let resourceTypeLabel = resourceValue.parentNameOverride || store.getters['type-map/labelFor'](schema);
|
|
18
|
+
|
|
19
|
+
// 转换为中文
|
|
20
|
+
const displayName_zh_hans: Record<string, string> = {
|
|
21
|
+
'GlobalRole': '全局角色',
|
|
22
|
+
'RoleTemplate': '集群角色',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (displayName_zh_hans[resourceTypeLabel]) {
|
|
26
|
+
resourceTypeLabel = displayName_zh_hans[resourceTypeLabel]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (resourceTypeLabel == '集群角色' && (route.query?.roleContext == 'NAMESPACE' || resource?.parentLocationOverride?.hash == '#NAMESPACE')) {
|
|
30
|
+
resourceTypeLabel = '项目或资源组角色'
|
|
31
|
+
}
|
|
32
|
+
|
|
18
33
|
const resourceName = resourceSubtypeValue ? `${ resourceSubtypeValue } - ${ resourceValue.nameDisplay }` : resourceValue.nameDisplay;
|
|
19
34
|
const resourceTo = resourceValue.listLocation || {
|
|
20
35
|
name: 'c-cluster-product-resource',
|
package/components/SideNav.vue
CHANGED
|
@@ -436,7 +436,7 @@ export default {
|
|
|
436
436
|
:aria-label="t('nav.ariaLabel.sideNav')"
|
|
437
437
|
>
|
|
438
438
|
<div class="side-all-title">
|
|
439
|
-
{{ prod == 'Cloud' && currentCluster ? '控制台' : prod }}
|
|
439
|
+
{{ (prod == 'Cloud' || prod == 'Harvester') && currentCluster ? '控制台' : prod }}
|
|
440
440
|
</div>
|
|
441
441
|
|
|
442
442
|
<!-- Actual nav -->
|
|
@@ -705,12 +705,12 @@ export default {
|
|
|
705
705
|
<!-- 列表头部 -->
|
|
706
706
|
<template #column-headers>
|
|
707
707
|
<div class="column-headers row">
|
|
708
|
-
<div :class="ruleClass">
|
|
708
|
+
<div class="arrayListCls" :class="ruleClass">
|
|
709
709
|
<span class="text-label">{{ t('rbac.roletemplate.tabs.grantResources.tableHeaders.verbs') }}
|
|
710
710
|
<span class="required">*</span>
|
|
711
711
|
</span>
|
|
712
712
|
</div>
|
|
713
|
-
<div :class="ruleClass">
|
|
713
|
+
<div class="arrayListCls" :class="ruleClass">
|
|
714
714
|
<span class="text-label">
|
|
715
715
|
{{ t('rbac.roletemplate.tabs.grantResources.tableHeaders.resources') }}
|
|
716
716
|
<i
|
|
@@ -723,7 +723,7 @@ export default {
|
|
|
723
723
|
>*</span>
|
|
724
724
|
</span>
|
|
725
725
|
</div>
|
|
726
|
-
<div :class="ruleClass">
|
|
726
|
+
<div class="arrayListCls" :class="ruleClass">
|
|
727
727
|
<span class="text-label">{{ t('rbac.roletemplate.tabs.grantResources.tableHeaders.apiGroups') }}</span>
|
|
728
728
|
</div>
|
|
729
729
|
<div
|
|
@@ -740,7 +740,7 @@ export default {
|
|
|
740
740
|
<div class="columns row mr-20">
|
|
741
741
|
|
|
742
742
|
<!-- 动作(verbs)选择 -->
|
|
743
|
-
<div :class="ruleClass">
|
|
743
|
+
<div class="arrayListCls" :class="ruleClass">
|
|
744
744
|
<!-- Select verbs -->
|
|
745
745
|
<Select
|
|
746
746
|
:value="props.row.value.verbs"
|
|
@@ -758,7 +758,7 @@ export default {
|
|
|
758
758
|
</div>
|
|
759
759
|
|
|
760
760
|
<!-- 资源(resources)选择 -->
|
|
761
|
-
<div :class="ruleClass">
|
|
761
|
+
<div class="arrayListCls" :class="ruleClass">
|
|
762
762
|
<Select
|
|
763
763
|
style="width: auto;"
|
|
764
764
|
:value="getRule('resources', props.row.value)"
|
|
@@ -776,7 +776,7 @@ export default {
|
|
|
776
776
|
</div>
|
|
777
777
|
|
|
778
778
|
<!-- API Groups 输入 -->
|
|
779
|
-
<div :class="ruleClass">
|
|
779
|
+
<div class="arrayListCls" :class="ruleClass">
|
|
780
780
|
<LabeledInput
|
|
781
781
|
:value="getRule('apiGroups', props.row.value)"
|
|
782
782
|
:disabled="isBuiltin"
|
|
@@ -788,6 +788,7 @@ export default {
|
|
|
788
788
|
|
|
789
789
|
<!-- 非命名空间 URL 输入(仅非命名空间模式显示) -->
|
|
790
790
|
<div
|
|
791
|
+
class="arrayListCls"
|
|
791
792
|
v-if="!isNamespaced"
|
|
792
793
|
:class="ruleClass"
|
|
793
794
|
>
|
|
@@ -859,6 +860,9 @@ export default {
|
|
|
859
860
|
</template>
|
|
860
861
|
|
|
861
862
|
<style lang="scss" scoped>
|
|
863
|
+
.arrayListCls {
|
|
864
|
+
min-width: 360px;
|
|
865
|
+
}
|
|
862
866
|
.ruleCls {
|
|
863
867
|
margin-right: 10px;
|
|
864
868
|
}
|
|
@@ -1,54 +1,18 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import { Banner } from '@components/Banner';
|
|
3
2
|
import { get } from '@shell/utils/object';;
|
|
4
|
-
import {
|
|
5
|
-
AS, _DETAIL, _CONFIG, _YAML, MODE, _CREATE, _EDIT, _VIEW, _UNFLAG, _GRAPH
|
|
6
|
-
} from '@shell/config/query-params';
|
|
7
|
-
import { ExtensionPoint, PanelLocation } from '@shell/core/types';
|
|
8
3
|
import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
|
|
9
4
|
import { useStore } from 'vuex';
|
|
10
5
|
|
|
11
|
-
// i18n-uses resourceDetail.header.*
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Resource Detail Masthead component.
|
|
15
|
-
*
|
|
16
|
-
* ToDo: this component seem to be picking up a lot of logic from special cases, could be simplified down to parameters and then customized per use-case via wrapper component
|
|
17
|
-
*/
|
|
18
6
|
export default {
|
|
19
7
|
|
|
20
|
-
name: '
|
|
8
|
+
name: 'MastheadBreadcrumb',
|
|
21
9
|
|
|
22
10
|
components: {
|
|
23
|
-
// BadgeState,
|
|
24
|
-
Banner,
|
|
25
11
|
},
|
|
26
12
|
props: {
|
|
27
|
-
|
|
28
|
-
type: Object,
|
|
29
|
-
default: () => {
|
|
30
|
-
return {};
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
mode: {
|
|
35
|
-
type: String,
|
|
36
|
-
default: 'view'
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
realMode: {
|
|
40
|
-
type: String,
|
|
41
|
-
default: 'view'
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
as: {
|
|
13
|
+
resourceTypeLabel: {
|
|
45
14
|
type: String,
|
|
46
|
-
default:
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
storeOverride: {
|
|
50
|
-
type: String,
|
|
51
|
-
default: null,
|
|
15
|
+
default: ''
|
|
52
16
|
},
|
|
53
17
|
|
|
54
18
|
resource: {
|
|
@@ -56,15 +20,10 @@ export default {
|
|
|
56
20
|
default: null,
|
|
57
21
|
},
|
|
58
22
|
|
|
59
|
-
|
|
60
|
-
type: String,
|
|
61
|
-
default: null,
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
parentRouteOverride: {
|
|
23
|
+
realMode: {
|
|
65
24
|
type: String,
|
|
66
|
-
default:
|
|
67
|
-
}
|
|
25
|
+
default: 'view',
|
|
26
|
+
}
|
|
68
27
|
|
|
69
28
|
},
|
|
70
29
|
|
|
@@ -77,82 +36,10 @@ export default {
|
|
|
77
36
|
|
|
78
37
|
data() {
|
|
79
38
|
return {
|
|
80
|
-
DETAIL_VIEW: _DETAIL,
|
|
81
|
-
extensionType: ExtensionPoint.PANEL,
|
|
82
|
-
extensionLocation: PanelLocation.DETAILS_MASTHEAD,
|
|
83
|
-
Svg: require('~shell/assets/images/API.svg')
|
|
84
39
|
};
|
|
85
40
|
},
|
|
86
41
|
|
|
87
42
|
computed: {
|
|
88
|
-
dev() {
|
|
89
|
-
return this.$store.getters['prefs/dev'];
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
schema() {
|
|
93
|
-
const inStore = this.storeOverride || this.$store.getters['currentStore'](this.resource);
|
|
94
|
-
|
|
95
|
-
return this.$store.getters[`${ inStore }/schemaFor`]( this.resource );
|
|
96
|
-
},
|
|
97
|
-
|
|
98
|
-
isProjectHelmChart() {
|
|
99
|
-
return this.schema?.id === HELM.PROJECTHELMCHART;
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
shouldHifenize() {
|
|
103
|
-
return (this.mode === 'view' || this.mode === 'edit') && this.resourceSubtype?.length && this.value?.nameDisplay?.length;
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
parent() {
|
|
107
|
-
const displayName = this.value?.parentNameOverride || this.$store.getters['type-map/labelFor'](this.schema);
|
|
108
|
-
const product = this.$store.getters['currentProduct'].name;
|
|
109
|
-
|
|
110
|
-
const defaultLocation = {
|
|
111
|
-
name: 'c-cluster-product-resource',
|
|
112
|
-
params: {
|
|
113
|
-
resource: this.resource,
|
|
114
|
-
product,
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const location = this.value?.parentLocationOverride || defaultLocation;
|
|
119
|
-
|
|
120
|
-
if (this.parentRouteOverride) {
|
|
121
|
-
location.name = this.parentRouteOverride;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const typeOptions = this.$store.getters[`type-map/optionsFor`]( this.resource );
|
|
125
|
-
|
|
126
|
-
// 转换为中文
|
|
127
|
-
const displayName_zh_hans = {
|
|
128
|
-
'GlobalRole': '全局角色',
|
|
129
|
-
'RoleTemplate': '集群角色',
|
|
130
|
-
}
|
|
131
|
-
if (displayName_zh_hans[displayName]) {
|
|
132
|
-
displayName = displayName_zh_hans[displayName]
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (displayName == '集群角色' && (this.$route.query?.roleContext == 'NAMESPACE' || location.hash == '#NAMESPACE')) {
|
|
136
|
-
displayName = '项目或资源组角色'
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const out = {
|
|
140
|
-
displayName, location, ...typeOptions
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
return out;
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
displayName() {
|
|
148
|
-
let displayName = this.value.nameDisplay;
|
|
149
|
-
|
|
150
|
-
if (this.isProjectHelmChart) {
|
|
151
|
-
displayName = this.value.projectDisplayName;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return this.shouldHifenize ? ` - ${ displayName }` : displayName;
|
|
155
|
-
},
|
|
156
43
|
|
|
157
44
|
demoDisplay() {
|
|
158
45
|
|
|
@@ -177,12 +64,6 @@ export default {
|
|
|
177
64
|
return partsEn;
|
|
178
65
|
},
|
|
179
66
|
|
|
180
|
-
location() {
|
|
181
|
-
const { parent } = this;
|
|
182
|
-
|
|
183
|
-
return parent?.location;
|
|
184
|
-
},
|
|
185
|
-
|
|
186
67
|
},
|
|
187
68
|
|
|
188
69
|
methods: {
|
|
@@ -206,7 +87,7 @@ export default {
|
|
|
206
87
|
<span>/</span>
|
|
207
88
|
</span>
|
|
208
89
|
<span class="excram-last-name">
|
|
209
|
-
{{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') +
|
|
90
|
+
{{ (realMode === 'view'? '查看': realMode === 'edit' ? '编辑':'创建') + resourceTypeLabel }}
|
|
210
91
|
</span>
|
|
211
92
|
</div>
|
|
212
93
|
</div>
|
|
@@ -215,71 +96,6 @@ export default {
|
|
|
215
96
|
|
|
216
97
|
<style lang='scss' scoped>
|
|
217
98
|
|
|
218
|
-
HEADER {
|
|
219
|
-
margin: 0;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
.primaryheader {
|
|
223
|
-
display: flex;
|
|
224
|
-
flex-direction: row;
|
|
225
|
-
align-items: center;
|
|
226
|
-
font-size:14px;
|
|
227
|
-
height: 50px;
|
|
228
|
-
|
|
229
|
-
h1 {
|
|
230
|
-
margin: 0;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
.subheader{
|
|
235
|
-
display: flex;
|
|
236
|
-
flex-direction: row;
|
|
237
|
-
color: var(--input-label);
|
|
238
|
-
& > * {
|
|
239
|
-
margin: 5px 20px 5px 0px;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
.live-data {
|
|
243
|
-
color: var(--body-text)
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
.state-banner {
|
|
248
|
-
margin: 3px 0 0 0;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
.masthead-state {
|
|
252
|
-
font-size: initial;
|
|
253
|
-
display: inline-block;
|
|
254
|
-
position: relative;
|
|
255
|
-
/* top: -2px; */
|
|
256
|
-
font-size: 12px;
|
|
257
|
-
margin-left: 5px;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
.masthead-istio {
|
|
261
|
-
.icon {
|
|
262
|
-
vertical-align: middle;
|
|
263
|
-
color: var(--primary);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
.left-right-split {
|
|
268
|
-
display: grid;
|
|
269
|
-
align-items: center;
|
|
270
|
-
|
|
271
|
-
.left-half {
|
|
272
|
-
grid-column: 1;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.right-half {
|
|
276
|
-
grid-column: 2;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
.resource-external {
|
|
281
|
-
font-size: 18px;
|
|
282
|
-
}
|
|
283
99
|
.excram-list{
|
|
284
100
|
font-size: 14px;
|
|
285
101
|
margin-bottom: 20px;
|
|
@@ -287,10 +103,7 @@ export default {
|
|
|
287
103
|
.excram-last-name{
|
|
288
104
|
color: var(--link);
|
|
289
105
|
}
|
|
290
|
-
|
|
291
|
-
color: #d7d7d7;
|
|
292
|
-
margin: 0px 10px;
|
|
293
|
-
}
|
|
106
|
+
|
|
294
107
|
.detailIcon-span{
|
|
295
108
|
width: 24px;
|
|
296
109
|
height: 24px;
|
|
@@ -306,11 +119,5 @@ export default {
|
|
|
306
119
|
left: 4px;
|
|
307
120
|
top: -2px;
|
|
308
121
|
}
|
|
309
|
-
|
|
310
|
-
display: flex;
|
|
311
|
-
align-items: center;
|
|
312
|
-
}
|
|
313
|
-
.detailIcon-span-title{
|
|
314
|
-
font-weight: bold;
|
|
315
|
-
}
|
|
122
|
+
|
|
316
123
|
</style>
|
|
@@ -392,6 +392,10 @@ export default {
|
|
|
392
392
|
.unlabeled-select {
|
|
393
393
|
position: relative;
|
|
394
394
|
|
|
395
|
+
:deep() .vs__actions:after {
|
|
396
|
+
padding-top: 2px;
|
|
397
|
+
}
|
|
398
|
+
|
|
395
399
|
:deep() .v-select.select-input-view {
|
|
396
400
|
.vs__actions {
|
|
397
401
|
visibility: hidden;
|
|
@@ -409,7 +413,8 @@ export default {
|
|
|
409
413
|
|
|
410
414
|
:deep() .vs__selected-options {
|
|
411
415
|
display: flex;
|
|
412
|
-
|
|
416
|
+
align-items: center;
|
|
417
|
+
margin: 0px;
|
|
413
418
|
|
|
414
419
|
.vs__selected {
|
|
415
420
|
width: initial;
|
package/package.json
CHANGED
package/scripts/publish-shell.sh
CHANGED
|
@@ -1,5 +1,145 @@
|
|
|
1
1
|
{
|
|
2
2
|
"translations": [
|
|
3
|
+
{
|
|
4
|
+
"pattern": "The new password must not be the same as the current password",
|
|
5
|
+
"replacement": "新密码不能与当前密码相同,请重新设置",
|
|
6
|
+
"flags": "gi"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"pattern": "guest memory is greater than the configured maxguest memory",
|
|
10
|
+
"replacement": "内存已超过所配置的最大客户机内存",
|
|
11
|
+
"flags": "gi"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"pattern": "memory hotplug is only available for vms with at least (\\d+[a-z]*) of guest memory",
|
|
15
|
+
"replacement": "内存热插拔仅适用于客户机内存至少为 $1 的虚拟机",
|
|
16
|
+
"flags": "gi"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"pattern": "storage class must contain csi\\.storage\\.k8s\\.io/(provisioner-secret-name|provisioner-secret-namespace|node-stage-secret-name|node-stage-secret-namespace|node-publish-secret-name|node-publish-secret-namespace)(?:,\\s*)?(.*)",
|
|
20
|
+
"replacement": "存储池必须包含以下 CSI 密钥注解:$1$2",
|
|
21
|
+
"flags": "gi"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"pattern": "sourceimagename is required when image source type is \"clone\"",
|
|
25
|
+
"replacement": "镜像来源类型为“克隆”时,必须填写源镜像名称",
|
|
26
|
+
"flags": "gi"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"pattern": "([^\"\\s]+) exceeds the file size limit of (\\d+) bytes",
|
|
30
|
+
"replacement": "文件 '$1' 超过大小限制 $2 字节",
|
|
31
|
+
"flags": "gi"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"pattern": "failure while starting vmi: virtualmachineinstance\\.kubevirt\\.io \"([^\"]+)\" is invalid: metadata\\.labels: invalid value: \"([^\"]+)\": name part must consist of alphanumeric characters, '-', '_' or '\\.', and must start and end with an alphanumeric character",
|
|
35
|
+
"replacement": "启动虚拟机实例失败:'$1' 标签值 '$2' 无效,只能包含字母、数字、'-','_'或'.',且以字母/数字开头和结尾",
|
|
36
|
+
"flags": "gi"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"pattern": "virtualmachine\\.kubevirt\\.io \"([^\"]+)\" is invalid:[\\s\\S]*?metadata\\.labels: invalid value: \"([^\"]*)\"[\\s\\S]*?regex used for validation is '([^']+)'",
|
|
40
|
+
"replacement": "虚拟机 '$1' 标签值 '$2' 无效:只能包含字母、数字、'-','_' 或 '.',且以字母/数字开头结尾(正则:$3)",
|
|
41
|
+
"flags": "gi"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"pattern": "virtualmachine\\.kubevirt\\.io \"([^\"]+)\" is invalid:[\\s\\S]*?spec\\.template: Invalid value: corev1\\.PodTemplateSpec \\{[\\s\\S]*?spec: corev1\\.PodSpec \\{[\\s\\S]*?containers: \\[corev1\\.Container \\{[\\s\\S]*?image: \"([^\"]*)\",[\\s\\S]*?\\}\\],[\\s\\S]*?nodeSelector: map\\[([^:]+): ([^\\]]+)\\],[\\s\\S]*?\\},[\\s\\S]*?\\},[\\s\\S]*?\\},[\\s\\S]*?regex used for validation is '([^']+)'",
|
|
45
|
+
"replacement": "虚拟机 '$1' 的镜像 '$2' 无法在节点标签 '$3=$4' 的节点上运行(正则:$5)",
|
|
46
|
+
"flags": "gi"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"pattern": "role is locked and cannot be assigned",
|
|
50
|
+
"replacement": "角色已被锁定,不能再分配",
|
|
51
|
+
"flags": "gi"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"pattern": "invalid current password",
|
|
55
|
+
"replacement": "当前密码输入错误,请重新输入",
|
|
56
|
+
"flags": "gi"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"pattern": "spec\\.template\\.spec\\.podaffinity\\.requiredduringschedulingignoredduringexecution\\[(\\d+)\\]\\.topologykey: required value: can not be empty[\\s\\S]*?regex used for validation is '([^']+)'",
|
|
60
|
+
"replacement": "拓扑键不能为空",
|
|
61
|
+
"flags": "gi"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"pattern": "pcidevice ([^\\s]+) has no iommugroup available",
|
|
65
|
+
"replacement": "PCI 设备 '$1' 没有可用的 IOMMU 组",
|
|
66
|
+
"flags": "gi"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"pattern": "invalidbodycontent 422: failed to parse totalsnapshotsizequota: quantities must match the regular expression '\\^\\(\\[\\+\\-\\]\\?\\[0-9\\.\\]\\+\\)\\(\\[eeinumkkmgtp\\]\\*\\[\\-\\+\\]\\?\\[0-9\\]\\*\\)\\$'",
|
|
70
|
+
"replacement": "快照配额不能为空",
|
|
71
|
+
"flags": "gi"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"pattern": "secrets \"([^\"]+)\" already exists",
|
|
75
|
+
"replacement": "密钥 \"$1\" 已存在",
|
|
76
|
+
"flags": "gi"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"pattern": "backup target is invalid",
|
|
80
|
+
"replacement": "备份目标无效",
|
|
81
|
+
"flags": "gi"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"pattern": "failed to list objects with param:[\\s\\S]*?server gave http response to https client",
|
|
85
|
+
"replacement": "列举对象失败:服务器返回 HTTP 响应,但客户端使用 HTTPS,请检查协议配置",
|
|
86
|
+
"flags": "gi"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"pattern": "clusternetwork\\.network\\.harvesterhci\\.io \"([^\"]+)\" is invalid: metadata\\.name: invalid value: \"([^\"]*)\": a lowercase rfc 1123 subdomain must consist of lower case alphanumeric characters, '-' or '\\.', and must start and end with an alphanumeric character",
|
|
90
|
+
"replacement": "集群网络名称 '$1' 无效:须符合 RFC 1123 子域名规则,只能使用小写字母、数字、'-' 或 '.',且以字母或数字开头和结尾",
|
|
91
|
+
"flags": "gi"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"pattern": "loadbalancer\\.loadbalancer\\.harvesterhci\\.io \"([^\"]+)\" is invalid: \\[spec\\.listeners\\[(\\d+)\\]\\.(backendport|port): required value[^\\]]*\\]",
|
|
95
|
+
"replacement": "负载均衡器 '$1' 配置无效:第 $2 个监听器的 $3 为必填项",
|
|
96
|
+
"flags": "gi"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"pattern": "can't delete cluster network (\\S+) because vlanconfig\\(s\\) \\[(.*?)\\] under this clusternetwork are still existing",
|
|
100
|
+
"replacement": "无法删除集群网络 '$1',因其下仍存在 VLAN 配置 [$2]",
|
|
101
|
+
"flags": "gi"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"pattern": "value: (\\d+) must be in range \\[1 \\.\\. (\\d+)\\]",
|
|
105
|
+
"replacement": "值 $1 超出范围,必须在 1–$2 之间",
|
|
106
|
+
"flags": "gi"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"pattern": "can't delete vlanconfig (\\S+) because it is blocked by vm\\(s\\) ([^/]+)/(\\S+) which must be stopped at first",
|
|
110
|
+
"replacement": "无法删除 VLAN 配置 '$1':需先停止虚拟机 '$2/$3'",
|
|
111
|
+
"flags": "gi"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"pattern": "cannot find nfs path",
|
|
115
|
+
"replacement": "无法找到 NFS 路径",
|
|
116
|
+
"flags": "gi"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"pattern": "get \"([^\"]+)\": unsupported protocol scheme \"\"",
|
|
120
|
+
"replacement": "url 无效",
|
|
121
|
+
"flags": "gi"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"pattern": "cannot mount nfs ([^\\s]+)[\\s\\S]*?no such file or directory[\\s\\S]*?cannot mount using nfsv4",
|
|
125
|
+
"replacement": "备份存储的端点无法访问",
|
|
126
|
+
"flags": "gi"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"pattern": "can't create nad ([^/]+)/([^\\s]+) because the gateway ([^\\s]+) is invalid",
|
|
130
|
+
"replacement": "无法创建虚拟网络 '$1/$2',因为网关 '$3' 无效",
|
|
131
|
+
"flags": "gi"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"pattern": "can't create nad ([^/]+)/([^\\s]+) because the cidr ([^\\s]+) is invalid",
|
|
135
|
+
"replacement": "无法创建虚拟网络 '$1/$2',因为 CIDR '$3' 无效",
|
|
136
|
+
"flags": "gi"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"pattern": "no matching backup found for url ([^\\s]+) and backing image ([^\\s]+)",
|
|
140
|
+
"replacement": "未找到与 URL $1 和镜像 $2 匹配的备份",
|
|
141
|
+
"flags": "gi"
|
|
142
|
+
},
|
|
3
143
|
{
|
|
4
144
|
"pattern": "take virtual machine snapshot ([^\\s]+) successfully\\.",
|
|
5
145
|
"replacement": "虚拟机快照 '$1' 创建成功。",
|
|
@@ -70,11 +210,17 @@
|
|
|
70
210
|
"replacement": "无效的下一跳地址",
|
|
71
211
|
"flags": "gi"
|
|
72
212
|
},
|
|
213
|
+
{
|
|
214
|
+
"pattern": "number of sockets in cpu topology is greater than the maximum sockets allowed, number of sockets in cpu topology is greater than the maximum sockets allowed",
|
|
215
|
+
"replacement": "CPU 拓扑中的 socket 数量已超过最大允许值",
|
|
216
|
+
"flags": "gi"
|
|
217
|
+
},
|
|
73
218
|
{
|
|
74
219
|
"pattern": "number of sockets in cpu topology is greater than the maximum sockets allowed",
|
|
75
220
|
"replacement": "CPU 拓扑中的 socket 数量已超过最大允许值",
|
|
76
221
|
"flags": "gi"
|
|
77
222
|
},
|
|
223
|
+
|
|
78
224
|
{
|
|
79
225
|
"pattern": "not a default subnet join as provider is ([^\\s]+)",
|
|
80
226
|
"replacement": "非默认子网,当前以提供者 $1 加入",
|
|
@@ -87,7 +233,7 @@
|
|
|
87
233
|
},
|
|
88
234
|
{
|
|
89
235
|
"pattern": "validation failed in api: vpc.kubeovn.io \"([^\"]*)\" is invalid: metadata\\.name: invalid value: \"([^\"]*)\": a lowercase rfc 1123 subdomain must consist of lower case alphanumeric characters, '-' or '\\.', and must start and end with an alphanumeric character \\(e\\.g\\..*?\\)",
|
|
90
|
-
"replacement": "
|
|
236
|
+
"replacement": "校验失败:VPC 名称 \"$1\" 不符合 RFC 1123 子域名规则,只能使用小写字母、数字、'-' 或 '.',且必须以字母/数字开头和结尾",
|
|
91
237
|
"flags": "gi"
|
|
92
238
|
},
|
|
93
239
|
{
|
|
@@ -1423,6 +1569,10 @@
|
|
|
1423
1569
|
"pattern": ""备份" 是必填项。",
|
|
1424
1570
|
"replacement": "\"快照/备份\" 是必填项"
|
|
1425
1571
|
},
|
|
1572
|
+
{
|
|
1573
|
+
"pattern": "namespaces",
|
|
1574
|
+
"replacement": "资源组"
|
|
1575
|
+
},
|
|
1426
1576
|
{
|
|
1427
1577
|
"pattern": "%",
|
|
1428
1578
|
"replacement": ""
|