@things-factory/figure-ui 10.1.90 → 10.1.92
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/client/modeller/editor.ts +61 -90
- package/client/modeller/fields.ts +8 -1
- package/client/modeller/figure-section-close-choice.ts +52 -0
- package/client/modeller/figure-section-editor.ts +58 -3
- package/client/modeller/figure-section-panel.ts +3 -0
- package/client/modeller/side-panel-styles.ts +4 -11
- package/dist-client/modeller/editor.d.ts +10 -4
- package/dist-client/modeller/editor.js +59 -88
- package/dist-client/modeller/editor.js.map +1 -1
- package/dist-client/modeller/fields.js +8 -1
- package/dist-client/modeller/fields.js.map +1 -1
- package/dist-client/modeller/figure-section-close-choice.d.ts +17 -0
- package/dist-client/modeller/figure-section-close-choice.js +58 -0
- package/dist-client/modeller/figure-section-close-choice.js.map +1 -0
- package/dist-client/modeller/figure-section-editor.d.ts +11 -1
- package/dist-client/modeller/figure-section-editor.js +57 -3
- package/dist-client/modeller/figure-section-editor.js.map +1 -1
- package/dist-client/modeller/figure-section-panel.js +3 -0
- package/dist-client/modeller/figure-section-panel.js.map +1 -1
- package/dist-client/modeller/side-panel-styles.js +4 -11
- package/dist-client/modeller/side-panel-styles.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/test/layout.test.ts +19 -4
- package/test/section-editor.test.ts +31 -8
- package/translations/en.json +19 -15
- package/translations/ja.json +15 -11
- package/translations/ko.json +19 -15
- package/translations/ms.json +15 -11
- package/translations/zh.json +15 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/figure-ui",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.92",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"@things-factory:registry": "https://registry.npmjs.org"
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"@operato/shell": "^10.0.0",
|
|
41
41
|
"@operato/styles": "^10.0.0",
|
|
42
42
|
"@operato/utils": "^10.0.0",
|
|
43
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
43
|
+
"@things-factory/ai-assistant": "^10.1.91",
|
|
44
44
|
"@things-factory/figure-service": "^10.1.84",
|
|
45
45
|
"three": "^0.185.1"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "669325ccb1e071480a3f7cffbdf5296ec046b7a5"
|
|
48
48
|
}
|
package/test/layout.test.ts
CHANGED
|
@@ -37,12 +37,12 @@ test('부품을 고르면 — 도형 전체의 탭(판정 · 이력)은 그 부
|
|
|
37
37
|
assert.ok(renderBody.includes(from), from)
|
|
38
38
|
})
|
|
39
39
|
|
|
40
|
-
/* B.1 (designer 2026-09-27)
|
|
41
|
-
test('
|
|
40
|
+
/* B.1 (designer 2026-09-27), amended by the user 2026-10-01: no path -- the list and the canvas show the choice; the list's root goes back. */
|
|
41
|
+
test('패널 머리에는 경로가 없고 부품의 세 줄만 — 모델 설정은 목록 루트의 한 동작으로 연다', () => {
|
|
42
42
|
assert.ok((renderBody.match(/\$\{this\.renderSubject\(\)\}/g) ?? []).length >= 3)
|
|
43
43
|
const subject = editor.slice(editor.indexOf(' private renderSubject()'), editor.indexOf(' private showModelSettings()'))
|
|
44
|
-
assert.ok(subject.includes('
|
|
45
|
-
assert.ok(
|
|
44
|
+
assert.ok(!subject.includes('<nav path'), 'no path')
|
|
45
|
+
assert.ok(subject.includes('if (!summary) return nothing'), 'nothing chosen: no head')
|
|
46
46
|
const show = editor.slice(editor.indexOf(' private showModelSettings()'), editor.indexOf(' render() {'))
|
|
47
47
|
assert.ok(show.includes("this.selected = ''") && show.includes("this.tab = 'properties'"), 'the model settings, on the properties tab')
|
|
48
48
|
assert.ok(!/session!?\.(command|apply|edit|undo)/.test(show), 'moving changes no data and no history')
|
|
@@ -82,3 +82,18 @@ test('탭 아이콘은 오른쪽 칸 맨 위 — 타입 칸은 속성 탭 안의
|
|
|
82
82
|
const page = read('../client/pages/figure-modeller-page.ts')
|
|
83
83
|
assert.ok(page.includes('<label slot="type" type-field>'))
|
|
84
84
|
})
|
|
85
|
+
|
|
86
|
+
/* User 2026-10-01: 「맞추기 아이콘 … 무엇을 하는 것인지 모르겠다」 -- words, and what moves the part apart from what makes one. */
|
|
87
|
+
test('맞추기는 글자 단추로 — 옮기는 넷(가운데 X·Z, 면에 대기, 눈금)과 새 부품을 만드는 대칭 복사를 다른 줄에 둔다', () => {
|
|
88
|
+
const tools = editor.slice(editor.indexOf(' private renderTools('), editor.indexOf(" /**\n * A part's name."))
|
|
89
|
+
assert.ok(!tools.includes('<md-icon>'), 'no icon-only buttons')
|
|
90
|
+
assert.ok(tools.includes("i18next.t('figure.label.tools')") && tools.includes("i18next.t('figure.label.mirror-copy')"), 'two rows, each named')
|
|
91
|
+
const plane = editor.slice(editor.indexOf(' private renderPlaneAlign('), editor.indexOf(' private alignToPlane()'))
|
|
92
|
+
assert.ok(!plane.includes('<md-icon>') && plane.includes('figure.button.align-to-${placement}'))
|
|
93
|
+
const ko = JSON.parse(readFileSync(fileURLToPath(new URL('../translations/ko.json', import.meta.url)), 'utf8')) as Record<string, string>
|
|
94
|
+
assert.deepEqual(
|
|
95
|
+
['center-x', 'center-z', 'align-to-floor', 'snap', 'mirror-x'].map(k => ko[`figure.button.${k}`]),
|
|
96
|
+
['X 가운데로', 'Z 가운데로', '바닥에 내려놓기', '눈금에 맞추기', 'X 반대편에']
|
|
97
|
+
)
|
|
98
|
+
assert.ok(!ko['figure.text.center-on-x']!.includes('기준 상자'), 'says what the centre is')
|
|
99
|
+
})
|
|
@@ -121,9 +121,10 @@ test('적용은 한 명령, 취소·Esc 는 아무것도 보내지 않는다 —
|
|
|
121
121
|
has(editorPanel, /return this\.revision !== this\.openedAt/)
|
|
122
122
|
has(editor, /<figure-section-editor[\s\S]*?\.revision=\$\{this\.session\?\.read\(\)\.revision \?\? 0\}[\s\S]*?@command=\$\{\(e: CustomEvent\) => this\.linkCommand\(e\.detail\.action\)\}/)
|
|
123
123
|
has(editor,
|
|
124
|
-
/protected willUpdate[\s\S]*?if \(this\.sectionEditing && this\.sectionEditing !== this\.selected\) this\.
|
|
124
|
+
/protected willUpdate[\s\S]*?if \(this\.sectionEditing && this\.sectionEditing !== this\.selected\) this\.leaveSectionEditor\(this\.selected\)\s*\}/,
|
|
125
125
|
'the selection moved off the part by any way closes it and lets go of the preview'
|
|
126
126
|
)
|
|
127
|
+
has(editor, /if \(!editor\?\.dirty \|\| !stillThere\) \{\s*this\.closeSectionEditor\(\)/, 'nothing changed, or nothing to go back to: it just closes')
|
|
127
128
|
has(editor, /private closeSectionEditor\(\) \{\s*this\.sectionEditing = null\s*this\.holdAction\(null\)/)
|
|
128
129
|
has(sectionPanel, /section-editor-open/)
|
|
129
130
|
})
|
|
@@ -133,7 +134,7 @@ test('Delete 키는 칸 안에서는 글자를, 밖에서는 고른 점을 지
|
|
|
133
134
|
/* The scene listens on its own element and stops the key there: heard later, Esc selected nothing and Delete took the part. */
|
|
134
135
|
has(editorPanel, /window\.addEventListener\('keydown', this\.keys, true\)/)
|
|
135
136
|
has(editorPanel, /const take = \(\) => \(e\.preventDefault\(\), e\.stopImmediatePropagation\(\)\)/)
|
|
136
|
-
has(editorPanel, /if \(e\.key === 'Escape'\) \{\s*take\(\)\s*this\.
|
|
137
|
+
has(editorPanel, /if \(e\.key === 'Escape'\) \{\s*take\(\)\s*this\.requestClose\(\)/)
|
|
137
138
|
})
|
|
138
139
|
|
|
139
140
|
test('그림은 점을 다 담고 여유를 둔다 — 50 mm 단위로', () => {
|
|
@@ -177,10 +178,14 @@ test('편집 창이 열린 동안 모델러의 키는 비켜선다 — Esc 가
|
|
|
177
178
|
assert.ok(onKey.indexOf('if (this.sectionEditing) return') < onKey.indexOf('keyActionOf('), 'before any key is taken')
|
|
178
179
|
})
|
|
179
180
|
|
|
180
|
-
test('
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
181
|
+
test('속성의 형상 치수에는 점·꼭짓점 칸이 없다 (사용자 10-01) — 높이만 남고, 단면 칸이 점 개수를 말한다', async () => {
|
|
182
|
+
const { groupFields } = await import('../client/modeller/fields.ts')
|
|
183
|
+
const f = (id: string) => ({ id, value: 0, unit: 'mm' })
|
|
184
|
+
const ids = ['tip.dimension.height', 'tip.point.p1.x', 'tip.point.p1.z', 'tip.point.p12.x', 'tip.apex.x', 'tip.apex.z', 'tip.position.x']
|
|
185
|
+
const { singles } = groupFields(ids.map(f) as never, 'tip')
|
|
186
|
+
assert.deepEqual(singles.map(g => (g as { field: { id: string } }).field.id), ['tip.dimension.height'])
|
|
187
|
+
has(sectionPanel, /e\.apex \? 'figure\.text\.section-points-apex' : 'figure\.text\.section-points', \{ points: String\(e\.section\.points\.length\) \}/)
|
|
188
|
+
assert.equal(say('figure.text.section-points-apex', { points: '3' }), '점 3개 · 꼭짓점 하나')
|
|
184
189
|
})
|
|
185
190
|
|
|
186
191
|
test('편집 창 옆에 입체를 볼 자리가 없으면 윤곽과 입체 결과를 번갈아 본다 (§7)', async () => {
|
|
@@ -286,8 +291,6 @@ test('편집 창에서 끝을 한 점으로: 켜면 점들의 가운데 위에
|
|
|
286
291
|
assert.deepEqual(again.apex, { x: 0, z: 0 })
|
|
287
292
|
assert.deepEqual(sectionOfWorking(p, again), { kind: 'polygon', points: again.points })
|
|
288
293
|
assert.equal(issuesOfWorking(p, { ...again, apex: { x: Number.NaN, z: 0 } }).words[0]!.key, 'figure.text.section-issue-number')
|
|
289
|
-
/* In the properties its apex is called as the editor calls it: 꼭짓점 X. */
|
|
290
|
-
has(editor, /\? \[`\$\{i18next\.t\('figure\.label\.section-editor-apex-mark'\)\} \$\{apex\[1\]!\.toUpperCase\(\)\}`\]/)
|
|
291
294
|
/* Its length is its height: the same field, called so. */
|
|
292
295
|
has(editorPanel, /this\.working\.apex \? 'figure\.label\.section-editor-height' : 'figure\.label\.section-editor-length'/)
|
|
293
296
|
const back = applyFigureAuthoring(pyramid, { kind: 'set-section', part: 'wedge', apex: null })
|
|
@@ -303,3 +306,23 @@ test('끝면에 붙은 부품이 있으면 한 점으로 모으기를 막고 그
|
|
|
303
306
|
/* A pyramid in the section panel: its editor opens, and it has no corners and no inside. */
|
|
304
307
|
has(sectionPanel, /const e = body\?\.shape \? drawnOf\(body\.shape\) : undefined/)
|
|
305
308
|
})
|
|
309
|
+
|
|
310
|
+
test('닫기 전에 묻는다 (사용자 10-01): 바꾼 것이 있으면 적용·버리기·계속 편집 — 바꾼 것이 없으면 그냥 닫는다', () => {
|
|
311
|
+
const choice = read('../client/modeller/figure-section-close-choice.ts')
|
|
312
|
+
/* Esc and 취소 both ask; while it asks, the question has the keys. */
|
|
313
|
+
has(editorPanel, /if \(e\.key === 'Escape'\) \{\s*take\(\)\s*this\.requestClose\(\)/)
|
|
314
|
+
has(editorPanel, /<button @click=\$\{\(\) => this\.requestClose\(\)\}>\$\{i18next\.t\('figure\.button\.section-editor-cancel'\)\}/)
|
|
315
|
+
has(editorPanel, /if \(this\.asking\) return\n/)
|
|
316
|
+
has(editorPanel, /if \(!this\.dirty\) \{\s*this\.cancel\(\)\s*return true/)
|
|
317
|
+
/* Apply is only offered when it would be taken: not for a refused shape, not after the figure changed. */
|
|
318
|
+
has(editorPanel, /if \(choice === 'apply' && !held\)/)
|
|
319
|
+
has(choice, /\$\{this\.held\s*\? nothing/)
|
|
320
|
+
/* Picking another part while changes wait keeps the part selected until the editor closed. */
|
|
321
|
+
has(editor, /this\.selected = editing\s*editor\.requestClose\(\)\.then\(closed => \{\s*if \(closed && this\.selected === editing\) this\.selected = next/)
|
|
322
|
+
for (const lang of ['ko', 'en', 'ja', 'zh', 'ms']) {
|
|
323
|
+
const t = JSON.parse(read(`../translations/${lang}.json`)) as Record<string, string>
|
|
324
|
+
for (const key of ['figure.text.section-editor-close-changed', 'figure.text.section-editor-close-invalid', 'figure.button.section-editor-apply-and-close', 'figure.button.section-editor-discard', 'figure.button.keep-editing'])
|
|
325
|
+
assert.ok(t[key], `${lang} ${key}`)
|
|
326
|
+
}
|
|
327
|
+
assert.equal(ko['figure.button.section-editor-apply-and-close'], '적용하고 닫기')
|
|
328
|
+
})
|
package/translations/en.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"figure.button.add-parameter": "add parameter",
|
|
6
6
|
"figure.button.ask": "ask",
|
|
7
7
|
"figure.button.cancel": "cancel",
|
|
8
|
-
"figure.button.center-x": "
|
|
9
|
-
"figure.button.center-z": "
|
|
8
|
+
"figure.button.center-x": "to X centre",
|
|
9
|
+
"figure.button.center-z": "to Z centre",
|
|
10
10
|
"figure.button.close": "close",
|
|
11
11
|
"figure.button.delete-figure": "delete",
|
|
12
12
|
"figure.button.discard": "discard",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"figure.button.scale-uniformly": "grow by one ratio",
|
|
21
21
|
"figure.text.sizing-uniform-proposed": "this figure has joints. growing it by one ratio keeps the joints together at any size.",
|
|
22
22
|
"figure.text.sizing-uniform-explained": "grows the whole figure by the geometric mean of the three sizes a board gives it. the feet stay on the floor; room left above the figure stays empty.",
|
|
23
|
-
"figure.button.mirror-x": "
|
|
24
|
-
"figure.button.mirror-z": "
|
|
23
|
+
"figure.button.mirror-x": "across X",
|
|
24
|
+
"figure.button.mirror-z": "across Z",
|
|
25
25
|
"figure.button.move-part-down": "move down",
|
|
26
26
|
"figure.button.move-part-up": "move up",
|
|
27
27
|
"figure.button.new-figure": "new figure",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"figure.button.revert": "revert",
|
|
34
34
|
"figure.button.save": "save",
|
|
35
35
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
36
|
-
"figure.button.snap": "snap",
|
|
36
|
+
"figure.button.snap": "snap to grid",
|
|
37
37
|
"figure.label.declared-space": "declared space",
|
|
38
38
|
"figure.label.follows-expression": "set by an expression",
|
|
39
39
|
"figure.label.gizmo-rotate": "turn",
|
|
@@ -388,8 +388,8 @@
|
|
|
388
388
|
"figure.text.category-explained": "how the palette groups figures. one per figure.",
|
|
389
389
|
"figure.text.category-placeholder": "e.g. conveyor",
|
|
390
390
|
"figure.text.ceiling-height-explained": "the height a ceiling figure hangs from in the preview.",
|
|
391
|
-
"figure.text.center-on-x": "
|
|
392
|
-
"figure.text.center-on-z": "
|
|
391
|
+
"figure.text.center-on-x": "moves it to the figure's X centre (X=0).",
|
|
392
|
+
"figure.text.center-on-z": "moves it to the figure's Z centre (Z=0).",
|
|
393
393
|
"figure.text.clip-is-time-running": "plays over time. the value an instance gives is the playback speed.",
|
|
394
394
|
"figure.text.clip-name-is-how-it-is-driven": "an instance gives a speed by this name.",
|
|
395
395
|
"figure.text.clip-name-taken": "another clip already has this name. enter a different name.",
|
|
@@ -502,7 +502,6 @@
|
|
|
502
502
|
"figure.text.tags-explained": "tags used for search. separate several with commas.",
|
|
503
503
|
"figure.text.tags-placeholder": "e.g. outbound, automatic, level 2",
|
|
504
504
|
"figure.text.thumbnail-not-made-yet": "no thumbnail yet",
|
|
505
|
-
"figure.text.tools-explained": "from left: centre X, centre Z, to floor, mirror X, mirror Z, snap to grid.",
|
|
506
505
|
"figure.text.triangle-count": "{count} triangles",
|
|
507
506
|
"figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one.",
|
|
508
507
|
"figure.text.type-name-cannot-change": "the type name cannot be changed after creation.",
|
|
@@ -884,8 +883,6 @@
|
|
|
884
883
|
"figure.text.placement-is-intent": "What the figure is authored from. You can choose it before any part; it does not change the declared space.",
|
|
885
884
|
"figure.button.show-model-settings": "Show model settings",
|
|
886
885
|
"figure.text.new-figure-name": "New figure",
|
|
887
|
-
"figure.label.panel-path": "What the panel shows",
|
|
888
|
-
"figure.label.model-settings": "Model settings",
|
|
889
886
|
"figure.text.fasten-editing": "Editing the current attachment: its {face} on {target}",
|
|
890
887
|
"figure.text.fasten-new": "Attach anew",
|
|
891
888
|
"figure.text.fasten-start": "Attach this part to a face on another part so they keep their relationship when either changes.",
|
|
@@ -894,10 +891,10 @@
|
|
|
894
891
|
"figure.text.fasten-target-first": "Choose the part to attach to first.",
|
|
895
892
|
"figure.text.fasten-edit-on-plane": "This part is connected to the model's placement reference. Detach it before attaching it to another part.",
|
|
896
893
|
"figure.button.fasten-update": "Update this attachment",
|
|
897
|
-
"figure.button.align-to-floor": "
|
|
898
|
-
"figure.button.align-to-ceiling": "
|
|
899
|
-
"figure.button.align-to-wall": "
|
|
900
|
-
"figure.button.align-to-center": "
|
|
894
|
+
"figure.button.align-to-floor": "set on the floor",
|
|
895
|
+
"figure.button.align-to-ceiling": "up to the ceiling",
|
|
896
|
+
"figure.button.align-to-wall": "back to the wall",
|
|
897
|
+
"figure.button.align-to-center": "to centre height",
|
|
901
898
|
"figure.text.align-to-floor": "Moves it once so its bottom is on the floor (Y=0). It is not attached.",
|
|
902
899
|
"figure.text.align-to-ceiling": "Moves it once so its top is on the ceiling (Y=0). It is not attached.",
|
|
903
900
|
"figure.text.align-to-wall": "Moves it once so its back is on the wall (Z=0). It is not attached.",
|
|
@@ -945,5 +942,12 @@
|
|
|
945
942
|
"figure.label.section-editor-apex-at": "apex {axis} (mm)",
|
|
946
943
|
"figure.label.section-editor-apex-mark": "apex",
|
|
947
944
|
"figure.text.section-editor-apex-blocked": "A part is fastened to its {face}, so it cannot be drawn to one point.",
|
|
948
|
-
"figure.label.section-editor-height": "height (mm)"
|
|
945
|
+
"figure.label.section-editor-height": "height (mm)",
|
|
946
|
+
"figure.text.section-editor-close-changed": "The section has changes not applied yet. What should happen to them?",
|
|
947
|
+
"figure.text.section-editor-close-invalid": "The shape as it is cannot be applied. Fix it and apply, or let it go.",
|
|
948
|
+
"figure.button.section-editor-apply-and-close": "apply and close",
|
|
949
|
+
"figure.button.section-editor-discard": "discard and close",
|
|
950
|
+
"figure.text.section-points": "{points} points",
|
|
951
|
+
"figure.text.section-points-apex": "{points} points · one apex",
|
|
952
|
+
"figure.label.mirror-copy": "mirror copy"
|
|
949
953
|
}
|
package/translations/ja.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"figure.button.add-parameter": "パラメーターを追加",
|
|
6
6
|
"figure.button.ask": "ask",
|
|
7
7
|
"figure.button.cancel": "キャンセル",
|
|
8
|
-
"figure.button.center-x": "
|
|
9
|
-
"figure.button.center-z": "
|
|
8
|
+
"figure.button.center-x": "X 中央へ",
|
|
9
|
+
"figure.button.center-z": "Z 中央へ",
|
|
10
10
|
"figure.button.close": "close",
|
|
11
11
|
"figure.button.delete-figure": "delete",
|
|
12
12
|
"figure.button.discard": "discard",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"figure.button.scale-uniformly": "一つの比率で拡大",
|
|
21
21
|
"figure.text.sizing-uniform-proposed": "関節のある図形です。一つの比率で拡大すると、どのサイズでも関節が離れません。",
|
|
22
22
|
"figure.text.sizing-uniform-explained": "ボードが与えた 3 軸サイズの幾何平均の比率で図形全体を拡大します。足は床に置き、箱の上の余りは空けたままにします。",
|
|
23
|
-
"figure.button.mirror-x": "
|
|
24
|
-
"figure.button.mirror-z": "
|
|
23
|
+
"figure.button.mirror-x": "X 反対側に",
|
|
24
|
+
"figure.button.mirror-z": "Z 反対側に",
|
|
25
25
|
"figure.button.move-part-down": "move down",
|
|
26
26
|
"figure.button.move-part-up": "move up",
|
|
27
27
|
"figure.button.new-figure": "new figure",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"figure.button.revert": "戻す",
|
|
34
34
|
"figure.button.save": "save",
|
|
35
35
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
36
|
-
"figure.button.snap": "
|
|
36
|
+
"figure.button.snap": "グリッドに合わせる",
|
|
37
37
|
"figure.label.declared-space": "空間宣言",
|
|
38
38
|
"figure.label.follows-expression": "式で決まる",
|
|
39
39
|
"figure.label.gizmo-rotate": "回転",
|
|
@@ -388,8 +388,8 @@
|
|
|
388
388
|
"figure.text.category-explained": "パレットでまとめて表示する基準です。Figure ごとに 1 つだけ決めます。",
|
|
389
389
|
"figure.text.category-placeholder": "例: コンベヤ",
|
|
390
390
|
"figure.text.ceiling-height-explained": "天井基準の Figure をプレビューで吊り下げる高さです。",
|
|
391
|
-
"figure.text.center-on-x": "
|
|
392
|
-
"figure.text.center-on-z": "
|
|
391
|
+
"figure.text.center-on-x": "図形の X 中央 (X=0) へ移動します。",
|
|
392
|
+
"figure.text.center-on-z": "図形の Z 中央 (Z=0) へ移動します。",
|
|
393
393
|
"figure.text.clip-is-time-running": "時間に沿って再生されます。インスタンスが渡す値は再生速度です。",
|
|
394
394
|
"figure.text.clip-name-is-how-it-is-driven": "インスタンスはこの名前で再生速度を渡します。",
|
|
395
395
|
"figure.text.clip-name-taken": "同じ名前の clip がすでにあります。別の名前を入力してください。",
|
|
@@ -502,7 +502,6 @@
|
|
|
502
502
|
"figure.text.tags-explained": "検索に使うタグです。カンマで区切って複数入力できます。",
|
|
503
503
|
"figure.text.tags-placeholder": "例: 搬出, 自動, 2 階",
|
|
504
504
|
"figure.text.thumbnail-not-made-yet": "no thumbnail yet",
|
|
505
|
-
"figure.text.tools-explained": "左から X 中央、Z 中央、床に付ける、X 対称、Z 対称、目盛りに合わせるです。",
|
|
506
505
|
"figure.text.triangle-count": "{count} triangles",
|
|
507
506
|
"figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
|
|
508
507
|
"figure.text.type-name-cannot-change": "タイプ名は作成後に変更できません。",
|
|
@@ -884,8 +883,6 @@
|
|
|
884
883
|
"figure.text.placement-is-intent": "作成の基準です。部品がなくても決められ、空間の宣言は変えません。",
|
|
885
884
|
"figure.button.show-model-settings": "モデル設定を表示",
|
|
886
885
|
"figure.text.new-figure-name": "新しい Figure",
|
|
887
|
-
"figure.label.panel-path": "表示中の対象",
|
|
888
|
-
"figure.label.model-settings": "モデル設定",
|
|
889
886
|
"figure.text.fasten-editing": "現在の取り付けを編集: {face}を{target}に",
|
|
890
887
|
"figure.text.fasten-new": "新しく取り付ける",
|
|
891
888
|
"figure.text.fasten-start": "別の部品の面に取り付けると、相手の部品が変わっても関係を保ちます。",
|
|
@@ -945,5 +942,12 @@
|
|
|
945
942
|
"figure.label.section-editor-apex-at": "頂点 {axis} (mm)",
|
|
946
943
|
"figure.label.section-editor-apex-mark": "頂点",
|
|
947
944
|
"figure.text.section-editor-apex-blocked": "{face}に部品が付いているため、一点にまとめられません。",
|
|
948
|
-
"figure.label.section-editor-height": "高さ (mm)"
|
|
945
|
+
"figure.label.section-editor-height": "高さ (mm)",
|
|
946
|
+
"figure.text.section-editor-close-changed": "適用していない断面の変更があります。どうしますか?",
|
|
947
|
+
"figure.text.section-editor-close-invalid": "今の形は適用できません。直してから適用するか、破棄してください。",
|
|
948
|
+
"figure.button.section-editor-apply-and-close": "適用して閉じる",
|
|
949
|
+
"figure.button.section-editor-discard": "破棄して閉じる",
|
|
950
|
+
"figure.text.section-points": "点 {points} 個",
|
|
951
|
+
"figure.text.section-points-apex": "点 {points} 個 · 頂点 1 つ",
|
|
952
|
+
"figure.label.mirror-copy": "対称コピー"
|
|
949
953
|
}
|
package/translations/ko.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"figure.button.add-parameter": "파라미터 추가",
|
|
6
6
|
"figure.button.ask": "요청",
|
|
7
7
|
"figure.button.cancel": "취소",
|
|
8
|
-
"figure.button.center-x": "X
|
|
9
|
-
"figure.button.center-z": "Z
|
|
8
|
+
"figure.button.center-x": "X 가운데로",
|
|
9
|
+
"figure.button.center-z": "Z 가운데로",
|
|
10
10
|
"figure.button.close": "닫기",
|
|
11
11
|
"figure.button.delete-figure": "삭제",
|
|
12
12
|
"figure.button.discard": "취소",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"figure.button.scale-uniformly": "한 비율로 키우기",
|
|
21
21
|
"figure.text.sizing-uniform-proposed": "관절이 있는 도형입니다. 한 비율로 키우면 어떤 크기에서도 관절이 벌어지지 않습니다.",
|
|
22
22
|
"figure.text.sizing-uniform-explained": "보드가 준 세 축 크기의 기하평균 비율로 도형 전체를 키웁니다. 발은 바닥에 두고, 상자 위가 남으면 그대로 비워 둡니다.",
|
|
23
|
-
"figure.button.mirror-x": "X
|
|
24
|
-
"figure.button.mirror-z": "Z
|
|
23
|
+
"figure.button.mirror-x": "X 반대편에",
|
|
24
|
+
"figure.button.mirror-z": "Z 반대편에",
|
|
25
25
|
"figure.button.move-part-down": "아래로",
|
|
26
26
|
"figure.button.move-part-up": "위로",
|
|
27
27
|
"figure.button.new-figure": "새 Figure",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"figure.button.revert": "되돌리기",
|
|
34
34
|
"figure.button.save": "저장",
|
|
35
35
|
"figure.button.see-the-trend-chart": "추이 그래프 보기",
|
|
36
|
-
"figure.button.snap": "눈금에",
|
|
36
|
+
"figure.button.snap": "눈금에 맞추기",
|
|
37
37
|
"figure.label.declared-space": "공간 선언",
|
|
38
38
|
"figure.label.follows-expression": "식으로 정해짐",
|
|
39
39
|
"figure.label.gizmo-rotate": "돌리기",
|
|
@@ -388,8 +388,8 @@
|
|
|
388
388
|
"figure.text.category-explained": "팔레트에서 묶어 보이는 기준입니다. Figure 마다 하나만 정합니다.",
|
|
389
389
|
"figure.text.category-placeholder": "예: 컨베이어",
|
|
390
390
|
"figure.text.ceiling-height-explained": "천장 기반 Figure 를 미리보기에서 매달 높이입니다.",
|
|
391
|
-
"figure.text.center-on-x": "
|
|
392
|
-
"figure.text.center-on-z": "
|
|
391
|
+
"figure.text.center-on-x": "도형의 X 가운데(X=0)로 옮깁니다.",
|
|
392
|
+
"figure.text.center-on-z": "도형의 Z 가운데(Z=0)로 옮깁니다.",
|
|
393
393
|
"figure.text.clip-is-time-running": "시간에 따라 재생됩니다. 인스턴스가 주는 값은 재생 속도입니다.",
|
|
394
394
|
"figure.text.clip-name-is-how-it-is-driven": "인스턴스가 이 이름으로 배속을 줍니다.",
|
|
395
395
|
"figure.text.clip-name-taken": "같은 이름의 clip 이 이미 있습니다. 다른 이름을 입력하세요.",
|
|
@@ -502,7 +502,6 @@
|
|
|
502
502
|
"figure.text.tags-explained": "검색에 쓰는 태그입니다. 쉼표로 나눠 여러 개 입력할 수 있습니다.",
|
|
503
503
|
"figure.text.tags-placeholder": "예: 반출, 자동, 2층",
|
|
504
504
|
"figure.text.thumbnail-not-made-yet": "미리보기 그림 없음",
|
|
505
|
-
"figure.text.tools-explained": "왼쪽부터 X 가운데, Z 가운데, 바닥에 붙이기, X 대칭, Z 대칭, 눈금 맞춤입니다.",
|
|
506
505
|
"figure.text.triangle-count": "삼각형 {count}개",
|
|
507
506
|
"figure.text.type-name-already-taken": "타입 이름 {type} 은 이미 쓰이고 있습니다. 다른 이름을 정해 주세요.",
|
|
508
507
|
"figure.text.type-name-cannot-change": "타입 이름은 만든 뒤에 바꿀 수 없습니다.",
|
|
@@ -884,8 +883,6 @@
|
|
|
884
883
|
"figure.text.placement-is-intent": "작성 기준입니다. 부품이 없어도 정할 수 있고, 공간 선언은 바꾸지 않습니다.",
|
|
885
884
|
"figure.button.show-model-settings": "모델 설정 보기",
|
|
886
885
|
"figure.text.new-figure-name": "새 Figure",
|
|
887
|
-
"figure.label.panel-path": "지금 보는 대상",
|
|
888
|
-
"figure.label.model-settings": "모델 설정",
|
|
889
886
|
"figure.text.fasten-editing": "현재 관계 수정 — {face} → {target}",
|
|
890
887
|
"figure.text.fasten-new": "새로 붙이기",
|
|
891
888
|
"figure.text.fasten-start": "이 부품을 다른 부품의 면에 붙여 두면, 상대 부품의 크기나 위치가 바뀌어도 함께 움직입니다.",
|
|
@@ -894,10 +891,10 @@
|
|
|
894
891
|
"figure.text.fasten-target-first": "먼저 붙일 부품을 고르세요.",
|
|
895
892
|
"figure.text.fasten-edit-on-plane": "이 부품은 현재 모델의 설치 기준면에 연결되어 있습니다. 다른 부품에 붙이려면 먼저 붙임을 푸세요.",
|
|
896
893
|
"figure.button.fasten-update": "이 붙임 수정",
|
|
897
|
-
"figure.button.align-to-floor": "바닥에
|
|
898
|
-
"figure.button.align-to-ceiling": "천장에
|
|
899
|
-
"figure.button.align-to-wall": "벽에
|
|
900
|
-
"figure.button.align-to-center": "중심
|
|
894
|
+
"figure.button.align-to-floor": "바닥에 내려놓기",
|
|
895
|
+
"figure.button.align-to-ceiling": "천장에 대기",
|
|
896
|
+
"figure.button.align-to-wall": "벽에 대기",
|
|
897
|
+
"figure.button.align-to-center": "중심 높이로",
|
|
901
898
|
"figure.text.align-to-floor": "지금 위치만 아랫면을 바닥(Y=0)에 맞춥니다. 붙이지는 않습니다.",
|
|
902
899
|
"figure.text.align-to-ceiling": "지금 위치만 윗면을 천장(Y=0)에 맞춥니다. 붙이지는 않습니다.",
|
|
903
900
|
"figure.text.align-to-wall": "지금 위치만 뒷면을 벽(Z=0)에 맞춥니다. 붙이지는 않습니다.",
|
|
@@ -945,5 +942,12 @@
|
|
|
945
942
|
"figure.label.section-editor-apex-at": "꼭짓점 {axis} (mm)",
|
|
946
943
|
"figure.label.section-editor-apex-mark": "꼭짓점",
|
|
947
944
|
"figure.text.section-editor-apex-blocked": "{face}에 붙은 부품이 있어 한 점으로 모을 수 없습니다.",
|
|
948
|
-
"figure.label.section-editor-height": "높이 (mm)"
|
|
945
|
+
"figure.label.section-editor-height": "높이 (mm)",
|
|
946
|
+
"figure.text.section-editor-close-changed": "적용하지 않은 단면 변경이 있습니다. 어떻게 할까요?",
|
|
947
|
+
"figure.text.section-editor-close-invalid": "지금 모양은 적용할 수 없습니다. 고친 뒤 적용하거나 버리세요.",
|
|
948
|
+
"figure.button.section-editor-apply-and-close": "적용하고 닫기",
|
|
949
|
+
"figure.button.section-editor-discard": "버리고 닫기",
|
|
950
|
+
"figure.text.section-points": "점 {points}개",
|
|
951
|
+
"figure.text.section-points-apex": "점 {points}개 · 꼭짓점 하나",
|
|
952
|
+
"figure.label.mirror-copy": "대칭 복사"
|
|
949
953
|
}
|
package/translations/ms.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"figure.button.add-parameter": "tambah parameter",
|
|
6
6
|
"figure.button.ask": "ask",
|
|
7
7
|
"figure.button.cancel": "batal",
|
|
8
|
-
"figure.button.center-x": "
|
|
9
|
-
"figure.button.center-z": "
|
|
8
|
+
"figure.button.center-x": "ke tengah X",
|
|
9
|
+
"figure.button.center-z": "ke tengah Z",
|
|
10
10
|
"figure.button.close": "close",
|
|
11
11
|
"figure.button.delete-figure": "delete",
|
|
12
12
|
"figure.button.discard": "discard",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"figure.button.scale-uniformly": "besarkan dengan satu nisbah",
|
|
21
21
|
"figure.text.sizing-uniform-proposed": "figura ini mempunyai sendi. membesarkannya dengan satu nisbah memastikan sendi tidak terpisah pada sebarang saiz.",
|
|
22
22
|
"figure.text.sizing-uniform-explained": "membesarkan seluruh figura dengan min geometri tiga saiz yang diberi papan. kaki kekal di lantai; ruang di atas figura dibiarkan kosong.",
|
|
23
|
-
"figure.button.mirror-x": "
|
|
24
|
-
"figure.button.mirror-z": "
|
|
23
|
+
"figure.button.mirror-x": "seberang X",
|
|
24
|
+
"figure.button.mirror-z": "seberang Z",
|
|
25
25
|
"figure.button.move-part-down": "move down",
|
|
26
26
|
"figure.button.move-part-up": "move up",
|
|
27
27
|
"figure.button.new-figure": "new figure",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"figure.button.revert": "kembalikan",
|
|
34
34
|
"figure.button.save": "save",
|
|
35
35
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
36
|
-
"figure.button.snap": "
|
|
36
|
+
"figure.button.snap": "jajar ke grid",
|
|
37
37
|
"figure.label.declared-space": "ruang yang diisytiharkan",
|
|
38
38
|
"figure.label.follows-expression": "ditetapkan oleh ungkapan",
|
|
39
39
|
"figure.label.gizmo-rotate": "putar",
|
|
@@ -388,8 +388,8 @@
|
|
|
388
388
|
"figure.text.category-explained": "cara palet mengumpulkan figure. satu bagi setiap figure.",
|
|
389
389
|
"figure.text.category-placeholder": "cth. penghantar",
|
|
390
390
|
"figure.text.ceiling-height-explained": "ketinggian figure siling digantung dalam pratonton.",
|
|
391
|
-
"figure.text.center-on-x": "
|
|
392
|
-
"figure.text.center-on-z": "
|
|
391
|
+
"figure.text.center-on-x": "alih ke tengah X rajah (X=0).",
|
|
392
|
+
"figure.text.center-on-z": "alih ke tengah Z rajah (Z=0).",
|
|
393
393
|
"figure.text.clip-is-time-running": "dimainkan mengikut masa. nilai yang diberikan instans ialah kelajuan main.",
|
|
394
394
|
"figure.text.clip-name-is-how-it-is-driven": "instans memberi kelajuan melalui nama ini.",
|
|
395
395
|
"figure.text.clip-name-taken": "clip lain sudah menggunakan nama ini. masukkan nama lain.",
|
|
@@ -502,7 +502,6 @@
|
|
|
502
502
|
"figure.text.tags-explained": "tag untuk carian. pisahkan beberapa tag dengan koma.",
|
|
503
503
|
"figure.text.tags-placeholder": "cth. keluar, automatik, aras 2",
|
|
504
504
|
"figure.text.thumbnail-not-made-yet": "no thumbnail yet",
|
|
505
|
-
"figure.text.tools-explained": "dari kiri: tengah X, tengah Z, ke lantai, cermin X, cermin Z, jajar ke grid.",
|
|
506
505
|
"figure.text.triangle-count": "{count} triangles",
|
|
507
506
|
"figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
|
|
508
507
|
"figure.text.type-name-cannot-change": "nama jenis tidak boleh diubah selepas dicipta.",
|
|
@@ -884,8 +883,6 @@
|
|
|
884
883
|
"figure.text.placement-is-intent": "Asas pengarangan rajah. Boleh dipilih sebelum ada bahagian; ia tidak mengubah ruang yang diisytiharkan.",
|
|
885
884
|
"figure.button.show-model-settings": "Tunjukkan tetapan model",
|
|
886
885
|
"figure.text.new-figure-name": "Rajah baharu",
|
|
887
|
-
"figure.label.panel-path": "Apa yang dipaparkan",
|
|
888
|
-
"figure.label.model-settings": "Tetapan model",
|
|
889
886
|
"figure.text.fasten-editing": "Menyunting lekatan semasa: {face} pada {target}",
|
|
890
887
|
"figure.text.fasten-new": "Lekatkan baharu",
|
|
891
888
|
"figure.text.fasten-start": "Lekatkan bahagian ini pada muka bahagian lain supaya hubungannya kekal apabila salah satu berubah.",
|
|
@@ -945,5 +942,12 @@
|
|
|
945
942
|
"figure.label.section-editor-apex-at": "puncak {axis} (mm)",
|
|
946
943
|
"figure.label.section-editor-apex-mark": "puncak",
|
|
947
944
|
"figure.text.section-editor-apex-blocked": "Ada bahagian yang dipasang pada {face}, jadi ia tidak boleh dihimpunkan ke satu titik.",
|
|
948
|
-
"figure.label.section-editor-height": "tinggi (mm)"
|
|
945
|
+
"figure.label.section-editor-height": "tinggi (mm)",
|
|
946
|
+
"figure.text.section-editor-close-changed": "Ada perubahan keratan yang belum digunakan. Apa yang perlu dibuat?",
|
|
947
|
+
"figure.text.section-editor-close-invalid": "Bentuk semasa tidak boleh digunakan. Betulkan dan gunakan, atau buang.",
|
|
948
|
+
"figure.button.section-editor-apply-and-close": "guna dan tutup",
|
|
949
|
+
"figure.button.section-editor-discard": "buang dan tutup",
|
|
950
|
+
"figure.text.section-points": "{points} titik",
|
|
951
|
+
"figure.text.section-points-apex": "{points} titik · satu puncak",
|
|
952
|
+
"figure.label.mirror-copy": "salinan cermin"
|
|
949
953
|
}
|
package/translations/zh.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"figure.button.add-parameter": "添加参数",
|
|
6
6
|
"figure.button.ask": "ask",
|
|
7
7
|
"figure.button.cancel": "取消",
|
|
8
|
-
"figure.button.center-x": "
|
|
9
|
-
"figure.button.center-z": "
|
|
8
|
+
"figure.button.center-x": "移到 X 中心",
|
|
9
|
+
"figure.button.center-z": "移到 Z 中心",
|
|
10
10
|
"figure.button.close": "close",
|
|
11
11
|
"figure.button.delete-figure": "delete",
|
|
12
12
|
"figure.button.discard": "discard",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"figure.button.scale-uniformly": "按单一比例放大",
|
|
21
21
|
"figure.text.sizing-uniform-proposed": "这是带关节的图形。按单一比例放大,任何尺寸下关节都不会分开。",
|
|
22
22
|
"figure.text.sizing-uniform-explained": "按看板给出的三轴尺寸的几何平均比例放大整个图形。底部保持在地面,盒子上方多出的空间保持空着。",
|
|
23
|
-
"figure.button.mirror-x": "
|
|
24
|
-
"figure.button.mirror-z": "
|
|
23
|
+
"figure.button.mirror-x": "X 对侧",
|
|
24
|
+
"figure.button.mirror-z": "Z 对侧",
|
|
25
25
|
"figure.button.move-part-down": "move down",
|
|
26
26
|
"figure.button.move-part-up": "move up",
|
|
27
27
|
"figure.button.new-figure": "new figure",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"figure.button.revert": "回退",
|
|
34
34
|
"figure.button.save": "save",
|
|
35
35
|
"figure.button.see-the-trend-chart": "see the trend chart",
|
|
36
|
-
"figure.button.snap": "
|
|
36
|
+
"figure.button.snap": "对齐网格",
|
|
37
37
|
"figure.label.declared-space": "空间声明",
|
|
38
38
|
"figure.label.follows-expression": "由表达式决定",
|
|
39
39
|
"figure.label.gizmo-rotate": "旋转",
|
|
@@ -388,8 +388,8 @@
|
|
|
388
388
|
"figure.text.category-explained": "在组件面板中分组显示的依据。每个 Figure 只设一个。",
|
|
389
389
|
"figure.text.category-placeholder": "例: 输送机",
|
|
390
390
|
"figure.text.ceiling-height-explained": "在预览中悬挂天花板基准 Figure 的高度。",
|
|
391
|
-
"figure.text.center-on-x": "
|
|
392
|
-
"figure.text.center-on-z": "
|
|
391
|
+
"figure.text.center-on-x": "移到图形的 X 中心 (X=0)。",
|
|
392
|
+
"figure.text.center-on-z": "移到图形的 Z 中心 (Z=0)。",
|
|
393
393
|
"figure.text.clip-is-time-running": "随时间播放。实例提供的值是播放速度。",
|
|
394
394
|
"figure.text.clip-name-is-how-it-is-driven": "实例通过此名称提供播放速度。",
|
|
395
395
|
"figure.text.clip-name-taken": "已存在同名 clip。请输入其他名称。",
|
|
@@ -502,7 +502,6 @@
|
|
|
502
502
|
"figure.text.tags-explained": "用于搜索的标签。可用逗号分隔输入多个。",
|
|
503
503
|
"figure.text.tags-placeholder": "例: 出库, 自动, 2 层",
|
|
504
504
|
"figure.text.thumbnail-not-made-yet": "no thumbnail yet",
|
|
505
|
-
"figure.text.tools-explained": "从左起依次为: X 居中、Z 居中、贴地、X 镜像、Z 镜像、对齐网格。",
|
|
506
505
|
"figure.text.triangle-count": "{count} triangles",
|
|
507
506
|
"figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
|
|
508
507
|
"figure.text.type-name-cannot-change": "类型名称创建后无法更改。",
|
|
@@ -884,8 +883,6 @@
|
|
|
884
883
|
"figure.text.placement-is-intent": "这是创作基准。没有部件也可以选择,不会更改声明的空间。",
|
|
885
884
|
"figure.button.show-model-settings": "查看模型设置",
|
|
886
885
|
"figure.text.new-figure-name": "新 Figure",
|
|
887
|
-
"figure.label.panel-path": "当前查看的对象",
|
|
888
|
-
"figure.label.model-settings": "模型设置",
|
|
889
886
|
"figure.text.fasten-editing": "编辑当前附着:{face}附着在{target}上",
|
|
890
887
|
"figure.text.fasten-new": "新建附着",
|
|
891
888
|
"figure.text.fasten-start": "将此部件附着到另一部件的面上,任一部件变化时都会保持该关系。",
|
|
@@ -945,5 +942,12 @@
|
|
|
945
942
|
"figure.label.section-editor-apex-at": "顶点 {axis} (mm)",
|
|
946
943
|
"figure.label.section-editor-apex-mark": "顶点",
|
|
947
944
|
"figure.text.section-editor-apex-blocked": "{face}上连接着部件,无法收为一点。",
|
|
948
|
-
"figure.label.section-editor-height": "高度 (mm)"
|
|
945
|
+
"figure.label.section-editor-height": "高度 (mm)",
|
|
946
|
+
"figure.text.section-editor-close-changed": "有尚未应用的截面更改。要怎么处理?",
|
|
947
|
+
"figure.text.section-editor-close-invalid": "当前形状无法应用。请修正后应用,或放弃更改。",
|
|
948
|
+
"figure.button.section-editor-apply-and-close": "应用并关闭",
|
|
949
|
+
"figure.button.section-editor-discard": "放弃并关闭",
|
|
950
|
+
"figure.text.section-points": "{points} 个点",
|
|
951
|
+
"figure.text.section-points-apex": "{points} 个点 · 一个顶点",
|
|
952
|
+
"figure.label.mirror-copy": "对称复制"
|
|
949
953
|
}
|