@things-factory/figure-ui 10.1.49 → 10.1.50

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/graphql/v3-store.ts +2 -1
  2. package/client/modeller/figure-history-panel.ts +9 -1
  3. package/client/modeller/figure-v3-first-save.ts +98 -0
  4. package/client/modeller/figure-v3-links.ts +89 -26
  5. package/client/modeller/figure-v3-parts.ts +1 -0
  6. package/client/modeller/figure-v3-properties.ts +2 -1
  7. package/client/modeller/v3-canvas.ts +61 -7
  8. package/client/modeller/v3-editor.ts +91 -21
  9. package/client/modeller/v3-first-save.ts +34 -0
  10. package/client/modeller/v3-gizmo.ts +52 -3
  11. package/client/modeller/v3-joint-drag.ts +116 -0
  12. package/client/modeller/v3-joint-fan.ts +24 -11
  13. package/client/modeller/v3-keys.ts +12 -1
  14. package/client/modeller/v3-links.ts +72 -5
  15. package/client/modeller/v3-live.ts +11 -0
  16. package/client/modeller/v3-product-session.ts +4 -2
  17. package/client/modeller/v3-refusals.ts +21 -0
  18. package/client/pages/figure-v3-modeller-page.ts +46 -7
  19. package/dist-client/graphql/v3-store.js +2 -1
  20. package/dist-client/graphql/v3-store.js.map +1 -1
  21. package/dist-client/modeller/figure-history-panel.js +9 -1
  22. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  23. package/dist-client/modeller/figure-v3-first-save.d.ts +20 -0
  24. package/dist-client/modeller/figure-v3-first-save.js +118 -0
  25. package/dist-client/modeller/figure-v3-first-save.js.map +1 -0
  26. package/dist-client/modeller/figure-v3-links.d.ts +5 -0
  27. package/dist-client/modeller/figure-v3-links.js +81 -23
  28. package/dist-client/modeller/figure-v3-links.js.map +1 -1
  29. package/dist-client/modeller/figure-v3-parts.js +1 -0
  30. package/dist-client/modeller/figure-v3-parts.js.map +1 -1
  31. package/dist-client/modeller/figure-v3-properties.js +2 -1
  32. package/dist-client/modeller/figure-v3-properties.js.map +1 -1
  33. package/dist-client/modeller/v3-canvas.d.ts +11 -0
  34. package/dist-client/modeller/v3-canvas.js +61 -7
  35. package/dist-client/modeller/v3-canvas.js.map +1 -1
  36. package/dist-client/modeller/v3-editor.d.ts +13 -1
  37. package/dist-client/modeller/v3-editor.js +91 -21
  38. package/dist-client/modeller/v3-editor.js.map +1 -1
  39. package/dist-client/modeller/v3-first-save.d.ts +17 -0
  40. package/dist-client/modeller/v3-first-save.js +27 -0
  41. package/dist-client/modeller/v3-first-save.js.map +1 -0
  42. package/dist-client/modeller/v3-gizmo.d.ts +18 -0
  43. package/dist-client/modeller/v3-gizmo.js +45 -2
  44. package/dist-client/modeller/v3-gizmo.js.map +1 -1
  45. package/dist-client/modeller/v3-joint-drag.d.ts +19 -0
  46. package/dist-client/modeller/v3-joint-drag.js +97 -0
  47. package/dist-client/modeller/v3-joint-drag.js.map +1 -0
  48. package/dist-client/modeller/v3-joint-fan.js +24 -11
  49. package/dist-client/modeller/v3-joint-fan.js.map +1 -1
  50. package/dist-client/modeller/v3-keys.d.ts +9 -1
  51. package/dist-client/modeller/v3-keys.js +3 -0
  52. package/dist-client/modeller/v3-keys.js.map +1 -1
  53. package/dist-client/modeller/v3-links.d.ts +45 -2
  54. package/dist-client/modeller/v3-links.js +52 -3
  55. package/dist-client/modeller/v3-links.js.map +1 -1
  56. package/dist-client/modeller/v3-live.d.ts +6 -0
  57. package/dist-client/modeller/v3-live.js +10 -0
  58. package/dist-client/modeller/v3-live.js.map +1 -1
  59. package/dist-client/modeller/v3-product-session.d.ts +4 -1
  60. package/dist-client/modeller/v3-product-session.js +2 -2
  61. package/dist-client/modeller/v3-product-session.js.map +1 -1
  62. package/dist-client/modeller/v3-refusals.d.ts +4 -0
  63. package/dist-client/modeller/v3-refusals.js +21 -0
  64. package/dist-client/modeller/v3-refusals.js.map +1 -0
  65. package/dist-client/pages/figure-v3-modeller-page.d.ts +4 -0
  66. package/dist-client/pages/figure-v3-modeller-page.js +45 -7
  67. package/dist-client/pages/figure-v3-modeller-page.js.map +1 -1
  68. package/dist-client/tsconfig.tsbuildinfo +1 -1
  69. package/package.json +7 -5
  70. package/test/browser/build.mjs +62 -0
  71. package/test/browser/modeller-page.js +198 -0
  72. package/test/browser/modeller.check.mjs +334 -0
  73. package/test/browser/serve.mjs +43 -0
  74. package/test/joints.ts +33 -0
  75. package/test/v3-clips.test.ts +3 -2
  76. package/test/v3-controls.test.ts +3 -2
  77. package/test/v3-fields.test.ts +3 -2
  78. package/test/v3-first-save.test.ts +75 -0
  79. package/test/v3-gizmo.test.ts +38 -5
  80. package/test/v3-joint-drag.test.ts +93 -0
  81. package/test/v3-joint-fan.test.ts +16 -6
  82. package/test/v3-keys.test.ts +15 -2
  83. package/test/v3-links.test.ts +62 -14
  84. package/test/v3-live.test.ts +23 -4
  85. package/test/v3-maturity.test.ts +2 -6
  86. package/test/v3-refusals.test.ts +28 -0
  87. package/translations/en.json +33 -5
  88. package/translations/ja.json +32 -4
  89. package/translations/ko.json +32 -4
  90. package/translations/ms.json +32 -4
  91. package/translations/zh.json +32 -4
@@ -0,0 +1,28 @@
1
+ /*
2
+ * 크기 범위 거절을 사람의 말로 (사용자 2026-09-24: 「what is this warning message means?」 — 커널의 영어 원문이 떴다).
3
+ */
4
+ import { test } from 'node:test'
5
+ import assert from 'node:assert/strict'
6
+ import { readFileSync } from 'node:fs'
7
+ import { fileURLToPath } from 'node:url'
8
+
9
+ import { sizeRangeRefusalOf } from '../client/modeller/v3-refusals.ts'
10
+
11
+ const ko = JSON.parse(readFileSync(fileURLToPath(new URL('../translations/ko.json', import.meta.url)), 'utf8'))
12
+ const say = (key: string, params: Record<string, string>) => ko[key].replace(/\{(\w+)\}/g, (_: string, k: string) => params[k] ?? '')
13
+ const refusal = (message: string) => Object.assign(new Error(message), { code: 'INSTANCE_SIZE_RANGE' })
14
+
15
+ test('화성 트레이의 거절 — 축 · 숫자 · 부품 · 고치는 곳', () => {
16
+ const said = sizeRangeRefusalOf(refusal('INSTANCE_SIZE_RANGE: size.x: below 8.82353 mm a length goes to zero (cell); declare the smallest size at 8.82353 mm or more'), say)!
17
+ assert.ok(said.includes('X 축을') && said.includes('8.8 mm') && said.includes('cell 부품') && said.includes('다시 재기'), said)
18
+ assert.ok(!/declare|below/.test(said))
19
+ })
20
+
21
+ test('위쪽 끝도, 부품 이름이 없어도', () => {
22
+ const said = sizeRangeRefusalOf(refusal('INSTANCE_SIZE_RANGE: size.y: above 15000 mm the figure cannot be drawn; declare the largest size at 15000 mm or less'), say)!
23
+ assert.ok(said.includes('Y 축을') && said.includes('15,000 mm'), said)
24
+ })
25
+
26
+ test('다른 거절은 건드리지 않는다', () => {
27
+ assert.equal(sizeRangeRefusalOf(Object.assign(new Error('x'), { code: 'EDIT_TARGET' }), say), null)
28
+ })
@@ -66,9 +66,19 @@
66
66
  "figure.text.repeat-what-pitch-gives": "{count} at a length of {length} mm · placed up to {longest} mm long ({limit} in a row).",
67
67
  "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}.",
68
68
  "figure.text.gizmo-joint-places": "a joint places {part}. move it with its control in the motion tab.",
69
+ "figure.label.motion-continuous": "turn without end",
70
+ "figure.text.fasten-before-moving": "fasten it to another part or the floor first; then it can move.",
71
+ "figure.text.joint-range-holds-zero": "the range must hold 0, the rest pose.",
72
+ "figure.text.gizmo-joint-mimic": "the {joint} joint follows {leader}. move {leader}.",
73
+ "figure.text.gizmo-joint-fixed-turn": "the {joint} joint does not turn. give it a turn in the motion tab.",
74
+ "figure.text.gizmo-joint-turned-slide": "the {joint} joint only slides. use the move handle.",
75
+ "figure.text.gizmo-joint-origin-follows": "the {joint} joint's place follows another part. change it under fastening in the motion tab.",
76
+ "figure.text.gizmo-joint-off-axis": "the {joint} joint turns only about {axis}. use the {axis} rotate handle.",
77
+ "figure.text.gizmo-size-follows": "{part}'s {axis} size follows another measure. change it under sizes in the motion tab.",
69
78
  "figure.text.gizmo-fastening-places": "{part} is fastened to a face of another part, which places it. detach it first to move it.",
70
- "figure.text.gizmo-size-worked-out": "the size of {part} is worked out, so the gizmo cannot change it. set it to fixed under dimensions.",
71
- "figure.text.instance-range-can-widen": "measured again after the parts changed: {ranges} mm.",
79
+ "figure.text.instance-range-can-widen": "measured again with the parts as they are: {ranges} mm.",
80
+ "figure.text.size-range-too-small": "below {mm} mm on {axis} the {part} part has no length, yet the figure is declared to be placed smaller, so this change cannot be made. use \"measure again\" under the sizes it can be placed at.",
81
+ "figure.text.size-range-too-large": "above {mm} mm on {axis} the {part} part cannot be drawn, yet the figure is declared to be placed larger, so this change cannot be made. use \"measure again\" under the sizes it can be placed at.",
72
82
  "figure.text.mounting-face-needs-space": "declare the space first to choose one.",
73
83
  "figure.text.part-is-referenced": "'{part}' cannot be deleted: another part is fastened to it or follows its size. Undo that link first.",
74
84
  "figure.text.part-name-invalid": "'{name}' cannot be a part name. Start with a letter and use letters, digits, - and _.",
@@ -374,6 +384,9 @@
374
384
  "figure.text.designate-in-properties": "nothing designated yet. select a part and set its role in the properties tab.",
375
385
  "figure.text.detail-level-explained": "S for signs and posts, M for most equipment, L for the large equipment a view centres on. the level sets the part limit.",
376
386
  "figure.text.discard-changes-and-start-new": "there are unsaved changes. discard them and start a new figure?",
387
+ "figure.text.leave-without-saving": "there are unsaved changes. discard them and leave?",
388
+ "figure.button.leave-without-saving": "discard and leave",
389
+ "figure.button.keep-editing": "keep editing",
377
390
  "figure.text.does-not-block": "does not block",
378
391
  "figure.text.emissive-explained": "how bright the surface itself is. 0 is unlit, and it does not light its surroundings.",
379
392
  "figure.text.enter-a-type-name": "enter a type name.",
@@ -515,7 +528,7 @@
515
528
  "figure.text.tools-explained": "from left: centre X, centre Z, to floor, mirror X, mirror Z, snap to grid.",
516
529
  "figure.text.triangle-count": "{count} triangles",
517
530
  "figure.text.two-keys-at-least": "add at least two keys.",
518
- "figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
531
+ "figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one.",
519
532
  "figure.text.type-name-cannot-change": "the type name cannot be changed after creation.",
520
533
  "figure.text.type-name-will-not-release": "this name cannot be released. use capitals, digits and single underscores, 3 to 32 characters (e.g. AGV_LIFTER).",
521
534
  "figure.text.unit-is-a-word-not-a-rule": "a display unit (e.g. mm, deg, %). it is not used in calculation.",
@@ -551,7 +564,7 @@
551
564
  "figure.label.facing-flush": "same plane",
552
565
  "figure.label.gap": "gap (mm)",
553
566
  "figure.label.align": "within the face",
554
- "figure.label.align-centre": "centre",
567
+ "figure.label.align-centre": "centred",
555
568
  "figure.label.align-min": "low edge",
556
569
  "figure.label.align-max": "high edge",
557
570
  "figure.button.fasten": "Fasten",
@@ -673,5 +686,20 @@
673
686
  "figure.label.group-figure": "Figure",
674
687
  "figure.label.group-standing": "Where it stands",
675
688
  "figure.label.group-catalog": "Catalogue",
676
- "figure.button.control-settings": "Name, range and time"
689
+ "figure.button.control-settings": "Name, range and time",
690
+ "figure.label.align-x": "left-right",
691
+ "figure.label.align-y": "up-down",
692
+ "figure.label.align-z": "front-back",
693
+ "figure.label.align-x-min": "level with left edge",
694
+ "figure.label.align-x-max": "level with right edge",
695
+ "figure.label.align-y-min": "level with bottom edge",
696
+ "figure.label.align-y-max": "level with top edge",
697
+ "figure.label.align-z-min": "level with back edge",
698
+ "figure.label.align-z-max": "level with front edge",
699
+ "figure.label.align-mm": "offset from centre (mm)",
700
+ "figure.label.motion-follow": "moves with",
701
+ "figure.label.motion-own-control": "its own control",
702
+ "figure.label.motion-multiplier": "multiplier",
703
+ "figure.label.motion-offset": "offset",
704
+ "figure.label.motion-follows": "moves with {joint} × {multiplier} + {offset}"
677
705
  }
@@ -64,9 +64,19 @@
64
64
  "figure.text.repeat-what-pitch-gives": "長さ {length} mm で {count} 個 · 最大 {longest} mm まで置けます (1 列 {limit} 個)。",
65
65
  "figure.text.repeat-pitch-too-small": "pitch は {min} mm 以上にしてください。作成した長さ {length} mm で {limit} 個を超えるためです。",
66
66
  "figure.text.gizmo-joint-places": "{part} は関節に付いていて、関節が位置を決めます。動きタブの操作値で動かしてください。",
67
+ "figure.label.motion-continuous": "無限回転",
68
+ "figure.text.fasten-before-moving": "先に他の部品か床に取り付けると、動きを付けられます。",
69
+ "figure.text.joint-range-holds-zero": "範囲に 0(基本姿勢)を含めてください。",
70
+ "figure.text.gizmo-joint-mimic": "{joint} 関節は {leader} に従います。{leader} を動かしてください。",
71
+ "figure.text.gizmo-joint-fixed-turn": "{joint} 関節は回りません。動きタブで回転を付けてください。",
72
+ "figure.text.gizmo-joint-turned-slide": "{joint} 関節はスライドのみです。移動ハンドルを使ってください。",
73
+ "figure.text.gizmo-joint-origin-follows": "{joint} 関節の位置は他の部品に従います。動きタブの取り付けで変えてください。",
74
+ "figure.text.gizmo-joint-off-axis": "{joint} 関節は {axis} 軸でのみ回ります。{axis} の回転ハンドルを使ってください。",
75
+ "figure.text.gizmo-size-follows": "{part} の {axis} 寸法は他の寸法に従います。動きタブの寸法で変えてください。",
67
76
  "figure.text.gizmo-fastening-places": "{part} は他の部品の面に付いていて、その面が位置を決めます。動かすには先に外してください。",
68
- "figure.text.gizmo-size-worked-out": "{part} のサイズは式で決まっているため、ギズモでは変えられません。寸法欄で固定にしてください。",
69
- "figure.text.instance-range-can-widen": "部品が変わったので測り直すと {ranges} mm です。",
77
+ "figure.text.instance-range-can-widen": "今の部品で測り直すと {ranges} mm です。",
78
+ "figure.text.size-range-too-small": "この図形は {axis} を {mm} mm より小さくすると {part} 部品の長さが 0 になりますが、それより小さく置けると宣言されているため、この変更はできません。「置けるサイズ」で測り直すと範囲が合います。",
79
+ "figure.text.size-range-too-large": "この図形は {axis} を {mm} mm より大きくすると {part} 部品を描けませんが、それより大きく置けると宣言されているため、この変更はできません。「置けるサイズ」で測り直すと範囲が合います。",
70
80
  "figure.text.mounting-face-needs-space": "先に空間を宣言すると選べます。",
71
81
  "figure.text.part-is-referenced": "'{part}' には他の部品が取り付けられているか、そのサイズに従っているため削除できません。先にその連結を外してください。",
72
82
  "figure.text.part-name-invalid": "'{name}' は部品名に使えません。英字で始め、英字・数字・-・_ のみ使えます。",
@@ -372,6 +382,9 @@
372
382
  "figure.text.designate-in-properties": "まだ指定された部品がありません。部品を選び、プロパティタブで「能力での役割」を指定してください。",
373
383
  "figure.text.detail-level-explained": "S は標識・柱、M はほとんどの設備、L は画面の中心となる大きな設備に使います。等級で部品数の上限が決まります。",
374
384
  "figure.text.discard-changes-and-start-new": "保存していない変更があります。破棄して新しく始めますか?",
385
+ "figure.text.leave-without-saving": "保存していない変更があります。破棄して移動しますか?",
386
+ "figure.button.leave-without-saving": "破棄して移動",
387
+ "figure.button.keep-editing": "編集を続ける",
375
388
  "figure.text.does-not-block": "止めないもの",
376
389
  "figure.text.emissive-explained": "面そのものの明るさです。0 なら光らず、周囲は照らしません。",
377
390
  "figure.text.enter-a-type-name": "タイプ名を入力してください。",
@@ -547,7 +560,7 @@
547
560
  "figure.label.facing-flush": "same plane",
548
561
  "figure.label.gap": "gap (mm)",
549
562
  "figure.label.align": "within the face",
550
- "figure.label.align-centre": "centre",
563
+ "figure.label.align-centre": "中央",
551
564
  "figure.label.align-min": "low edge",
552
565
  "figure.label.align-max": "high edge",
553
566
  "figure.button.fasten": "Fasten",
@@ -673,5 +686,20 @@
673
686
  "figure.label.group-figure": "図形",
674
687
  "figure.label.group-standing": "置き方",
675
688
  "figure.label.group-catalog": "一覧情報",
676
- "figure.button.control-settings": "名前・範囲・時間"
689
+ "figure.button.control-settings": "名前・範囲・時間",
690
+ "figure.label.align-x": "左右の位置",
691
+ "figure.label.align-y": "上下の位置",
692
+ "figure.label.align-z": "前後の位置",
693
+ "figure.label.align-x-min": "左端に揃える",
694
+ "figure.label.align-x-max": "右端に揃える",
695
+ "figure.label.align-y-min": "下端に揃える",
696
+ "figure.label.align-y-max": "上端に揃える",
697
+ "figure.label.align-z-min": "後端に揃える",
698
+ "figure.label.align-z-max": "前端に揃える",
699
+ "figure.label.align-mm": "中央からの距離 (mm)",
700
+ "figure.label.motion-follow": "連動",
701
+ "figure.label.motion-own-control": "自分の操作値",
702
+ "figure.label.motion-multiplier": "倍率",
703
+ "figure.label.motion-offset": "オフセット",
704
+ "figure.label.motion-follows": "{joint} に連動 × {multiplier} + {offset}"
677
705
  }
@@ -66,9 +66,19 @@
66
66
  "figure.text.repeat-what-pitch-gives": "길이 {length} mm 에서 {count}개 · 최대 길이 {longest} mm 까지 놓입니다 (한 줄 {limit}개).",
67
67
  "figure.text.repeat-pitch-too-small": "pitch 는 {min} mm 이상이어야 합니다. 저작한 길이 {length} mm 에서 {limit}개를 넘기 때문입니다.",
68
68
  "figure.text.gizmo-joint-places": "{part} 부품은 관절에 달려 있어 관절이 자리를 정합니다. 움직임 탭의 조작값으로 움직이세요.",
69
+ "figure.label.motion-continuous": "끝없이 회전",
70
+ "figure.text.fasten-before-moving": "먼저 다른 부품이나 바닥에 붙여야 움직임을 줄 수 있습니다.",
71
+ "figure.text.joint-range-holds-zero": "범위에 0이 들어가야 합니다. 0이 기본 자세입니다.",
72
+ "figure.text.gizmo-joint-mimic": "{joint} 관절은 {leader} 관절을 따라 움직입니다. {leader}을(를) 움직이세요.",
73
+ "figure.text.gizmo-joint-fixed-turn": "{joint} 관절은 돌지 않습니다. 돌리려면 움직임 탭에서 회전을 주세요.",
74
+ "figure.text.gizmo-joint-turned-slide": "{joint} 관절은 미끄러지기만 합니다. 이동 손잡이로 움직이세요.",
75
+ "figure.text.gizmo-joint-origin-follows": "{joint} 관절의 자리는 다른 부품을 따라 정해집니다. 움직임 탭의 붙이기에서 바꾸세요.",
76
+ "figure.text.gizmo-joint-off-axis": "{joint} 관절은 {axis}축으로만 돕니다. {axis} 회전 손잡이를 쓰세요.",
77
+ "figure.text.gizmo-size-follows": "{part}의 {axis} 치수는 다른 치수를 따라 정해집니다. 움직임 탭의 치수에서 바꾸세요.",
69
78
  "figure.text.gizmo-fastening-places": "{part} 부품은 다른 부품의 면에 붙어 있어 그 면이 자리를 정합니다. 옮기려면 먼저 떼세요.",
70
- "figure.text.gizmo-size-worked-out": "{part} 부품의 크기는 식으로 정해져 있어 기즈모로 바꿀 수 없습니다. 치수 칸에서 고정으로 바꾸면 됩니다.",
71
- "figure.text.instance-range-can-widen": "부품이 바뀌어 다시 재면 {ranges} mm 입니다.",
79
+ "figure.text.instance-range-can-widen": "지금 부품으로 다시 재면 {ranges} mm 입니다.",
80
+ "figure.text.size-range-too-small": "이 도형은 {axis} 축을 {mm} mm 보다 작게 하면 {part} 부품의 길이가 0 이 되는데, 그보다 작게 놓일 수 있다고 선언되어 있어 이 변경을 할 수 없습니다. 「놓일 수 있는 크기」에서 다시 재기를 누르면 범위가 맞춰집니다.",
81
+ "figure.text.size-range-too-large": "이 도형은 {axis} 축을 {mm} mm 보다 크게 하면 {part} 부품을 그릴 수 없는데, 그보다 크게 놓일 수 있다고 선언되어 있어 이 변경을 할 수 없습니다. 「놓일 수 있는 크기」에서 다시 재기를 누르면 범위가 맞춰집니다.",
72
82
  "figure.text.mounting-face-needs-space": "공간을 먼저 선언해야 고를 수 있습니다.",
73
83
  "figure.text.part-is-referenced": "'{part}' 에 다른 부품이 붙어 있거나 그 크기를 따르고 있어 지울 수 없습니다. 그 연결을 먼저 푸세요.",
74
84
  "figure.text.part-name-invalid": "'{name}' 은 부품 이름으로 쓸 수 없습니다. 영문자로 시작하고 영문자·숫자·-·_ 만 씁니다.",
@@ -374,6 +384,9 @@
374
384
  "figure.text.designate-in-properties": "아직 지정된 부품이 없습니다. 부품을 선택하고 속성 탭에서 「능력에서의 역할」을 지정하세요.",
375
385
  "figure.text.detail-level-explained": "S 는 표지·기둥, M 은 대부분의 설비, L 은 화면의 중심이 되는 큰 설비에 씁니다. 등급에 따라 부품 수 한도가 정해집니다.",
376
386
  "figure.text.discard-changes-and-start-new": "저장하지 않은 변경이 있습니다. 버리고 새로 시작할까요?",
387
+ "figure.text.leave-without-saving": "저장하지 않은 변경이 있습니다. 버리고 나갈까요?",
388
+ "figure.button.leave-without-saving": "버리고 나가기",
389
+ "figure.button.keep-editing": "계속 편집",
377
390
  "figure.text.does-not-block": "막지는 않는 것",
378
391
  "figure.text.emissive-explained": "면 자체의 밝기입니다. 0 이면 빛나지 않고, 주변은 밝히지 않습니다.",
379
392
  "figure.text.enter-a-type-name": "타입 이름을 입력하세요.",
@@ -515,7 +528,7 @@
515
528
  "figure.text.tools-explained": "왼쪽부터 X 가운데, Z 가운데, 바닥에 붙이기, X 대칭, Z 대칭, 눈금 맞춤입니다.",
516
529
  "figure.text.triangle-count": "삼각형 {count}개",
517
530
  "figure.text.two-keys-at-least": "키를 두 개 이상 추가하세요.",
518
- "figure.text.type-name-already-taken": "타입 이름 {type} 은 이미 쓰이고 있습니다. 나중에 바꿀 수 없으니 다른 이름을 정해 주세요.",
531
+ "figure.text.type-name-already-taken": "타입 이름 {type} 은 이미 쓰이고 있습니다. 다른 이름을 정해 주세요.",
519
532
  "figure.text.type-name-cannot-change": "타입 이름은 만든 뒤에 바꿀 수 없습니다.",
520
533
  "figure.text.type-name-will-not-release": "이 이름으로는 발행할 수 없습니다. 영문 대문자·숫자·밑줄(연속 불가)로 3~32자를 입력하세요(예: AGV_LIFTER).",
521
534
  "figure.text.unit-is-a-word-not-a-rule": "표시용 단위입니다 (예: mm · deg · %). 값 계산에는 쓰지 않습니다.",
@@ -673,5 +686,20 @@
673
686
  "figure.label.group-figure": "도형",
674
687
  "figure.label.group-standing": "놓이는 자리",
675
688
  "figure.label.group-catalog": "목록 정보",
676
- "figure.button.control-settings": "이름 · 범위 · 시간"
689
+ "figure.button.control-settings": "이름 · 범위 · 시간",
690
+ "figure.label.align-x": "좌우 자리",
691
+ "figure.label.align-y": "위아래 자리",
692
+ "figure.label.align-z": "앞뒤 자리",
693
+ "figure.label.align-x-min": "왼쪽 끝 맞춤",
694
+ "figure.label.align-x-max": "오른쪽 끝 맞춤",
695
+ "figure.label.align-y-min": "아래 끝 맞춤",
696
+ "figure.label.align-y-max": "위 끝 맞춤",
697
+ "figure.label.align-z-min": "뒤 끝 맞춤",
698
+ "figure.label.align-z-max": "앞 끝 맞춤",
699
+ "figure.label.align-mm": "가운데서 거리 (mm)",
700
+ "figure.label.motion-follow": "따라 움직임",
701
+ "figure.label.motion-own-control": "제 조작값으로",
702
+ "figure.label.motion-multiplier": "배율",
703
+ "figure.label.motion-offset": "더하기",
704
+ "figure.label.motion-follows": "따라 움직임: {joint} × {multiplier} + {offset}"
677
705
  }
@@ -64,9 +64,19 @@
64
64
  "figure.text.repeat-what-pitch-gives": "{count} pada panjang {length} mm · boleh diletakkan sehingga {longest} mm ({limit} sebaris).",
65
65
  "figure.text.repeat-pitch-too-small": "pitch mesti sekurang-kurangnya {min} mm: pada panjang asal {length} mm ia akan melebihi {limit}.",
66
66
  "figure.text.gizmo-joint-places": "sendi menentukan kedudukan {part}. gerakkannya dengan kawalannya di tab gerakan.",
67
+ "figure.label.motion-continuous": "putaran tanpa henti",
68
+ "figure.text.fasten-before-moving": "lekatkan pada bahagian lain atau lantai dahulu; kemudian ia boleh bergerak.",
69
+ "figure.text.joint-range-holds-zero": "julat mesti mengandungi 0, pose rehat.",
70
+ "figure.text.gizmo-joint-mimic": "sendi {joint} mengikut {leader}. gerakkan {leader}.",
71
+ "figure.text.gizmo-joint-fixed-turn": "sendi {joint} tidak berputar. berikan putaran di tab gerakan.",
72
+ "figure.text.gizmo-joint-turned-slide": "sendi {joint} hanya menggelongsor. gunakan pemegang alih.",
73
+ "figure.text.gizmo-joint-origin-follows": "kedudukan sendi {joint} mengikut bahagian lain. ubahnya di bawah pelekatan dalam tab gerakan.",
74
+ "figure.text.gizmo-joint-off-axis": "sendi {joint} hanya berputar pada paksi {axis}. gunakan pemegang putar {axis}.",
75
+ "figure.text.gizmo-size-follows": "saiz {axis} {part} mengikut ukuran lain. ubahnya di bawah saiz dalam tab gerakan.",
67
76
  "figure.text.gizmo-fastening-places": "{part} dilekatkan pada muka bahagian lain, yang menentukan kedudukannya. tanggalkan dahulu untuk menggerakkannya.",
68
- "figure.text.gizmo-size-worked-out": "saiz {part} dikira melalui formula, jadi gizmo tidak dapat mengubahnya. tetapkan kepada tetap di bawah dimensi.",
69
- "figure.text.instance-range-can-widen": "diukur semula selepas bahagian berubah: {ranges} mm.",
77
+ "figure.text.instance-range-can-widen": "diukur semula dengan bahagian semasa: {ranges} mm.",
78
+ "figure.text.size-range-too-small": "di bawah {mm} mm pada {axis} bahagian {part} tiada panjang, namun figura diisytiharkan boleh diletakkan lebih kecil, jadi perubahan ini tidak boleh dibuat. gunakan \"ukur semula\" di bawah saiz yang boleh diletakkan.",
79
+ "figure.text.size-range-too-large": "di atas {mm} mm pada {axis} bahagian {part} tidak boleh dilukis, namun figura diisytiharkan boleh diletakkan lebih besar, jadi perubahan ini tidak boleh dibuat. gunakan \"ukur semula\" di bawah saiz yang boleh diletakkan.",
70
80
  "figure.text.mounting-face-needs-space": "isytiharkan ruang dahulu untuk memilih.",
71
81
  "figure.text.part-is-referenced": "'{part}' tidak boleh dipadam: bahagian lain dipasang padanya atau mengikut saiznya. Leraikan pautan itu dahulu.",
72
82
  "figure.text.part-name-invalid": "'{name}' tidak boleh menjadi nama bahagian. Mulakan dengan huruf dan gunakan huruf, digit, - dan _.",
@@ -372,6 +382,9 @@
372
382
  "figure.text.designate-in-properties": "belum ada yang ditetapkan. pilih bahagian dan tetapkan peranannya dalam tab sifat.",
373
383
  "figure.text.detail-level-explained": "S untuk papan tanda dan tiang, M untuk kebanyakan peralatan, L untuk peralatan besar yang menjadi tumpuan. tahap menentukan had bahagian.",
374
384
  "figure.text.discard-changes-and-start-new": "ada perubahan belum disimpan. buang dan mulakan yang baharu?",
385
+ "figure.text.leave-without-saving": "ada perubahan yang belum disimpan. buang dan keluar?",
386
+ "figure.button.leave-without-saving": "buang dan keluar",
387
+ "figure.button.keep-editing": "teruskan menyunting",
375
388
  "figure.text.does-not-block": "tidak menghalang",
376
389
  "figure.text.emissive-explained": "kecerahan permukaan itu sendiri. 0 bermaksud tidak bercahaya, dan ia tidak menerangi sekeliling.",
377
390
  "figure.text.enter-a-type-name": "masukkan nama jenis.",
@@ -547,7 +560,7 @@
547
560
  "figure.label.facing-flush": "same plane",
548
561
  "figure.label.gap": "gap (mm)",
549
562
  "figure.label.align": "within the face",
550
- "figure.label.align-centre": "centre",
563
+ "figure.label.align-centre": "di tengah",
551
564
  "figure.label.align-min": "low edge",
552
565
  "figure.label.align-max": "high edge",
553
566
  "figure.button.fasten": "Fasten",
@@ -673,5 +686,20 @@
673
686
  "figure.label.group-figure": "Rajah",
674
687
  "figure.label.group-standing": "Kedudukan letak",
675
688
  "figure.label.group-catalog": "Maklumat katalog",
676
- "figure.button.control-settings": "Nama, julat dan masa"
689
+ "figure.button.control-settings": "Nama, julat dan masa",
690
+ "figure.label.align-x": "kiri-kanan",
691
+ "figure.label.align-y": "atas-bawah",
692
+ "figure.label.align-z": "depan-belakang",
693
+ "figure.label.align-x-min": "rata tepi kiri",
694
+ "figure.label.align-x-max": "rata tepi kanan",
695
+ "figure.label.align-y-min": "rata tepi bawah",
696
+ "figure.label.align-y-max": "rata tepi atas",
697
+ "figure.label.align-z-min": "rata tepi belakang",
698
+ "figure.label.align-z-max": "rata tepi depan",
699
+ "figure.label.align-mm": "jarak dari tengah (mm)",
700
+ "figure.label.motion-follow": "bergerak bersama",
701
+ "figure.label.motion-own-control": "kawalan sendiri",
702
+ "figure.label.motion-multiplier": "pendarab",
703
+ "figure.label.motion-offset": "ofset",
704
+ "figure.label.motion-follows": "bergerak bersama {joint} × {multiplier} + {offset}"
677
705
  }
@@ -64,9 +64,19 @@
64
64
  "figure.text.repeat-what-pitch-gives": "长度 {length} mm 时 {count} 个 · 最长可放到 {longest} mm (一排 {limit} 个)。",
65
65
  "figure.text.repeat-pitch-too-small": "pitch 须不小于 {min} mm:在原始长度 {length} mm 下会超过 {limit} 个。",
66
66
  "figure.text.gizmo-joint-places": "{part} 由关节决定位置。请用运动标签中的控制值移动它。",
67
+ "figure.label.motion-continuous": "无限旋转",
68
+ "figure.text.fasten-before-moving": "请先将其固定到其他部件或地面上,然后才能添加运动。",
69
+ "figure.text.joint-range-holds-zero": "范围必须包含 0(默认姿态)。",
70
+ "figure.text.gizmo-joint-mimic": "{joint} 关节跟随 {leader}。请移动 {leader}。",
71
+ "figure.text.gizmo-joint-fixed-turn": "{joint} 关节不会旋转。请在运动标签中添加旋转。",
72
+ "figure.text.gizmo-joint-turned-slide": "{joint} 关节只能滑动。请使用移动手柄。",
73
+ "figure.text.gizmo-joint-origin-follows": "{joint} 关节的位置跟随其他部件。请在运动标签的固定中修改。",
74
+ "figure.text.gizmo-joint-off-axis": "{joint} 关节只绕 {axis} 轴旋转。请使用 {axis} 旋转手柄。",
75
+ "figure.text.gizmo-size-follows": "{part} 的 {axis} 尺寸跟随其他尺寸。请在运动标签的尺寸中修改。",
67
76
  "figure.text.gizmo-fastening-places": "{part} 贴在另一个部件的面上,由该面决定位置。要移动请先分离。",
68
- "figure.text.gizmo-size-worked-out": "{part} 的尺寸由公式决定,无法用控件修改。请在尺寸栏改为固定。",
69
- "figure.text.instance-range-can-widen": "部件已变更,重新测量为 {ranges} mm。",
77
+ "figure.text.instance-range-can-widen": "按当前部件重新测量为 {ranges} mm。",
78
+ "figure.text.size-range-too-small": "此图形的 {axis} 小于 {mm} mm 时 {part} 部件长度为 0,但声明可以放得更小,因此无法进行此更改。请在「可放置的尺寸」中重新测量。",
79
+ "figure.text.size-range-too-large": "此图形的 {axis} 大于 {mm} mm 时无法绘制 {part} 部件,但声明可以放得更大,因此无法进行此更改。请在「可放置的尺寸」中重新测量。",
70
80
  "figure.text.mounting-face-needs-space": "请先声明空间,然后才能选择。",
71
81
  "figure.text.part-is-referenced": "无法删除 '{part}':有其他部件固定在它上面或跟随它的尺寸。请先解除该连接。",
72
82
  "figure.text.part-name-invalid": "'{name}' 不能作为部件名称。请以字母开头,只使用字母、数字、- 和 _。",
@@ -372,6 +382,9 @@
372
382
  "figure.text.designate-in-properties": "还没有指定部件。请选择部件,在属性标签页中设置「在能力中的角色」。",
373
383
  "figure.text.detail-level-explained": "S 用于标志和立柱,M 用于大多数设备,L 用于作为画面中心的大型设备。等级决定部件数量上限。",
374
384
  "figure.text.discard-changes-and-start-new": "有未保存的更改。放弃并新建吗?",
385
+ "figure.text.leave-without-saving": "有未保存的更改。放弃并离开吗?",
386
+ "figure.button.leave-without-saving": "放弃并离开",
387
+ "figure.button.keep-editing": "继续编辑",
375
388
  "figure.text.does-not-block": "不影响发布的项",
376
389
  "figure.text.emissive-explained": "面本身的亮度。0 表示不发光,也不会照亮周围。",
377
390
  "figure.text.enter-a-type-name": "请输入类型名称。",
@@ -547,7 +560,7 @@
547
560
  "figure.label.facing-flush": "same plane",
548
561
  "figure.label.gap": "gap (mm)",
549
562
  "figure.label.align": "within the face",
550
- "figure.label.align-centre": "centre",
563
+ "figure.label.align-centre": "居中",
551
564
  "figure.label.align-min": "low edge",
552
565
  "figure.label.align-max": "high edge",
553
566
  "figure.button.fasten": "Fasten",
@@ -673,5 +686,20 @@
673
686
  "figure.label.group-figure": "图形",
674
687
  "figure.label.group-standing": "放置方式",
675
688
  "figure.label.group-catalog": "目录信息",
676
- "figure.button.control-settings": "名称 · 范围 · 时间"
689
+ "figure.button.control-settings": "名称 · 范围 · 时间",
690
+ "figure.label.align-x": "左右位置",
691
+ "figure.label.align-y": "上下位置",
692
+ "figure.label.align-z": "前后位置",
693
+ "figure.label.align-x-min": "对齐左边缘",
694
+ "figure.label.align-x-max": "对齐右边缘",
695
+ "figure.label.align-y-min": "对齐下边缘",
696
+ "figure.label.align-y-max": "对齐上边缘",
697
+ "figure.label.align-z-min": "对齐后边缘",
698
+ "figure.label.align-z-max": "对齐前边缘",
699
+ "figure.label.align-mm": "距中心 (mm)",
700
+ "figure.label.motion-follow": "跟随",
701
+ "figure.label.motion-own-control": "自身控制值",
702
+ "figure.label.motion-multiplier": "倍率",
703
+ "figure.label.motion-offset": "偏移",
704
+ "figure.label.motion-follows": "跟随 {joint} × {multiplier} + {offset}"
677
705
  }