@things-factory/figure-ui 10.1.25 → 10.1.27

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 (50) hide show
  1. package/client/graphql/index.ts +4 -1
  2. package/client/modeller/figure-animations.ts +229 -29
  3. package/client/modeller/figure-history-panel.ts +2 -2
  4. package/client/modeller/figure-inspector.ts +151 -5
  5. package/client/modeller/figure-preview.ts +5 -5
  6. package/client/modeller/figure-source.ts +33 -45
  7. package/client/modeller/figure-view.ts +20 -0
  8. package/client/modeller/joint-edits.ts +201 -0
  9. package/client/modeller/proposal-session.ts +8 -2
  10. package/client/pages/figure-modeller-page.ts +50 -15
  11. package/dist-client/graphql/index.js +4 -1
  12. package/dist-client/graphql/index.js.map +1 -1
  13. package/dist-client/modeller/figure-animations.d.ts +19 -0
  14. package/dist-client/modeller/figure-animations.js +206 -22
  15. package/dist-client/modeller/figure-animations.js.map +1 -1
  16. package/dist-client/modeller/figure-history-panel.js +2 -2
  17. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  18. package/dist-client/modeller/figure-inspector.d.ts +11 -0
  19. package/dist-client/modeller/figure-inspector.js +124 -4
  20. package/dist-client/modeller/figure-inspector.js.map +1 -1
  21. package/dist-client/modeller/figure-preview.js +5 -5
  22. package/dist-client/modeller/figure-preview.js.map +1 -1
  23. package/dist-client/modeller/figure-source.d.ts +12 -1
  24. package/dist-client/modeller/figure-source.js +13 -40
  25. package/dist-client/modeller/figure-source.js.map +1 -1
  26. package/dist-client/modeller/figure-view.d.ts +16 -0
  27. package/dist-client/modeller/figure-view.js +15 -0
  28. package/dist-client/modeller/figure-view.js.map +1 -1
  29. package/dist-client/modeller/joint-edits.d.ts +29 -0
  30. package/dist-client/modeller/joint-edits.js +175 -0
  31. package/dist-client/modeller/joint-edits.js.map +1 -0
  32. package/dist-client/modeller/proposal-session.d.ts +5 -0
  33. package/dist-client/modeller/proposal-session.js +3 -2
  34. package/dist-client/modeller/proposal-session.js.map +1 -1
  35. package/dist-client/pages/figure-modeller-page.d.ts +2 -22
  36. package/dist-client/pages/figure-modeller-page.js +46 -15
  37. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  38. package/dist-client/tsconfig.tsbuildinfo +1 -0
  39. package/dist-server/tsconfig.tsbuildinfo +1 -0
  40. package/package.json +3 -3
  41. package/test/ai-proposal-contract.test.ts +3 -2
  42. package/test/figure-source.test.ts +43 -57
  43. package/test/i18n-prefix-guard.test.ts +2 -3
  44. package/test/joint-edits.test.ts +130 -0
  45. package/test/preview-board-depth.test.ts +27 -0
  46. package/translations/en.json +119 -80
  47. package/translations/ja.json +208 -58
  48. package/translations/ko.json +139 -100
  49. package/translations/ms.json +206 -56
  50. package/translations/zh.json +207 -57
@@ -1,5 +1,11 @@
1
1
  {
2
+ "figure.button.add-channel": "tambah saluran",
3
+ "figure.button.add-clip": "tambah clip",
4
+ "figure.button.add-key": "tambah kunci",
5
+ "figure.button.add-parameter": "tambah parameter",
6
+ "figure.button.apply-fix": "guna pembetulan · {part} {axis} muka: {from} → {to}",
2
7
  "figure.button.ask": "ask",
8
+ "figure.button.cancel": "batal",
3
9
  "figure.button.center-x": "centre X",
4
10
  "figure.button.center-z": "centre Z",
5
11
  "figure.button.close": "close",
@@ -11,8 +17,12 @@
11
17
  "figure.button.move-part-down": "move down",
12
18
  "figure.button.move-part-up": "move up",
13
19
  "figure.button.new-figure": "new figure",
20
+ "figure.button.pivot-clear": "pusat bahagian",
21
+ "figure.button.pivot-set": "tetapkan",
22
+ "figure.button.preview-fix": "pratonton pembetulan · {part} {axis} muka: {from} → {to}",
14
23
  "figure.button.redo": "Buat semula",
15
24
  "figure.button.release-figure": "terbitkan",
25
+ "figure.button.remove": "buang",
16
26
  "figure.button.remove-part": "delete",
17
27
  "figure.button.reset-view": "reset",
18
28
  "figure.button.revert": "kembalikan",
@@ -22,11 +32,12 @@
22
32
  "figure.button.take-n-changes": "apply {n}",
23
33
  "figure.button.to-floor": "to floor",
24
34
  "figure.button.undo": "Nyahbuat",
25
- "figure.label.anchor": "pegang permukaan mana",
35
+ "figure.label.accepts": "diterima",
36
+ "figure.label.anchor": "muka tetap",
26
37
  "figure.label.anchor-advanced": "advanced proportional sizing",
27
- "figure.label.anchor-aspect-x": "membesar hanya sebanyak paksi x (kekalkan nisbah)",
28
- "figure.label.anchor-aspect-y": "membesar hanya sebanyak paksi y (kekalkan nisbah)",
29
- "figure.label.anchor-aspect-z": "membesar hanya sebanyak paksi z (kekalkan nisbah)",
38
+ "figure.label.anchor-aspect-x": "membesar hanya sebanyak x (kekal nisbah)",
39
+ "figure.label.anchor-aspect-y": "membesar hanya sebanyak y (kekal nisbah)",
40
+ "figure.label.anchor-aspect-z": "membesar hanya sebanyak z (kekal nisbah)",
30
41
  "figure.label.anchor-auto": "automatik ({rule})",
31
42
  "figure.label.anchor-center": "kekal di tengah, saiz tidak berubah",
32
43
  "figure.label.anchor-choice-aspect-x": "keep X ratio",
@@ -42,16 +53,18 @@
42
53
  "figure.label.anchor-choice-min-z": "back face",
43
54
  "figure.label.anchor-choice-scale": "grow together",
44
55
  "figure.label.anchor-choice-span": "fill both faces",
45
- "figure.label.anchor-max": "melekat pada permukaan atas",
46
- "figure.label.anchor-max-x": "melekat pada permukaan kanan",
47
- "figure.label.anchor-max-y": "melekat pada permukaan atas",
48
- "figure.label.anchor-max-z": "melekat pada permukaan hadapan",
49
- "figure.label.anchor-min": "melekat pada permukaan bawah",
50
- "figure.label.anchor-min-x": "melekat pada permukaan kiri",
51
- "figure.label.anchor-min-y": "melekat pada permukaan bawah",
52
- "figure.label.anchor-min-z": "melekat pada permukaan belakang",
56
+ "figure.label.anchor-max": "kekal pada muka atas",
57
+ "figure.label.anchor-max-x": "kekal pada muka kanan",
58
+ "figure.label.anchor-max-y": "kekal pada muka atas",
59
+ "figure.label.anchor-max-z": "kekal pada muka hadapan",
60
+ "figure.label.anchor-min": "kekal pada muka bawah",
61
+ "figure.label.anchor-min-x": "kekal pada muka kiri",
62
+ "figure.label.anchor-min-y": "kekal pada muka bawah",
63
+ "figure.label.anchor-min-z": "kekal pada muka belakang",
53
64
  "figure.label.anchor-scale": "membesar bersama kotak",
54
- "figure.label.anchor-span": "menyentuh kedua permukaan, mengisi ruang",
65
+ "figure.label.anchor-span": "menyentuh kedua-dua muka, mengisi ruang antara",
66
+ "figure.label.animation": "animasi",
67
+ "figure.label.assumed-drawing": "lukisan tempat ia diletakkan",
55
68
  "figure.label.axis-consistency": "visual consistency",
56
69
  "figure.label.axis-consistency-short": "consistency",
57
70
  "figure.label.axis-depth": "depth",
@@ -59,6 +72,7 @@
59
72
  "figure.label.axis-detail-short": "fidelity",
60
73
  "figure.label.axis-height": "height",
61
74
  "figure.label.axis-labels": "axis labels",
75
+ "figure.label.axis-name": "paksi {axis}",
62
76
  "figure.label.axis-reactive": "state display",
63
77
  "figure.label.axis-reactive-short": "state",
64
78
  "figure.label.axis-readable": "recognisability",
@@ -74,9 +88,19 @@
74
88
  "figure.label.budget-surface": "surfaces outside the palette",
75
89
  "figure.label.budget-transparent": "transparent materials",
76
90
  "figure.label.budgets": "budgets",
77
- "figure.label.by-axis": "maturity by axis",
91
+ "figure.label.by-axis": "kematangan mengikut item",
78
92
  "figure.label.candidate-review": "candidate review",
79
93
  "figure.label.cast-shadow": "cast shadow",
94
+ "figure.label.category": "kategori",
95
+ "figure.label.ceiling-height": "ketinggian siling (mm)",
96
+ "figure.label.channel-path": "digerakkan",
97
+ "figure.label.channel-pivot": "pangsi",
98
+ "figure.label.channel-target": "bahagian",
99
+ "figure.label.channel-target-joints": "sendi",
100
+ "figure.label.channel-target-parts": "bahagian",
101
+ "figure.label.channels": "saluran",
102
+ "figure.label.clip-name": "nama clip",
103
+ "figure.label.clips": "animasi (dimainkan mengikut masa)",
80
104
  "figure.label.coordinate-ground": "coordinate ground",
81
105
  "figure.label.corner-round": "corner round",
82
106
  "figure.label.detail-L": "detailed",
@@ -99,7 +123,8 @@
99
123
  "figure.label.environment-studio": "studio",
100
124
  "figure.label.environment-sunny": "sunny",
101
125
  "figure.label.environment-warehouse": "warehouse",
102
- "figure.label.figure": "figura",
126
+ "figure.label.figure": "figure",
127
+ "figure.label.figure-placement": "penempatan",
103
128
  "figure.label.figure-released": "diterbitkan",
104
129
  "figure.label.figure-type": "type",
105
130
  "figure.label.findings": "findings",
@@ -112,11 +137,31 @@
112
137
  "figure.label.hollow-floor": "floor thickness",
113
138
  "figure.label.hollow-wall": "wall thickness",
114
139
  "figure.label.intensity": "intensity",
140
+ "figure.label.interpolation-linear": "licin",
141
+ "figure.label.interpolation-step": "berperingkat",
142
+ "figure.label.joint": "sendi",
143
+ "figure.label.joint-axis": "paksi",
144
+ "figure.label.joint-limit-max": "maks",
145
+ "figure.label.joint-limit-min": "min",
146
+ "figure.label.joint-limits-deg": "had (darjah)",
147
+ "figure.label.joint-limits-mm": "had (mm)",
148
+ "figure.label.joint-origin": "titik asal",
149
+ "figure.label.joint-parent": "dilekatkan pada",
150
+ "figure.label.joint-parent-none": "tiada (bingkai figure)",
151
+ "figure.label.joint-type": "pergerakan",
152
+ "figure.label.joint-type-continuous": "putar tanpa had",
153
+ "figure.label.joint-type-none": "tetap",
154
+ "figure.label.joint-type-prismatic": "gelongsor",
155
+ "figure.label.joint-type-revolute": "putar dalam had",
156
+ "figure.label.joint-value": "nilai sendi",
115
157
  "figure.label.keep-round": "section",
158
+ "figure.label.key-at": "masa (s)",
159
+ "figure.label.key-at-value": "kedudukan (0–1)",
116
160
  "figure.label.key-light": "key light",
117
161
  "figure.label.maturity": "maturity",
118
162
  "figure.label.mode-edit": "edit",
119
163
  "figure.label.mode-preview": "preview",
164
+ "figure.label.motion-intent": "apa yang patut bergerak?",
120
165
  "figure.label.name": "name",
121
166
  "figure.label.no-color-chosen": "no color set",
122
167
  "figure.label.none": "none",
@@ -135,13 +180,25 @@
135
180
  "figure.label.palette-purpose-warning": "warning signal · an attention-needed indicator",
136
181
  "figure.label.palette-role": "color role",
137
182
  "figure.label.palette-token": "palette token",
183
+ "figure.label.parameter-default": "lalai",
184
+ "figure.label.parameter-duration": "masa gerak penuh (s)",
185
+ "figure.label.parameter-name": "nama parameter",
186
+ "figure.label.parameter-range": "julat",
187
+ "figure.label.parameters": "parameter (postur ditentukan oleh nilai)",
138
188
  "figure.label.part": "part",
139
189
  "figure.label.part-material": "material",
140
190
  "figure.label.part-position": "position (centre)",
141
191
  "figure.label.part-size": "size",
142
192
  "figure.label.parts": "parts",
193
+ "figure.label.path-rotation": "putaran",
194
+ "figure.label.path-scale": "skala",
195
+ "figure.label.path-translation": "anjakan",
143
196
  "figure.label.placement": "position and size",
197
+ "figure.label.placement-ceiling": "berasaskan siling (ceiling)",
198
+ "figure.label.placement-center": "berasaskan pusat (center)",
199
+ "figure.label.placement-floor": "berasaskan lantai (floor)",
144
200
  "figure.label.placement-limit": "had penempatan",
201
+ "figure.label.playback-speed": "kelajuan",
145
202
  "figure.label.preset": "preset",
146
203
  "figure.label.preset-ceramic": "ceramic",
147
204
  "figure.label.preset-default": "default",
@@ -150,6 +207,7 @@
150
207
  "figure.label.preset-plastic": "plastic",
151
208
  "figure.label.preset-rubber": "rubber",
152
209
  "figure.label.preset-wood": "wood",
210
+ "figure.label.preview-base": "asas",
153
211
  "figure.label.primitive-cube": "box",
154
212
  "figure.label.primitive-cylinder": "cylinder",
155
213
  "figure.label.primitive-polygon": "polygon",
@@ -158,14 +216,30 @@
158
216
  "figure.label.primitive-wall": "wall",
159
217
  "figure.label.properties": "properties",
160
218
  "figure.label.proposed": "proposed",
219
+ "figure.label.recipe-conveyor": "penggelek penghantar terus berputar",
220
+ "figure.label.recipe-gate": "pintu atau get dibuka",
221
+ "figure.label.recipe-lift": "lif menukar ketinggian",
222
+ "figure.label.recipe-pusher": "penolak bergerak ke kedudukan",
161
223
  "figure.label.release": "terbitkan",
162
- "figure.label.released-versions": "versi diterbitkan",
224
+ "figure.label.released-versions": "versi yang diterbitkan",
163
225
  "figure.label.repeat-axis": "axis it repeats along",
226
+ "figure.label.repeat-count": "bilangan",
164
227
  "figure.label.repeat-pitch": "pitch",
165
228
  "figure.label.reuse-trend": "reuse trend",
229
+ "figure.label.role-in-capability": "peranan dalam keupayaan",
230
+ "figure.label.role-port-in": "port masuk",
231
+ "figure.label.role-port-out": "port keluar",
232
+ "figure.label.role-slot": "slot",
166
233
  "figure.label.rotation-degrees": "rotation (degrees)",
234
+ "figure.label.rung-flow": "barang mengalir melalui",
235
+ "figure.label.rung-hold": "memegang barang",
236
+ "figure.label.rung-none": "lukis sahaja",
167
237
  "figure.label.same-as-off": "same as unlit",
168
238
  "figure.label.scene-floor": "floor",
239
+ "figure.label.scene-reference": "rujukan adegan",
240
+ "figure.label.scene-reference-floor": "lantai (floor)",
241
+ "figure.label.scene-reference-inverted": "terbalik, siling (inverted)",
242
+ "figure.label.scene-reference-space": "ruang (space)",
169
243
  "figure.label.segments": "segments",
170
244
  "figure.label.shape": "shape",
171
245
  "figure.label.shape-detail": "shape detail",
@@ -176,26 +250,44 @@
176
250
  "figure.label.sizing-scale": "scales proportionally",
177
251
  "figure.label.sizing-stretch": "stretches on one axis",
178
252
  "figure.label.sky-color": "sky color",
253
+ "figure.label.slot-capacity": "kapasiti",
254
+ "figure.label.slots-and-ports": "slot dan port",
179
255
  "figure.label.state": "keadaan",
180
256
  "figure.label.status-colors": "lit colors (lamps · indicators)",
257
+ "figure.label.tab-capability": "keupayaan",
181
258
  "figure.label.tab-environment": "persekitaran",
259
+ "figure.label.tags": "tag",
182
260
  "figure.label.tools": "align",
183
261
  "figure.label.transparent": "transparent",
184
262
  "figure.label.triangles": "triangles",
185
263
  "figure.label.triangles-at-100": "triangles for 100",
186
264
  "figure.label.triangles-at-10k": "triangles at 10k instances",
187
265
  "figure.label.weight": "weight",
266
+ "figure.label.what-this-does": "apa yang dilakukan figure ini",
267
+ "figure.text.accepts-anything": "kosong bermaksud apa sahaja",
268
+ "figure.text.accepts-explained": "jenis yang dibenarkan dalam slot ini. pisahkan dengan koma; biarkan kosong untuk tiada had.",
188
269
  "figure.text.add-a-shape": "click to add a part",
189
- "figure.text.all-lights-off": "both lights are off. only self-lit surfaces show; everything else goes black — this is how you check whether a lamp is lit.",
270
+ "figure.text.all-lights-off": "kedua-dua lampu dimatikan; hanya permukaan bercahaya kelihatan.",
190
271
  "figure.text.already-released-edit-to-release-again": "sudah diterbitkan. sunting dan simpan untuk kembali ke draf, kemudian terbitkan semula.",
191
- "figure.text.anchor-explained": "di mana bahagian ini melekat apabila kotak membesar. Dua bahagian bersentuhan pada permukaan berbeza akan terpisah apabila membesar.",
192
- "figure.text.assistant-proposed-a-figure": "here is a proposal the result is on the right.",
193
- "figure.text.axes-not-measurable-yet": "axes that cannot be measured yet are left off the chart — {axes}. the reason is listed below.",
194
- "figure.text.bound-by-drawCalls": "draw calls reach the limit first {per} per instance, against {budget} for a drawing.",
195
- "figure.text.bound-by-triangles": "triangles reach the limit first {per} per instance, against {budget} for a drawing.",
272
+ "figure.text.anchor-explained": "muka tempat bahagian ini kekal apabila kotak membesar. dua bahagian yang bersentuhan pada muka berbeza akan terpisah apabila membesar.",
273
+ "figure.text.anchors-are-not-drawn": "slot dan port tidak dilukis pada lukisan; hanya editor yang memaparkannya.",
274
+ "figure.text.animated-parts-cost": "setiap bahagian yang bergerak menambah satu draw call.",
275
+ "figure.text.animated-parts-over": "melebihi had. banyak daripada ini pada satu lukisan akan melambatkannya.",
276
+ "figure.text.animation-empty-examples": "penggelek berputar · daun pintu gelongsor · lif naik · lampu isyarat berkelip.",
277
+ "figure.text.animation-empty-what-it-is": "belum ada gerakan. tambah clip untuk menggerakkan bahagian.",
278
+ "figure.text.animation-needs-a-named-part": "tambah bahagian dahulu.",
279
+ "figure.text.assistant-proposed-a-figure": "cadangan dipaparkan di sebelah kanan.",
280
+ "figure.text.axes-not-measurable-yet": "tidak dimasukkan dalam carta kerana tidak dapat diukur: {axes}. sebabnya di bawah.",
281
+ "figure.text.bound-by-drawCalls": "draw call mencapai had dahulu ({per} setiap satu, {budget} setiap lukisan).",
282
+ "figure.text.bound-by-triangles": "segi tiga mencapai had dahulu ({per} setiap satu, {budget} setiap lukisan).",
196
283
  "figure.text.budget-not-measured-yet": "this target has not been measured yet.",
197
284
  "figure.text.cannot-release-now": "belum boleh diterbitkan",
198
- "figure.text.canvas-appears-once-a-part-exists": "the canvas appears once the figure has a part.",
285
+ "figure.text.canvas-appears-once-a-part-exists": "pilih bentuk di sebelah kiri untuk menambah bahagian pertama.",
286
+ "figure.text.capability-hand-written": "ditetapkan secara manual, jadi tidak sepadan dengan mana-mana tahap di atas. ia disimpan dengan nama di bawah.",
287
+ "figure.text.capacity-from-repeat": "kapasiti ditentukan oleh tetapan ulangan dan saiz instans",
288
+ "figure.text.category-explained": "cara palet mengumpulkan figure. satu bagi setiap figure.",
289
+ "figure.text.category-placeholder": "cth. penghantar",
290
+ "figure.text.ceiling-height-explained": "ketinggian figure siling digantung dalam pratonton.",
199
291
  "figure.text.center-on-x": "move to the centre of the base box on X.",
200
292
  "figure.text.center-on-z": "move to the centre of the base box on Z.",
201
293
  "figure.text.change-added": "a new part",
@@ -207,50 +299,71 @@
207
299
  "figure.text.change-placement": "asas letak",
208
300
  "figure.text.change-removed": "a part being removed",
209
301
  "figure.text.change-styleKit": "the style kit",
302
+ "figure.text.channel-target-is-gone": "tiada bahagian sedemikian. jika anda menamakan semula bahagian, pilih semula di sini.",
303
+ "figure.text.clip-is-time-running": "dimainkan mengikut masa. nilai yang diberikan instans ialah kelajuan main.",
304
+ "figure.text.clip-name-is-how-it-is-driven": "instans memberi kelajuan melalui nama ini.",
305
+ "figure.text.clip-name-taken": "clip lain sudah menggunakan nama ini. masukkan nama lain.",
306
+ "figure.text.clip-needs-a-channel": "tambah sekurang-kurangnya satu saluran.",
307
+ "figure.text.clip-needs-a-name": "masukkan nama.",
210
308
  "figure.text.collapse-parts-pane": "collapse the part list",
211
309
  "figure.text.collapse-properties-pane": "collapse the property pane",
212
- "figure.text.coordinate-ground-explained": "draws the origin and a grid on the floor",
310
+ "figure.text.coordinate-ground-explained": "melukis asalan dan grid pada lantai",
213
311
  "figure.text.delete-figure-confirm": "delete {name}? drawings already using this type will no longer find it.",
214
- "figure.text.detail-level-explained": "declares how detailed this figure is meant to be. S simple suits signs and posts, M normal suits most equipment, L detailed suits the large equipment a view is built around. the level sets the part limit, and maturity checks whether the figure lives up to it.",
312
+ "figure.text.designate-in-properties": "belum ada yang ditetapkan. pilih bahagian dan tetapkan peranannya dalam tab sifat.",
313
+ "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.",
215
314
  "figure.text.discard-changes-and-start-new": "ada perubahan belum disimpan. buang dan mulakan yang baharu?",
216
315
  "figure.text.does-not-block": "tidak menghalang",
217
- "figure.text.emissive-explained": "the surface lights itself. 0 means it is not a lamp. it does not spill onto its surroundings.",
218
- "figure.text.environment-explained": "sets what metal surfaces reflect. it does not change the shape.",
316
+ "figure.text.emissive-explained": "kecerahan permukaan itu sendiri. 0 bermaksud tidak bercahaya, dan ia tidak menerangi sekeliling.",
317
+ "figure.text.enter-a-type-name": "masukkan nama jenis.",
318
+ "figure.text.environment-explained": "menetapkan apa yang dipantulkan oleh permukaan logam. bentuk tidak berubah.",
219
319
  "figure.text.expand-parts-pane": "expand the part list",
220
320
  "figure.text.expand-properties-pane": "expand the property pane",
221
321
  "figure.text.figure-display-name": "display name",
322
+ "figure.text.figure-name-example": "cth. pengangkutan hois atas kepala",
323
+ "figure.text.figure-type-example": "cth. OHT, AGV_LIFTER",
324
+ "figure.text.figure-type-placeholder": "pengecam jenis figure (cth. OHT)",
222
325
  "figure.text.find-by-this-tag": "find by this tag",
223
326
  "figure.text.fits-n-instances": "up to {n}",
224
- "figure.text.floor-explained": "overlaps the coordinate ground, so usually off",
225
- "figure.text.follow-camera-explained": "turn off to fix the shadow direction",
327
+ "figure.text.floor-explained": "bertindih dengan asas koordinat, jadi biasanya dimatikan",
328
+ "figure.text.follow-camera-explained": "matikan untuk menetapkan arah bayang",
226
329
  "figure.text.grade-decided-by": "what decided the grade",
227
- "figure.text.grade-explained": "the grade comes from how much of a declared limit is used, taking the one closest to its cap. averaging would hide a full limit behind the loose ones.",
330
+ "figure.text.grade-explained": "gred ditentukan oleh penggunaan item yang paling hampir dengan hadnya.",
228
331
  "figure.text.grade-scale-lead": "grade scale (limit used)",
229
332
  "figure.text.headroom-percent": "{percent}% headroom",
230
- "figure.text.hemisphere-light-explained": "even light from sky and ground. it lifts the shaded faces.",
333
+ "figure.text.hemisphere-light-explained": "cahaya sekata dari langit dan tanah. ia mencerahkan muka yang berbayang.",
231
334
  "figure.text.hide-all-parts": "hide all",
232
335
  "figure.text.hide-this-part": "hide this part while you work. not saved",
233
- "figure.text.how-many-fit": "how many one drawing holds before the overhead shows",
336
+ "figure.text.how-many-fit": "berapa banyak muat pada satu lukisan tanpa melambatkannya",
234
337
  "figure.text.instances-unit": "instances",
338
+ "figure.text.interpolation-explained": "cara jurang antara kunci diisi.",
339
+ "figure.text.joint-channel-value-deg": "nilai kunci ialah sudut sendi dalam darjah.",
340
+ "figure.text.joint-channel-value-mm": "nilai kunci ialah jarak gerak sendi dalam mm.",
341
+ "figure.text.joint-driven-by": "parameter \"{name}\" menggerakkan sendi ini. semak dalam pratonton.",
342
+ "figure.text.joint-explained": "apabila bahagian yang dilekatkan bergerak, bahagian ini turut bergerak. sendi menetapkan paksi putaran atau arah gelongsor bahagian ini berbanding bahagian tersebut, serta hadnya. parameter yang dicipta bersama sendi memberi nilainya.",
343
+ "figure.text.joint-limits-must-include-zero": "had mesti merangkumi 0. pose seperti dilukis ialah 0.",
344
+ "figure.text.joint-not-driven": "tiada parameter menggerakkan sendi ini. tambah satu dalam tab animasi.",
345
+ "figure.text.joint-value-beyond-limits": "di luar had sendi.",
235
346
  "figure.text.keep-round-cost": "1 draw call",
236
347
  "figure.text.keep-round-merged": "merged into a group",
237
348
  "figure.text.keep-round-off": "off",
238
349
  "figure.text.keep-round-on": "keep round",
350
+ "figure.text.keys-must-rise": "setiap kunci mesti selepas kunci sebelumnya.",
239
351
  "figure.text.limit-comes-from-level": "the detail level sets this limit.",
240
- "figure.text.maturity-blocked-no-binding": "the format has no way to connect a state value to a part yet, and the renderer does not read it.",
352
+ "figure.text.maturity-blocked-no-binding": "paparan keadaan belum diukur.",
241
353
  "figure.text.maturity-blocked-no-parts": "nothing to measure — there are no parts.",
242
- "figure.text.maturity-consistency-because": "checks textures, segment presets and material count what it takes to sit well with other assets and stay crisp when zoomed.",
354
+ "figure.text.maturity-consistency-because": "menyemak penggunaan tekstur, bilangan segmen yang disyorkan dan bilangan bahan.",
243
355
  "figure.text.maturity-consistency-clean": "no issues",
244
356
  "figure.text.maturity-consistency-faults": "has issues",
245
- "figure.text.maturity-detail-because": "how much of the declared level you actually used.",
246
- "figure.text.maturity-readable-because": "how many distinct colour regions are visible from directly above, and how evenly. Viewpoint entropy (Vazquez et al.) computed over colour regions rather than faces — counting faces would reward raising the segment count alone.",
247
- "figure.text.maturity-reuse-because": "shapes saved because several parts share one. a low number is not a fault.",
357
+ "figure.text.maturity-detail-because": "bahagian daripada had bahagian tahap yang diisytiharkan yang digunakan.",
358
+ "figure.text.maturity-readable-because": "berapa banyak kawasan warna berbeza kelihatan dari atas, dan sejauh mana sekata.",
359
+ "figure.text.maturity-reuse-because": "bentuk yang dijimatkan kerana beberapa bahagian berkongsi satu bentuk.",
248
360
  "figure.text.maturity-scale-because": "measured against a drawing holding 500 assets.",
249
361
  "figure.text.mirror-explained": "adds a mirrored copy on the other side — for parts that come in pairs, like legs or arms.",
250
362
  "figure.text.mirror-would-overlap": "already centred — a mirror would land in the same place and overlap.",
251
363
  "figure.text.mode-edit-explained": "place and edit parts. always at the base size.",
252
364
  "figure.text.mode-preview-explained": "how it looks placed on a drawing. base size next to the enlarged ones.",
253
365
  "figure.text.more-segment-options": "advanced segment counts",
366
+ "figure.text.motion-intent-help": "pilih bahagian untuk digerakkan, kemudian tujuannya. gerakan yang dihasilkan boleh dilaraskan dalam editor lanjutan di bawah.",
254
367
  "figure.text.must-fix-to-release": "perbaiki dahulu",
255
368
  "figure.text.n-of-limit": "{used} / {limit}",
256
369
  "figure.text.n-parts-at-most": "up to {limit} parts",
@@ -259,49 +372,86 @@
259
372
  "figure.text.no-findings": "nothing to report.",
260
373
  "figure.text.not-measurable-yet": "not measurable",
261
374
  "figure.text.not-measured-yet": "not measured",
262
- "figure.text.nothing-released-yet": "belum ada versi diterbitkan. penerbitan menyimpan figura seperti sekarang sebagai satu versi.",
263
- "figure.text.on-by-default-explained": "the starting state when placed on a drawing. an instance switching it wins.",
375
+ "figure.text.nothing-released-yet": "belum ada yang diterbitkan.",
376
+ "figure.text.on-by-default-explained": "keadaan permulaan apabila diletakkan pada lukisan. nilai yang ditetapkan pada instans diutamakan.",
264
377
  "figure.text.other-segment-count": "enter a value",
265
- "figure.text.palette-purpose-explained": "Choose the visual role this part plays, not an implementation color name.",
378
+ "figure.text.palette-purpose-explained": "pilih peranan warna yang dimainkan bahagian ini pada skrin.",
379
+ "figure.text.parameter-curve-is-the-value-axis": "kunci diletakkan pada nilai (0 = minimum, 1 = maksimum). masa gerak penuh ditetapkan berasingan.",
380
+ "figure.text.parameter-duration-empty-is-instant": "saat untuk bergerak dari minimum ke maksimum. biarkan kosong untuk menggunakan nilai baharu serta-merta.",
381
+ "figure.text.parameter-is-a-value-not-a-timeline": "memaparkan postur bagi nilai yang diberikan instans (cth. hois turun 1200mm).",
382
+ "figure.text.parameter-key-within-span": "masukkan kunci antara 0 (minimum) dan 1 (maksimum).",
383
+ "figure.text.parameter-name-is-how-a-value-arrives": "instans memberi nilai melalui nama ini.",
384
+ "figure.text.parameter-needs-a-name": "masukkan nama.",
266
385
  "figure.text.part-limit-reached": "the detail level allows no more parts — raise the level or remove a part.",
267
386
  "figure.text.part-limit-reached-short": "level {level} allows {limit} parts. Raise the level or remove a part.",
387
+ "figure.text.part-name-cannot-be-empty": "beri nama kepada bahagian.",
388
+ "figure.text.path-rotation-unit": "sudut euler dalam darjah, konvensyen yang sama dengan putaran bahagian.",
389
+ "figure.text.path-scale-unit": "nisbah. 1 ialah saiz penuh; 0 menyembunyikan bahagian.",
390
+ "figure.text.path-translation-unit": "anjakan dari kedudukan bahagian. 0 mengekalkannya di tempat.",
268
391
  "figure.text.pick-a-shape-above-to-start": "pick a shape above to add the first part.",
269
392
  "figure.text.picked-changes-do-not-validate": "the selected changes do not make a valid figure",
270
- "figure.text.preview-blocked-by-errors": "cannot build the figure breaks the format. the maturity tab has the reason.",
271
- "figure.text.preview-needs-a-part": "add a part and the drawing view appears here.",
272
- "figure.text.proposal-feedback-note": "Optional note for the next suggestion (this session only)",
393
+ "figure.text.pivot-defaults-to-the-part-centre": "jika tidak ditetapkan, bahagian berputar pada pusatnya sendiri. koordinat adalah setempat kepada bahagian.",
394
+ "figure.text.placement-explained": "menetapkan satah rujukan dalam adegan 3D (lantai: AGV/penghantar, siling: OHT/hois, pusat: sensor/dron).",
395
+ "figure.text.preview-blocked-by-errors": "pratonton tidak dapat dipaparkan kerana ralat format. lihat tab kematangan untuk sebabnya.",
396
+ "figure.text.preview-needs-a-part": "tambah bahagian untuk melihat rupanya apabila diletakkan pada lukisan.",
397
+ "figure.text.proposal-feedback-note": "nota pilihan untuk cadangan seterusnya (sesi ini sahaja)",
273
398
  "figure.text.proposal-feedback-placeholder": "e.g. keep the silhouette, but make the port easier to read",
274
399
  "figure.text.put-on-floor": "drop it to the floor (Z=0).",
275
- "figure.text.release-needs-a-save-first": "ada perubahan yang belum disimpan. penerbitan mengeluarkan apa yang telah disimpan, jadi simpan dahulu.",
400
+ "figure.text.range-needs-room": "maksimum mesti melebihi minimum.",
401
+ "figure.text.recipe-conveyor": "animasi · instans memberinya kelajuan",
402
+ "figure.text.recipe-gate": "parameter · instans memberi tahap terbuka, 0 hingga 100 %",
403
+ "figure.text.recipe-lift": "parameter · instans memberi ketinggian, 0 hingga 100 mm",
404
+ "figure.text.recipe-pusher": "parameter · instans memberi jarak gerak, 0 hingga 100 mm",
405
+ "figure.text.release-check-fix": "pembetulan semakan terbitan · {part} {axis} muka: {from} → {to}",
406
+ "figure.text.release-needs-a-save-first": "terdapat perubahan yang belum disimpan. simpan dahulu.",
276
407
  "figure.text.releasing": "sedang menerbitkan…",
277
- "figure.text.renaming-a-part-breaks-bindings": "the name is a stored identifier changing it breaks bindings on instances already placed.",
278
- "figure.text.repeat-edits-the-unit": "you author one unit even though several appear. the gizmo moves the whole run, while size and rotation apply to that one unit — the pitch is declared separately so the layout stays. a single copy cannot be edited on its own.",
279
- "figure.text.repeat-pitch-explained": "centre to centre distance. it does not depend on the part size, so widening or turning the part leaves the layout alone.",
408
+ "figure.text.renaming-a-part-breaks-bindings": "menamakan semula memutuskan pengikatan pada instans yang sudah diletakkan.",
409
+ "figure.text.repeat-count-capped": "sehingga {limit}. setiap salinan menambah satu draw call.",
410
+ "figure.text.repeat-count-now": "{count} pada saiz asal",
411
+ "figure.text.repeat-edits-the-unit": "salinan berulang disunting sebagai satu. untuk menukar satu salinan, tambahkannya sebagai bahagian berasingan.",
412
+ "figure.text.repeat-grows-with-instance": "bilangan bertambah apabila instans membesar pada paksi ini. jarak kekal.",
413
+ "figure.text.repeat-keeps-count": "bilangan kekal dan setiap salinan membesar.",
414
+ "figure.text.repeat-pitch-explained": "jarak dari pusat ke pusat. ia kekal apabila saiz bahagian berubah.",
280
415
  "figure.text.report-appears-when-you-add-a-part": "weight and score appear once the figure has a part.",
281
416
  "figure.text.reuse-score-explained": "how much headroom is left in the declared limits. the one closest to its cap sets the score.",
282
- "figure.text.revert-to-version-confirm": "kembali ke v{version}? apa yang sedang anda kerjakan akan digantikan dengan versi itu.",
283
- "figure.text.save-the-figure-before-releasing": "figura ini belum disimpan. simpan dahulu untuk menerbitkannya.",
417
+ "figure.text.revert-to-version-confirm": "kembali ke v{version}? apa yang sedang anda sunting akan diganti dengan versi itu.",
418
+ "figure.text.role-none-means-drawn": "tanpa sebarang pilihan, ini hanyalah bahagian yang dilukis",
419
+ "figure.text.rung-flow-note": "memegang barang dan menerima serta menghantarnya melalui port. penghantar, pelongsor, penyisih",
420
+ "figure.text.rung-hold-note": "mempunyai slot untuk meletakkan barang. rak, palet, meja kerja",
421
+ "figure.text.rung-none-note": "tidak menerima apa-apa. kebanyakan figure termasuk di sini.",
422
+ "figure.text.save-new-figure-desc": "tetapkan kod jenis unik dan nama paparan bagi figure ini.",
423
+ "figure.text.save-the-figure-before-releasing": "figure ini belum disimpan. simpan untuk membolehkan penerbitan.",
284
424
  "figure.text.saving-figure": "saving",
425
+ "figure.text.scene-reference-explained": "jenis lukisan tempat pratonton meletakkan figure. penempatan figure itu sendiri tidak berubah.",
285
426
  "figure.text.search-figure": "search by name, type, description, category or tag",
286
427
  "figure.text.select-a-part-to-edit": "select a part to edit it here.",
428
+ "figure.text.server-returned-no-data": "respons pelayan tiada data. cuba lagi.",
287
429
  "figure.text.show-all-parts": "show all",
288
430
  "figure.text.show-this-part": "show this part again",
289
- "figure.text.sizing-costs-one-draw-call": "a part that does not scale proportionally cannot be merged with the others, so it costs one more draw call. that shows up in the group count under maturity.",
431
+ "figure.text.sizing-costs-one-draw-call": "bahagian yang tidak berskala secara berkadar menambah satu draw call.",
290
432
  "figure.text.sizing-fixed-explained": "the size stays, only the position follows — like a motor or a gauge.",
291
- "figure.text.sizing-repeat-explained": "the count grows instead of the size. the shape is shared so vertices do not grow, but each copy costs one draw call.",
433
+ "figure.text.sizing-repeat-explained": "bilangan bertambah dan bukannya saiz. setiap salinan menambah satu draw call.",
292
434
  "figure.text.sizing-scale-explained": "this part grows with the instance.",
293
435
  "figure.text.sizing-stretch-explained": "only one axis stretches — like a frame, a belt or a rail.",
436
+ "figure.text.slots-need-capability": "pilih \"memegang barang\" atau lebih tinggi sebelum menetapkan slot.",
294
437
  "figure.text.snap-explained": "rounds position and size to the grid — the same spacing you see on the canvas.",
438
+ "figure.text.source-changed-ask-again": "sumber telah berubah. buang calon dan minta semula dalam bantuan AI.",
439
+ "figure.text.tags-explained": "tag untuk carian. pisahkan beberapa tag dengan koma.",
440
+ "figure.text.tags-placeholder": "cth. keluar, automatik, aras 2",
295
441
  "figure.text.thumbnail-not-made-yet": "no thumbnail yet",
296
- "figure.text.tools-explained": "Use alignment after setting position, size, and rotation. From left: centre X, centre Z, put on floor, mirror X, mirror Z, and snap to grid. Hover an icon to confirm its action.",
442
+ "figure.text.tools-explained": "dari kiri: tengah X, tengah Z, ke lantai, cermin X, cermin Z, jajar ke grid.",
297
443
  "figure.text.triangle-count": "{count} triangles",
444
+ "figure.text.two-keys-at-least": "tambah sekurang-kurangnya dua kunci.",
298
445
  "figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
299
- "figure.text.type-name-cannot-change": "the type name is a stored identifier and cannot be changed after creation.",
446
+ "figure.text.type-name-cannot-change": "nama jenis tidak boleh diubah selepas dicipta.",
447
+ "figure.text.type-name-will-not-release": "nama ini tidak boleh diterbitkan. gunakan huruf besar, digit dan garis bawah tunggal, 3 hingga 32 aksara (cth. AGV_LIFTER).",
448
+ "figure.text.unit-is-a-word-not-a-rule": "unit paparan (cth. mm, deg, %). ia tidak digunakan dalam pengiraan.",
300
449
  "figure.text.unsaved-changes": "unsaved",
301
450
  "figure.text.version-number": "v{version}",
302
- "figure.text.view-settings-are-not-saved": "these settings are not saved. they make the view comfortable to work in and do not travel with the asset.",
451
+ "figure.text.view-settings-are-not-saved": "tetapan ini tidak disimpan.",
303
452
  "figure.text.what-a-figure-is": "a Figure is a 3D component you author. Compose it from simple shapes and it becomes a component you can place on a drawing, sharing shape and material across every instance.",
304
- "figure.text.what-changed-in-this-release": "apa yang berubah dalam versi ini",
453
+ "figure.text.what-changed-in-this-release": "apa yang berubah dalam terbitan ini",
305
454
  "figure.title.figures": "figures",
306
- "figure.title.new-figure": "new figure"
455
+ "figure.title.new-figure": "new figure",
456
+ "figure.title.save-new-figure": "simpan draf figure"
307
457
  }