@things-factory/figure-ui 10.1.151 → 10.1.152
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 +15 -23
- package/client/modeller/fasten-geometry.ts +32 -0
- package/client/modeller/figure-links.ts +32 -14
- package/client/modeller/mesh-import.ts +0 -10
- package/client/modeller/refusals.ts +14 -1
- package/dist-client/modeller/editor.d.ts +0 -6
- package/dist-client/modeller/editor.js +16 -24
- package/dist-client/modeller/editor.js.map +1 -1
- package/dist-client/modeller/fasten-geometry.d.ts +13 -0
- package/dist-client/modeller/fasten-geometry.js +29 -0
- package/dist-client/modeller/fasten-geometry.js.map +1 -1
- package/dist-client/modeller/figure-links.d.ts +9 -2
- package/dist-client/modeller/figure-links.js +35 -14
- package/dist-client/modeller/figure-links.js.map +1 -1
- package/dist-client/modeller/mesh-import.d.ts +0 -2
- package/dist-client/modeller/mesh-import.js +0 -11
- package/dist-client/modeller/mesh-import.js.map +1 -1
- package/dist-client/modeller/product-session.d.ts +4 -28
- package/dist-client/modeller/refusals.d.ts +2 -1
- package/dist-client/modeller/refusals.js +17 -1
- package/dist-client/modeller/refusals.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/test/browser/build.mjs +7 -2
- package/test/browser/editing.check.mjs +14 -0
- package/test/browser/fix-alignment.check.mjs +101 -0
- package/test/browser/links.check.mjs +34 -5
- package/test/browser/mesh-select.check.mjs +91 -0
- package/test/browser/modeller-page.js +36 -0
- package/test/browser/modeller-revision.check.mjs +18 -6
- package/test/browser/part-ids.check.mjs +24 -6
- package/test/browser/parts.check.mjs +39 -2
- package/test/browser/row-preview.check.mjs +81 -0
- package/test/browser/screen.check.mjs +2 -1
- package/test/fields.test.ts +5 -9
- package/test/fix-alignment.test.ts +32 -0
- package/test/mesh-import.test.ts +1 -8
- package/test/parts-wiring.test.ts +1 -5
- package/test/refusals.test.ts +28 -0
- package/translations/en.json +8 -0
- package/translations/es.json +8 -0
- package/translations/ja.json +8 -0
- package/translations/ko.json +8 -0
- package/translations/ms.json +8 -0
- package/translations/zh.json +8 -0
|
@@ -648,7 +648,8 @@ describe('the preview: registered as a board registers it, posed and played, the
|
|
|
648
648
|
await mode('preview')
|
|
649
649
|
await until('the preview stands', () => !!screenCheck.deep('figure-preview')[0]?.shadowRoot?.querySelector('div[clips]'))
|
|
650
650
|
const type = await read(() => screenCheck.previewTypeOf(screenCheck.editor().session.read().context))
|
|
651
|
-
|
|
651
|
+
/* The preview made earlier stands hidden and is shown again first: registered once it has the figure as it is now. */
|
|
652
|
+
await until(`registered as ${type}`, type => screenCheck.registered(type), type)
|
|
652
653
|
assert.equal(await read(() => screenCheck.registered('figure-preview-new') && screenCheck.editor().session.read().context !== ''), false, 'not under another figure\'s type')
|
|
653
654
|
await boardsUp()
|
|
654
655
|
await read(() => {
|
package/test/fields.test.ts
CHANGED
|
@@ -76,12 +76,8 @@ test('pitch 는 한 곳에서 하나의 값이고, 늘 set-repeat 로 바꿔 최
|
|
|
76
76
|
}
|
|
77
77
|
})
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
/* Which of the two places it is said from the refusal's details (refusals.test.ts makes both with the kernel, ADR-0127). */
|
|
85
|
-
assert.ok(moved.includes('placedRefusalOf(error, partLabelOf(id)'), moved)
|
|
86
|
-
})
|
|
87
|
-
|
|
79
|
+
/*
|
|
80
|
+
* A gizmo drag on a part a rule places is written as the rule's nudge, growing by a ratio on a scale drag
|
|
81
|
+
* (modeller.check.mjs, the gizmo on a part placed by worked-out rules); one a joint places is refused in words from the
|
|
82
|
+
* kernel's details (editing.check.mjs).
|
|
83
|
+
*/
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 정렬·간격 고치기 (fasten-geometry `insideAlignmentOf`): the alignment that brings a part inside the face it is fastened
|
|
3
|
+
* on -- the least move on each side it is out, the centre when it is wider -- or why there is nothing to move.
|
|
4
|
+
*/
|
|
5
|
+
import { test } from 'node:test'
|
|
6
|
+
import assert from 'node:assert/strict'
|
|
7
|
+
|
|
8
|
+
import { insideAlignmentOf, type FaceView } from '../client/modeller/fasten-geometry.js'
|
|
9
|
+
|
|
10
|
+
/* A 400 × 1000 top, a 100 × 100 footprint on it; edges offered on X, a distance only on Z. */
|
|
11
|
+
const view = (part = { x: 100, y: 100, z: 100 }): FaceView => ({ axes: ['x', 'z'], face: { x: 400, z: 1000 }, part, edges: { x: true, y: true, z: false } })
|
|
12
|
+
|
|
13
|
+
test('out past the low edge: moved to that edge from inside, the other axis left as it was', () => {
|
|
14
|
+
const fixed = insideAlignmentOf(view(), { x: 'mm', z: 'centre' }, { x: -1000 })
|
|
15
|
+
assert.deepEqual(fixed, { align: { x: 'min', z: 'centre' }, alignMm: { x: -1000 }, moved: ['x'] })
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('out past the high edge where edges are not offered: that edge as a distance', () => {
|
|
19
|
+
const fixed = insideAlignmentOf(view(), { x: 'centre', z: 'mm' }, { z: 900 })
|
|
20
|
+
assert.deepEqual(fixed, { align: { x: 'centre', z: 'mm' }, alignMm: { z: 450 }, moved: ['z'] })
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('wider than the face: centred, the most of it on the face', () => {
|
|
24
|
+
const fixed = insideAlignmentOf(view({ x: 600, y: 100, z: 100 }), { x: 'max' }, {})
|
|
25
|
+
assert.deepEqual(fixed, { align: { x: 'centre' }, alignMm: {}, moved: ['x'] })
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
test('nothing of it out: inside -- what is out is fastened on it; no face size: unmeasured', () => {
|
|
29
|
+
assert.deepEqual(insideAlignmentOf(view(), { x: 'max', z: 'centre' }, {}), { cannot: 'inside' })
|
|
30
|
+
assert.deepEqual(insideAlignmentOf(undefined, {}, {}), { cannot: 'unmeasured' })
|
|
31
|
+
assert.deepEqual(insideAlignmentOf({ ...view(), face: { x: 400 } }, {}, {}), { cannot: 'unmeasured' })
|
|
32
|
+
})
|
package/test/mesh-import.test.ts
CHANGED
|
@@ -8,7 +8,7 @@ import assert from 'node:assert/strict'
|
|
|
8
8
|
import { readFileSync } from 'node:fs'
|
|
9
9
|
import { fileURLToPath } from 'node:url'
|
|
10
10
|
|
|
11
|
-
import { meshChoicesOf,
|
|
11
|
+
import { meshChoicesOf, meshPartOf, type MeshUpload } from '../client/modeller/mesh-import.js'
|
|
12
12
|
|
|
13
13
|
const read = (path: string) => readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8')
|
|
14
14
|
const HASH = 'c'.repeat(64)
|
|
@@ -59,13 +59,6 @@ test('a node: its own bounds and counts, standing and turned where the file had
|
|
|
59
59
|
assert.throws(() => meshPartOf(upload, { node: 3 }, 'x'), 'a node that cannot be a part is not made one')
|
|
60
60
|
})
|
|
61
61
|
|
|
62
|
-
test("a part's id from a node's name: letter-led and clean, another number when taken", () => {
|
|
63
|
-
assert.equal(meshPartIdOf('Hoist Unit #2', new Set()), 'Hoist-Unit-2')
|
|
64
|
-
assert.equal(meshPartIdOf('2nd beam', new Set()), 'nd-beam')
|
|
65
|
-
assert.equal(meshPartIdOf('###', new Set()), 'mesh')
|
|
66
|
-
assert.equal(meshPartIdOf('hoist', new Set(['hoist', 'hoist-2'])), 'hoist-3')
|
|
67
|
-
})
|
|
68
|
-
|
|
69
62
|
/* The screen itself -- the palette's button, the upload, the question, the step added -- is driven in browser/places-mesh.check.mjs. */
|
|
70
63
|
test('the mesh words are in every language', () => {
|
|
71
64
|
for (const lang of ['en', 'es', 'ja', 'ko', 'ms', 'zh']) {
|
|
@@ -11,7 +11,6 @@ import { readFileSync } from 'node:fs'
|
|
|
11
11
|
import { fileURLToPath } from 'node:url'
|
|
12
12
|
|
|
13
13
|
const read = (path: string) => readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8')
|
|
14
|
-
const editor = read('../client/modeller/editor.ts')
|
|
15
14
|
|
|
16
15
|
/*
|
|
17
16
|
* Each event the panel sends answered by the editor -- picked, moved, duplicated, removed, added, hidden -- as one step
|
|
@@ -37,10 +36,7 @@ test('팔레트는 시작 모양만 낸다 — 둥근 상자와 통은 상자의
|
|
|
37
36
|
})
|
|
38
37
|
|
|
39
38
|
test('부품 이름은 figure-model 의 rename-part 로 바꾸고, 거절은 까닭별로 사람의 말로 한다', () => {
|
|
40
|
-
|
|
41
|
-
assert.match(editor, /this\.selected = name/, '바꾼 이름의 부품이 그대로 골라져 있다')
|
|
42
|
-
/* The reason is the kernel's refusal (ADR-0127): the screen does not check the name again (refusals.test.ts makes all three). */
|
|
43
|
-
assert.match(editor, /this\.error = partNameRefusalOf\(error, /)
|
|
39
|
+
/* Renamed in one step and still selected, and a refused name said from the kernel's details: parts.check.mjs. */
|
|
44
40
|
for (const lang of ['ko', 'en', 'ja', 'zh', 'ms', 'es']) {
|
|
45
41
|
const table = JSON.parse(read(`../translations/${lang}.json`))
|
|
46
42
|
for (const key of ['figure.text.part-name-taken', 'figure.text.part-name-invalid']) assert.ok(table[key]?.includes('{name}'), `${lang}: ${key}`)
|
package/test/refusals.test.ts
CHANGED
|
@@ -210,6 +210,34 @@ test('줄이 한도를 넘으면 몇 개가 되는지와 한도를 말한다 —
|
|
|
210
210
|
assert.ok(bodies.includes('19,402') && bodies.includes('10,000'), bodies)
|
|
211
211
|
})
|
|
212
212
|
|
|
213
|
+
test('일상에서 코드로만 보이던 거절 넷 — 줄이 안 들어감 · 같은 축의 줄 안의 줄 · 기준면이 걸린 부품의 줄 · 쓰인 부품 id (:3300, 2026-10-11)', () => {
|
|
214
|
+
const shelf = () => {
|
|
215
|
+
let a = fm.addFigureBox(fm.createFigureAsset('Shelf'), { id: 'board', size: { x: 400, y: 50, z: 1000 }, position: { x: 0, y: 0, z: 0 } })
|
|
216
|
+
a = fm.addFigureBox(a, { id: 'bin', size: { x: 100, y: 100, z: 100 }, position: { x: 0, y: 0, z: 0 } })
|
|
217
|
+
a = act(a, { kind: 'attach', part: 'board', face: 'bottom', to: { plane: 'mounting-plane' } })
|
|
218
|
+
return act(a, { kind: 'attach', part: 'bin', face: 'bottom', to: { part: 'board', face: 'top' } })
|
|
219
|
+
}
|
|
220
|
+
/* Five 100 mm bins asked for on 400 mm. */
|
|
221
|
+
const fit = editRefusalOf(refusalOf(() => act(shelf(), { kind: 'make-repeat', part: 'bin', axis: 'x', pitch: 1, count: 5 })), keyed)
|
|
222
|
+
assert.match(fit, /row-does-not-fit .*"count":"5".*"length":"400".*"extent":"100"/)
|
|
223
|
+
/* A cap on the roller made a row along X, as the roller's row is. */
|
|
224
|
+
let capped = fm.addFigureBox(conveyor(), { id: 'cap', size: { x: 20, y: 20, z: 20 }, position: { x: 0, y: 0, z: 0 } })
|
|
225
|
+
capped = act(capped, { kind: 'attach', part: 'cap', face: 'bottom', to: { part: 'roller', face: 'top' } })
|
|
226
|
+
assert.match(editRefusalOf(refusalOf(() => act(capped, { kind: 'make-repeat', part: 'cap', axis: 'x', pitch: 10 })), keyed), /row-same-axis .*"part":"cap","outer":"roller","axis":"X"/)
|
|
227
|
+
/* The bin's top holds the slot layout: made a row, the layout would stand on no one bin. */
|
|
228
|
+
const slotted = act(shelf(), {
|
|
229
|
+
kind: 'set-slot-layout',
|
|
230
|
+
label: 'Bin',
|
|
231
|
+
role: 'seat',
|
|
232
|
+
anchors: [{ id: 'bin', part: 'bin', face: 'top' }],
|
|
233
|
+
layout: { tiers: [{ tierNo: 1, anchorId: 'bin', mount: 'ON', position: { x: 0, y: 0, z: 0 }, rotation: 0, layout: { pattern: 'SINGLE', slot: { allowed: { width: 100, depth: 100, height: 100 }, accepts: ['TOTE'] } } }] }
|
|
234
|
+
})
|
|
235
|
+
const held = editRefusalOf(refusalOf(() => act(slotted, { kind: 'make-repeat', part: 'bin', axis: 'x', pitch: 150 })), say)
|
|
236
|
+
assert.ok(held.includes('bin') && held.includes('자리 배치') && !held.includes('SURFACE_PROVENANCE'), held)
|
|
237
|
+
/* A new part named as the row's part is (its copies drawn under ids of their own): the same words as a rename. */
|
|
238
|
+
assert.match(editRefusalOf(refusalOf(() => fm.addFigureBox(conveyor(), { id: 'roller', size: { x: 1, y: 1, z: 1 }, position: { x: 0, y: 0, z: 0 } })), keyed), /part-name-taken .*"name":"roller"/)
|
|
239
|
+
})
|
|
240
|
+
|
|
213
241
|
test('기즈모로 옮길 수 없는 부품 — 관절이 자리를 정하는지, 붙은 면이 정하는지', () => {
|
|
214
242
|
assert.match(placedRefusalOf(refusalOf(() => act(conveyor(), { kind: 'nudge-part', part: 'roller', by: { x: 10 } })), '롤러', keyed)!, /gizmo-joint-places .*"part":"롤러"/)
|
|
215
243
|
assert.match(placedRefusalOf(refusalOf(() => act(conveyor(), { kind: 'scale-position', part: 'roller', axis: 'x' })), '롤러', keyed)!, /gizmo-fastening-places .*"part":"롤러"/)
|
package/translations/en.json
CHANGED
|
@@ -59,6 +59,12 @@
|
|
|
59
59
|
"figure.text.row-copies-over-limit": "At this pitch the row has {count} copies. A row takes up to {limit}. Widen the pitch.",
|
|
60
60
|
"figure.text.row-geometry-over-limit": "Laid out, the row would draw {count} bodies. A figure draws up to {limit}.",
|
|
61
61
|
"figure.text.row-copies-out-of-range": "A row has {min} to {max} copies. Given: {count}",
|
|
62
|
+
"figure.text.row-does-not-fit": "{count} do not fit in {length} mm: each is {extent} mm. Make fewer, or make the part smaller.",
|
|
63
|
+
"figure.text.row-same-axis": "{outer}'s row already runs along {axis}. A row of {part} inside it runs along another axis.",
|
|
64
|
+
"figure.text.row-face-held-slot-layout": "The slot layout stands on a face of {part}, so it cannot be made a row. Move that anchor of the slot layout first.",
|
|
65
|
+
"figure.text.row-face-held-place": "A place is on a face of {part}, so it cannot be made a row. Remove that place first.",
|
|
66
|
+
"figure.text.row-face-held-footprint": "The figure's room is measured from a face of {part}, so it cannot be made a row. Change the room first.",
|
|
67
|
+
"figure.text.row-face-held-other": "A face of {part} is used elsewhere, so it cannot be made a row.",
|
|
62
68
|
"figure.text.gizmo-joint-places": "a joint places {part}. move it with its control in the motion tab.",
|
|
63
69
|
"figure.label.motion-continuous": "turn without end",
|
|
64
70
|
"figure.text.fasten-before-moving": "fasten it to another part or the floor first; then it can move.",
|
|
@@ -549,6 +555,8 @@
|
|
|
549
555
|
"figure.text.overhang-side-low": "{axis} low side {mm} mm",
|
|
550
556
|
"figure.text.overhang-side-high": "{axis} high side {mm} mm",
|
|
551
557
|
"figure.button.fix-alignment": "change alignment and gap",
|
|
558
|
+
"figure.text.fix-alignment-inside": "{part} is inside the face. What is out is a part fastened on {part}: pick that part to fix it.",
|
|
559
|
+
"figure.text.fix-alignment-unmeasured": "The face of {on} cannot be measured, so it cannot be lined up for you. Drag the part in the drawing below.",
|
|
552
560
|
"figure.text.detach-moves": "Detached, it moves:",
|
|
553
561
|
"figure.text.detach-keeps-children": "Parts fastened to it ({parts}) stay fastened to it.",
|
|
554
562
|
"figure.text.detach-clips": "Detaching removes clips: {clips}. You will be asked when you detach.",
|
package/translations/es.json
CHANGED
|
@@ -59,6 +59,12 @@
|
|
|
59
59
|
"figure.text.row-copies-over-limit": "Con este paso la fila tiene {count} copias. Una fila admite hasta {limit}. Amplíe el paso.",
|
|
60
60
|
"figure.text.row-geometry-over-limit": "Desplegada, la fila dibujaría {count} cuerpos. Una figura dibuja hasta {limit}.",
|
|
61
61
|
"figure.text.row-copies-out-of-range": "Una fila tiene de {min} a {max} copias. Valor dado: {count}",
|
|
62
|
+
"figure.text.row-does-not-fit": "{count} no caben en {length} mm: cada una mide {extent} mm. Ponga menos o haga la pieza más pequeña.",
|
|
63
|
+
"figure.text.row-same-axis": "La fila de {outer} ya va a lo largo de {axis}. Una fila de {part} dentro de ella va por otro eje.",
|
|
64
|
+
"figure.text.row-face-held-slot-layout": "La disposición de huecos se apoya en una cara de {part}, así que no puede convertirse en fila. Cambie antes esa referencia de la disposición.",
|
|
65
|
+
"figure.text.row-face-held-place": "Hay un lugar en una cara de {part}, así que no puede convertirse en fila. Quite antes ese lugar.",
|
|
66
|
+
"figure.text.row-face-held-footprint": "El espacio de la figura se mide desde una cara de {part}, así que no puede convertirse en fila. Cambie antes ese espacio.",
|
|
67
|
+
"figure.text.row-face-held-other": "Una cara de {part} se usa en otro lugar, así que no puede convertirse en fila.",
|
|
62
68
|
"figure.text.gizmo-joint-places": "una articulación coloca {part}. muévala con su control en la pestaña de movimiento.",
|
|
63
69
|
"figure.label.motion-continuous": "girar sin fin",
|
|
64
70
|
"figure.text.fasten-before-moving": "primero sujétela a otra pieza o al suelo; después podrá moverse.",
|
|
@@ -549,6 +555,8 @@
|
|
|
549
555
|
"figure.text.overhang-side-low": "{axis} lado inferior {mm} mm",
|
|
550
556
|
"figure.text.overhang-side-high": "{axis} lado superior {mm} mm",
|
|
551
557
|
"figure.button.fix-alignment": "cambiar alineación y separación",
|
|
558
|
+
"figure.text.fix-alignment-inside": "{part} está dentro de la cara. Lo que sobresale es una pieza sujeta a {part}: selecciónela para corregirla.",
|
|
559
|
+
"figure.text.fix-alignment-unmeasured": "No se puede medir la cara de {on}, así que no se puede alinear automáticamente. Arrastre la pieza en el dibujo de abajo.",
|
|
552
560
|
"figure.text.detach-moves": "Al separarla, se mueve:",
|
|
553
561
|
"figure.text.detach-keeps-children": "Las piezas sujetas a ella ({parts}) siguen sujetas a ella.",
|
|
554
562
|
"figure.text.detach-clips": "Al separarla se eliminan clips: {clips}. Se le preguntará al separarla.",
|
package/translations/ja.json
CHANGED
|
@@ -59,6 +59,12 @@
|
|
|
59
59
|
"figure.text.row-copies-over-limit": "この間隔では列が {count} 個になります。1 列は {limit} 個までです。間隔を広げてください。",
|
|
60
60
|
"figure.text.row-geometry-over-limit": "列を展開すると形状が {count} 個になります。図形は {limit} 個まで描きます。",
|
|
61
61
|
"figure.text.row-copies-out-of-range": "列の個数は {min}~{max} 個です。入力値: {count}",
|
|
62
|
+
"figure.text.row-does-not-fit": "{count} 個は {length} mm に収まりません。1 個が {extent} mm です。個数を減らすか部品を小さくしてください。",
|
|
63
|
+
"figure.text.row-same-axis": "{outer} の列はすでに {axis} 方向です。{part} の列は別の方向に並べてください。",
|
|
64
|
+
"figure.text.row-face-held-slot-layout": "{part} の面を場所の配置が基準面として使っているため、列にできません。先に場所の配置の基準面を変えてください。",
|
|
65
|
+
"figure.text.row-face-held-place": "{part} の面に場所があるため、列にできません。先にその場所を削除してください。",
|
|
66
|
+
"figure.text.row-face-held-footprint": "{part} の面が占有空間の基準のため、列にできません。先に占有空間を変えてください。",
|
|
67
|
+
"figure.text.row-face-held-other": "{part} の面がほかで使われているため、列にできません。",
|
|
62
68
|
"figure.text.gizmo-joint-places": "{part} は関節に付いていて、関節が位置を決めます。動きタブの操作値で動かしてください。",
|
|
63
69
|
"figure.label.motion-continuous": "無限回転",
|
|
64
70
|
"figure.text.fasten-before-moving": "先に他の部品か床に取り付けると、動きを付けられます。",
|
|
@@ -549,6 +555,8 @@
|
|
|
549
555
|
"figure.text.overhang-side-low": "{axis} 低い側 {mm} mm",
|
|
550
556
|
"figure.text.overhang-side-high": "{axis} 高い側 {mm} mm",
|
|
551
557
|
"figure.button.fix-alignment": "位置合わせ・間隔を直す",
|
|
558
|
+
"figure.text.fix-alignment-inside": "{part} は面の内側にあります。はみ出しているのは {part} に付いた部品です。その部品を選んで直してください。",
|
|
559
|
+
"figure.text.fix-alignment-unmeasured": "{on} の面の大きさを測れないため、自動では合わせられません。下の図で部品をドラッグして動かしてください。",
|
|
552
560
|
"figure.text.detach-moves": "外すと位置が変わります:",
|
|
553
561
|
"figure.text.detach-keeps-children": "この部品に取り付いた部品({parts})はそのまま取り付いています。",
|
|
554
562
|
"figure.text.detach-clips": "外すとクリップが削除されます: {clips}。外すときにもう一度確認します。",
|
package/translations/ko.json
CHANGED
|
@@ -59,6 +59,12 @@
|
|
|
59
59
|
"figure.text.row-copies-over-limit": "간격이 좁아 줄이 {count}개가 됩니다. 한 줄은 {limit}개까지입니다. 간격을 넓혀 주세요.",
|
|
60
60
|
"figure.text.row-geometry-over-limit": "줄을 펼치면 형상이 {count}개가 됩니다. 도형은 {limit}개까지 그립니다.",
|
|
61
61
|
"figure.text.row-copies-out-of-range": "줄의 개수는 {min}~{max}개입니다. 넣은 값: {count}",
|
|
62
|
+
"figure.text.row-does-not-fit": "{count}개가 {length} mm 안에 들어가지 않습니다. 하나가 {extent} mm입니다. 개수를 줄이거나 부품을 줄여 주세요.",
|
|
63
|
+
"figure.text.row-same-axis": "{outer}의 줄이 이미 {axis} 방향입니다. {part}의 줄은 다른 방향으로 늘어나야 합니다.",
|
|
64
|
+
"figure.text.row-face-held-slot-layout": "{part}의 면을 자리 배치가 기준면으로 쓰고 있어 줄로 바꿀 수 없습니다. 자리 배치의 기준면을 먼저 바꿔 주세요.",
|
|
65
|
+
"figure.text.row-face-held-place": "{part}의 면에 자리가 있어 줄로 바꿀 수 없습니다. 그 자리를 먼저 지워 주세요.",
|
|
66
|
+
"figure.text.row-face-held-footprint": "{part}의 면이 점유 공간의 기준이라 줄로 바꿀 수 없습니다. 점유 공간을 먼저 바꿔 주세요.",
|
|
67
|
+
"figure.text.row-face-held-other": "{part}의 면을 다른 곳에서 쓰고 있어 줄로 바꿀 수 없습니다.",
|
|
62
68
|
"figure.text.gizmo-joint-places": "{part} 부품은 관절에 달려 있어 관절이 자리를 정합니다. 움직임 탭의 조작값으로 움직이세요.",
|
|
63
69
|
"figure.label.motion-continuous": "끝없이 회전",
|
|
64
70
|
"figure.text.fasten-before-moving": "먼저 다른 부품이나 바닥에 붙여야 움직임을 줄 수 있습니다.",
|
|
@@ -549,6 +555,8 @@
|
|
|
549
555
|
"figure.text.overhang-side-low": "{axis} 낮은 쪽 {mm} mm",
|
|
550
556
|
"figure.text.overhang-side-high": "{axis} 높은 쪽 {mm} mm",
|
|
551
557
|
"figure.button.fix-alignment": "정렬·간격 고치기",
|
|
558
|
+
"figure.text.fix-alignment-inside": "{part}은(는) 면 안에 있습니다. 밖으로 나온 것은 {part}에 붙은 부품이니, 그 부품을 골라 고쳐 주세요.",
|
|
559
|
+
"figure.text.fix-alignment-unmeasured": "{on}의 면 크기를 잴 수 없어 자동으로 맞출 수 없습니다. 아래 그림에서 끌어 옮겨 주세요.",
|
|
552
560
|
"figure.text.detach-moves": "떼면 자리가 바뀝니다:",
|
|
553
561
|
"figure.text.detach-keeps-children": "이 부품에 붙은 부품({parts})은 그대로 이 부품에 붙어 있습니다.",
|
|
554
562
|
"figure.text.detach-clips": "떼면 클립이 지워집니다: {clips}. 뗄 때 다시 묻습니다.",
|
package/translations/ms.json
CHANGED
|
@@ -59,6 +59,12 @@
|
|
|
59
59
|
"figure.text.row-copies-over-limit": "Pada jarak ini barisan mempunyai {count} salinan. Satu barisan mengambil sehingga {limit}. Lebarkan jarak.",
|
|
60
60
|
"figure.text.row-geometry-over-limit": "Apabila dibentangkan, barisan akan melukis {count} jasad. Rajah melukis sehingga {limit}.",
|
|
61
61
|
"figure.text.row-copies-out-of-range": "Satu barisan mempunyai {min} hingga {max} salinan. Diberi: {count}",
|
|
62
|
+
"figure.text.row-does-not-fit": "{count} tidak muat dalam {length} mm: setiap satu {extent} mm. Kurangkan bilangan atau kecilkan bahagian.",
|
|
63
|
+
"figure.text.row-same-axis": "Baris {outer} sudah berjalan sepanjang {axis}. Baris {part} di dalamnya mesti berjalan pada paksi lain.",
|
|
64
|
+
"figure.text.row-face-held-slot-layout": "Susun atur slot berdiri pada permukaan {part}, jadi ia tidak boleh dijadikan baris. Tukar sauh susun atur slot itu dahulu.",
|
|
65
|
+
"figure.text.row-face-held-place": "Ada tempat pada permukaan {part}, jadi ia tidak boleh dijadikan baris. Buang tempat itu dahulu.",
|
|
66
|
+
"figure.text.row-face-held-footprint": "Ruang rajah diukur dari permukaan {part}, jadi ia tidak boleh dijadikan baris. Tukar ruang rajah dahulu.",
|
|
67
|
+
"figure.text.row-face-held-other": "Permukaan {part} digunakan di tempat lain, jadi ia tidak boleh dijadikan baris.",
|
|
62
68
|
"figure.text.gizmo-joint-places": "sendi menentukan kedudukan {part}. gerakkannya dengan kawalannya di tab gerakan.",
|
|
63
69
|
"figure.label.motion-continuous": "putaran tanpa henti",
|
|
64
70
|
"figure.text.fasten-before-moving": "lekatkan pada bahagian lain atau lantai dahulu; kemudian ia boleh bergerak.",
|
|
@@ -549,6 +555,8 @@
|
|
|
549
555
|
"figure.text.overhang-side-low": "{axis} sisi bawah {mm} mm",
|
|
550
556
|
"figure.text.overhang-side-high": "{axis} sisi atas {mm} mm",
|
|
551
557
|
"figure.button.fix-alignment": "ubah penjajaran dan jarak",
|
|
558
|
+
"figure.text.fix-alignment-inside": "{part} berada di dalam permukaan. Yang terkeluar ialah bahagian yang diikat pada {part}: pilih bahagian itu untuk membetulkannya.",
|
|
559
|
+
"figure.text.fix-alignment-unmeasured": "Permukaan {on} tidak dapat diukur, jadi ia tidak dapat dijajarkan secara automatik. Seret bahagian dalam lukisan di bawah.",
|
|
552
560
|
"figure.text.detach-moves": "Apabila ditanggalkan, ia bergerak:",
|
|
553
561
|
"figure.text.detach-keeps-children": "Bahagian yang dilekatkan padanya ({parts}) kekal dilekatkan.",
|
|
554
562
|
"figure.text.detach-clips": "Menanggalkan membuang klip: {clips}. Anda akan ditanya semasa menanggalkan.",
|
package/translations/zh.json
CHANGED
|
@@ -59,6 +59,12 @@
|
|
|
59
59
|
"figure.text.row-copies-over-limit": "此间距下一排有 {count} 个。一排最多 {limit} 个。请加大间距。",
|
|
60
60
|
"figure.text.row-geometry-over-limit": "展开后这一排有 {count} 个形体。图形最多绘制 {limit} 个。",
|
|
61
61
|
"figure.text.row-copies-out-of-range": "一排的数量为 {min}~{max} 个。输入值: {count}",
|
|
62
|
+
"figure.text.row-does-not-fit": "{length} mm 内放不下 {count} 个:每个 {extent} mm。请减少个数或缩小部件。",
|
|
63
|
+
"figure.text.row-same-axis": "{outer} 的排列已沿 {axis} 方向。{part} 的排列须沿另一个方向。",
|
|
64
|
+
"figure.text.row-face-held-slot-layout": "位置布局以 {part} 的面为基准面,因此不能改为排列。请先更改位置布局的基准面。",
|
|
65
|
+
"figure.text.row-face-held-place": "{part} 的面上有位置,因此不能改为排列。请先删除该位置。",
|
|
66
|
+
"figure.text.row-face-held-footprint": "占用空间以 {part} 的面为基准,因此不能改为排列。请先更改占用空间。",
|
|
67
|
+
"figure.text.row-face-held-other": "{part} 的面在别处被使用,因此不能改为排列。",
|
|
62
68
|
"figure.text.gizmo-joint-places": "{part} 由关节决定位置。请用运动标签中的控制值移动它。",
|
|
63
69
|
"figure.label.motion-continuous": "无限旋转",
|
|
64
70
|
"figure.text.fasten-before-moving": "请先将其固定到其他部件或地面上,然后才能添加运动。",
|
|
@@ -549,6 +555,8 @@
|
|
|
549
555
|
"figure.text.overhang-side-low": "{axis} 低侧 {mm} mm",
|
|
550
556
|
"figure.text.overhang-side-high": "{axis} 高侧 {mm} mm",
|
|
551
557
|
"figure.button.fix-alignment": "修改对齐和间距",
|
|
558
|
+
"figure.text.fix-alignment-inside": "{part} 在面内。超出的是固定在 {part} 上的部件,请选中该部件进行修正。",
|
|
559
|
+
"figure.text.fix-alignment-unmeasured": "无法测量 {on} 的面,因此无法自动对齐。请在下方图中拖动部件。",
|
|
552
560
|
"figure.text.detach-moves": "拆下后位置会改变:",
|
|
553
561
|
"figure.text.detach-keeps-children": "附着在此部件上的部件({parts})仍附着在它上面。",
|
|
554
562
|
"figure.text.detach-clips": "拆下会删除片段:{clips}。拆下时会再次确认。",
|