@sparkelf/dsh-dataops-managed 0.3.11 → 0.3.12
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/lib/client.js +89 -154
- package/lib/client.js.map +1 -1
- package/lib/index.js +271 -21
- package/lib/types/client/locales.d.ts +8 -14
- package/lib/types/client/model-sync-client.d.ts +17 -0
- package/lib/types/index.d.ts +17 -0
- package/lib/types/model-sync.d.ts +18 -0
- package/lib/types/settings-sync.d.ts +103 -0
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -64,6 +64,17 @@ window.__ModuleLoader__.load({
|
|
|
64
64
|
id: model.id,
|
|
65
65
|
shared: model.shared === true
|
|
66
66
|
}] : [];
|
|
67
|
+
}) : [],
|
|
68
|
+
sections: Array.isArray(record.sections) ? record.sections.flatMap((entry) => {
|
|
69
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) return [];
|
|
70
|
+
const section = entry;
|
|
71
|
+
if (typeof section.ns !== "string" || section.ns === "") return [];
|
|
72
|
+
return [{
|
|
73
|
+
ns: section.ns,
|
|
74
|
+
followState: section.followState === "detached" ? "detached" : "following",
|
|
75
|
+
applied: section.applied === true,
|
|
76
|
+
mounted: section.mounted === true
|
|
77
|
+
}];
|
|
67
78
|
}) : []
|
|
68
79
|
};
|
|
69
80
|
}
|
|
@@ -107,24 +118,24 @@ window.__ModuleLoader__.load({
|
|
|
107
118
|
document.head.appendChild(tag);
|
|
108
119
|
}
|
|
109
120
|
var ManagedDataOpsSection_module_css_default = {
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"title": "_2dqzjG_title",
|
|
113
|
-
"modelDescription": "_2dqzjG_modelDescription",
|
|
114
|
-
"modelId": "_2dqzjG_modelId",
|
|
121
|
+
"statusRow": "_2dqzjG_statusRow",
|
|
122
|
+
"section": "_2dqzjG_section",
|
|
115
123
|
"description": "_2dqzjG_description",
|
|
116
|
-
"
|
|
117
|
-
"
|
|
124
|
+
"switch": "_2dqzjG_switch",
|
|
125
|
+
"modelId": "_2dqzjG_modelId",
|
|
126
|
+
"modelTitle": "_2dqzjG_modelTitle",
|
|
118
127
|
"detailRow": "_2dqzjG_detailRow",
|
|
119
|
-
"details": "_2dqzjG_details",
|
|
120
|
-
"section": "_2dqzjG_section",
|
|
121
128
|
"modelPanel": "_2dqzjG_modelPanel",
|
|
122
|
-
"modelTitle": "_2dqzjG_modelTitle",
|
|
123
|
-
"statusRow": "_2dqzjG_statusRow",
|
|
124
|
-
"switch": "_2dqzjG_switch",
|
|
125
129
|
"modelListTitle": "_2dqzjG_modelListTitle",
|
|
130
|
+
"title": "_2dqzjG_title",
|
|
126
131
|
"brandingCopy": "_2dqzjG_brandingCopy",
|
|
127
|
-
"
|
|
132
|
+
"modelAction": "_2dqzjG_modelAction",
|
|
133
|
+
"modelList": "_2dqzjG_modelList",
|
|
134
|
+
"details": "_2dqzjG_details",
|
|
135
|
+
"brandingRow": "_2dqzjG_brandingRow",
|
|
136
|
+
"modelListDescription": "_2dqzjG_modelListDescription",
|
|
137
|
+
"modelRow": "_2dqzjG_modelRow",
|
|
138
|
+
"modelDescription": "_2dqzjG_modelDescription"
|
|
128
139
|
};
|
|
129
140
|
//#endregion
|
|
130
141
|
//#region src/client/ManagedDataOpsSection.tsx
|
|
@@ -170,7 +181,7 @@ window.__ModuleLoader__.load({
|
|
|
170
181
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {})
|
|
171
182
|
})]
|
|
172
183
|
}),
|
|
173
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
184
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PublishDefaults, { t }),
|
|
174
185
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
|
|
175
186
|
className: ManagedDataOpsSection_module_css_default.details,
|
|
176
187
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -185,15 +196,16 @@ window.__ModuleLoader__.load({
|
|
|
185
196
|
});
|
|
186
197
|
}
|
|
187
198
|
/**
|
|
188
|
-
*
|
|
199
|
+
* Publish this workspace's configuration as the default other users start from.
|
|
189
200
|
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
201
|
+
* One action rather than a set of controls: the configuration is whatever this workspace already
|
|
202
|
+
* holds -- the models, the permission default, the general settings -- and the button copies it to
|
|
203
|
+
* DataOps. Every other user's workspace takes that copy as its starting values and may then change
|
|
204
|
+
* anything, at which point their own version wins and this button never reaches it again.
|
|
193
205
|
* @param props - Translate function from the section.
|
|
194
|
-
* @returns The
|
|
206
|
+
* @returns The publish row.
|
|
195
207
|
*/
|
|
196
|
-
function
|
|
208
|
+
function PublishDefaults({ t }) {
|
|
197
209
|
const [state, setState] = (0, react.useState)({ kind: "loading" });
|
|
198
210
|
const [busy, setBusy] = (0, react.useState)(false);
|
|
199
211
|
const refresh = (0, react.useCallback)(async () => {
|
|
@@ -210,10 +222,10 @@ window.__ModuleLoader__.load({
|
|
|
210
222
|
(0, react.useEffect)(() => {
|
|
211
223
|
refresh();
|
|
212
224
|
}, [refresh]);
|
|
213
|
-
const
|
|
225
|
+
const publish = (0, react.useCallback)(async () => {
|
|
214
226
|
setBusy(true);
|
|
215
227
|
try {
|
|
216
|
-
const status = await postModelSyncAction(
|
|
228
|
+
const status = await postModelSyncAction({ action: "publish-defaults" });
|
|
217
229
|
if (status !== null) setState({
|
|
218
230
|
kind: "ready",
|
|
219
231
|
status
|
|
@@ -225,117 +237,52 @@ window.__ModuleLoader__.load({
|
|
|
225
237
|
}
|
|
226
238
|
}, []);
|
|
227
239
|
if (state.kind === "loading") return null;
|
|
228
|
-
if (state.kind === "unavailable") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
240
|
+
if (state.kind === "unavailable" || state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
229
241
|
className: ManagedDataOpsSection_module_css_default.modelPanel,
|
|
230
242
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
231
243
|
className: ManagedDataOpsSection_module_css_default.modelTitle,
|
|
232
|
-
children: t("
|
|
244
|
+
children: t("defaultsTitle")
|
|
233
245
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
234
246
|
className: ManagedDataOpsSection_module_css_default.modelDescription,
|
|
235
|
-
|
|
247
|
+
role: state.kind === "failed" ? "alert" : void 0,
|
|
248
|
+
children: state.kind === "failed" ? t("loadFailed") : t("modelsUnavailable")
|
|
236
249
|
})]
|
|
237
250
|
});
|
|
238
|
-
|
|
251
|
+
const { status } = state;
|
|
252
|
+
if (!status.canPublish) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
239
253
|
className: ManagedDataOpsSection_module_css_default.modelPanel,
|
|
240
254
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
241
255
|
className: ManagedDataOpsSection_module_css_default.modelTitle,
|
|
242
|
-
children: t("
|
|
256
|
+
children: t("defaultsTitle")
|
|
243
257
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
244
258
|
className: ManagedDataOpsSection_module_css_default.modelDescription,
|
|
245
|
-
|
|
246
|
-
children: t("loadFailed")
|
|
259
|
+
children: t("defaultsNotAdmin")
|
|
247
260
|
})]
|
|
248
261
|
});
|
|
249
|
-
const { status } = state;
|
|
250
|
-
const following = status.followState === "following";
|
|
251
262
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
252
263
|
className: ManagedDataOpsSection_module_css_default.modelPanel,
|
|
253
264
|
children: [
|
|
254
265
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
255
266
|
className: ManagedDataOpsSection_module_css_default.modelTitle,
|
|
256
|
-
children: t("
|
|
267
|
+
children: t("defaultsTitle")
|
|
257
268
|
}),
|
|
258
269
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
259
270
|
className: ManagedDataOpsSection_module_css_default.modelDescription,
|
|
260
|
-
children: t("
|
|
271
|
+
children: t("defaultsDescription")
|
|
261
272
|
}),
|
|
262
|
-
|
|
263
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
264
|
-
className: ManagedDataOpsSection_module_css_default.brandingRow,
|
|
265
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
266
|
-
className: ManagedDataOpsSection_module_css_default.brandingCopy,
|
|
267
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("syncTitle") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("syncDescription") })]
|
|
268
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
269
|
-
type: "button",
|
|
270
|
-
className: ManagedDataOpsSection_module_css_default.switch,
|
|
271
|
-
role: "switch",
|
|
272
|
-
"aria-label": t("syncToggle"),
|
|
273
|
-
"aria-checked": status.publisherSharing,
|
|
274
|
-
"data-checked": status.publisherSharing,
|
|
275
|
-
disabled: busy,
|
|
276
|
-
onClick: () => {
|
|
277
|
-
act({
|
|
278
|
-
action: "publish",
|
|
279
|
-
sharingEnabled: !status.publisherSharing
|
|
280
|
-
});
|
|
281
|
-
},
|
|
282
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {})
|
|
283
|
-
})]
|
|
284
|
-
}),
|
|
285
|
-
status.publisherSharing && status.models.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
286
|
-
className: ManagedDataOpsSection_module_css_default.modelList,
|
|
287
|
-
children: [
|
|
288
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
|
|
289
|
-
className: ManagedDataOpsSection_module_css_default.modelListTitle,
|
|
290
|
-
children: t("modelsListTitle")
|
|
291
|
-
}),
|
|
292
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
293
|
-
className: ManagedDataOpsSection_module_css_default.modelListDescription,
|
|
294
|
-
children: t("modelsListDescription")
|
|
295
|
-
}),
|
|
296
|
-
status.models.map((model) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
297
|
-
className: ManagedDataOpsSection_module_css_default.modelRow,
|
|
298
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
|
|
299
|
-
className: ManagedDataOpsSection_module_css_default.modelId,
|
|
300
|
-
children: model.id
|
|
301
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
302
|
-
type: "button",
|
|
303
|
-
className: ManagedDataOpsSection_module_css_default.switch,
|
|
304
|
-
role: "switch",
|
|
305
|
-
"aria-label": t("modelShareLabel") + ": " + model.id,
|
|
306
|
-
"aria-checked": model.shared,
|
|
307
|
-
"data-checked": model.shared,
|
|
308
|
-
disabled: busy,
|
|
309
|
-
onClick: () => {
|
|
310
|
-
const next = model.shared ? [...status.privateModelIds, model.id] : status.privateModelIds.filter((id) => id !== model.id);
|
|
311
|
-
act({
|
|
312
|
-
action: "private-models",
|
|
313
|
-
privateModelIds: next,
|
|
314
|
-
sharingEnabled: true
|
|
315
|
-
});
|
|
316
|
-
},
|
|
317
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {})
|
|
318
|
-
})]
|
|
319
|
-
}, model.id))
|
|
320
|
-
]
|
|
321
|
-
}) : null,
|
|
322
|
-
status.publisherSharing && status.models.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
323
|
-
className: ManagedDataOpsSection_module_css_default.modelDescription,
|
|
324
|
-
children: t("modelsEmpty")
|
|
325
|
-
}) : null
|
|
326
|
-
] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
273
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
327
274
|
className: ManagedDataOpsSection_module_css_default.brandingRow,
|
|
328
275
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
329
276
|
className: ManagedDataOpsSection_module_css_default.brandingCopy,
|
|
330
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children:
|
|
331
|
-
}),
|
|
277
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("defaultsActionTitle") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: status.publishedAt === null ? t("defaultsNeverPublished") : t("defaultsPublishedAt") + " " + status.publishedAt })]
|
|
278
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
332
279
|
type: "button",
|
|
333
280
|
className: ManagedDataOpsSection_module_css_default.modelAction,
|
|
334
281
|
disabled: busy,
|
|
335
282
|
onClick: () => {
|
|
336
|
-
|
|
283
|
+
publish();
|
|
337
284
|
},
|
|
338
|
-
children: busy ? t("
|
|
285
|
+
children: busy ? t("defaultsPublishing") : t("defaultsPublish")
|
|
339
286
|
})]
|
|
340
287
|
})
|
|
341
288
|
]
|
|
@@ -415,28 +362,28 @@ window.__ModuleLoader__.load({
|
|
|
415
362
|
document.head.appendChild(tag);
|
|
416
363
|
}
|
|
417
364
|
var SkillPlazaSection_module_css_default = {
|
|
418
|
-
"head": "_9FdZvq_head",
|
|
419
|
-
"titleIcon": "_9FdZvq_titleIcon",
|
|
420
|
-
"cardHead": "_9FdZvq_cardHead",
|
|
421
|
-
"mine": "_9FdZvq_mine",
|
|
422
|
-
"intro": "_9FdZvq_intro",
|
|
423
|
-
"cardTitle": "_9FdZvq_cardTitle",
|
|
424
|
-
"emptyIcon": "_9FdZvq_emptyIcon",
|
|
425
|
-
"title": "_9FdZvq_title",
|
|
426
365
|
"search": "_9FdZvq_search",
|
|
427
|
-
"cardMain": "_9FdZvq_cardMain",
|
|
428
366
|
"cards": "_9FdZvq_cards",
|
|
429
|
-
"
|
|
430
|
-
"tagBar": "_9FdZvq_tagBar",
|
|
431
|
-
"cardIcon": "_9FdZvq_cardIcon",
|
|
367
|
+
"cardMain": "_9FdZvq_cardMain",
|
|
432
368
|
"cardMarks": "_9FdZvq_cardMarks",
|
|
369
|
+
"intro": "_9FdZvq_intro",
|
|
433
370
|
"toolbar": "_9FdZvq_toolbar",
|
|
371
|
+
"emptyText": "_9FdZvq_emptyText",
|
|
372
|
+
"notice": "_9FdZvq_notice",
|
|
434
373
|
"section": "_9FdZvq_section",
|
|
374
|
+
"card": "_9FdZvq_card",
|
|
375
|
+
"cardIcon": "_9FdZvq_cardIcon",
|
|
376
|
+
"title": "_9FdZvq_title",
|
|
377
|
+
"cardDesc": "_9FdZvq_cardDesc",
|
|
378
|
+
"tagBar": "_9FdZvq_tagBar",
|
|
435
379
|
"cardEnd": "_9FdZvq_cardEnd",
|
|
436
|
-
"notice": "_9FdZvq_notice",
|
|
437
380
|
"empty": "_9FdZvq_empty",
|
|
438
|
-
"
|
|
439
|
-
"
|
|
381
|
+
"cardHead": "_9FdZvq_cardHead",
|
|
382
|
+
"cardTitle": "_9FdZvq_cardTitle",
|
|
383
|
+
"mine": "_9FdZvq_mine",
|
|
384
|
+
"emptyIcon": "_9FdZvq_emptyIcon",
|
|
385
|
+
"titleIcon": "_9FdZvq_titleIcon",
|
|
386
|
+
"head": "_9FdZvq_head"
|
|
440
387
|
};
|
|
441
388
|
//#endregion
|
|
442
389
|
//#region src/client/SkillPlazaSection.tsx
|
|
@@ -688,18 +635,18 @@ window.__ModuleLoader__.load({
|
|
|
688
635
|
document.head.appendChild(tag);
|
|
689
636
|
}
|
|
690
637
|
var WanxiangBrand_module_css_default = {
|
|
691
|
-
"harness": "s0HPxG_harness",
|
|
692
|
-
"unitTop": "s0HPxG_unitTop",
|
|
693
|
-
"unitRight": "s0HPxG_unitRight",
|
|
694
|
-
"animatedMark": "s0HPxG_animatedMark",
|
|
695
|
-
"unit-right": "s0HPxG_unit-right",
|
|
696
638
|
"unit-core": "s0HPxG_unit-core",
|
|
697
|
-
"unitLeft": "s0HPxG_unitLeft",
|
|
698
|
-
"unitCore": "s0HPxG_unitCore",
|
|
699
|
-
"sidebarName": "s0HPxG_sidebarName",
|
|
700
639
|
"unit-top": "s0HPxG_unit-top",
|
|
640
|
+
"mark": "s0HPxG_mark",
|
|
641
|
+
"unit-right": "s0HPxG_unit-right",
|
|
701
642
|
"unit-left": "s0HPxG_unit-left",
|
|
702
|
-
"
|
|
643
|
+
"unitLeft": "s0HPxG_unitLeft",
|
|
644
|
+
"unitRight": "s0HPxG_unitRight",
|
|
645
|
+
"sidebarName": "s0HPxG_sidebarName",
|
|
646
|
+
"animatedMark": "s0HPxG_animatedMark",
|
|
647
|
+
"harness": "s0HPxG_harness",
|
|
648
|
+
"unitTop": "s0HPxG_unitTop",
|
|
649
|
+
"unitCore": "s0HPxG_unitCore"
|
|
703
650
|
};
|
|
704
651
|
//#endregion
|
|
705
652
|
//#region src/client/WanxiangBrand.tsx
|
|
@@ -987,20 +934,14 @@ window.__ModuleLoader__.load({
|
|
|
987
934
|
modelsTitle: "Model configuration",
|
|
988
935
|
modelsDescription: "Share the models configured here with other users, and choose which of them they may use.",
|
|
989
936
|
modelsUnavailable: "Model configuration is unavailable until this workspace is connected to DataOps.",
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
resuming: "Switching…",
|
|
999
|
-
noPublisher: "No administrator is sharing models right now.",
|
|
1000
|
-
modelsListTitle: "Models other users may use",
|
|
1001
|
-
modelsListDescription: "A model turned off here stays available in this workspace and is not offered to other users.",
|
|
1002
|
-
modelShareLabel: "Available to other users",
|
|
1003
|
-
modelsEmpty: "No models are configured in this workspace yet. Add them in Models settings first.",
|
|
937
|
+
defaultsTitle: "Default configuration",
|
|
938
|
+
defaultsDescription: "Publish the configuration this workspace holds — models, permissions, and general settings — as the values other users start from. Their workspace takes that copy once and may then change anything, and a change they make is never overwritten.",
|
|
939
|
+
defaultsActionTitle: "Publish as the default",
|
|
940
|
+
defaultsNotAdmin: "Only an administrator may publish the default configuration.",
|
|
941
|
+
defaultsNeverPublished: "Not published yet.",
|
|
942
|
+
defaultsPublishedAt: "Last published:",
|
|
943
|
+
defaultsPublish: "Publish default configuration",
|
|
944
|
+
defaultsPublishing: "Publishing…",
|
|
1004
945
|
loadFailed: "The model configuration could not be loaded. Try again.",
|
|
1005
946
|
plazaTitle: "Skill plaza",
|
|
1006
947
|
plazaIntro: "Skills other users shared. Install one to use it in this workspace, or share a skill of your own.",
|
|
@@ -1035,20 +976,14 @@ window.__ModuleLoader__.load({
|
|
|
1035
976
|
modelsTitle: "模型配置共享",
|
|
1036
977
|
modelsDescription: "把这里配置的模型共享给其他用户,并决定他们可以使用其中哪些。",
|
|
1037
978
|
modelsUnavailable: "工作区接入 DataOps 后即可使用模型配置共享。",
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
resuming: "切换中…",
|
|
1047
|
-
noPublisher: "当前没有管理员共享模型。",
|
|
1048
|
-
modelsListTitle: "其他用户可使用的模型",
|
|
1049
|
-
modelsListDescription: "在这里关闭的模型,本工作区仍可使用,只是不提供给其他用户。",
|
|
1050
|
-
modelShareLabel: "提供给其他用户使用",
|
|
1051
|
-
modelsEmpty: "本工作区还没有配置模型,请先在模型设置中添加。",
|
|
979
|
+
defaultsTitle: "默认配置",
|
|
980
|
+
defaultsDescription: "把本工作区当前的配置(模型、权限、通用设置)发布为其他用户的初始值。对方工作区只取用一次,之后可以随意修改,改过的内容不会被覆盖。",
|
|
981
|
+
defaultsActionTitle: "发布为默认值",
|
|
982
|
+
defaultsNotAdmin: "只有管理员可以发布默认配置。",
|
|
983
|
+
defaultsNeverPublished: "尚未发布。",
|
|
984
|
+
defaultsPublishedAt: "上次发布:",
|
|
985
|
+
defaultsPublish: "发布默认配置",
|
|
986
|
+
defaultsPublishing: "发布中…",
|
|
1052
987
|
loadFailed: "模型配置加载失败,请重试。",
|
|
1053
988
|
plazaTitle: "技能广场",
|
|
1054
989
|
plazaIntro: "其他用户共享的技能。装载后即可在本工作区使用,也可以把自己的技能共享出去。",
|