@things-factory/figure-ui 10.1.33 → 10.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/graphql/index.ts +13 -0
- package/client/modeller/figure-history-panel.ts +82 -2
- package/client/modeller/figure-side.ts +3 -0
- package/client/modeller/v3-renderer.ts +61 -0
- package/client/pages/figure-modeller-page.ts +67 -3
- package/client/types.ts +8 -0
- package/dist-client/graphql/index.js +13 -0
- package/dist-client/graphql/index.js.map +1 -1
- package/dist-client/modeller/figure-history-panel.d.ts +13 -0
- package/dist-client/modeller/figure-history-panel.js +89 -4
- package/dist-client/modeller/figure-history-panel.js.map +1 -1
- package/dist-client/modeller/figure-side.d.ts +2 -0
- package/dist-client/modeller/figure-side.js +5 -0
- package/dist-client/modeller/figure-side.js.map +1 -1
- package/dist-client/modeller/v3-renderer.d.ts +31 -0
- package/dist-client/modeller/v3-renderer.js +81 -0
- package/dist-client/modeller/v3-renderer.js.map +1 -0
- package/dist-client/pages/figure-modeller-page.d.ts +9 -0
- package/dist-client/pages/figure-modeller-page.js +73 -2
- package/dist-client/pages/figure-modeller-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/types.d.ts +7 -0
- package/dist-client/types.js.map +1 -1
- package/package.json +4 -4
- package/test/base-box.test.ts +13 -0
- package/test/v3-renderer.test.ts +24 -0
- package/translations/en.json +7 -0
- package/translations/ja.json +3 -0
- package/translations/ko.json +7 -0
- package/translations/ms.json +3 -0
- package/translations/zh.json +3 -0
package/dist-client/types.d.ts
CHANGED
|
@@ -161,6 +161,12 @@ export interface FigureGateFix {
|
|
|
161
161
|
/** All blocking sizing cases clear after this exact edit was remeasured server-side. */
|
|
162
162
|
safe: boolean;
|
|
163
163
|
}
|
|
164
|
+
/** A server-remeasured set of draft-only changes that clears every blocking sizing split. */
|
|
165
|
+
export interface FigureGateFixPlan {
|
|
166
|
+
fixes: FigureGateFix[];
|
|
167
|
+
resolved: number;
|
|
168
|
+
safe: boolean;
|
|
169
|
+
}
|
|
164
170
|
export interface FigureGateFinding {
|
|
165
171
|
code: string;
|
|
166
172
|
message: string;
|
|
@@ -172,6 +178,7 @@ export interface FigureGateFinding {
|
|
|
172
178
|
at?: string;
|
|
173
179
|
/** Candidate edits; the UI must preview and explicitly apply these, never auto-save them. */
|
|
174
180
|
fixes?: FigureGateFix[];
|
|
181
|
+
fixPlan?: FigureGateFixPlan;
|
|
175
182
|
blocking: boolean;
|
|
176
183
|
}
|
|
177
184
|
/** 발행해도 되나. `blocked` 면 서버가 거절한다. */
|
package/dist-client/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../client/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * 화면이 다루는 모양.\n *\n * 정본 형식(`FigureSource`)의 타입은 **여기서 다시 정의하지 않는다** —\n * `@hatiolab/figure-model` 에서 가져온다. 두 벌이면 갈리고, 갈리면 화면이 서버가\n * 거절할 것을 만들어 낸다.\n */\nexport type { FigureSource, FigureBlueprint, FigurePart, ErrorCode, ViolationCode } from '@hatiolab/figure-model'\n\n/** 서버가 돌려주는 Figure 한 벌. `source` 는 저작면에서만 받는다. */\nexport interface Figure {\n id: string\n /** 컴포넌트 타입 이름. **만든 뒤에 고칠 수 없다.** */\n type: string\n name: string\n description?: string\n /** 분류 하나 — 팔레트에서 묶어 보이는 기준. */\n category?: string\n /** 태그 여럿 — 분류로는 못 하는 찾기. */\n tags?: string[]\n state?: 'draft' | 'released'\n /** 재활용 점수 0~100. 서버가 정본에서 계산한다 — 화면이 보내는 값이 아니다. */\n score?: number\n triangles?: number\n groups?: number\n thumbnail?: string\n thumbnailUpdatedAt?: string\n updatedAt?: string\n updater?: { id: string; name: string }\n /** `FigureSource` JSON 문자열. 목록 질의에는 실려 오지 않는다. */\n source?: string\n properties?: string\n version?: number\n}\n\n/**\n * 발행된 판 하나.\n *\n * 저작 중 저장은 여기 오지 않는다 — 판본은 발행에서만 생긴다.\n */\nexport interface FigureVersion {\n version: number\n /** 발행하며 남긴 말. */\n comment?: string\n state?: 'draft' | 'released'\n updatedAt?: string\n updater?: { id: string; name: string }\n score?: number\n triangles?: number\n groups?: number\n}\n\nexport interface FigureListResult {\n items: Figure[]\n total: number\n}\n\n/**\n * 새 Figure.\n *\n * `score`·`triangles`·`groups` 가 없다 — **서버가 정본에서 계산한다.** 화면이 보내면\n * 거짓이 들어오고 목록이 실물과 다른 것을 보여 준다.\n */\nexport interface NewFigure {\n type: string\n name: string\n description?: string\n category?: string\n tags?: string[]\n source: string\n properties?: string\n state?: 'draft' | 'released'\n thumbnail?: string\n}\n\n/**\n * 수정.\n *\n * `type` 이 없다 — 저장되는 식별자라 고칠 수 없다. 배치된 도면이 그 이름으로 타입을\n * 찾으므로, 바꾸면 그 도면이 빈 화면이 된다.\n */\nexport interface FigurePatch {\n /** 발행 전 초안에서만 받는다 — 발행된 뒤에는 문이 거절한다(ADR-0063 결정 4). */\n type?: string\n name?: string\n description?: string\n category?: string\n /** 빈 배열은 「전부 지운다」, 안 주는 것은 「건드리지 않는다」. */\n tags?: string[]\n source?: string\n properties?: string\n state?: 'draft' | 'released'\n thumbnail?: string\n}\n\n/** 검증 결과 한 줄. 코드는 figure-model 의 것을 그대로 쓴다. */\nexport interface FigureFinding {\n code: string\n message: string\n at?: string\n}\n\n/**\n * 저작 보조가 낸 후보.\n *\n * **정본이 아니다.** 저작자가 보고 받아야 정본이 된다 — 서버는 저장하지 않고\n * 돌려주기만 한다.\n */\nexport interface FigureProposal {\n /** 후보 정본. JSON 문자열이다 — 화면이 파싱한다. */\n source: string\n score: number\n grade: string\n triangles: number\n /** 재질 묶음 = 인스턴스 하나가 무는 draw call. */\n groups: number\n /** Rule-based review of measurable design concerns; it is not an aesthetic verdict. */\n quality: {\n status: 'ready' | 'review'\n summary: string\n findings: Array<{ dimension: string; code: string; message: string }>\n visualRegions: number\n visualCoverage: number\n visualReadability: number\n }\n /** 형식은 맞으나 정책을 넘은 것. 막지 않는다 — 저작자가 정한다. */\n violations: FigureFinding[]\n /** 몇 번 만에 됐나. 진단용이다. */\n attempts: number\n}\n\n/** 사람이 후보를 수락하거나 버릴 때 직접 남긴 현재 저작 세션의 참고 신호. */\nexport interface ProposalFeedback {\n outcome: 'accepted' | 'discarded'\n selectedChanges: number\n totalChanges: number\n note?: string\n grade?: string\n quality?: { status?: 'ready' | 'review'; findingCodes?: string[] }\n}\n\n/**\n * 발행 판정 한 줄.\n *\n * `FigureFinding` 과 달리 **`blocking` 이 있다.** 저장 쪽 발견은 정의상 막지 않는 것들이고,\n * 발행 판정은 막는 것과 알리는 것을 함께 내므로 어느 쪽인지를 값이 스스로 말한다 — 코드를 보고\n * 화면이 다시 분류하면 규칙이 두 벌이 된다.\n */\n/** One reversible anchor edit the sizing gate has measured against this exact source. */\nexport interface FigureGateFix {\n findingWay: string\n part: string\n axis: 'x' | 'y' | 'z'\n from?: string\n to: 'min' | 'center' | 'max' | 'span'\n resolved: number\n /** All blocking sizing cases clear after this exact edit was remeasured server-side. */\n safe: boolean\n}\n\nexport interface FigureGateFinding {\n code: string\n message: string\n /** 왜 그것이 문제인가 — 사람이 무엇을 보게 되나. */\n why?: string\n /** 무엇을 바꾸면 되나 — 부품 이름과 값으로. */\n how?: string\n /** 갈라진 부품 이름들, 또는 정본 안의 경로. */\n at?: string\n /** Candidate edits; the UI must preview and explicitly apply these, never auto-save them. */\n fixes?: FigureGateFix[]\n blocking: boolean\n}\n\n/** 발행해도 되나. `blocked` 면 서버가 거절한다. */\nexport interface FigureInspection {\n blocked: boolean\n findings: FigureGateFinding[]\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../client/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * 화면이 다루는 모양.\n *\n * 정본 형식(`FigureSource`)의 타입은 **여기서 다시 정의하지 않는다** —\n * `@hatiolab/figure-model` 에서 가져온다. 두 벌이면 갈리고, 갈리면 화면이 서버가\n * 거절할 것을 만들어 낸다.\n */\nexport type { FigureSource, FigureBlueprint, FigurePart, ErrorCode, ViolationCode } from '@hatiolab/figure-model'\n\n/** 서버가 돌려주는 Figure 한 벌. `source` 는 저작면에서만 받는다. */\nexport interface Figure {\n id: string\n /** 컴포넌트 타입 이름. **만든 뒤에 고칠 수 없다.** */\n type: string\n name: string\n description?: string\n /** 분류 하나 — 팔레트에서 묶어 보이는 기준. */\n category?: string\n /** 태그 여럿 — 분류로는 못 하는 찾기. */\n tags?: string[]\n state?: 'draft' | 'released'\n /** 재활용 점수 0~100. 서버가 정본에서 계산한다 — 화면이 보내는 값이 아니다. */\n score?: number\n triangles?: number\n groups?: number\n thumbnail?: string\n thumbnailUpdatedAt?: string\n updatedAt?: string\n updater?: { id: string; name: string }\n /** `FigureSource` JSON 문자열. 목록 질의에는 실려 오지 않는다. */\n source?: string\n properties?: string\n version?: number\n}\n\n/**\n * 발행된 판 하나.\n *\n * 저작 중 저장은 여기 오지 않는다 — 판본은 발행에서만 생긴다.\n */\nexport interface FigureVersion {\n version: number\n /** 발행하며 남긴 말. */\n comment?: string\n state?: 'draft' | 'released'\n updatedAt?: string\n updater?: { id: string; name: string }\n score?: number\n triangles?: number\n groups?: number\n}\n\nexport interface FigureListResult {\n items: Figure[]\n total: number\n}\n\n/**\n * 새 Figure.\n *\n * `score`·`triangles`·`groups` 가 없다 — **서버가 정본에서 계산한다.** 화면이 보내면\n * 거짓이 들어오고 목록이 실물과 다른 것을 보여 준다.\n */\nexport interface NewFigure {\n type: string\n name: string\n description?: string\n category?: string\n tags?: string[]\n source: string\n properties?: string\n state?: 'draft' | 'released'\n thumbnail?: string\n}\n\n/**\n * 수정.\n *\n * `type` 이 없다 — 저장되는 식별자라 고칠 수 없다. 배치된 도면이 그 이름으로 타입을\n * 찾으므로, 바꾸면 그 도면이 빈 화면이 된다.\n */\nexport interface FigurePatch {\n /** 발행 전 초안에서만 받는다 — 발행된 뒤에는 문이 거절한다(ADR-0063 결정 4). */\n type?: string\n name?: string\n description?: string\n category?: string\n /** 빈 배열은 「전부 지운다」, 안 주는 것은 「건드리지 않는다」. */\n tags?: string[]\n source?: string\n properties?: string\n state?: 'draft' | 'released'\n thumbnail?: string\n}\n\n/** 검증 결과 한 줄. 코드는 figure-model 의 것을 그대로 쓴다. */\nexport interface FigureFinding {\n code: string\n message: string\n at?: string\n}\n\n/**\n * 저작 보조가 낸 후보.\n *\n * **정본이 아니다.** 저작자가 보고 받아야 정본이 된다 — 서버는 저장하지 않고\n * 돌려주기만 한다.\n */\nexport interface FigureProposal {\n /** 후보 정본. JSON 문자열이다 — 화면이 파싱한다. */\n source: string\n score: number\n grade: string\n triangles: number\n /** 재질 묶음 = 인스턴스 하나가 무는 draw call. */\n groups: number\n /** Rule-based review of measurable design concerns; it is not an aesthetic verdict. */\n quality: {\n status: 'ready' | 'review'\n summary: string\n findings: Array<{ dimension: string; code: string; message: string }>\n visualRegions: number\n visualCoverage: number\n visualReadability: number\n }\n /** 형식은 맞으나 정책을 넘은 것. 막지 않는다 — 저작자가 정한다. */\n violations: FigureFinding[]\n /** 몇 번 만에 됐나. 진단용이다. */\n attempts: number\n}\n\n/** 사람이 후보를 수락하거나 버릴 때 직접 남긴 현재 저작 세션의 참고 신호. */\nexport interface ProposalFeedback {\n outcome: 'accepted' | 'discarded'\n selectedChanges: number\n totalChanges: number\n note?: string\n grade?: string\n quality?: { status?: 'ready' | 'review'; findingCodes?: string[] }\n}\n\n/**\n * 발행 판정 한 줄.\n *\n * `FigureFinding` 과 달리 **`blocking` 이 있다.** 저장 쪽 발견은 정의상 막지 않는 것들이고,\n * 발행 판정은 막는 것과 알리는 것을 함께 내므로 어느 쪽인지를 값이 스스로 말한다 — 코드를 보고\n * 화면이 다시 분류하면 규칙이 두 벌이 된다.\n */\n/** One reversible anchor edit the sizing gate has measured against this exact source. */\nexport interface FigureGateFix {\n findingWay: string\n part: string\n axis: 'x' | 'y' | 'z'\n from?: string\n to: 'min' | 'center' | 'max' | 'span'\n resolved: number\n /** All blocking sizing cases clear after this exact edit was remeasured server-side. */\n safe: boolean\n}\n\n/** A server-remeasured set of draft-only changes that clears every blocking sizing split. */\nexport interface FigureGateFixPlan {\n fixes: FigureGateFix[]\n resolved: number\n safe: boolean\n}\n\nexport interface FigureGateFinding {\n code: string\n message: string\n /** 왜 그것이 문제인가 — 사람이 무엇을 보게 되나. */\n why?: string\n /** 무엇을 바꾸면 되나 — 부품 이름과 값으로. */\n how?: string\n /** 갈라진 부품 이름들, 또는 정본 안의 경로. */\n at?: string\n /** Candidate edits; the UI must preview and explicitly apply these, never auto-save them. */\n fixes?: FigureGateFix[]\n fixPlan?: FigureGateFixPlan\n blocking: boolean\n}\n\n/** 발행해도 되나. `blocked` 면 서버가 거절한다. */\nexport interface FigureInspection {\n blocked: boolean\n findings: FigureGateFinding[]\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/figure-ui",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.35",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"@things-factory:registry": "https://registry.npmjs.org"
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"clean": "npm run clean:server && npm run clean:client"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@hatiolab/figure-model": "^0.1.
|
|
29
|
+
"@hatiolab/figure-model": "^0.1.32",
|
|
30
30
|
"@hatiolab/things-scene": "^10.1.22",
|
|
31
31
|
"@material/web": "^2.0.0",
|
|
32
32
|
"@operato/data-grist": "^10.0.0",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"@operato/shell": "^10.0.0",
|
|
38
38
|
"@operato/styles": "^10.0.0",
|
|
39
39
|
"@operato/utils": "^10.0.0",
|
|
40
|
-
"@things-factory/figure-service": "^10.1.
|
|
40
|
+
"@things-factory/figure-service": "^10.1.35",
|
|
41
41
|
"three": "^0.185.1"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "396f43b648b704f1938a2d890ab2f6efa33fdb86"
|
|
44
44
|
}
|
package/test/base-box.test.ts
CHANGED
|
@@ -219,4 +219,17 @@ describe('화면에 붙어 있다', () => {
|
|
|
219
219
|
assert.ok(/renderBaseContract\(\)/.test(inspector))
|
|
220
220
|
assert.ok(/base-ratio-changed|base-size-changed/.test(inspector))
|
|
221
221
|
})
|
|
222
|
+
|
|
223
|
+
it('외곽 폭 변경은 비율 수식 대신 선택 가능한 결과로 안내한다', () => {
|
|
224
|
+
const history = source('../client/modeller/figure-history-panel.ts')
|
|
225
|
+
const side = source('../client/modeller/figure-side.ts')
|
|
226
|
+
const page = source('../client/pages/figure-modeller-page.ts')
|
|
227
|
+
|
|
228
|
+
assert.ok(/figure\.button\.restore-released-base/.test(history), '이전 폭으로 되돌릴 수 있다')
|
|
229
|
+
assert.ok(/figure\.button\.keep-changed-appearance/.test(history), '조정된 폭을 유지할 수 있다')
|
|
230
|
+
assert.ok(/restore-released-footprint/.test(history), '복원 의도를 부모에게 보낸다')
|
|
231
|
+
assert.ok(/\.releasedBase=\$\{this\.releasedBase\}/.test(side), '직전 발행 기준을 이력 탭까지 보낸다')
|
|
232
|
+
assert.ok(/restoreReleasedFootprint\(base: \{ x: number; z: number \}\)/.test(page), 'X·Z만 복원한다')
|
|
233
|
+
assert.ok(/depth: this\.draft\.depth/.test(page), 'Y는 이번 리비전 값을 유지한다')
|
|
234
|
+
})
|
|
222
235
|
})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {test} from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
import * as THREE from 'three'
|
|
4
|
+
import {replaceV3Meshes} from '../client/modeller/v3-renderer.ts'
|
|
5
|
+
import type {V3RenderPart} from '../client/modeller/v3-renderer.ts'
|
|
6
|
+
const box=(id:string):V3RenderPart=>({id,shape:{provider:'box',dimensions:{width:100,height:200,depth:300}},pose:{r:[[1,0,0],[0,1,0],[0,0,1]],t:[0,100,0]},material:{token:'primary'}})
|
|
7
|
+
test('V3 renderer replaces rather than accumulates; empty scene disposes old resources',()=>{
|
|
8
|
+
const group=new THREE.Group();replaceV3Meshes(group,[box('a'),box('b')],{primary:'#123456'})
|
|
9
|
+
assert.equal(group.children.length,2);let disposed=0
|
|
10
|
+
const first=group.children[0] as THREE.Mesh;first.geometry.addEventListener('dispose',()=>disposed++)
|
|
11
|
+
replaceV3Meshes(group,[box('c')],{primary:'#123456'});assert.equal(group.children.length,1);assert.equal(group.children[0].name,'c');assert.equal(disposed,1)
|
|
12
|
+
replaceV3Meshes(group,[],{});assert.equal(group.children.length,0)
|
|
13
|
+
})
|
|
14
|
+
test('V3 renderer preserves scene on unsupported geometry and resolves pose/material',()=>{
|
|
15
|
+
const group=new THREE.Group();replaceV3Meshes(group,[box('a')],{primary:'#123456'})
|
|
16
|
+
const old=group.children[0],bounds=new THREE.Box3().setFromObject(group)
|
|
17
|
+
assert.equal(bounds.min.y,0);assert.equal(bounds.max.y,200)
|
|
18
|
+
assert.throws(()=>replaceV3Meshes(group,[box('b'),{...box('c'),shape:{provider:'unknown',dimensions:{}}}],{primary:'#123456'}),/Unsupported/)
|
|
19
|
+
assert.equal(group.children[0],old)
|
|
20
|
+
const p=box('glow');p.material={token:'primary',preset:'metal',transparent:true,emissive:{token:'primary',intensity:2,on:true}}
|
|
21
|
+
replaceV3Meshes(group,[p],{primary:'#123456'})
|
|
22
|
+
const material=(group.children[0] as THREE.Mesh).material as THREE.MeshStandardMaterial
|
|
23
|
+
assert.equal(material.metalness,0.8);assert.equal(material.transparent,true);assert.equal(material.emissiveIntensity,2)
|
|
24
|
+
})
|
package/translations/en.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"figure.button.add-key": "add key",
|
|
5
5
|
"figure.button.add-parameter": "add parameter",
|
|
6
6
|
"figure.button.apply-fix": "apply fix · {part} {axis} face: {from} → {to}",
|
|
7
|
+
"figure.button.apply-recommended-fix": "apply recommended fix",
|
|
7
8
|
"figure.button.ask": "ask",
|
|
8
9
|
"figure.button.cancel": "cancel",
|
|
9
10
|
"figure.button.center-x": "centre X",
|
|
@@ -24,6 +25,8 @@
|
|
|
24
25
|
"figure.button.preview-fix": "preview fix · {part} {axis} face: {from} → {to}",
|
|
25
26
|
"figure.button.redo": "redo",
|
|
26
27
|
"figure.button.release-figure": "release",
|
|
28
|
+
"figure.button.restore-released-base": "restore the previous model width",
|
|
29
|
+
"figure.button.keep-changed-appearance": "publish with the adjusted width",
|
|
27
30
|
"figure.button.remove": "remove",
|
|
28
31
|
"figure.button.remove-part": "delete",
|
|
29
32
|
"figure.button.reset-view": "reset",
|
|
@@ -33,6 +36,8 @@
|
|
|
33
36
|
"figure.button.settle-on-floor": "settle on the floor",
|
|
34
37
|
"figure.button.snap": "snap",
|
|
35
38
|
"figure.button.take-n-changes": "apply {n}",
|
|
39
|
+
"figure.text.recommended-fix-explained": "{n} changes rechecked against every resize case. They apply to this draft only; review and save when ready.",
|
|
40
|
+
"figure.text.show-affected-parts": "show affected parts",
|
|
36
41
|
"figure.button.to-floor": "to floor",
|
|
37
42
|
"figure.button.undo": "undo",
|
|
38
43
|
"figure.label.accepts": "accepts",
|
|
@@ -372,6 +377,8 @@
|
|
|
372
377
|
"figure.text.more-segment-options": "advanced segment counts",
|
|
373
378
|
"figure.text.motion-intent-help": "pick the part to move, then what it is for. the motion it makes can be adjusted in the advanced editor below.",
|
|
374
379
|
"figure.text.must-fix-to-release": "fix these first",
|
|
380
|
+
"figure.text.choose-appearance-change": "choose how to handle the adjusted model width",
|
|
381
|
+
"figure.text.appearance-choice-explained": "Restore returns X and Z to the previous release while retaining Y and all other edits. Publishing with the adjusted width keeps the current model outline.",
|
|
375
382
|
"figure.text.n-of-limit": "{used} / {limit}",
|
|
376
383
|
"figure.text.n-parts-at-most": "up to {limit} parts",
|
|
377
384
|
"figure.text.n-triangles": "{count} triangles",
|
package/translations/ja.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"figure.button.add-key": "キーを追加",
|
|
5
5
|
"figure.button.add-parameter": "パラメーターを追加",
|
|
6
6
|
"figure.button.apply-fix": "修正を適用 · {part} {axis} 固定面: {from} → {to}",
|
|
7
|
+
"figure.button.apply-recommended-fix": "推奨修正を適用",
|
|
7
8
|
"figure.button.ask": "ask",
|
|
8
9
|
"figure.button.cancel": "キャンセル",
|
|
9
10
|
"figure.button.center-x": "centre X",
|
|
@@ -33,6 +34,8 @@
|
|
|
33
34
|
"figure.button.settle-on-floor": "床に置く",
|
|
34
35
|
"figure.button.snap": "snap",
|
|
35
36
|
"figure.button.take-n-changes": "apply {n}",
|
|
37
|
+
"figure.text.recommended-fix-explained": "すべてのサイズ変更ケースを再検査した {n} 件の修正です。下書きだけに適用され、保存前に確認できます。",
|
|
38
|
+
"figure.text.show-affected-parts": "影響する部品を見る",
|
|
36
39
|
"figure.button.to-floor": "to floor",
|
|
37
40
|
"figure.button.undo": "元に戻す",
|
|
38
41
|
"figure.label.accepts": "受け入れるもの",
|
package/translations/ko.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"figure.button.add-key": "키 추가",
|
|
5
5
|
"figure.button.add-parameter": "파라미터 추가",
|
|
6
6
|
"figure.button.apply-fix": "수정 적용 · {part} {axis} 고정 면: {from} → {to}",
|
|
7
|
+
"figure.button.apply-recommended-fix": "권장 수정 적용",
|
|
7
8
|
"figure.button.ask": "요청",
|
|
8
9
|
"figure.button.cancel": "취소",
|
|
9
10
|
"figure.button.center-x": "X 가운데",
|
|
@@ -24,6 +25,8 @@
|
|
|
24
25
|
"figure.button.preview-fix": "수정안 미리보기 · {part} {axis} 고정 면: {from} → {to}",
|
|
25
26
|
"figure.button.redo": "다시 실행",
|
|
26
27
|
"figure.button.release-figure": "발행하기",
|
|
28
|
+
"figure.button.restore-released-base": "이전 모델 폭으로 되돌리기",
|
|
29
|
+
"figure.button.keep-changed-appearance": "조정된 모델 폭으로 발행",
|
|
27
30
|
"figure.button.remove": "삭제",
|
|
28
31
|
"figure.button.remove-part": "삭제",
|
|
29
32
|
"figure.button.reset-view": "처음으로",
|
|
@@ -33,6 +36,8 @@
|
|
|
33
36
|
"figure.button.settle-on-floor": "바닥에 앉히기",
|
|
34
37
|
"figure.button.snap": "눈금에",
|
|
35
38
|
"figure.button.take-n-changes": "{n}개 적용",
|
|
39
|
+
"figure.text.recommended-fix-explained": "서버가 전체 크기 변경을 다시 검사한 {n}개 수정입니다. 초안에만 적용되며 저장 전 확인할 수 있습니다.",
|
|
40
|
+
"figure.text.show-affected-parts": "영향 받는 부품 보기",
|
|
36
41
|
"figure.button.to-floor": "바닥에",
|
|
37
42
|
"figure.button.undo": "실행 취소",
|
|
38
43
|
"figure.label.accepts": "받는 것",
|
|
@@ -372,6 +377,8 @@
|
|
|
372
377
|
"figure.text.more-segment-options": "고급 분할 수",
|
|
373
378
|
"figure.text.motion-intent-help": "움직일 부품을 고른 뒤 목적을 선택하세요. 만들어진 동작은 아래 고급 편집에서 조정할 수 있습니다.",
|
|
374
379
|
"figure.text.must-fix-to-release": "고쳐야 하는 것",
|
|
380
|
+
"figure.text.choose-appearance-change": "조정된 모델 폭의 처리 방식을 선택하세요",
|
|
381
|
+
"figure.text.appearance-choice-explained": "되돌리기는 X와 Z를 직전 발행값으로 바꾸고 Y와 나머지 편집은 유지합니다. 조정된 폭으로 발행하면 현재 모델 외곽을 유지합니다.",
|
|
375
382
|
"figure.text.n-of-limit": "{used} / {limit}",
|
|
376
383
|
"figure.text.n-parts-at-most": "부품 {limit}개까지",
|
|
377
384
|
"figure.text.n-triangles": "삼각형 {count}개",
|
package/translations/ms.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"figure.button.add-key": "tambah kunci",
|
|
5
5
|
"figure.button.add-parameter": "tambah parameter",
|
|
6
6
|
"figure.button.apply-fix": "guna pembetulan · {part} {axis} muka: {from} → {to}",
|
|
7
|
+
"figure.button.apply-recommended-fix": "guna pembetulan disyorkan",
|
|
7
8
|
"figure.button.ask": "ask",
|
|
8
9
|
"figure.button.cancel": "batal",
|
|
9
10
|
"figure.button.center-x": "centre X",
|
|
@@ -33,6 +34,8 @@
|
|
|
33
34
|
"figure.button.settle-on-floor": "letak di lantai",
|
|
34
35
|
"figure.button.snap": "snap",
|
|
35
36
|
"figure.button.take-n-changes": "apply {n}",
|
|
37
|
+
"figure.text.recommended-fix-explained": "{n} pembetulan telah diperiksa semula untuk semua keadaan saiz. Ia hanya digunakan pada draf ini; semak dan simpan apabila sedia.",
|
|
38
|
+
"figure.text.show-affected-parts": "tunjukkan bahagian terjejas",
|
|
36
39
|
"figure.button.to-floor": "to floor",
|
|
37
40
|
"figure.button.undo": "Nyahbuat",
|
|
38
41
|
"figure.label.accepts": "diterima",
|
package/translations/zh.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"figure.button.add-key": "添加关键帧",
|
|
5
5
|
"figure.button.add-parameter": "添加参数",
|
|
6
6
|
"figure.button.apply-fix": "应用修正 · {part} {axis} 固定面: {from} → {to}",
|
|
7
|
+
"figure.button.apply-recommended-fix": "应用推荐修正",
|
|
7
8
|
"figure.button.ask": "ask",
|
|
8
9
|
"figure.button.cancel": "取消",
|
|
9
10
|
"figure.button.center-x": "centre X",
|
|
@@ -33,6 +34,8 @@
|
|
|
33
34
|
"figure.button.settle-on-floor": "落到地面",
|
|
34
35
|
"figure.button.snap": "snap",
|
|
35
36
|
"figure.button.take-n-changes": "apply {n}",
|
|
37
|
+
"figure.text.recommended-fix-explained": "已针对所有尺寸变化情况重新检查的 {n} 项修正。它们只应用到草稿;请确认后再保存。",
|
|
38
|
+
"figure.text.show-affected-parts": "查看受影响部件",
|
|
36
39
|
"figure.button.to-floor": "to floor",
|
|
37
40
|
"figure.button.undo": "撤销",
|
|
38
41
|
"figure.label.accepts": "接受的类型",
|