@things-factory/figure-ui 10.1.6 → 10.1.8

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 (51) hide show
  1. package/client/graphql/index.ts +25 -0
  2. package/client/modeller/figure-animations.ts +769 -0
  3. package/client/modeller/figure-ask.ts +6 -1
  4. package/client/modeller/figure-history-panel.ts +52 -1
  5. package/client/modeller/figure-inspector.ts +520 -120
  6. package/client/modeller/figure-side.ts +65 -17
  7. package/client/modeller/proposal-session.ts +92 -0
  8. package/client/pages/figure-list-page.ts +56 -4
  9. package/client/pages/figure-modeller-page.ts +204 -179
  10. package/client/types.ts +39 -0
  11. package/client/viewparts/figure-thumb.ts +78 -0
  12. package/dist-client/graphql/index.d.ts +3 -1
  13. package/dist-client/graphql/index.js +22 -0
  14. package/dist-client/graphql/index.js.map +1 -1
  15. package/dist-client/modeller/figure-animations.d.ts +96 -0
  16. package/dist-client/modeller/figure-animations.js +708 -0
  17. package/dist-client/modeller/figure-animations.js.map +1 -0
  18. package/dist-client/modeller/figure-ask.d.ts +3 -0
  19. package/dist-client/modeller/figure-ask.js +9 -0
  20. package/dist-client/modeller/figure-ask.js.map +1 -1
  21. package/dist-client/modeller/figure-history-panel.d.ts +7 -0
  22. package/dist-client/modeller/figure-history-panel.js +50 -0
  23. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  24. package/dist-client/modeller/figure-inspector.d.ts +17 -0
  25. package/dist-client/modeller/figure-inspector.js +506 -107
  26. package/dist-client/modeller/figure-inspector.js.map +1 -1
  27. package/dist-client/modeller/figure-side.d.ts +23 -0
  28. package/dist-client/modeller/figure-side.js +68 -16
  29. package/dist-client/modeller/figure-side.js.map +1 -1
  30. package/dist-client/modeller/proposal-session.d.ts +23 -0
  31. package/dist-client/modeller/proposal-session.js +65 -0
  32. package/dist-client/modeller/proposal-session.js.map +1 -0
  33. package/dist-client/pages/figure-list-page.d.ts +10 -0
  34. package/dist-client/pages/figure-list-page.js +55 -4
  35. package/dist-client/pages/figure-list-page.js.map +1 -1
  36. package/dist-client/pages/figure-modeller-page.d.ts +50 -28
  37. package/dist-client/pages/figure-modeller-page.js +197 -176
  38. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  39. package/dist-client/tsconfig.tsbuildinfo +1 -1
  40. package/dist-client/types.d.ts +44 -0
  41. package/dist-client/types.js.map +1 -1
  42. package/dist-client/viewparts/figure-thumb.js +74 -0
  43. package/dist-client/viewparts/figure-thumb.js.map +1 -1
  44. package/package.json +4 -5
  45. package/test/ai-proposal-contract.test.ts +169 -0
  46. package/test/i18n-prefix-guard.test.ts +42 -0
  47. package/translations/en.json +82 -6
  48. package/translations/ja.json +34 -1
  49. package/translations/ko.json +92 -6
  50. package/translations/ms.json +34 -1
  51. package/translations/zh.json +34 -1
@@ -1,19 +1,29 @@
1
1
  {
2
+ "figure.button.add-channel": "add channel",
3
+ "figure.button.add-clip": "add clip",
4
+ "figure.button.add-key": "add key",
2
5
  "figure.button.ask": "ask",
6
+ "figure.label.candidate-review": "candidate review",
7
+ "figure.text.proposal-feedback-note": "Optional note for the next suggestion (this session only)",
8
+ "figure.text.proposal-feedback-placeholder": "e.g. keep the silhouette, but make the port easier to read",
9
+ "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.",
10
+ "figure.text.palette-purpose-explained": "Choose the visual role this part plays, not an implementation color name.",
3
11
  "figure.button.attach-a-picture": "image",
4
12
  "figure.button.center-x": "centre X",
5
13
  "figure.button.center-z": "centre Z",
6
14
  "figure.button.close": "close",
7
15
  "figure.button.delete-figure": "delete",
8
16
  "figure.button.discard": "discard",
9
- "figure.button.dock": "chat",
10
17
  "figure.button.duplicate-part": "duplicate",
11
18
  "figure.button.mirror-x": "mirror X",
12
19
  "figure.button.mirror-z": "mirror Z",
13
20
  "figure.button.move-part-down": "move down",
14
21
  "figure.button.move-part-up": "move up",
15
22
  "figure.button.new-figure": "new figure",
23
+ "figure.button.pivot-clear": "part centre",
24
+ "figure.button.pivot-set": "set",
16
25
  "figure.button.release-figure": "release",
26
+ "figure.button.remove": "remove",
17
27
  "figure.button.remove-part": "delete",
18
28
  "figure.button.reset-view": "reset",
19
29
  "figure.button.revert": "revert",
@@ -28,6 +38,20 @@
28
38
  "figure.label.anchor-aspect-y": "grows only as much as y does (keeps ratio)",
29
39
  "figure.label.anchor-aspect-z": "grows only as much as z does (keeps ratio)",
30
40
  "figure.label.anchor-auto": "automatic ({rule})",
41
+ "figure.label.anchor-advanced": "advanced proportional sizing",
42
+ "figure.label.anchor-choice-auto": "automatic",
43
+ "figure.label.anchor-choice-aspect-x": "keep X ratio",
44
+ "figure.label.anchor-choice-aspect-y": "keep Y ratio",
45
+ "figure.label.anchor-choice-aspect-z": "keep Z ratio",
46
+ "figure.label.anchor-choice-center": "stay centred",
47
+ "figure.label.anchor-choice-max-x": "right face",
48
+ "figure.label.anchor-choice-max-y": "upper face",
49
+ "figure.label.anchor-choice-max-z": "front face",
50
+ "figure.label.anchor-choice-min-x": "left face",
51
+ "figure.label.anchor-choice-min-y": "lower face",
52
+ "figure.label.anchor-choice-min-z": "back face",
53
+ "figure.label.anchor-choice-scale": "grow together",
54
+ "figure.label.anchor-choice-span": "fill both faces",
31
55
  "figure.label.anchor-center": "stays centred, keeps its size",
32
56
  "figure.label.anchor-max": "stays on the upper face",
33
57
  "figure.label.anchor-max-x": "stays on the right face",
@@ -39,6 +63,7 @@
39
63
  "figure.label.anchor-min-z": "stays on the back face",
40
64
  "figure.label.anchor-scale": "grows with the box",
41
65
  "figure.label.anchor-span": "touches both faces, fills between",
66
+ "figure.label.animation": "animation",
42
67
  "figure.label.axis-consistency": "visual consistency",
43
68
  "figure.label.axis-consistency-short": "consistency",
44
69
  "figure.label.axis-depth": "depth",
@@ -55,7 +80,7 @@
55
80
  "figure.label.axis-scale": "scale",
56
81
  "figure.label.axis-scale-short": "scale",
57
82
  "figure.label.axis-width": "width",
58
- "figure.label.budget-animations": "animation points",
83
+ "figure.label.budget-animations": "moving parts",
59
84
  "figure.label.budget-groups": "material groups",
60
85
  "figure.label.budget-parts": "part count",
61
86
  "figure.label.budget-surface": "surfaces outside the palette",
@@ -63,6 +88,12 @@
63
88
  "figure.label.budgets": "budgets",
64
89
  "figure.label.by-axis": "maturity by axis",
65
90
  "figure.label.cast-shadow": "cast shadow",
91
+ "figure.label.category": "category",
92
+ "figure.label.channel-path": "moves",
93
+ "figure.label.channel-pivot": "pivot",
94
+ "figure.label.channel-target": "part",
95
+ "figure.label.channels": "channels",
96
+ "figure.label.clip-name": "clip name",
66
97
  "figure.label.coordinate-ground": "coordinate ground",
67
98
  "figure.label.corner-round": "corner round",
68
99
  "figure.label.detail-L": "detailed",
@@ -74,6 +105,8 @@
74
105
  "figure.label.draft": "draft",
75
106
  "figure.label.draw-calls-at-100": "draw calls for 100",
76
107
  "figure.label.draw-calls-at-10k": "draw calls at 10k instances",
108
+ "figure.label.drive-hold": "position",
109
+ "figure.label.drive-loop": "speed",
77
110
  "figure.label.emissive": "emissive",
78
111
  "figure.label.emissive-color": "lit color",
79
112
  "figure.label.environment": "environment",
@@ -98,7 +131,10 @@
98
131
  "figure.label.hollow-floor": "floor thickness",
99
132
  "figure.label.hollow-wall": "wall thickness",
100
133
  "figure.label.intensity": "intensity",
134
+ "figure.label.interpolation-linear": "smooth",
135
+ "figure.label.interpolation-step": "stepped",
101
136
  "figure.label.keep-round": "section",
137
+ "figure.label.key-at": "at (s)",
102
138
  "figure.label.key-light": "key light",
103
139
  "figure.label.maturity": "maturity",
104
140
  "figure.label.mode-edit": "edit",
@@ -109,11 +145,26 @@
109
145
  "figure.label.now": "current",
110
146
  "figure.label.on-by-default": "on by default",
111
147
  "figure.label.palette-token": "palette token",
148
+ "figure.label.palette-role": "color role",
149
+ "figure.label.palette-purpose-accent": "accent part · handles and covers that must stand out",
150
+ "figure.label.palette-purpose-danger": "danger signal · an error or stop indicator",
151
+ "figure.label.palette-purpose-dark": "frame and shadow · dark structure and edges",
152
+ "figure.label.palette-purpose-info": "information signal · an operating-information indicator",
153
+ "figure.label.palette-purpose-light": "light face · light housings and label surrounds",
154
+ "figure.label.palette-purpose-neutral": "neutral machine face · supporting structures and machine parts",
155
+ "figure.label.palette-purpose-primary": "main body · the largest equipment housing",
156
+ "figure.label.palette-purpose-registered": "registered palette color",
157
+ "figure.label.palette-purpose-success": "normal signal · a normal-operation indicator",
158
+ "figure.label.palette-purpose-surface": "surface and background · broad background faces",
159
+ "figure.label.palette-purpose-warning": "warning signal · an attention-needed indicator",
112
160
  "figure.label.part": "part",
113
161
  "figure.label.part-material": "material",
114
162
  "figure.label.part-position": "position (centre)",
115
163
  "figure.label.part-size": "size",
116
164
  "figure.label.parts": "parts",
165
+ "figure.label.path-rotation": "rotation",
166
+ "figure.label.path-scale": "scale",
167
+ "figure.label.path-translation": "offset",
117
168
  "figure.label.placement": "position and size",
118
169
  "figure.label.placement-limit": "placement limit",
119
170
  "figure.label.preset": "preset",
@@ -164,6 +215,7 @@
164
215
  "figure.label.status-colors": "lit colors (lamps · indicators)",
165
216
  "figure.label.tab-capability": "capability",
166
217
  "figure.label.tab-environment": "environment",
218
+ "figure.label.tags": "tags",
167
219
  "figure.label.tools": "align",
168
220
  "figure.label.transparent": "transparent",
169
221
  "figure.label.triangles": "triangles",
@@ -178,6 +230,12 @@
178
230
  "figure.text.already-released-edit-to-release-again": "already released. edit and save to go back to draft, then release again.",
179
231
  "figure.text.anchor-explained": "where this part stays as the box grows. Two touching parts on different faces drift apart as it grows.",
180
232
  "figure.text.anchors-are-not-drawn": "a slot is where things are placed, a port is where things enter and leave. neither is drawn on a board; the editor shows their positions",
233
+ "figure.text.animated-parts-cost": "A moving part is drawn on its own — one more draw call each, and a matrix update every frame.",
234
+ "figure.text.animated-parts-over": "Over the limit. Nothing is blocked, but many of these on one board will cost frames.",
235
+ "figure.text.animation-empty-examples": "A turning roller · a sliding door leaf · a rising lift · a blinking beacon.",
236
+ "figure.text.animation-empty-what-it-is": "This figure does not move yet. A clip is one set of motion across several parts — a door opening is the two leaves sliding apart, not two separate things.",
237
+ "figure.text.animation-is-driven-by-a-fact": "One clip moves several parts together. On a board a fact sets its value — “this door is 40% open”.",
238
+ "figure.text.animation-needs-a-named-part": "Add a part first. A channel names the part it moves.",
181
239
  "figure.text.ask-create-example": "e.g. a three-tier conveyor sorter",
182
240
  "figure.text.ask-revise-example": "e.g. bring it down to two material groups",
183
241
  "figure.text.ask-to-create": "create",
@@ -192,6 +250,8 @@
192
250
  "figure.text.canvas-appears-once-a-part-exists": "the editing area where you place and move parts. pick one from shapes on the left to start.",
193
251
  "figure.text.capability-hand-written": "these capabilities were set by hand and match no rung. the names below are what gets stored",
194
252
  "figure.text.capacity-from-repeat": "capacity comes from the repeat setting and the instance size",
253
+ "figure.text.category-explained": "how the palette groups figures. one per figure — a figure in two groups meets the author twice.",
254
+ "figure.text.category-placeholder": "e.g. conveyor",
195
255
  "figure.text.center-on-x": "move to the centre of the base box on X.",
196
256
  "figure.text.center-on-z": "move to the centre of the base box on Z.",
197
257
  "figure.text.change-added": "a new part",
@@ -201,6 +261,11 @@
201
261
  "figure.text.change-detail": "the detail level",
202
262
  "figure.text.change-removed": "a part being removed",
203
263
  "figure.text.change-styleKit": "the style kit",
264
+ "figure.text.channel-target-is-gone": "No such part. If you renamed the part, pick it again here.",
265
+ "figure.text.clip-name-is-how-it-is-driven": "An instance drives the clip by this name.",
266
+ "figure.text.clip-name-taken": "Another clip already has this name. Instances drive by name, so two cannot share one.",
267
+ "figure.text.clip-needs-a-channel": "With no channel there is nothing to move.",
268
+ "figure.text.clip-needs-a-name": "Without a name nothing can drive it.",
204
269
  "figure.text.collapse-parts-pane": "collapse the part list",
205
270
  "figure.text.collapse-properties-pane": "collapse the property pane",
206
271
  "figure.text.coordinate-ground-explained": "draws the origin and a grid on the floor",
@@ -208,14 +273,16 @@
208
273
  "figure.text.designate-in-properties": "nothing designated yet. select a part and set its role in the properties tab",
209
274
  "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.",
210
275
  "figure.text.discard-changes-and-start-new": "there are unsaved changes. discard them and start a new figure?",
211
- "figure.text.dock-explained": "talk to the authoring assistant. it reads the figure you have open and offers candidates.",
212
- "figure.text.dock-placeholder": "say what to make or change (Shift+Enter for a new line, Enter to send)",
213
276
  "figure.text.does-not-block": "does not block",
277
+ "figure.text.drive-explained": "How the value an instance gives is read.",
278
+ "figure.text.drive-hold-note": "Time is held. The value an instance gives is a position from 0 to 1 — how far open a door is.",
279
+ "figure.text.drive-loop-note": "Time runs. The value an instance gives is a speed — a turning roller works this way.",
214
280
  "figure.text.emissive-explained": "the surface lights itself. 0 means it is not a lamp. it does not spill onto its surroundings.",
215
281
  "figure.text.environment-explained": "sets what metal surfaces reflect. it does not change the shape.",
216
282
  "figure.text.expand-parts-pane": "expand the part list",
217
283
  "figure.text.expand-properties-pane": "expand the property pane",
218
284
  "figure.text.figure-display-name": "display name",
285
+ "figure.text.find-by-this-tag": "find by this tag",
219
286
  "figure.text.fits-n-instances": "up to {n}",
220
287
  "figure.text.floor-explained": "overlaps the coordinate ground, so usually off",
221
288
  "figure.text.follow-camera-explained": "turn off to fix the shadow direction",
@@ -228,10 +295,12 @@
228
295
  "figure.text.hide-this-part": "hide this part while you work. not saved",
229
296
  "figure.text.how-many-fit": "how many fit on one board before it slows down",
230
297
  "figure.text.instances-unit": "instances",
298
+ "figure.text.interpolation-explained": "How the gap between keys is filled.",
231
299
  "figure.text.keep-round-cost": "1 draw call",
232
300
  "figure.text.keep-round-merged": "merged into a group",
233
301
  "figure.text.keep-round-off": "off",
234
302
  "figure.text.keep-round-on": "keep round",
303
+ "figure.text.keys-must-rise": "Each key must come after the one before it.",
235
304
  "figure.text.limit-comes-from-level": "the detail level sets this limit.",
236
305
  "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.",
237
306
  "figure.text.maturity-blocked-no-parts": "nothing to measure — there are no parts.",
@@ -257,14 +326,18 @@
257
326
  "figure.text.nothing-released-yet": "nothing released yet. releasing keeps the figure as it is now, as a version.",
258
327
  "figure.text.on-by-default-explained": "the starting state when placed on a board. an instance switching it wins.",
259
328
  "figure.text.other-segment-count": "enter a value",
329
+ "figure.text.more-segment-options": "advanced segment counts",
260
330
  "figure.text.part-limit-reached": "the detail level allows no more parts — raise the level or remove a part.",
261
331
  "figure.text.part-limit-reached-short": "level {level} allows {limit} parts. Raise the level or remove a part.",
332
+ "figure.text.path-rotation-unit": "Euler degrees — the same convention as the part's own rotation.",
333
+ "figure.text.path-scale-unit": "A ratio. 1 is full size; 0 makes the part vanish.",
334
+ "figure.text.path-translation-unit": "Offset from where the part sits. 0 leaves it in place.",
262
335
  "figure.text.pick-a-shape-above-to-start": "pick a shape above to add the first part.",
263
336
  "figure.text.picked-changes-do-not-validate": "the selected changes do not make a valid figure",
264
337
  "figure.text.picture-is-for-proportions": "used for proportions and form, not for surface detail.",
338
+ "figure.text.pivot-defaults-to-the-part-centre": "Left unset, the part turns about its own centre. Coordinates are local to the part.",
265
339
  "figure.text.preview-blocked-by-errors": "cannot build — the figure breaks the format. the maturity tab has the reason.",
266
340
  "figure.text.preview-needs-a-part": "shows how it looks placed on a board. appears once you make a part.",
267
- "figure.text.proposal-had-no-source": "the candidate carried no source, so it cannot be taken.",
268
341
  "figure.text.put-on-floor": "drop it to the floor (Z=0).",
269
342
  "figure.text.release-needs-a-save-first": "there are unsaved changes. a release publishes what was saved, so save first.",
270
343
  "figure.text.releasing": "releasing…",
@@ -284,7 +357,7 @@
284
357
  "figure.text.rung-none-note": "takes nothing. most figures belong here",
285
358
  "figure.text.save-the-figure-before-releasing": "this figure has not been saved yet. save it and you can release it.",
286
359
  "figure.text.saving-figure": "saving",
287
- "figure.text.search-figure-by-name-or-type": "search by name or type",
360
+ "figure.text.search-figure": "search by name, type, description, category or tag",
288
361
  "figure.text.select-a-part-to-edit": "select a part to edit it here.",
289
362
  "figure.text.show-all-parts": "show all",
290
363
  "figure.text.show-this-part": "show this part again",
@@ -295,8 +368,11 @@
295
368
  "figure.text.sizing-stretch-explained": "only one axis stretches — like a frame, a belt or a rail.",
296
369
  "figure.text.slots-need-capability": "select \"holds things\" or above before designating a slot",
297
370
  "figure.text.snap-explained": "rounds position and size to the grid — the same spacing you see on the canvas.",
371
+ "figure.text.tags-explained": "for the finding a single category cannot do. a figure may carry several — a conveyor that is also outbound. separate them with commas.",
372
+ "figure.text.tags-placeholder": "e.g. outbound, automatic, level 2",
298
373
  "figure.text.thumbnail-not-made-yet": "no thumbnail yet",
299
374
  "figure.text.triangle-count": "{count} triangles",
375
+ "figure.text.two-keys-at-least": "A channel needs two keys. With one it is not motion, it is a single pose.",
300
376
  "figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
301
377
  "figure.text.type-name-cannot-change": "the type name is a stored identifier and cannot be changed after creation.",
302
378
  "figure.text.unsaved-changes": "unsaved",
@@ -1,5 +1,10 @@
1
1
  {
2
2
  "figure.button.ask": "ask",
3
+ "figure.label.candidate-review": "candidate review",
4
+ "figure.text.proposal-feedback-note": "Optional note for the next suggestion (this session only)",
5
+ "figure.text.proposal-feedback-placeholder": "e.g. keep the silhouette, but make the port easier to read",
6
+ "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.",
7
+ "figure.text.palette-purpose-explained": "Choose the visual role this part plays, not an implementation color name.",
3
8
  "figure.button.attach-a-picture": "image",
4
9
  "figure.button.center-x": "centre X",
5
10
  "figure.button.center-z": "centre Z",
@@ -26,6 +31,20 @@
26
31
  "figure.label.anchor-aspect-y": "y 軸が大きくなる分だけ大きくなる (比率維持)",
27
32
  "figure.label.anchor-aspect-z": "z 軸が大きくなる分だけ大きくなる (比率維持)",
28
33
  "figure.label.anchor-auto": "自動 ({rule})",
34
+ "figure.label.anchor-advanced": "advanced proportional sizing",
35
+ "figure.label.anchor-choice-auto": "automatic",
36
+ "figure.label.anchor-choice-aspect-x": "keep X ratio",
37
+ "figure.label.anchor-choice-aspect-y": "keep Y ratio",
38
+ "figure.label.anchor-choice-aspect-z": "keep Z ratio",
39
+ "figure.label.anchor-choice-center": "stay centred",
40
+ "figure.label.anchor-choice-max-x": "right face",
41
+ "figure.label.anchor-choice-max-y": "upper face",
42
+ "figure.label.anchor-choice-max-z": "front face",
43
+ "figure.label.anchor-choice-min-x": "left face",
44
+ "figure.label.anchor-choice-min-y": "lower face",
45
+ "figure.label.anchor-choice-min-z": "back face",
46
+ "figure.label.anchor-choice-scale": "grow together",
47
+ "figure.label.anchor-choice-span": "fill both faces",
29
48
  "figure.label.anchor-center": "中央に残り大きさはそのまま",
30
49
  "figure.label.anchor-max": "大きい側の面にくっついている",
31
50
  "figure.label.anchor-max-x": "右の面にくっついている",
@@ -107,6 +126,18 @@
107
126
  "figure.label.now": "current",
108
127
  "figure.label.on-by-default": "on by default",
109
128
  "figure.label.palette-token": "palette token",
129
+ "figure.label.palette-role": "color role",
130
+ "figure.label.palette-purpose-accent": "accent part · handles and covers that must stand out",
131
+ "figure.label.palette-purpose-danger": "danger signal · an error or stop indicator",
132
+ "figure.label.palette-purpose-dark": "frame and shadow · dark structure and edges",
133
+ "figure.label.palette-purpose-info": "information signal · an operating-information indicator",
134
+ "figure.label.palette-purpose-light": "light face · light housings and label surrounds",
135
+ "figure.label.palette-purpose-neutral": "neutral machine face · supporting structures and machine parts",
136
+ "figure.label.palette-purpose-primary": "main body · the largest equipment housing",
137
+ "figure.label.palette-purpose-registered": "registered palette color",
138
+ "figure.label.palette-purpose-success": "normal signal · a normal-operation indicator",
139
+ "figure.label.palette-purpose-surface": "surface and background · broad background faces",
140
+ "figure.label.palette-purpose-warning": "warning signal · an attention-needed indicator",
110
141
  "figure.label.part": "part",
111
142
  "figure.label.part-material": "material",
112
143
  "figure.label.part-position": "position (centre)",
@@ -194,6 +225,7 @@
194
225
  "figure.text.expand-parts-pane": "expand the part list",
195
226
  "figure.text.expand-properties-pane": "expand the property pane",
196
227
  "figure.text.figure-display-name": "display name",
228
+ "figure.text.find-by-this-tag": "find by this tag",
197
229
  "figure.text.fits-n-instances": "up to {n}",
198
230
  "figure.text.floor-explained": "overlaps the coordinate ground, so usually off",
199
231
  "figure.text.follow-camera-explained": "turn off to fix the shadow direction",
@@ -235,6 +267,7 @@
235
267
  "figure.text.nothing-released-yet": "まだ公開した版がありません。公開すると、その時点のフィギュアが版として残ります。",
236
268
  "figure.text.on-by-default-explained": "the starting state when placed on a board. an instance switching it wins.",
237
269
  "figure.text.other-segment-count": "enter a value",
270
+ "figure.text.more-segment-options": "advanced segment counts",
238
271
  "figure.text.part-limit-reached": "the detail level allows no more parts — raise the level or remove a part.",
239
272
  "figure.text.part-limit-reached-short": "level {level} allows {limit} parts. Raise the level or remove a part.",
240
273
  "figure.text.pick-a-shape-above-to-start": "pick a shape above to add the first part.",
@@ -253,7 +286,7 @@
253
286
  "figure.text.revert-to-version-confirm": "第{version}版に戻します。作業中の内容がその版のものに変わります。続けますか?",
254
287
  "figure.text.save-the-figure-before-releasing": "まだ保存されていません。保存すると公開できます。",
255
288
  "figure.text.saving-figure": "saving",
256
- "figure.text.search-figure-by-name-or-type": "search by name or type",
289
+ "figure.text.search-figure": "search by name, type, description, category or tag",
257
290
  "figure.text.select-a-part-to-edit": "select a part to edit it here.",
258
291
  "figure.text.show-all-parts": "show all",
259
292
  "figure.text.show-this-part": "show this part again",
@@ -1,19 +1,29 @@
1
1
  {
2
+ "figure.button.add-channel": "채널 추가",
3
+ "figure.button.add-clip": "clip 추가",
4
+ "figure.button.add-key": "키 추가",
2
5
  "figure.button.ask": "요청",
6
+ "figure.label.candidate-review": "후보 검토 근거",
7
+ "figure.text.proposal-feedback-note": "다음 제안에 반영할 메모 (현재 세션에만 사용)",
8
+ "figure.text.proposal-feedback-placeholder": "예: 실루엣은 유지하되 포트가 더 잘 보이게",
9
+ "figure.text.tools-explained": "맞추기는 위치·크기·회전을 직접 입력한 뒤 빠르게 정렬하는 도구입니다. 왼쪽부터 X 가운데, Z 가운데, 바닥에 붙이기, X 대칭, Z 대칭, 눈금 맞춤입니다. 아이콘 위에 마우스를 올리면 각 동작을 다시 확인할 수 있습니다.",
10
+ "figure.text.palette-purpose-explained": "색 이름이 아니라 이 부품이 화면에서 맡을 역할을 고릅니다.",
3
11
  "figure.button.attach-a-picture": "이미지",
4
12
  "figure.button.center-x": "X 가운데",
5
13
  "figure.button.center-z": "Z 가운데",
6
14
  "figure.button.close": "닫기",
7
15
  "figure.button.delete-figure": "삭제",
8
16
  "figure.button.discard": "취소",
9
- "figure.button.dock": "대화",
10
17
  "figure.button.duplicate-part": "복제",
11
18
  "figure.button.mirror-x": "X 대칭",
12
19
  "figure.button.mirror-z": "Z 대칭",
13
20
  "figure.button.move-part-down": "아래로",
14
21
  "figure.button.move-part-up": "위로",
15
22
  "figure.button.new-figure": "새 Figure",
23
+ "figure.button.pivot-clear": "제 중심으로",
24
+ "figure.button.pivot-set": "적기",
16
25
  "figure.button.release-figure": "발행하기",
26
+ "figure.button.remove": "삭제",
17
27
  "figure.button.remove-part": "삭제",
18
28
  "figure.button.reset-view": "처음으로",
19
29
  "figure.button.revert": "되돌리기",
@@ -28,6 +38,20 @@
28
38
  "figure.label.anchor-aspect-y": "y 축이 커지는 만큼만 커진다 (비율 유지)",
29
39
  "figure.label.anchor-aspect-z": "z 축이 커지는 만큼만 커진다 (비율 유지)",
30
40
  "figure.label.anchor-auto": "자동 ({rule})",
41
+ "figure.label.anchor-advanced": "고급 비율 유지",
42
+ "figure.label.anchor-choice-auto": "자동",
43
+ "figure.label.anchor-choice-aspect-x": "X 비율 유지",
44
+ "figure.label.anchor-choice-aspect-y": "Y 비율 유지",
45
+ "figure.label.anchor-choice-aspect-z": "Z 비율 유지",
46
+ "figure.label.anchor-choice-center": "가운데 고정",
47
+ "figure.label.anchor-choice-max-x": "오른쪽 면",
48
+ "figure.label.anchor-choice-max-y": "위 면",
49
+ "figure.label.anchor-choice-max-z": "앞 면",
50
+ "figure.label.anchor-choice-min-x": "왼쪽 면",
51
+ "figure.label.anchor-choice-min-y": "아래 면",
52
+ "figure.label.anchor-choice-min-z": "뒤 면",
53
+ "figure.label.anchor-choice-scale": "함께 확대",
54
+ "figure.label.anchor-choice-span": "양쪽 채움",
31
55
  "figure.label.anchor-center": "가운데에 남고 크기는 그대로",
32
56
  "figure.label.anchor-max": "큰 쪽 면에 붙어 있는다",
33
57
  "figure.label.anchor-max-x": "오른쪽 면에 붙어 있는다",
@@ -39,6 +63,12 @@
39
63
  "figure.label.anchor-min-z": "뒤 면에 붙어 있는다",
40
64
  "figure.label.anchor-scale": "상자와 함께 커진다",
41
65
  "figure.label.anchor-span": "양쪽 면에 닿아 사이를 채운다",
66
+ "figure.label.animation": "애니메이션",
67
+ "figure.label.motion-intent": "무엇을 움직일까요?",
68
+ "figure.label.recipe-conveyor": "컨베이어 롤러 계속 회전",
69
+ "figure.label.recipe-gate": "문 또는 게이트 열기",
70
+ "figure.label.recipe-pusher": "푸셔 위치 이동",
71
+ "figure.label.recipe-lift": "리프트 높이 변경",
42
72
  "figure.label.axis-consistency": "표현 일관성",
43
73
  "figure.label.axis-consistency-short": "일관성",
44
74
  "figure.label.axis-depth": "높이",
@@ -55,7 +85,7 @@
55
85
  "figure.label.axis-scale": "배치 규모",
56
86
  "figure.label.axis-scale-short": "규모",
57
87
  "figure.label.axis-width": "가로",
58
- "figure.label.budget-animations": "애니메이션 지점",
88
+ "figure.label.budget-animations": "움직이는 부품",
59
89
  "figure.label.budget-groups": "재질 그룹",
60
90
  "figure.label.budget-parts": "부품 수",
61
91
  "figure.label.budget-surface": "팔레트 외 표면",
@@ -63,6 +93,12 @@
63
93
  "figure.label.budgets": "한도",
64
94
  "figure.label.by-axis": "축별 성숙도",
65
95
  "figure.label.cast-shadow": "그림자 드리우기",
96
+ "figure.label.category": "분류",
97
+ "figure.label.channel-path": "무엇을",
98
+ "figure.label.channel-pivot": "회전 중심",
99
+ "figure.label.channel-target": "부품",
100
+ "figure.label.channels": "채널",
101
+ "figure.label.clip-name": "clip 이름",
66
102
  "figure.label.coordinate-ground": "좌표 바탕",
67
103
  "figure.label.corner-round": "모서리 굴림",
68
104
  "figure.label.detail-L": "상세",
@@ -74,6 +110,8 @@
74
110
  "figure.label.draft": "초안",
75
111
  "figure.label.draw-calls-at-100": "100개 기준 draw call",
76
112
  "figure.label.draw-calls-at-10k": "1만개 기준 draw call",
113
+ "figure.label.drive-hold": "위치",
114
+ "figure.label.drive-loop": "배속",
77
115
  "figure.label.emissive": "자체발광",
78
116
  "figure.label.emissive-color": "켜진 색",
79
117
  "figure.label.environment": "환경",
@@ -98,7 +136,10 @@
98
136
  "figure.label.hollow-floor": "바닥 두께",
99
137
  "figure.label.hollow-wall": "벽 두께",
100
138
  "figure.label.intensity": "세기",
139
+ "figure.label.interpolation-linear": "이어서",
140
+ "figure.label.interpolation-step": "끊어서",
101
141
  "figure.label.keep-round": "단면 유지",
142
+ "figure.label.key-at": "시각(초)",
102
143
  "figure.label.key-light": "키 라이트",
103
144
  "figure.label.maturity": "성숙도",
104
145
  "figure.label.mode-edit": "편집",
@@ -109,11 +150,26 @@
109
150
  "figure.label.now": "현재",
110
151
  "figure.label.on-by-default": "기본으로 켜 둔다",
111
152
  "figure.label.palette-token": "팔레트 토큰",
153
+ "figure.label.palette-role": "색 역할",
154
+ "figure.label.palette-purpose-accent": "강조 부품 · 손잡이·커버처럼 눈에 띄어야 할 곳",
155
+ "figure.label.palette-purpose-danger": "위험 신호 · 오류·정지 상태를 알리는 표시등",
156
+ "figure.label.palette-purpose-dark": "프레임·그림자 · 어두운 구조와 테두리",
157
+ "figure.label.palette-purpose-info": "정보 신호 · 동작 정보용 표시등",
158
+ "figure.label.palette-purpose-light": "밝은 면 · 밝은 외장과 라벨 주변",
159
+ "figure.label.palette-purpose-neutral": "중립 기계면 · 보조 구조와 기계 부품",
160
+ "figure.label.palette-purpose-primary": "기본 몸체 · 설비의 가장 큰 외장",
161
+ "figure.label.palette-purpose-registered": "등록된 팔레트 색",
162
+ "figure.label.palette-purpose-success": "정상 신호 · 정상 동작 상태를 알리는 표시등",
163
+ "figure.label.palette-purpose-surface": "표면·바탕 · 넓은 바탕 면",
164
+ "figure.label.palette-purpose-warning": "주의 신호 · 확인이 필요한 상태를 알리는 표시등",
112
165
  "figure.label.part": "부품",
113
166
  "figure.label.part-material": "재질",
114
167
  "figure.label.part-position": "위치 (중심)",
115
168
  "figure.label.part-size": "크기",
116
169
  "figure.label.parts": "부품",
170
+ "figure.label.path-rotation": "회전",
171
+ "figure.label.path-scale": "배율",
172
+ "figure.label.path-translation": "옮김",
117
173
  "figure.label.placement": "위치와 크기",
118
174
  "figure.label.placement-limit": "배치 한도",
119
175
  "figure.label.preset": "프리셋",
@@ -164,6 +220,7 @@
164
220
  "figure.label.status-colors": "켜진 색 (램프 · 표시등)",
165
221
  "figure.label.tab-capability": "능력",
166
222
  "figure.label.tab-environment": "환경",
223
+ "figure.label.tags": "태그",
167
224
  "figure.label.tools": "맞추기",
168
225
  "figure.label.transparent": "투명",
169
226
  "figure.label.triangles": "삼각형",
@@ -178,6 +235,17 @@
178
235
  "figure.text.already-released-edit-to-release-again": "이미 발행되어 있습니다. 고쳐서 저장하면 초안으로 돌아가고, 그때 다시 발행할 수 있습니다.",
179
236
  "figure.text.anchor-explained": "상자가 커질 때 이 부품이 어디에 붙어 있을지입니다. 맞댄 부품과 다른 면에 붙어 있으면 커질 때 사이가 벌어집니다.",
180
237
  "figure.text.anchors-are-not-drawn": "자리는 물건을 놓는 곳, 문은 물건이 들어오고 나가는 곳이다. 둘 다 보드에서 그려지지 않고 위치는 저작 화면에서만 표시된다",
238
+ "figure.text.animated-parts-cost": "움직이는 부품은 따로 그려집니다 — 부품마다 draw call 이 하나 늘고 프레임마다 갱신이 늘어납니다.",
239
+ "figure.text.animated-parts-over": "한도를 넘었습니다. 막지는 않지만 여럿 놓을 때 이 도형이 프레임을 많이 씁니다.",
240
+ "figure.text.animation-empty-examples": "도는 롤러 · 미끄러지는 문짝 · 오르내리는 리프트 · 깜빡이는 표시등.",
241
+ "figure.text.animation-empty-what-it-is": "이 도형은 아직 움직이지 않습니다. clip 은 부품 여럿을 한 벌로 움직이는 단위입니다 — 문 열림은 왼짝과 오른짝이 반대로 미끄러지는 것 하나입니다.",
242
+ "figure.text.animation-is-driven-by-a-fact": "clip 하나가 부품 여럿을 함께 움직입니다. 보드에서는 사실이 그 값을 정합니다 — 「지금 40% 열려 있다」처럼.",
243
+ "figure.text.animation-needs-a-named-part": "부품이 먼저 있어야 합니다. clip 은 부품을 가리켜 움직입니다.",
244
+ "figure.text.motion-intent-help": "움직일 부품을 고른 뒤 목적을 선택하세요. 만들어진 동작은 아래 고급 편집에서 조정할 수 있습니다.",
245
+ "figure.text.recipe-conveyor": "계속 움직임 · 입력값은 속도 또는 배속",
246
+ "figure.text.recipe-gate": "상태 위치 · 입력값은 열림 비율 0~100%",
247
+ "figure.text.recipe-pusher": "상태 위치 · 입력값은 이동 위치 0~100%",
248
+ "figure.text.recipe-lift": "상태 위치 · 입력값은 높이 0~100%",
181
249
  "figure.text.ask-create-example": "예: 3단 선반형 컨베이어 소터",
182
250
  "figure.text.ask-revise-example": "예: 재질 묶음을 2개로 줄여줘",
183
251
  "figure.text.ask-to-create": "신규",
@@ -192,6 +260,8 @@
192
260
  "figure.text.canvas-appears-once-a-part-exists": "부품을 놓고 옮기는 편집 영역입니다. 왼쪽 「도형」에서 하나를 선택해 시작하세요.",
193
261
  "figure.text.capability-hand-written": "손으로 지정한 능력이라 사다리의 어느 칸에도 해당하지 않는다. 아래 이름이 실제로 저장된다",
194
262
  "figure.text.capacity-from-repeat": "칸 수는 반복 설정과 인스턴스 크기로 정해진다",
263
+ "figure.text.category-explained": "팔레트에서 묶어 보이는 기준입니다. 도형 하나에 하나만 둡니다 — 한 도형이 두 묶음에 있으면 저작자가 같은 것을 두 번 만납니다.",
264
+ "figure.text.category-placeholder": "예: 컨베이어",
195
265
  "figure.text.center-on-x": "기준 상자의 X 가운데로 옮깁니다.",
196
266
  "figure.text.center-on-z": "기준 상자의 Z 가운데로 옮깁니다.",
197
267
  "figure.text.change-added": "새 부품",
@@ -201,6 +271,11 @@
201
271
  "figure.text.change-detail": "디테일 등급",
202
272
  "figure.text.change-removed": "삭제되는 부품",
203
273
  "figure.text.change-styleKit": "스타일 킷",
274
+ "figure.text.channel-target-is-gone": "그런 부품이 없습니다. 부품 이름을 바꾸었다면 여기서도 다시 고르십시오.",
275
+ "figure.text.clip-name-is-how-it-is-driven": "인스턴스가 이 이름으로 구동합니다.",
276
+ "figure.text.clip-name-taken": "같은 이름의 clip 이 이미 있습니다. 인스턴스가 이름으로 구동하므로 겹치면 안 됩니다.",
277
+ "figure.text.clip-needs-a-channel": "채널이 없으면 무엇을 움직이는지 알 수 없습니다.",
278
+ "figure.text.clip-needs-a-name": "이름이 없으면 구동할 수 없습니다.",
204
279
  "figure.text.collapse-parts-pane": "부품 목록 접기",
205
280
  "figure.text.collapse-properties-pane": "속성 칸 접기",
206
281
  "figure.text.coordinate-ground-explained": "원점과 눈금을 바닥에 그린다",
@@ -208,14 +283,16 @@
208
283
  "figure.text.designate-in-properties": "아직 지정된 부품이 없다. 부품을 선택하고 속성 탭에서 「능력에서 맡는 자리」를 지정한다",
209
284
  "figure.text.detail-level-explained": "이 형상을 얼마나 상세하게 만들 것인지 밝히는 값입니다. S 단순은 표지나 기둥처럼 형태가 단순한 것, M 보통은 대부분의 설비, L 상세는 화면의 주역이 되는 큰 설비에 씁니다. 밝힌 등급이 부품 수 한도를 정하고, 성숙도가 그 등급에 걸맞게 만들어졌는지 봅니다.",
210
285
  "figure.text.discard-changes-and-start-new": "저장하지 않은 변경이 있습니다. 버리고 새로 시작할까요?",
211
- "figure.text.dock-explained": "저작을 도와줄 어시스턴트와 대화합니다. 지금 열고 있는 도형을 읽고 후보를 내놓습니다.",
212
- "figure.text.dock-placeholder": "무엇을 만들거나 고칠지 적으세요 (Shift+Enter 줄바꿈, Enter 전송)",
213
286
  "figure.text.does-not-block": "막지는 않는 것",
287
+ "figure.text.drive-explained": "인스턴스가 주는 값을 어떻게 읽을지 정합니다.",
288
+ "figure.text.drive-hold-note": "시각이 멈춰 있습니다. 인스턴스가 주는 값은 0~1 위치입니다 — 열린 정도가 그렇습니다.",
289
+ "figure.text.drive-loop-note": "시각이 흐릅니다. 인스턴스가 주는 값은 배속입니다 — 도는 롤러가 그렇습니다.",
214
290
  "figure.text.emissive-explained": "이 면이 스스로 밝아집니다. 0 이면 램프가 아닙니다. 주변을 물들이지는 않습니다.",
215
291
  "figure.text.environment-explained": "금속 재질이 무엇을 비출지 정한다. 형상에는 영향이 없다.",
216
292
  "figure.text.expand-parts-pane": "부품 목록 펼치기",
217
293
  "figure.text.expand-properties-pane": "속성 칸 펼치기",
218
294
  "figure.text.figure-display-name": "표시 이름",
295
+ "figure.text.find-by-this-tag": "이 태그로 찾기",
219
296
  "figure.text.fits-n-instances": "{n}개까지",
220
297
  "figure.text.floor-explained": "좌표 바탕과 겹치므로 보통 끈다",
221
298
  "figure.text.follow-camera-explained": "끄면 그림자 방향이 고정된다",
@@ -228,10 +305,12 @@
228
305
  "figure.text.hide-this-part": "이 부품을 잠깐 가립니다. 저장되지 않습니다",
229
306
  "figure.text.how-many-fit": "한 도면에 몇 개까지 놓아도 화면이 느려지지 않는가",
230
307
  "figure.text.instances-unit": "개",
308
+ "figure.text.interpolation-explained": "키프레임 사이를 어떻게 잇습니까.",
231
309
  "figure.text.keep-round-cost": "draw call 1",
232
310
  "figure.text.keep-round-merged": "묶음에 합쳐짐",
233
311
  "figure.text.keep-round-off": "끔",
234
312
  "figure.text.keep-round-on": "원 유지",
313
+ "figure.text.keys-must-rise": "시각이 앞 키보다 커야 합니다.",
235
314
  "figure.text.limit-comes-from-level": "이 한도는 디테일 등급이 정합니다.",
236
315
  "figure.text.maturity-blocked-no-binding": "상태 값을 부품에 연결하는 방법이 아직 형식에 없습니다. 렌더러도 이 값을 읽지 않습니다.",
237
316
  "figure.text.maturity-blocked-no-parts": "부품이 없어 측정할 것이 없습니다.",
@@ -257,14 +336,18 @@
257
336
  "figure.text.nothing-released-yet": "아직 발행한 판이 없습니다. 발행하면 그때의 도형이 판으로 남습니다.",
258
337
  "figure.text.on-by-default-explained": "보드에 놓았을 때의 처음 상태입니다. 인스턴스가 켜고 끄면 그것이 이깁니다.",
259
338
  "figure.text.other-segment-count": "직접 입력",
339
+ "figure.text.more-segment-options": "고급 분할 수",
260
340
  "figure.text.part-limit-reached": "디테일 등급이 허용하는 부품 수를 모두 사용했습니다. 등급을 올리거나 부품을 삭제하세요.",
261
341
  "figure.text.part-limit-reached-short": "{level} 등급은 부품 {limit}개까지입니다. 등급을 올리거나 부품을 삭제하세요.",
342
+ "figure.text.path-rotation-unit": "오일러 도(°)입니다. 배치의 회전과 같은 약속입니다.",
343
+ "figure.text.path-scale-unit": "배율입니다. 1 이 제 크기이고 0 은 부품을 지웁니다.",
344
+ "figure.text.path-translation-unit": "부품 기준으로 옮긴 거리입니다. 0 이 제자리입니다.",
262
345
  "figure.text.pick-a-shape-above-to-start": "위에서 도형을 선택해 첫 부품을 추가하세요.",
263
346
  "figure.text.picked-changes-do-not-validate": "선택한 조합은 형식에 맞지 않습니다",
264
347
  "figure.text.picture-is-for-proportions": "비율과 형태를 참고합니다. 표면 무늬는 반영하지 않습니다.",
348
+ "figure.text.pivot-defaults-to-the-part-centre": "적지 않으면 부품 제 중심입니다. 부품 기준 좌표입니다.",
265
349
  "figure.text.preview-blocked-by-errors": "형식을 어겨서 세울 수 없습니다. 성숙도 탭에 사유가 있습니다.",
266
350
  "figure.text.preview-needs-a-part": "보드에 놓았을 때의 모습을 표시합니다. 부품을 만들면 표시됩니다.",
267
- "figure.text.proposal-had-no-source": "후보에 정본이 없어 받을 수 없습니다.",
268
351
  "figure.text.put-on-floor": "바닥(Z=0)에 붙입니다.",
269
352
  "figure.text.release-needs-a-save-first": "저장하지 않은 변경이 있습니다. 발행은 저장된 것을 내보내므로, 먼저 저장하세요.",
270
353
  "figure.text.releasing": "발행하고 있습니다…",
@@ -284,7 +367,7 @@
284
367
  "figure.text.rung-none-note": "물건을 받지 않는다. 대부분의 도형이 여기에 해당한다",
285
368
  "figure.text.save-the-figure-before-releasing": "아직 저장되지 않은 도형입니다. 저장하면 발행할 수 있습니다.",
286
369
  "figure.text.saving-figure": "저장 중",
287
- "figure.text.search-figure-by-name-or-type": "이름이나 타입으로 찾기",
370
+ "figure.text.search-figure": "이름 · 타입 · 설명 · 분류 · 태그로 찾기",
288
371
  "figure.text.select-a-part-to-edit": "부품을 선택하면 여기에서 편집합니다.",
289
372
  "figure.text.show-all-parts": "모두 보이기",
290
373
  "figure.text.show-this-part": "가린 부품을 다시 보입니다",
@@ -295,8 +378,11 @@
295
378
  "figure.text.sizing-stretch-explained": "한 축만 늘어납니다. 프레임·벨트·레일처럼요.",
296
379
  "figure.text.slots-need-capability": "자리를 지정하려면 먼저 「담는다」 이상을 선택해야 한다",
297
380
  "figure.text.snap-explained": "자리와 크기를 눈금에 맞춥니다. 캔버스의 눈금과 같은 간격입니다.",
381
+ "figure.text.tags-explained": "분류로는 못 하는 찾기를 위한 것입니다. 여럿 붙일 수 있습니다 — 컨베이어이면서 반출 구역의 것일 수 있습니다. 쉼표로 나눠 적습니다.",
382
+ "figure.text.tags-placeholder": "예: 반출, 자동, 2층",
298
383
  "figure.text.thumbnail-not-made-yet": "미리보기 그림 없음",
299
384
  "figure.text.triangle-count": "삼각형 {count}개",
385
+ "figure.text.two-keys-at-least": "키가 둘은 있어야 합니다. 하나뿐이면 움직임이 아니라 자세 하나입니다.",
300
386
  "figure.text.type-name-already-taken": "타입 이름 {type} 은 이미 쓰이고 있습니다. 나중에 바꿀 수 없으니 다른 이름을 정해 주세요.",
301
387
  "figure.text.type-name-cannot-change": "타입 이름은 저장되는 식별자여서 만든 뒤에는 바꿀 수 없습니다.",
302
388
  "figure.text.unsaved-changes": "저장 안 됨",