@things-factory/figure-ui 10.1.207 → 10.1.210

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/client/modeller/data-interface.ts +5 -5
  2. package/client/modeller/editor.ts +74 -57
  3. package/client/modeller/fasten-geometry.ts +2 -1
  4. package/client/modeller/figure-links.ts +26 -120
  5. package/client/modeller/figure-size-editor.ts +196 -0
  6. package/client/modeller/joint-drag.ts +25 -21
  7. package/client/modeller/joint-fan.ts +4 -3
  8. package/client/modeller/links.ts +36 -24
  9. package/client/modeller/motion-ends.ts +10 -6
  10. package/client/modeller/size-response.ts +95 -0
  11. package/dist-client/modeller/data-interface.d.ts +1 -1
  12. package/dist-client/modeller/data-interface.js +5 -5
  13. package/dist-client/modeller/data-interface.js.map +1 -1
  14. package/dist-client/modeller/editor.d.ts +9 -1
  15. package/dist-client/modeller/editor.js +80 -58
  16. package/dist-client/modeller/editor.js.map +1 -1
  17. package/dist-client/modeller/fasten-geometry.js +1 -1
  18. package/dist-client/modeller/fasten-geometry.js.map +1 -1
  19. package/dist-client/modeller/figure-links.d.ts +1 -4
  20. package/dist-client/modeller/figure-links.js +26 -107
  21. package/dist-client/modeller/figure-links.js.map +1 -1
  22. package/dist-client/modeller/figure-size-editor.d.ts +27 -0
  23. package/dist-client/modeller/figure-size-editor.js +221 -0
  24. package/dist-client/modeller/figure-size-editor.js.map +1 -0
  25. package/dist-client/modeller/joint-drag.d.ts +1 -1
  26. package/dist-client/modeller/joint-drag.js +27 -22
  27. package/dist-client/modeller/joint-drag.js.map +1 -1
  28. package/dist-client/modeller/joint-fan.js +4 -3
  29. package/dist-client/modeller/joint-fan.js.map +1 -1
  30. package/dist-client/modeller/links.d.ts +9 -6
  31. package/dist-client/modeller/links.js +33 -21
  32. package/dist-client/modeller/links.js.map +1 -1
  33. package/dist-client/modeller/motion-ends.d.ts +4 -1
  34. package/dist-client/modeller/motion-ends.js +10 -6
  35. package/dist-client/modeller/motion-ends.js.map +1 -1
  36. package/dist-client/modeller/size-response.d.ts +29 -0
  37. package/dist-client/modeller/size-response.js +99 -0
  38. package/dist-client/modeller/size-response.js.map +1 -0
  39. package/dist-client/route.d.ts +1 -1
  40. package/dist-client/tsconfig.tsbuildinfo +1 -1
  41. package/docs/evidence/2026-10-24/current-size-panel.png +0 -0
  42. package/docs/evidence/2026-10-24/integrated-size.png +0 -0
  43. package/docs/evidence/2026-10-24/multipart-response.png +0 -0
  44. package/docs/evidence/2026-10-24/repeat-layout.png +0 -0
  45. package/docs/evidence/2026-10-24/repeat-shared-style.png +0 -0
  46. package/docs/evidence/2026-10-24/size-in-layout.png +0 -0
  47. package/docs/evidence/2026-10-24/size-shared-style.png +0 -0
  48. package/docs/evidence/2026-10-24/width-preview.png +0 -0
  49. package/docs/multipart-response-review-2026-10-24.md +77 -0
  50. package/docs/response-authoring-2026-10-24.md +46 -0
  51. package/docs/size-and-repeat-ux-2026-10-24.md +67 -0
  52. package/package.json +8 -8
  53. package/test/attachment-size-contract.test.ts +47 -0
  54. package/test/browser/acceptance-page.js +1 -1
  55. package/test/browser/detail-page.js +1 -1
  56. package/test/browser/detail-tabs-page.js +1 -1
  57. package/test/browser/editing-page.js +1 -1
  58. package/test/browser/editing.check.mjs +28 -14
  59. package/test/browser/links.check.mjs +41 -22
  60. package/test/browser/modeller-page.js +1 -1
  61. package/test/browser/modeller-revision.check.mjs +21 -7
  62. package/test/browser/modeller.check.mjs +51 -39
  63. package/test/browser/multipart-response-page.js +8 -0
  64. package/test/browser/parts.check.mjs +2 -1
  65. package/test/browser/product-page.js +1 -1
  66. package/test/browser/props.check.mjs +17 -14
  67. package/test/browser/response-page.js +12 -0
  68. package/test/browser/row-preview.check.mjs +3 -3
  69. package/test/browser/screen.check.mjs +57 -13
  70. package/test/browser/serve-response.mjs +24 -0
  71. package/test/clip-ai-proposal.test.ts +1 -1
  72. package/test/clip-consent.test.ts +2 -2
  73. package/test/command-preview.test.ts +7 -7
  74. package/test/harness-serve.test.ts +1 -1
  75. package/test/heading-scale-guard.test.ts +3 -3
  76. package/test/joint-drag.test.ts +6 -6
  77. package/test/joint-frames.test.ts +33 -32
  78. package/test/joints.ts +1 -6
  79. package/test/links.test.ts +21 -20
  80. package/test/multipart-response-fixture.js +17 -0
  81. package/test/multipart-response.test.ts +37 -0
  82. package/test/refusals.test.ts +2 -2
  83. package/test/resize-with-placement.test.ts +23 -1
  84. package/test/size-response.test.ts +49 -0
  85. package/test/size-source-pairing.test.ts +66 -0
  86. package/translations/en.json +44 -10
  87. package/translations/es.json +44 -10
  88. package/translations/ja.json +44 -10
  89. package/translations/ko.json +58 -24
  90. package/translations/ms.json +44 -10
  91. package/translations/zh.json +44 -10
@@ -0,0 +1,66 @@
1
+ /*
2
+ * What a size follows when it is made to follow (ADR-0159 3): what its part hangs from, along the axis its own lies
3
+ * on as it stands -- read from figure-model (`figureAxisPairsOf`), never paired by letter.
4
+ */
5
+ import { test } from 'node:test'
6
+ import assert from 'node:assert/strict'
7
+ import { addFigureBox, addFigurePrimitive, applyFigureAuthoring, createFigureAsset } from '@hatiolab/figure-model'
8
+ import type { FigureAsset, FigureAuthoringAction } from '@hatiolab/figure-model'
9
+
10
+ import { revisionOf } from './revision-of.ts'
11
+ import { sameSizeSource, sizeRelationOf, sizeRelationSteps, sourceMeasureOf, suggestedSizeSource } from '../client/modeller/size-response.ts'
12
+ import { measureNow } from '../client/modeller/links.ts'
13
+
14
+ /** A frame on the floor, 1000 wide, 100 high, 600 deep, and a roller on its top turned `turn` about X. */
15
+ function bed(turn = 90): FigureAsset {
16
+ let a = addFigureBox(createFigureAsset('Bed'), { id: 'frame', size: { x: 1000, y: 100, z: 600 }, position: { x: 0, y: 50, z: 0 } })
17
+ a = addFigurePrimitive(a, { id: 'roller', kind: 'cylinder', dimensions: { radius: 30, length: 500 }, rotation: { x: turn, y: 0, z: 0 }, position: { x: 0, y: 150, z: 0 } } as never)
18
+ a = applyFigureAuthoring(a, { kind: 'attach', part: 'frame', to: { plane: 'mounting-plane' } })
19
+ return applyFigureAuthoring(a, { kind: 'attach', part: 'roller', to: { part: 'frame', face: 'top' } })
20
+ }
21
+ const run = (a: FigureAsset, steps: FigureAuthoringAction[]) => steps.reduce((x, s) => applyFigureAuthoring(x, s), a)
22
+ const lengthOf = (a: FigureAsset, design: Record<string, number> = {}) =>
23
+ measureNow(revisionOf({ ...a, designInputs: { ...a.designInputs, ...design } }), 'roller', 'y')
24
+ /** The frame's depth: its own size along Z. */
25
+ const depthOf = (_: FigureAsset) => 'frame.size.z'
26
+
27
+ test('a roller laid on its side follows the frame\'s depth with its length, not its height', () => {
28
+ assert.deepEqual(suggestedSizeSource(bed(), 'roller', 'y'), { of: 'part', part: 'frame', axis: 'z' })
29
+ /* Its diameter lies along the frame's width. */
30
+ assert.deepEqual(suggestedSizeSource(bed(), 'roller', 'x'), { of: 'part', part: 'frame', axis: 'x' })
31
+ })
32
+
33
+ test('made to follow by its gap, the length keeps 100 mm short of the frame\'s depth as the frame grows', () => {
34
+ const a = bed()
35
+ const b = run(a, sizeRelationSteps(revisionOf(a), 'roller', 'y', suggestedSizeSource(a, 'roller', 'y')!, 'difference'))
36
+ assert.equal(lengthOf(b), 500, 'it stands as it stood')
37
+ assert.ok(depthOf(b) in b.designInputs, `the frame's depth is an input: ${Object.keys(b.designInputs)}`)
38
+ assert.equal(lengthOf(b, { [depthOf(b)]: 900 }), 800, 'the frame 300 deeper: the roller 300 longer')
39
+ assert.equal(sizeRelationOf(revisionOf(b), 'roller', 'y').mode, 'difference')
40
+ })
41
+
42
+ test('made to follow by its ratio, it keeps its share', () => {
43
+ const a = bed()
44
+ const b = run(a, sizeRelationSteps(revisionOf(a), 'roller', 'y', suggestedSizeSource(a, 'roller', 'y')!, 'ratio'))
45
+ assert.equal(Math.round(lengthOf(b, { [depthOf(b)]: 1200 })!), 1000, '500 of 600 is 1000 of 1200')
46
+ })
47
+
48
+ test('standing on the floor turned a quarter, a part follows the figure along the axis it lies on', () => {
49
+ let a = addFigureBox(createFigureAsset('Beam'), { id: 'beam', size: { x: 100, y: 50, z: 800 }, position: { x: 0, y: 25, z: 0 }, rotation: { x: 0, y: 90, z: 0 } } as never)
50
+ a = applyFigureAuthoring(a, { kind: 'attach', part: 'beam', to: { plane: 'mounting-plane' } })
51
+ assert.deepEqual(suggestedSizeSource(a, 'beam', 'z'), { of: 'instance', axis: 'x' })
52
+ })
53
+
54
+ test('at an angle, nothing is suggested for the axes that lie at it: the author picks', () => {
55
+ assert.equal(suggestedSizeSource(bed(30), 'roller', 'y'), undefined)
56
+ assert.deepEqual(suggestedSizeSource(bed(30), 'roller', 'x'), { of: 'part', part: 'frame', axis: 'x' }, 'the axis it turns about still lies along X')
57
+ })
58
+
59
+ test('the source as it measures now, and when two sources are one', () => {
60
+ const r = revisionOf(bed())
61
+ assert.equal(sourceMeasureOf(r, { of: 'part', part: 'frame', axis: 'z' }), 600)
62
+ assert.ok(sameSizeSource({ of: 'part', part: 'frame', axis: 'z' }, { of: 'part', part: 'frame', axis: 'z' }))
63
+ assert.ok(!sameSizeSource({ of: 'part', part: 'frame', axis: 'z' }, { of: 'part', part: 'frame', axis: 'y' }))
64
+ assert.ok(!sameSizeSource({ of: 'instance', axis: 'z' }, { of: 'part', part: 'frame', axis: 'z' }))
65
+ assert.ok(!sameSizeSource(undefined, { of: 'instance', axis: 'z' }))
66
+ })
@@ -52,9 +52,9 @@
52
52
  "figure.text.scale-position-explained": "keeps this place as a share of the figure size — at twice the size it is twice as far.",
53
53
  "figure.text.repeat-member": "copy {index} of {count} made by repeating {name}.",
54
54
  "figure.label.detail-none": "none",
55
- "figure.label.repeat": "arranged in a row",
56
- "figure.text.repeat-fits-length": "as many copies as fit the figure’s length at this pitch.",
57
- "figure.text.repeat-fixed-count": "a repeat of a fixed count; its pitch cannot be set yet.",
55
+ "figure.label.repeat": "Repeat layout",
56
+ "figure.text.repeat-fits-length": "Parts fill the parent length at the chosen centre spacing.",
57
+ "figure.text.repeat-fixed-count": "Centre spacing is calculated automatically to keep the count.",
58
58
  "figure.text.repeat-what-pitch-gives": "{count} at a length of {length} mm · placed up to {longest} mm long ({limit} in a row).",
59
59
  "figure.text.repeat-pitch-too-small": "the pitch must be at least {min} mm: at the authored length of {length} mm it would make more than {limit}.",
60
60
  "figure.text.row-copies-over-limit": "At this pitch the row has {count} copies. A row takes up to {limit}. Widen the pitch.",
@@ -76,6 +76,7 @@
76
76
  "figure.text.gizmo-joint-turned-slide": "the {joint} joint only slides. use the move handle.",
77
77
  "figure.text.gizmo-joint-origin-follows": "the {joint} joint's place follows another part. change it under place in the properties tab.",
78
78
  "figure.text.gizmo-joint-off-axis": "the {joint} joint turns only about {axis}. use the {axis} rotate handle.",
79
+ "figure.text.gizmo-joint-several-axes": "the {joint} joint moves on several axes, so it cannot be dragged. adjust its values on the motion tab.",
79
80
  "figure.text.gizmo-size-follows": "{part}'s {axis} size follows another measure. change it under size in the responsive tab.",
80
81
  "figure.text.gizmo-fastening-places": "{part} is fastened to a face of another part, which places it. detach it first to move it.",
81
82
  "figure.text.size-range-leaves-out-size": "the {axis} range on a drawing, {range} mm, does not hold its size now, {at} mm.",
@@ -697,12 +698,12 @@
697
698
  "figure.label.face-opening-left": "opening left",
698
699
  "figure.label.face-opening-right": "opening right",
699
700
  "figure.label.face-opening-top": "opening top",
700
- "figure.label.repeat-fills": "as many as fill the length (set the pitch)",
701
- "figure.button.make-repeat": "arrange in a row",
702
- "figure.button.remove-repeat": "remove the row",
703
- "figure.label.row-basis": "how many",
704
- "figure.label.row-by-count": "a set count",
705
- "figure.text.row-count-spreads": "A set count is spread evenly over the length. Check the spacing in the preview.",
701
+ "figure.label.repeat-fills": "Keep spacing",
702
+ "figure.button.make-repeat": "Apply repeat layout",
703
+ "figure.button.remove-repeat": "Remove repeat layout",
704
+ "figure.label.row-basis": "Layout rule",
705
+ "figure.label.row-by-count": "Keep count",
706
+ "figure.text.row-count-spreads": "Distribute the chosen count evenly along the parent length. Centre spacing is calculated automatically.",
706
707
  "figure.text.row-blocked-unfastened": "Fasten {part} to another part to arrange it in a row along that part.",
707
708
  "figure.text.row-blocked-on-plane": "Fasten it to another part, not the mounting plane, to arrange it in a row along that part.",
708
709
  "figure.text.row-blocked-at-origin": "It stands at another part's origin. Fasten it to a face of that part to arrange it in a row along it.",
@@ -1184,5 +1185,38 @@
1184
1185
  "figure.text.board-size-range-explained": "A drawing can resize it within these ranges. An empty field is as far as the parts allow; a number typed narrows it to that. Only the parts that follow its size grow with it; the rest stay as they are.",
1185
1186
  "figure.text.board-size-followers": "parts that change with its size: {parts}",
1186
1187
  "figure.text.board-size-followers-more": "{first} and {rest} more",
1187
- "figure.text.board-size-no-followers": "no part changes with its size"
1188
+ "figure.text.board-size-no-followers": "no part changes with its size",
1189
+ "figure.button.resize-follow": "Scale proportionally",
1190
+ "figure.button.resize-follow-axis": "Scale {dimension} proportionally",
1191
+ "figure.text.resize-follow-axis": "Follow the figure size at the current proportion. Other dimensions stay unchanged.",
1192
+ "figure.label.size-axis": "axis",
1193
+ "figure.label.size-measure": "size (mm)",
1194
+ "figure.label.size-follows": "follows",
1195
+ "figure.label.size-source": "source",
1196
+ "figure.label.size-source-axis": "source axis",
1197
+ "figure.label.size-diameter": "diameter",
1198
+ "figure.label.size-figure": "figure",
1199
+ "figure.label.size-ratio": "keep the ratio",
1200
+ "figure.label.size-difference": "keep the gap",
1201
+ "figure.label.size-existing-rule": "existing formula",
1202
+ "figure.label.size-pick-source": "pick a source",
1203
+ "figure.button.size-other-source": "another source",
1204
+ "figure.text.size-ratio-result": "{pct}% of {source} {size} mm — changes by the same ratio when the source does.",
1205
+ "figure.text.size-difference-less": "{gap} mm less than {source} {size} mm — keeps that gap when the source changes.",
1206
+ "figure.text.size-difference-more": "{gap} mm more than {source} {size} mm — keeps that gap when the source changes.",
1207
+ "figure.text.size-difference-same": "the same as {source} {size} mm — changes as the source does.",
1208
+ "figure.text.size-custom-rule": "set by an existing formula. pick a source or a way and it changes from the size it is now.",
1209
+ "figure.text.size-uniform": "the whole figure grows and shrinks by one ratio.",
1210
+ "figure.text.size-invalid": "enter a size above 0.",
1211
+ "figure.text.size-unavailable-source": "this source's size cannot be followed.",
1212
+ "figure.text.size-unpaired": "it lies at an angle, so the axis to follow cannot be told. pick a source and an axis.",
1213
+ "figure.label.repeat-inactive": "Not applied",
1214
+ "figure.label.repeat-active": "Applied",
1215
+ "figure.label.tab-arrangement": "Layout",
1216
+ "figure.text.repeat-intro": "Repeat this part along the length of the part it is attached to.",
1217
+ "figure.text.repeat-direction": "Direction uses the attached parent’s axes.",
1218
+ "figure.text.repeat-draft": "Preview only. Apply to confirm this layout.",
1219
+ "figure.text.repeat-mode-pitch": "Keep spacing · Count changes with the parent length.",
1220
+ "figure.text.repeat-mode-count": "Keep count · Spacing changes with the parent length.",
1221
+ "figure.text.repeat-remove-explained": "Removing the layout leaves the original part."
1188
1222
  }
@@ -52,9 +52,9 @@
52
52
  "figure.text.scale-position-explained": "mantiene esta posición como fracción del tamaño de la figura: con el doble de tamaño queda al doble de distancia.",
53
53
  "figure.text.repeat-member": "copia {index} de {count} creada al repetir {name}.",
54
54
  "figure.label.detail-none": "ninguno",
55
- "figure.label.repeat": "dispuestas en fila",
56
- "figure.text.repeat-fits-length": "tantas copias como quepan en la longitud de la figura con este pitch.",
57
- "figure.text.repeat-fixed-count": "una repetición de cantidad fija; su pitch aún no se puede definir.",
55
+ "figure.label.repeat": "Distribución repetida",
56
+ "figure.text.repeat-fits-length": "Las piezas ocupan la longitud de referencia con la separación elegida.",
57
+ "figure.text.repeat-fixed-count": "La separación se calcula para mantener la cantidad.",
58
58
  "figure.text.repeat-what-pitch-gives": "{count} con una longitud de {length} mm · se colocan hasta {longest} mm de longitud ({limit} en una fila).",
59
59
  "figure.text.repeat-pitch-too-small": "el pitch debe ser de al menos {min} mm: con la longitud definida de {length} mm se superarían {limit}.",
60
60
  "figure.text.row-copies-over-limit": "Con este paso la fila tiene {count} copias. Una fila admite hasta {limit}. Amplíe el paso.",
@@ -76,6 +76,7 @@
76
76
  "figure.text.gizmo-joint-turned-slide": "la articulación {joint} solo se desliza. use el control de desplazamiento.",
77
77
  "figure.text.gizmo-joint-origin-follows": "la posición de la articulación {joint} sigue a otra pieza. cámbiela en sujeción, en la pestaña de movimiento.",
78
78
  "figure.text.gizmo-joint-off-axis": "la articulación {joint} solo gira alrededor de {axis}. use el control de rotación de {axis}.",
79
+ "figure.text.gizmo-joint-several-axes": "la articulación {joint} se mueve en varios ejes, así que no se puede arrastrar. ajuste sus valores en la pestaña de movimiento.",
79
80
  "figure.text.gizmo-size-follows": "el tamaño en {axis} de {part} sigue a otra medida. cámbielo en tamaños, en la pestaña de movimiento.",
80
81
  "figure.text.gizmo-fastening-places": "{part} está sujeta a una cara de otra pieza, que determina su posición. sepárela primero para moverla.",
81
82
  "figure.text.size-range-leaves-out-size": "el rango {axis} en un plano, {range} mm, no incluye su tamaño actual, {at} mm.",
@@ -697,12 +698,12 @@
697
698
  "figure.label.face-opening-left": "abertura izquierda",
698
699
  "figure.label.face-opening-right": "abertura derecha",
699
700
  "figure.label.face-opening-top": "abertura superior",
700
- "figure.label.repeat-fills": "tantas como llenen la longitud (definir el pitch)",
701
- "figure.button.make-repeat": "disponer en fila",
702
- "figure.button.remove-repeat": "quitar la fila",
703
- "figure.label.row-basis": "cuántas",
704
- "figure.label.row-by-count": "una cantidad fija",
705
- "figure.text.row-count-spreads": "Una cantidad fija se reparte uniformemente a lo largo de la longitud. Compruebe la separación en la vista previa.",
701
+ "figure.label.repeat-fills": "Mantener separación",
702
+ "figure.button.make-repeat": "Aplicar distribución",
703
+ "figure.button.remove-repeat": "Quitar distribución",
704
+ "figure.label.row-basis": "Regla de distribución",
705
+ "figure.label.row-by-count": "Mantener cantidad",
706
+ "figure.text.row-count-spreads": "Distribuya la cantidad elegida uniformemente. La separación se calcula automáticamente.",
706
707
  "figure.text.row-blocked-unfastened": "Sujete {part} a otra pieza para disponerla en fila a lo largo de esa pieza.",
707
708
  "figure.text.row-blocked-on-plane": "Sujétela a otra pieza, no al plano de montaje, para disponerla en fila a lo largo de esa pieza.",
708
709
  "figure.text.row-blocked-at-origin": "Está en el origen de otra pieza. Sujétela a una cara de esa pieza para disponerla en fila a lo largo de ella.",
@@ -1184,5 +1185,38 @@
1184
1185
  "figure.text.board-size-range-explained": "Un plano puede cambiar su tamaño dentro de estos rangos. Un campo vacío llega hasta donde permiten las piezas; un número lo limita a ese valor. Solo crecen las piezas que siguen su tamaño; las demás quedan igual.",
1185
1186
  "figure.text.board-size-followers": "piezas que cambian con su tamaño: {parts}",
1186
1187
  "figure.text.board-size-followers-more": "{first} y {rest} más",
1187
- "figure.text.board-size-no-followers": "ninguna pieza cambia con su tamaño"
1188
+ "figure.text.board-size-no-followers": "ninguna pieza cambia con su tamaño",
1189
+ "figure.button.resize-follow": "Cambiar proporcionalmente",
1190
+ "figure.button.resize-follow-axis": "Cambiar {dimension} proporcionalmente",
1191
+ "figure.text.resize-follow-axis": "Seguir el tamaño de la figura manteniendo la proporción actual. Las otras dimensiones no cambian.",
1192
+ "figure.label.size-axis": "eje",
1193
+ "figure.label.size-measure": "tamaño (mm)",
1194
+ "figure.label.size-follows": "sigue",
1195
+ "figure.label.size-source": "referencia",
1196
+ "figure.label.size-source-axis": "eje de referencia",
1197
+ "figure.label.size-diameter": "diámetro",
1198
+ "figure.label.size-figure": "figura",
1199
+ "figure.label.size-ratio": "mantener la proporción",
1200
+ "figure.label.size-difference": "mantener la holgura",
1201
+ "figure.label.size-existing-rule": "fórmula existente",
1202
+ "figure.label.size-pick-source": "elija una referencia",
1203
+ "figure.button.size-other-source": "otra referencia",
1204
+ "figure.text.size-ratio-result": "{pct}% de {source} {size} mm — cambia en la misma proporción cuando cambia la referencia.",
1205
+ "figure.text.size-difference-less": "{gap} mm menos que {source} {size} mm — mantiene esa diferencia cuando cambia la referencia.",
1206
+ "figure.text.size-difference-more": "{gap} mm más que {source} {size} mm — mantiene esa diferencia cuando cambia la referencia.",
1207
+ "figure.text.size-difference-same": "igual que {source} {size} mm — cambia como la referencia.",
1208
+ "figure.text.size-custom-rule": "lo fija una fórmula existente. elija una referencia o un modo y cambiará a partir del tamaño actual.",
1209
+ "figure.text.size-uniform": "toda la figura crece y se reduce en una sola proporción.",
1210
+ "figure.text.size-invalid": "introduzca un tamaño mayor que 0.",
1211
+ "figure.text.size-unavailable-source": "no se puede seguir el tamaño de esta referencia.",
1212
+ "figure.text.size-unpaired": "está en ángulo, así que no se sabe qué eje seguir. elija una referencia y un eje.",
1213
+ "figure.label.repeat-inactive": "Sin aplicar",
1214
+ "figure.label.repeat-active": "Aplicada",
1215
+ "figure.label.tab-arrangement": "Distribución",
1216
+ "figure.text.repeat-intro": "Repita esta pieza a lo largo de la pieza a la que está unida.",
1217
+ "figure.text.repeat-direction": "La dirección usa los ejes de la pieza de unión.",
1218
+ "figure.text.repeat-draft": "Vista previa. Pulse Aplicar para confirmar.",
1219
+ "figure.text.repeat-mode-pitch": "Mantener separación · La cantidad cambia con la longitud de referencia.",
1220
+ "figure.text.repeat-mode-count": "Mantener cantidad · La separación cambia con la longitud de referencia.",
1221
+ "figure.text.repeat-remove-explained": "Al quitar la distribución queda la pieza original."
1188
1222
  }
@@ -52,9 +52,9 @@
52
52
  "figure.text.scale-position-explained": "今の位置を図形サイズの割合として保ちます。2 倍のサイズなら 2 倍の距離に置かれます。",
53
53
  "figure.text.repeat-member": "{name} を {count} 個繰り返したうちの {index} 番目です。",
54
54
  "figure.label.detail-none": "なし",
55
- "figure.label.repeat": "列に並べる",
56
- "figure.text.repeat-fits-length": "図形の長さに合わせ、この間隔で入るだけ置かれます。",
57
- "figure.text.repeat-fixed-count": "個数が固定された繰り返しのため、間隔はまだ変更できません。",
55
+ "figure.label.repeat": "繰り返し配置",
56
+ "figure.text.repeat-fits-length": "接続先の長さに合わせ、指定した中心間隔で配置します。",
57
+ "figure.text.repeat-fixed-count": "個数を維持するよう中心間隔を自動計算します。",
58
58
  "figure.text.repeat-what-pitch-gives": "長さ {length} mm で {count} 個 · 最大 {longest} mm まで置けます (1 列 {limit} 個)。",
59
59
  "figure.text.repeat-pitch-too-small": "pitch は {min} mm 以上にしてください。作成した長さ {length} mm で {limit} 個を超えるためです。",
60
60
  "figure.text.row-copies-over-limit": "この間隔では列が {count} 個になります。1 列は {limit} 個までです。間隔を広げてください。",
@@ -76,6 +76,7 @@
76
76
  "figure.text.gizmo-joint-turned-slide": "{joint} 関節はスライドのみです。移動ハンドルを使ってください。",
77
77
  "figure.text.gizmo-joint-origin-follows": "{joint} 関節の位置は他の部品に従います。動きタブの取り付けで変えてください。",
78
78
  "figure.text.gizmo-joint-off-axis": "{joint} 関節は {axis} 軸でのみ回ります。{axis} の回転ハンドルを使ってください。",
79
+ "figure.text.gizmo-joint-several-axes": "{joint} 関節は軸が複数あるため、ドラッグで動かせません。動きタブの操作値で調整してください。",
79
80
  "figure.text.gizmo-size-follows": "{part} の {axis} 寸法は他の寸法に従います。動きタブの寸法で変えてください。",
80
81
  "figure.text.gizmo-fastening-places": "{part} は他の部品の面に付いていて、その面が位置を決めます。動かすには先に外してください。",
81
82
  "figure.text.size-range-leaves-out-size": "図面での {axis} の範囲 {range} mm に現在のサイズ {at} mm が入っていません。",
@@ -697,12 +698,12 @@
697
698
  "figure.label.face-opening-left": "開口部 左",
698
699
  "figure.label.face-opening-right": "開口部 右",
699
700
  "figure.label.face-opening-top": "開口部 上",
700
- "figure.label.repeat-fills": "長さを満たすだけ(pitch を決める)",
701
- "figure.button.make-repeat": "列に並べる",
702
- "figure.button.remove-repeat": "列をなくす",
703
- "figure.label.row-basis": "いくつ並べるか",
704
- "figure.label.row-by-count": "個数を決める",
705
- "figure.text.row-count-spreads": "個数を決めると長さの中で均等に広がります。間隔はプレビューで確認してください。",
701
+ "figure.label.repeat-fills": "間隔を維持",
702
+ "figure.button.make-repeat": "繰り返し配置を適用",
703
+ "figure.button.remove-repeat": "繰り返し配置を解除",
704
+ "figure.label.row-basis": "配置方式",
705
+ "figure.label.row-by-count": "個数を維持",
706
+ "figure.text.row-count-spreads": "指定した個数を接続先の長さに均等配置します。中心間隔は自動計算します。",
706
707
  "figure.text.row-blocked-unfastened": "{part} を別の部品に取り付けると、その部品に沿って列に並べられます。",
707
708
  "figure.text.row-blocked-on-plane": "取付平面ではなく別の部品に取り付けると、その部品に沿って列に並べられます。",
708
709
  "figure.text.row-blocked-at-origin": "別の部品の基準点に置かれているため、列に並べられません。その部品の面に取り付けると列に並べられます。",
@@ -1184,5 +1185,38 @@
1184
1185
  "figure.text.board-size-range-explained": "図面でこの範囲内にサイズを変えられます。空欄は部品が許す限りで、数値を入れるとその値に狭まります。サイズに従う部品だけが一緒に伸び、ほかはそのままです。",
1185
1186
  "figure.text.board-size-followers": "サイズに従って変わる部品: {parts}",
1186
1187
  "figure.text.board-size-followers-more": "{first} ほか {rest} 個",
1187
- "figure.text.board-size-no-followers": "サイズに従って変わる部品なし"
1188
+ "figure.text.board-size-no-followers": "サイズに従って変わる部品なし",
1189
+ "figure.button.resize-follow": "比例して変更",
1190
+ "figure.button.resize-follow-axis": "{dimension}を比例して変更",
1191
+ "figure.text.resize-follow-axis": "現在の比率を保って図形サイズに追従します。他の寸法は変更しません。",
1192
+ "figure.label.size-axis": "軸",
1193
+ "figure.label.size-measure": "サイズ (mm)",
1194
+ "figure.label.size-follows": "追従",
1195
+ "figure.label.size-source": "相手",
1196
+ "figure.label.size-source-axis": "相手の軸",
1197
+ "figure.label.size-diameter": "直径",
1198
+ "figure.label.size-figure": "図形",
1199
+ "figure.label.size-ratio": "比率を保つ",
1200
+ "figure.label.size-difference": "差を保つ",
1201
+ "figure.label.size-existing-rule": "既存の式",
1202
+ "figure.label.size-pick-source": "相手を選んでください",
1203
+ "figure.button.size-other-source": "別の相手",
1204
+ "figure.text.size-ratio-result": "{source} {size} mm の {pct}% — 相手が変わると同じ比率で変わります。",
1205
+ "figure.text.size-difference-less": "{source} {size} mm より {gap} mm 小さく — 相手が変わってもこの差を保ちます。",
1206
+ "figure.text.size-difference-more": "{source} {size} mm より {gap} mm 大きく — 相手が変わってもこの差を保ちます。",
1207
+ "figure.text.size-difference-same": "{source} {size} mm と同じ — 相手と同じだけ変わります。",
1208
+ "figure.text.size-custom-rule": "既存の式で決まります。相手や方式を選ぶと、今のサイズを基準に変わります。",
1209
+ "figure.text.size-uniform": "図形全体が一つの比率で拡大・縮小します。",
1210
+ "figure.text.size-invalid": "サイズは 0 より大きい数を入力してください。",
1211
+ "figure.text.size-unavailable-source": "この相手のサイズには追従できません。",
1212
+ "figure.text.size-unpaired": "斜めに置かれているため、追従する軸を決められません。相手と軸を選んでください。",
1213
+ "figure.label.repeat-inactive": "未適用",
1214
+ "figure.label.repeat-active": "適用済み",
1215
+ "figure.label.tab-arrangement": "配置",
1216
+ "figure.text.repeat-intro": "接続先の長さに沿って同じ部品を繰り返し配置します。",
1217
+ "figure.text.repeat-direction": "方向は接続先の軸です。",
1218
+ "figure.text.repeat-draft": "プレビューです。適用ボタンで確定します。",
1219
+ "figure.text.repeat-mode-pitch": "間隔を維持 · 接続先の長さに応じて個数が変わります。",
1220
+ "figure.text.repeat-mode-count": "個数を維持 · 接続先の長さに応じて間隔が変わります。",
1221
+ "figure.text.repeat-remove-explained": "解除すると元の部品が一つ残ります。"
1188
1222
  }
@@ -52,9 +52,9 @@
52
52
  "figure.text.scale-position-explained": "현재 위치를 도형 크기에 대한 비율로 설정합니다. 도형 크기가 두 배가 되면 기준점과의 거리도 두 배가 됩니다.",
53
53
  "figure.text.repeat-member": "{name} 되풀이 {count}개 중 {index}번째입니다.",
54
54
  "figure.label.detail-none": "없음",
55
- "figure.label.repeat": "줄로 배열",
56
- "figure.text.repeat-fits-length": "도형 길이에 맞춰 이 간격으로 들어가는 만큼 놓입니다.",
57
- "figure.text.repeat-fixed-count": "개수가 고정된 되풀이라 간격은 아직 바꿀 수 없습니다.",
55
+ "figure.label.repeat": "반복 배치",
56
+ "figure.text.repeat-fits-length": "상대 길이를 따라 정한 피치로 놓입니다.",
57
+ "figure.text.repeat-fixed-count": "개수를 지키도록 피치가 자동으로 정해집니다.",
58
58
  "figure.text.repeat-what-pitch-gives": "길이 {length} mm 에서 {count}개 · 최대 길이 {longest} mm 까지 놓입니다 (한 줄 {limit}개).",
59
59
  "figure.text.repeat-pitch-too-small": "피치는 {min} mm 이상이어야 합니다. 저작한 길이 {length} mm 에서 {limit}개를 넘기 때문입니다.",
60
60
  "figure.text.row-copies-over-limit": "간격이 좁아 줄이 {count}개가 됩니다. 한 줄은 {limit}개까지입니다. 간격을 넓혀 주세요.",
@@ -76,6 +76,7 @@
76
76
  "figure.text.gizmo-joint-turned-slide": "{joint} 관절은 미끄러지기만 합니다. 이동 손잡이로 움직이세요.",
77
77
  "figure.text.gizmo-joint-origin-follows": "{joint} 관절의 위치는 다른 부품을 기준으로 결정됩니다. 속성 탭의 「자리」에서 바꾸세요.",
78
78
  "figure.text.gizmo-joint-off-axis": "{joint} 관절은 {axis}축으로만 돕니다. {axis} 회전 손잡이를 쓰세요.",
79
+ "figure.text.gizmo-joint-several-axes": "{joint} 관절은 축이 여럿이라 끌어서 움직일 수 없습니다. 움직임 탭의 조작값으로 조정해 주세요.",
79
80
  "figure.text.gizmo-size-follows": "{part}의 {axis} 치수는 다른 치수를 따라 정해집니다. 반응형 탭의 「크기」에서 바꾸세요.",
80
81
  "figure.text.gizmo-fastening-places": "{part} 부품은 다른 부품의 면에 부착되어 있습니다. 위치를 직접 변경하려면 부착 관계를 먼저 해제해 주세요.",
81
82
  "figure.text.size-range-leaves-out-size": "도면에서의 {axis} 범위 {range} mm 에 지금 크기 {at} mm 가 들어가지 않습니다.",
@@ -285,7 +286,7 @@
285
286
  "figure.label.recipe-category-utility": "배관 · 유틸리티",
286
287
  "figure.label.recipe-category-space": "공간 · 건축",
287
288
  "figure.label.recipe-category-other": "기타",
288
- "figure.label.recipe-adds": "넣는 것",
289
+ "figure.label.recipe-adds": "추가 항목",
289
290
  "figure.text.recipe-parts": "부품 {parts}개",
290
291
  "figure.text.recipe-slides": "{part}: 미끄러짐",
291
292
  "figure.text.recipe-turns": "{part}: 회전",
@@ -697,20 +698,20 @@
697
698
  "figure.label.face-opening-left": "개구부 왼쪽",
698
699
  "figure.label.face-opening-right": "개구부 오른쪽",
699
700
  "figure.label.face-opening-top": "개구부 위",
700
- "figure.label.repeat-fills": "길이를 채우는 만큼 (피치를 정함)",
701
- "figure.button.make-repeat": "줄로 배열하기",
702
- "figure.button.remove-repeat": "줄 배열 삭제",
703
- "figure.label.row-basis": "몇 개로 배열할지",
704
- "figure.label.row-by-count": "개수를 정함",
705
- "figure.text.row-count-spreads": "개수를 설정하면 지정한 길이 안에 부품이 균등하게 배치됩니다. 간격은 미리보기에서 확인해 주세요.",
706
- "figure.text.row-blocked-unfastened": "{part}을(를) 다른 부품에 붙이면 그 부품을 따라 줄로 배열할 수 있습니다.",
707
- "figure.text.row-blocked-on-plane": "장착 평면이 아니라 다른 부품에 붙여야 그 부품을 따라 줄로 배열할 수 있습니다.",
708
- "figure.text.row-blocked-at-origin": "다른 부품의 기준점에 놓여 있어 줄로 배열할 수 없습니다. 그 부품의 면에 붙이면 줄로 배열할 수 있습니다.",
709
- "figure.text.row-blocked-holds-parts": "이 부품에 붙은 부품이 있어 줄로 배열할 수 없습니다. 먼저 줄로 배열한 뒤 붙이면 복사본마다 함께 붙습니다.",
710
- "figure.text.row-blocked-on-surface": "곡면 위 한 점에 붙어 있어 줄로 배열할 수 없습니다. 면에 붙이면 줄로 배열할 수 있습니다.",
701
+ "figure.label.repeat-fills": "피치 유지",
702
+ "figure.button.make-repeat": "반복 배치 적용",
703
+ "figure.button.remove-repeat": "반복 배치 해제",
704
+ "figure.label.row-basis": "배치 기준",
705
+ "figure.label.row-by-count": "개수 유지",
706
+ "figure.text.row-count-spreads": "정한 개수를 상대 길이에 고르게 놓습니다. 피치는 자동으로 정해집니다.",
707
+ "figure.text.row-blocked-unfastened": "{part}을(를) 다른 부품에 붙이면 그 부품을 따라 반복 배치할 수 있습니다.",
708
+ "figure.text.row-blocked-on-plane": "장착 평면이 아니라 다른 부품에 붙여야 그 부품을 따라 반복 배치할 수 있습니다.",
709
+ "figure.text.row-blocked-at-origin": "다른 부품의 기준점에 놓여 있어 반복 배치할 수 없습니다. 그 부품의 면에 붙이면 반복 배치할 수 있습니다.",
710
+ "figure.text.row-blocked-holds-parts": "이 부품에 붙은 부품이 있어 반복 배치할 수 없습니다. 먼저 반복 배치한 뒤 붙이면 복사본마다 함께 붙습니다.",
711
+ "figure.text.row-blocked-on-surface": "곡면 위 한 점에 붙어 있어 반복 배치할 수 없습니다. 면에 붙이면 반복 배치할 수 있습니다.",
711
712
  "figure.text.aim-self": "{part} 자신에는 붙일 수 없습니다.",
712
713
  "figure.text.aim-cannot": "{part}에는 붙일 면이나 곡면이 없습니다.",
713
- "figure.text.aim-not-here": "{part}의 그곳에는 붙일 수 없습니다. 면을 고르세요.",
714
+ "figure.text.aim-not-here": "{part}의 해당 위치에는 부착할 수 없습니다. 부착할 면을 선택해 주세요.",
714
715
  "figure.button.go-fasten": "붙이기로 가기",
715
716
  "figure.text.row-count-pitch": "{part} {count}개 · {axis} 방향 · 피치 {pitch} mm",
716
717
  "figure.text.row-count-uneven": "{part} {count}개 · {axis} 방향 · 간격이 고르지 않음",
@@ -763,7 +764,7 @@
763
764
  "figure.text.session-not-open": "먼저 모델을 정상적으로 열어 주세요.",
764
765
  "figure.text.session-saving": "저장이 끝난 뒤 편집해 주세요.",
765
766
  "figure.text.session-version-missing": "AI 편집에는 요청 당시의 모델 문맥과 리비전이 필요합니다.",
766
- "figure.text.session-new-figure-touched": "손대지 않은 새 모델에만 쓸 수 있습니다.",
767
+ "figure.text.session-new-figure-touched": "아직 편집하지 않은 새 모델에만 적용할 수 있습니다.",
767
768
  "figure.text.session-proposal-key": "제안 식별자가 올바르지 않습니다.",
768
769
  "figure.text.edit-refused-node-limit": "노드 수 제한으로 부품을 더 추가할 수 없습니다. 최대 노드 수는 {max}개입니다.",
769
770
  "figure.text.document-too-large": "도형이 {at} KiB 로 저장 한도 {max} KiB 를 넘습니다.",
@@ -785,7 +786,7 @@
785
786
  "figure.label.resize-advanced": "크기 반응 정하기",
786
787
  "figure.text.resize-all-following": "이 부품의 크기는 모델 크기를 따라 바뀝니다.",
787
788
  "figure.text.resize-uniform-warning": "이 도형은 전체 비율 유지 방식입니다. 방향별 변경보다 전체 비율 규칙이 우선합니다. 이 방식의 전환 기능은 아직 제공되지 않습니다.",
788
- "figure.text.preview-setup": "크기가 기대대로 바뀌지 않나요? 부품을 골라 늘어날 방향과 붙어 있을 자리를 정하세요.",
789
+ "figure.text.preview-setup": "크기가 예상과 다르게 변경되면 부품을 선택한 후 늘어날 방향과 고정할 위치를 설정해 주세요.",
789
790
  "figure.label.resize-part": "크기 반응을 설정할 부품",
790
791
  "figure.button.configure-size": "선택한 부품의 크기 반응 설정",
791
792
  "figure.text.resize-room-unchanged": "크기 반응을 적용했습니다. 선언한 공간은 바꾸지 않았습니다.",
@@ -832,7 +833,7 @@
832
833
  "figure.text.held-on-part": "{other}의 {otherFace}에 붙어 있음",
833
834
  "figure.button.open-fastening": "붙임 설정 열기",
834
835
  "figure.button.detach-held": "붙임 풀기",
835
- "figure.label.align-input": "위치 칸을 따름 ({field})",
836
+ "figure.label.align-input": "입력한 위치 사용 ({field})",
836
837
  "figure.label.tab-short-properties": "속성",
837
838
  "figure.label.tab-short-capability": "능력",
838
839
  "figure.label.tab-short-motion": "움직임",
@@ -962,7 +963,7 @@
962
963
  "figure.label.detail-saved": "저장본",
963
964
  "figure.text.detail-unreleased": "아직 발행되지 않았습니다. 저장된 초안을 보여줍니다.",
964
965
  "figure.button.detail-edit": "편집 화면 열기",
965
- "figure.button.download-package": "꾸러미 내려받기",
966
+ "figure.button.download-package": "패키지 다운로드",
966
967
  "figure.button.import-mesh": "GLB 가져오기",
967
968
  "figure.text.import-mesh-hint": "GLB 파일을 부품으로 가져옵니다. 파일 전체나 그 안의 한 부분을 고릅니다.",
968
969
  "figure.text.mesh-whole-file": "파일 전체",
@@ -1165,7 +1166,7 @@
1165
1166
  "figure.label.retired": "퇴역",
1166
1167
  "figure.button.retire": "퇴역",
1167
1168
  "figure.button.unretire": "되살리기",
1168
- "figure.label.superseded-by": "대신 쓸 Figure",
1169
+ "figure.label.superseded-by": "대체 Figure",
1169
1170
  "figure.text.retired-instead": "퇴역 · 대신 {type}",
1170
1171
  "figure.label.namespace-default": "기본",
1171
1172
  "figure.label.namespace-suspended": "쉬는 중",
@@ -1180,9 +1181,42 @@
1180
1181
  "figure.text.property-section-failed": "{section} 구역을 그리지 못했습니다: {reason}",
1181
1182
  "figure.label.board-size": "도면에서의 크기",
1182
1183
  "figure.text.board-size-fixed": "도면에 놓으면 늘 {x} × {y} × {z} mm 로 그려집니다.",
1183
- "figure.text.board-size-fixed-explained": "누르면 도면에서 이 도형의 크기를 바꿀 수 있게 됩니다. 부품을 골라 「도형 크기에 맞추기」를 눌러 두면 그 부품이 함께 늘어납니다.",
1184
- "figure.text.board-size-range-explained": "도면에서 이 범위 안으로 크기를 바꿀 수 있습니다. 빈 칸은 부품이 허락하는 만큼이고, 숫자를 넣으면 그 값으로 좁혀집니다. 크기를 따라 바뀌는 부품만 함께 늘어나고, 나머지는 그대로입니다.",
1184
+ "figure.text.board-size-fixed-explained": "선택하면 도면에서 이 도형의 크기를 변경할 수 있습니다. 부품에 「도형 크기에 맞추기」를 설정하면 해당 부품의 크기도 함께 변경됩니다.",
1185
+ "figure.text.board-size-range-explained": "도면에서 변경할 수 있는 크기 범위입니다. 비워 두면 부품에서 허용하는 범위를 사용하고, 값을 입력하면 해당 범위로 제한합니다. 크기 연동이 설정된 부품만 함께 조정되며, 나머지 부품의 크기는 유지됩니다.",
1185
1186
  "figure.text.board-size-followers": "크기를 따라 바뀌는 부품: {parts}",
1186
1187
  "figure.text.board-size-followers-more": "{first} 외 {rest}개",
1187
- "figure.text.board-size-no-followers": "크기를 따라 바뀌는 부품 없음"
1188
+ "figure.text.board-size-no-followers": "크기를 따라 바뀌는 부품 없음",
1189
+ "figure.button.resize-follow": "비례 변경",
1190
+ "figure.button.resize-follow-axis": "{dimension} 비례 변경",
1191
+ "figure.text.resize-follow-axis": "현재 치수의 비율을 유지하며 도형 크기를 따라갑니다. 다른 치수는 바꾸지 않습니다.",
1192
+ "figure.label.size-axis": "축",
1193
+ "figure.label.size-measure": "크기 (mm)",
1194
+ "figure.label.size-follows": "따라감",
1195
+ "figure.label.size-source": "상대",
1196
+ "figure.label.size-source-axis": "상대 축",
1197
+ "figure.label.size-diameter": "지름",
1198
+ "figure.label.size-figure": "도형",
1199
+ "figure.label.size-ratio": "비율 유지",
1200
+ "figure.label.size-difference": "간격 유지",
1201
+ "figure.label.size-existing-rule": "기존 식",
1202
+ "figure.label.size-pick-source": "상대를 고르세요",
1203
+ "figure.button.size-other-source": "다른 상대",
1204
+ "figure.text.size-ratio-result": "{source} {size} mm의 {pct}% — 상대가 바뀌면 같은 비율로 바뀝니다.",
1205
+ "figure.text.size-difference-less": "{source} {size} mm보다 {gap} mm 작게 — 상대가 바뀌어도 이 차이를 지킵니다.",
1206
+ "figure.text.size-difference-more": "{source} {size} mm보다 {gap} mm 크게 — 상대가 바뀌어도 이 차이를 지킵니다.",
1207
+ "figure.text.size-difference-same": "{source} {size} mm와 같게 — 상대가 바뀌면 똑같이 바뀝니다.",
1208
+ "figure.text.size-custom-rule": "기존 식으로 정해집니다. 상대나 방식을 고르면 지금 크기를 기준으로 바뀝니다.",
1209
+ "figure.text.size-uniform": "도형 전체가 한 비율로 커지고 작아집니다.",
1210
+ "figure.text.size-invalid": "크기는 0보다 큰 수로 넣으세요.",
1211
+ "figure.text.size-unavailable-source": "이 상대의 크기는 따를 수 없습니다.",
1212
+ "figure.text.size-unpaired": "비스듬히 놓여 따를 축을 정할 수 없습니다. 상대와 축을 고르세요.",
1213
+ "figure.label.repeat-inactive": "미적용",
1214
+ "figure.label.repeat-active": "적용됨",
1215
+ "figure.label.tab-arrangement": "배치",
1216
+ "figure.text.repeat-intro": "붙인 상대의 길이를 따라 같은 부품을 반복해서 놓습니다.",
1217
+ "figure.text.repeat-direction": "방향은 붙인 상대의 축입니다.",
1218
+ "figure.text.repeat-draft": "미리보기입니다. 적용 버튼을 눌러 확정하세요.",
1219
+ "figure.text.repeat-mode-pitch": "피치 유지 · 상대 길이가 바뀌면 개수가 바뀝니다.",
1220
+ "figure.text.repeat-mode-count": "개수 유지 · 상대 길이가 바뀌면 간격이 바뀝니다.",
1221
+ "figure.text.repeat-remove-explained": "해제하면 원본 부품 하나가 남습니다."
1188
1222
  }
@@ -52,9 +52,9 @@
52
52
  "figure.text.scale-position-explained": "menyimpan kedudukan ini sebagai bahagian saiz figura — pada saiz dua kali, jaraknya dua kali.",
53
53
  "figure.text.repeat-member": "salinan ke-{index} daripada {count} yang dibuat dengan mengulang {name}.",
54
54
  "figure.label.detail-none": "tiada",
55
- "figure.label.repeat": "disusun sebaris",
56
- "figure.text.repeat-fits-length": "seberapa banyak salinan yang muat pada panjang figura dengan jarak ini.",
57
- "figure.text.repeat-fixed-count": "ulangan dengan bilangan tetap; jaraknya belum boleh ditetapkan.",
55
+ "figure.label.repeat": "Susunan berulang",
56
+ "figure.text.repeat-fits-length": "Bahagian mengisi panjang rujukan pada jarak pusat yang dipilih.",
57
+ "figure.text.repeat-fixed-count": "Jarak pusat dikira untuk mengekalkan bilangan.",
58
58
  "figure.text.repeat-what-pitch-gives": "{count} pada panjang {length} mm · boleh diletakkan sehingga {longest} mm ({limit} sebaris).",
59
59
  "figure.text.repeat-pitch-too-small": "pitch mesti sekurang-kurangnya {min} mm: pada panjang asal {length} mm ia akan melebihi {limit}.",
60
60
  "figure.text.row-copies-over-limit": "Pada jarak ini barisan mempunyai {count} salinan. Satu barisan mengambil sehingga {limit}. Lebarkan jarak.",
@@ -76,6 +76,7 @@
76
76
  "figure.text.gizmo-joint-turned-slide": "sendi {joint} hanya menggelongsor. gunakan pemegang alih.",
77
77
  "figure.text.gizmo-joint-origin-follows": "kedudukan sendi {joint} mengikut bahagian lain. ubahnya di bawah pelekatan dalam tab gerakan.",
78
78
  "figure.text.gizmo-joint-off-axis": "sendi {joint} hanya berputar pada paksi {axis}. gunakan pemegang putar {axis}.",
79
+ "figure.text.gizmo-joint-several-axes": "sendi {joint} bergerak pada beberapa paksi, jadi ia tidak boleh diseret. laraskan nilainya pada tab gerakan.",
79
80
  "figure.text.gizmo-size-follows": "saiz {axis} {part} mengikut ukuran lain. ubahnya di bawah saiz dalam tab gerakan.",
80
81
  "figure.text.gizmo-fastening-places": "{part} dilekatkan pada muka bahagian lain, yang menentukan kedudukannya. tanggalkan dahulu untuk menggerakkannya.",
81
82
  "figure.text.size-range-leaves-out-size": "julat {axis} pada lukisan, {range} mm, tidak merangkumi saiznya sekarang, {at} mm.",
@@ -697,12 +698,12 @@
697
698
  "figure.label.face-opening-left": "bukaan kiri",
698
699
  "figure.label.face-opening-right": "bukaan kanan",
699
700
  "figure.label.face-opening-top": "bukaan atas",
700
- "figure.label.repeat-fills": "sebanyak yang memenuhi panjang (tetapkan pitch)",
701
- "figure.button.make-repeat": "susun sebaris",
702
- "figure.button.remove-repeat": "buang baris",
703
- "figure.label.row-basis": "berapa banyak",
704
- "figure.label.row-by-count": "bilangan tetap",
705
- "figure.text.row-count-spreads": "Bilangan tetap disebarkan sekata sepanjang panjang. Semak jaraknya dalam pratonton.",
701
+ "figure.label.repeat-fills": "Kekalkan jarak",
702
+ "figure.button.make-repeat": "Gunakan susunan",
703
+ "figure.button.remove-repeat": "Buang susunan",
704
+ "figure.label.row-basis": "Peraturan susunan",
705
+ "figure.label.row-by-count": "Kekalkan bilangan",
706
+ "figure.text.row-count-spreads": "Agihkan bilangan yang dipilih secara sekata. Jarak pusat dikira secara automatik.",
706
707
  "figure.text.row-blocked-unfastened": "Lekatkan {part} pada bahagian lain untuk menyusunnya sebaris di sepanjang bahagian itu.",
707
708
  "figure.text.row-blocked-on-plane": "Lekatkan pada bahagian lain, bukan satah pemasangan, untuk menyusunnya sebaris.",
708
709
  "figure.text.row-blocked-at-origin": "Ia diletakkan pada titik asal bahagian lain. Lekatkan pada muka bahagian itu untuk menyusunnya sebaris.",
@@ -1184,5 +1185,38 @@
1184
1185
  "figure.text.board-size-range-explained": "Lukisan boleh mengubah saiznya dalam julat ini. Medan kosong ialah setakat yang dibenarkan bahagian; nombor yang ditaip menyempitkannya ke nilai itu. Hanya bahagian yang mengikut saiznya turut membesar; yang lain kekal.",
1185
1186
  "figure.text.board-size-followers": "bahagian yang berubah mengikut saiznya: {parts}",
1186
1187
  "figure.text.board-size-followers-more": "{first} dan {rest} lagi",
1187
- "figure.text.board-size-no-followers": "tiada bahagian berubah mengikut saiznya"
1188
+ "figure.text.board-size-no-followers": "tiada bahagian berubah mengikut saiznya",
1189
+ "figure.button.resize-follow": "Ubah secara berkadar",
1190
+ "figure.button.resize-follow-axis": "Ubah {dimension} secara berkadar",
1191
+ "figure.text.resize-follow-axis": "Ikut saiz rajah pada perkadaran semasa. Dimensi lain tidak berubah.",
1192
+ "figure.label.size-axis": "paksi",
1193
+ "figure.label.size-measure": "saiz (mm)",
1194
+ "figure.label.size-follows": "mengikut",
1195
+ "figure.label.size-source": "sumber",
1196
+ "figure.label.size-source-axis": "paksi sumber",
1197
+ "figure.label.size-diameter": "diameter",
1198
+ "figure.label.size-figure": "rajah",
1199
+ "figure.label.size-ratio": "kekalkan nisbah",
1200
+ "figure.label.size-difference": "kekalkan jarak",
1201
+ "figure.label.size-existing-rule": "formula sedia ada",
1202
+ "figure.label.size-pick-source": "pilih sumber",
1203
+ "figure.button.size-other-source": "sumber lain",
1204
+ "figure.text.size-ratio-result": "{pct}% daripada {source} {size} mm — berubah dengan nisbah yang sama apabila sumber berubah.",
1205
+ "figure.text.size-difference-less": "{gap} mm kurang daripada {source} {size} mm — kekalkan jarak itu apabila sumber berubah.",
1206
+ "figure.text.size-difference-more": "{gap} mm lebih daripada {source} {size} mm — kekalkan jarak itu apabila sumber berubah.",
1207
+ "figure.text.size-difference-same": "sama dengan {source} {size} mm — berubah seperti sumber.",
1208
+ "figure.text.size-custom-rule": "ditetapkan oleh formula sedia ada. pilih sumber atau cara dan ia berubah daripada saiz sekarang.",
1209
+ "figure.text.size-uniform": "seluruh rajah membesar dan mengecil dengan satu nisbah.",
1210
+ "figure.text.size-invalid": "masukkan saiz melebihi 0.",
1211
+ "figure.text.size-unavailable-source": "saiz sumber ini tidak boleh diikut.",
1212
+ "figure.text.size-unpaired": "ia terletak senget, jadi paksi untuk diikut tidak dapat ditentukan. pilih sumber dan paksi.",
1213
+ "figure.label.repeat-inactive": "Belum digunakan",
1214
+ "figure.label.repeat-active": "Digunakan",
1215
+ "figure.label.tab-arrangement": "Susunan",
1216
+ "figure.text.repeat-intro": "Ulang bahagian ini sepanjang bahagian tempat ia dipasang.",
1217
+ "figure.text.repeat-direction": "Arah menggunakan paksi bahagian tempat ia dipasang.",
1218
+ "figure.text.repeat-draft": "Pratonton sahaja. Tekan Gunakan untuk mengesahkan.",
1219
+ "figure.text.repeat-mode-pitch": "Kekalkan jarak · Bilangan berubah mengikut panjang rujukan.",
1220
+ "figure.text.repeat-mode-count": "Kekalkan bilangan · Jarak berubah mengikut panjang rujukan.",
1221
+ "figure.text.repeat-remove-explained": "Membuang susunan meninggalkan satu bahagian asal."
1188
1222
  }