@things-factory/figure-ui 10.1.117 → 10.1.121
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 +1 -0
- package/client/modeller/figure-first-save.ts +1 -1
- package/client/modeller/figure-history-panel.ts +21 -0
- package/client/modeller/first-save.ts +6 -6
- package/client/pages/figure-list-page.ts +3 -1
- package/client/pages/figure-modeller-page.ts +5 -2
- package/client/types.ts +2 -0
- package/dist-client/graphql/index.js +1 -0
- package/dist-client/graphql/index.js.map +1 -1
- package/dist-client/modeller/figure-first-save.js +1 -1
- package/dist-client/modeller/figure-first-save.js.map +1 -1
- package/dist-client/modeller/figure-history-panel.d.ts +4 -0
- package/dist-client/modeller/figure-history-panel.js +23 -0
- package/dist-client/modeller/figure-history-panel.js.map +1 -1
- package/dist-client/modeller/first-save.d.ts +2 -2
- package/dist-client/modeller/first-save.js +6 -6
- package/dist-client/modeller/first-save.js.map +1 -1
- package/dist-client/pages/figure-list-page.js +2 -1
- package/dist-client/pages/figure-list-page.js.map +1 -1
- package/dist-client/pages/figure-modeller-page.js +4 -1
- package/dist-client/pages/figure-modeller-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/types.d.ts +2 -0
- package/dist-client/types.js.map +1 -1
- package/docs/product-cutover.md +7 -7
- package/package.json +6 -6
- package/test/first-save-suggest.test.ts +5 -5
- package/test/first-save.test.ts +15 -13
- package/test/package-download.test.ts +16 -0
- package/translations/en.json +2 -1
- package/translations/ja.json +2 -1
- package/translations/ko.json +2 -1
- package/translations/ms.json +2 -1
- package/translations/zh.json +2 -1
package/dist-client/types.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export interface Figure {
|
|
|
6
6
|
id: string;
|
|
7
7
|
/** 컴포넌트 타입 이름. **만든 뒤에 고칠 수 없다.** */
|
|
8
8
|
type: string;
|
|
9
|
+
/** Namespace of the full name {namespace}/{type} (ADR-0114). */
|
|
10
|
+
namespace?: string | null;
|
|
9
11
|
name: string;
|
|
10
12
|
description?: string;
|
|
11
13
|
/** 분류 하나 — 팔레트에서 묶어 보이는 기준. */
|
package/dist-client/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../client/types.ts"],"names":[],"mappings":"AAAA;;GAEG","sourcesContent":["/**\n * 화면이 다루는 모양. 도형 자산의 타입은 `@hatiolab/figure-model` 이 정한다 — 여기서 다시 적지 않는다.\n */\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 /** 도형 자산 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 * `FigureFinding` 과 달리 **`blocking` 이 있다.** 저장 쪽 발견은 정의상 막지 않는 것들이고,\n * 발행 판정은 막는 것과 알리는 것을 함께 내므로 어느 쪽인지를 값이 스스로 말한다 — 코드를 보고\n * 화면이 다시 분류하면 규칙이 두 벌이 된다.\n */\nexport interface FigureGateFinding {\n code: string\n message: string\n /** 왜 그것이 문제인가 — 사람이 무엇을 보게 되나. */\n why?: string\n /** 무엇을 바꾸면 되나 — 부품 이름과 값으로. */\n how?: string\n /** 갈라진 부품 이름들, 또는 정본 안의 경로. */\n at?: string\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":"AAAA;;GAEG","sourcesContent":["/**\n * 화면이 다루는 모양. 도형 자산의 타입은 `@hatiolab/figure-model` 이 정한다 — 여기서 다시 적지 않는다.\n */\n\n/** 서버가 돌려주는 Figure 한 벌. `source` 는 상세 또는 저작면을 열 때만 받는다. */\nexport interface Figure {\n id: string\n /** 컴포넌트 타입 이름. **만든 뒤에 고칠 수 없다.** */\n type: string\n /** Namespace of the full name {namespace}/{type} (ADR-0114). */\n namespace?: string | null\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 /** 도형 자산 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 * `FigureFinding` 과 달리 **`blocking` 이 있다.** 저장 쪽 발견은 정의상 막지 않는 것들이고,\n * 발행 판정은 막는 것과 알리는 것을 함께 내므로 어느 쪽인지를 값이 스스로 말한다 — 코드를 보고\n * 화면이 다시 분류하면 규칙이 두 벌이 된다.\n */\nexport interface FigureGateFinding {\n code: string\n message: string\n /** 왜 그것이 문제인가 — 사람이 무엇을 보게 되나. */\n why?: string\n /** 무엇을 바꾸면 되나 — 부품 이름과 값으로. */\n how?: string\n /** 갈라진 부품 이름들, 또는 정본 안의 경로. */\n at?: string\n blocking: boolean\n}\n\n/** 발행해도 되나. `blocked` 면 서버가 거절한다. */\nexport interface FigureInspection {\n blocked: boolean\n findings: FigureGateFinding[]\n}\n"]}
|
package/docs/product-cutover.md
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Figure 제품 현황
|
|
2
2
|
|
|
3
|
-
형식은
|
|
3
|
+
형식은 `figure-asset-1` 하나다. 옛 형식 V1·V2는 2026-09-26 코드와 명세에서 제거했다.
|
|
4
4
|
|
|
5
5
|
## 제품 코드
|
|
6
6
|
|
|
7
7
|
- `client/modeller/product-session.ts`: 모델 ID·로드·저장 경계를 workspace에 연결한다. 다른 모델의 지연 응답을 버리며 로드 실패 시 이전 형상을 노출하지 않는다. UI/AI는 같은 리비전과 undo/redo를 사용한다. AI 편집은 요청 당시 context/revision을 필수로 받는다.
|
|
8
|
-
- `client/modeller/canvas.ts`: things-scene 편집 모드의 판 위에 평가된
|
|
8
|
+
- `client/modeller/canvas.ts`: things-scene 편집 모드의 판 위에 평가된 Figure 형상을 부품마다 `figure-part` 컴포넌트로 세운다. 새 문맥에서 렌더링이 실패하면 이전 모델을 지운다.
|
|
9
9
|
- `client/modeller/editor.ts`: 부품 목록 · 캔버스 · 오른쪽 탭(속성 · 능력 · 움직임 · 판정 · 환경 · 이력). 실행 취소/다시 실행과 저장 연결.
|
|
10
10
|
- `client/graphql/store.ts`: 정본을 그대로 `saveFigure`로 보낸다.
|
|
11
|
-
- figure-service의 `saveFigure`: 도메인 권한 검사,
|
|
12
|
-
- `client/pages/figure-modeller-page.ts`: 위 요소를 묶는 페이지. `route.ts`의 `figure-modeller
|
|
11
|
+
- figure-service의 `saveFigure`: 도메인 권한 검사, 자산 검증, 정확한 이전 정본을 조건으로 하는 atomic UPDATE, 생성 요청 ID를 이용한 재시도. SQLite에서 지원하지 않는 행 잠금은 사용하지 않는다. 재지 않은 성능 점수/삼각형 수는 null로 둔다. 실제 운영 DB 저장 테스트는 아직 하지 않았다.
|
|
12
|
+
- `client/pages/figure-modeller-page.ts`: 위 요소를 묶는 페이지. `route.ts`의 `figure-modeller`가 이 페이지를 연다.
|
|
13
13
|
|
|
14
14
|
## 남은 항목
|
|
15
15
|
|
|
16
|
-
1. operato-figure의 AI-dock과 figure-service 도구/제안 생성기를
|
|
17
|
-
2. 발행 게이트, 썸네일, 카탈로그/배치 소비처가
|
|
16
|
+
1. operato-figure의 AI-dock과 figure-service 도구/제안 생성기를 Figure 정본 및 승인된 트랜잭션 계약으로 연결한다. 페이지 이벤트만 추가한 것은 AI 통합 완료가 아니다.
|
|
17
|
+
2. 발행 게이트, 썸네일, 카탈로그/배치 소비처가 Figure 평가 결과를 사용하는지 확인한다.
|
|
18
18
|
|
|
19
19
|
## 검증
|
|
20
20
|
|
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.121",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"@things-factory:registry": "https://registry.npmjs.org"
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"clean": "npm run clean:server && npm run clean:client"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@hatiolab/figure-model": "^0.
|
|
31
|
-
"@hatiolab/things-scene": "^10.1.
|
|
30
|
+
"@hatiolab/figure-model": "^0.4.0",
|
|
31
|
+
"@hatiolab/things-scene": "^10.1.74",
|
|
32
32
|
"@material/web": "^2.0.0",
|
|
33
33
|
"@operato/data-grist": "^10.0.0",
|
|
34
34
|
"@operato/graphql": "^10.0.0",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"@operato/shell": "^10.0.0",
|
|
41
41
|
"@operato/styles": "^10.0.0",
|
|
42
42
|
"@operato/utils": "^10.0.0",
|
|
43
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
44
|
-
"@things-factory/figure-service": "^10.1.
|
|
43
|
+
"@things-factory/ai-assistant": "^10.1.121",
|
|
44
|
+
"@things-factory/figure-service": "^10.1.121",
|
|
45
45
|
"three": "^0.185.1"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "23536a73b10f103048a2c893d3960b2a4e0f03dd"
|
|
48
48
|
}
|
|
@@ -13,18 +13,18 @@ import { suggestTypeOf, releasableType } from '../client/modeller/first-save.js'
|
|
|
13
13
|
const read = (path: string) => readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8')
|
|
14
14
|
|
|
15
15
|
test('an identifier is offered for any name: plain letters as they are, anything else a prefix and a random part', () => {
|
|
16
|
-
assert.equal(suggestTypeOf('Lift table', []), '
|
|
17
|
-
assert.equal(suggestTypeOf('roller-conveyor 2', []), '
|
|
16
|
+
assert.equal(suggestTypeOf('Lift table', []), 'lift-table')
|
|
17
|
+
assert.equal(suggestTypeOf('roller-conveyor 2', []), 'roller-conveyor-2')
|
|
18
18
|
for (const name of ['리프트 테이블', '새 Figure', '', '___', '2층 선반']) {
|
|
19
19
|
const made = suggestTypeOf(name, [])
|
|
20
|
-
assert.match(made, /^
|
|
20
|
+
assert.match(made, /^fig-[0-9a-z]{6}$/, name)
|
|
21
21
|
assert.ok(releasableType(made) && TYPE_PATTERN.test(made) && made.length >= TYPE_LENGTH.min && !isPlaceholderType(made))
|
|
22
22
|
}
|
|
23
23
|
/* Never one already used: a taken name falls back, a taken random part is drawn again. */
|
|
24
|
-
assert.match(suggestTypeOf('Lift table', ['
|
|
24
|
+
assert.match(suggestTypeOf('Lift table', ['lift-table']), /^fig-/)
|
|
25
25
|
let n = 0
|
|
26
26
|
const draws = [0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
|
|
27
|
-
assert.equal(suggestTypeOf('선반', ['
|
|
27
|
+
assert.equal(suggestTypeOf('선반', ['fig-000000'], () => draws[n++ % draws.length]!), 'fig-iiiiii')
|
|
28
28
|
})
|
|
29
29
|
|
|
30
30
|
test('the first save asks the name first; the identifier offered stays through retries, and renaming does not change it', () => {
|
package/test/first-save.test.ts
CHANGED
|
@@ -8,23 +8,25 @@ import { placeholderType } from '@hatiolab/figure-model'
|
|
|
8
8
|
import { firstSaveRefusalOf, releasableType, typeOf } from '../client/modeller/first-save.ts'
|
|
9
9
|
import { createFigureProductSession, type FigureProductStore } from '../client/modeller/product-session.ts'
|
|
10
10
|
|
|
11
|
-
test('치는 대로 타입의 모양이 된다 —
|
|
12
|
-
assert.equal(typeOf(' agv lifter '), '
|
|
13
|
-
assert.equal(typeOf('
|
|
11
|
+
test('치는 대로 타입의 모양이 된다 — 소문자 · 숫자 · 하이픈 하나', () => {
|
|
12
|
+
assert.equal(typeOf(' agv lifter '), 'agv-lifter')
|
|
13
|
+
assert.equal(typeOf('OHT_2'), 'oht-2')
|
|
14
|
+
assert.equal(typeOf('-Roller Conveyor-'), 'roller-conveyor')
|
|
14
15
|
})
|
|
15
16
|
|
|
16
17
|
test('발행할 수 없는 이름은 미리 말한다 — 임시 이름 · 형식 · 길이', () => {
|
|
17
|
-
assert.equal(releasableType('
|
|
18
|
+
assert.equal(releasableType('agv-lifter'), true)
|
|
18
19
|
assert.equal(releasableType(placeholderType()), false, '서버가 붙이는 임시 이름')
|
|
19
|
-
assert.equal(releasableType('
|
|
20
|
-
assert.equal(releasableType('
|
|
21
|
-
assert.equal(releasableType('
|
|
20
|
+
assert.equal(releasableType('a'), false, '2 자 미만')
|
|
21
|
+
assert.equal(releasableType('a--b'), false, '하이픈 둘')
|
|
22
|
+
assert.equal(releasableType('-oht'), false)
|
|
23
|
+
assert.equal(releasableType('AGV_LIFTER'), false, '대문자 · 밑줄')
|
|
22
24
|
})
|
|
23
25
|
|
|
24
26
|
test('비었거나 이미 쓰는 이름이면 저장하지 않는다', () => {
|
|
25
|
-
assert.deepEqual(firstSaveRefusalOf('', ['
|
|
26
|
-
assert.deepEqual(firstSaveRefusalOf('
|
|
27
|
-
assert.equal(firstSaveRefusalOf('
|
|
27
|
+
assert.deepEqual(firstSaveRefusalOf('', ['oht']), { key: 'figure.text.enter-a-type-name' })
|
|
28
|
+
assert.deepEqual(firstSaveRefusalOf('oht', ['oht']), { key: 'figure.text.type-name-already-taken', type: 'oht' })
|
|
29
|
+
assert.equal(firstSaveRefusalOf('agv', ['oht']), null)
|
|
28
30
|
})
|
|
29
31
|
|
|
30
32
|
/** A store that remembers what it was asked. */
|
|
@@ -46,12 +48,12 @@ test('타입은 새 도형을 만드는 저장에만 실린다 — 이미 있는
|
|
|
46
48
|
const { store, requests } = recording()
|
|
47
49
|
const session = createFigureProductSession(store)
|
|
48
50
|
session.startNew()
|
|
49
|
-
await session.save({ type: '
|
|
50
|
-
assert.equal(requests[0]!.type, '
|
|
51
|
+
await session.save({ type: 'agv-lifter' })
|
|
52
|
+
assert.equal(requests[0]!.type, 'agv-lifter')
|
|
51
53
|
assert.equal(requests[0]!.id, undefined, '만드는 저장')
|
|
52
54
|
|
|
53
55
|
session.command({ kind: 'rename', name: '리프터' })
|
|
54
|
-
await session.save({ type: '
|
|
56
|
+
await session.save({ type: 'other' })
|
|
55
57
|
assert.equal(requests[1]!.id, 'new-id')
|
|
56
58
|
assert.equal('type' in requests[1]!, false, '있는 도형에는 보내지 않는다')
|
|
57
59
|
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A released version downloads as a package by its release reference {namespace}/{type}@{version} (ADR-0114).
|
|
3
|
+
*/
|
|
4
|
+
import { test } from 'node:test'
|
|
5
|
+
import assert from 'node:assert/strict'
|
|
6
|
+
import { readFileSync } from 'node:fs'
|
|
7
|
+
|
|
8
|
+
const panel = readFileSync(new URL('../client/modeller/figure-history-panel.ts', import.meta.url), 'utf8')
|
|
9
|
+
|
|
10
|
+
test('each released version links to the package door by its full reference, only once the figure has a full name', () => {
|
|
11
|
+
const href = panel.slice(panel.indexOf('private packageHref'), panel.indexOf('private renderVersion'))
|
|
12
|
+
assert.match(href, /if \(!this\.figureNamespace \|\| !this\.figureType\) return undefined/)
|
|
13
|
+
assert.match(href, /`\$\{contextPath\}\/figure-package\?refs=\$\{encodeURIComponent\(`\$\{this\.figureNamespace\}\/\$\{this\.figureType\}@\$\{version\}`\)\}`/)
|
|
14
|
+
const row = panel.slice(panel.indexOf('private renderVersion'), panel.indexOf('private renderKept'))
|
|
15
|
+
assert.match(row, /<a package download href=/)
|
|
16
|
+
})
|
package/translations/en.json
CHANGED
|
@@ -983,5 +983,6 @@
|
|
|
983
983
|
"figure.text.detail-no-motion": "No motion is defined.",
|
|
984
984
|
"figure.text.detail-playing": "Playing",
|
|
985
985
|
"figure.label.detail-summary": "Drawing cost of the selected model",
|
|
986
|
-
"figure.text.detail-paused": "Paused"
|
|
986
|
+
"figure.text.detail-paused": "Paused",
|
|
987
|
+
"figure.button.download-package": "download package"
|
|
987
988
|
}
|
package/translations/ja.json
CHANGED
|
@@ -983,5 +983,6 @@
|
|
|
983
983
|
"figure.text.detail-no-motion": "登録された動きがありません。",
|
|
984
984
|
"figure.text.detail-playing": "再生中",
|
|
985
985
|
"figure.label.detail-summary": "選択したモデルの描画コスト",
|
|
986
|
-
"figure.text.detail-paused": "一時停止"
|
|
986
|
+
"figure.text.detail-paused": "一時停止",
|
|
987
|
+
"figure.button.download-package": "パッケージをダウンロード"
|
|
987
988
|
}
|
package/translations/ko.json
CHANGED
|
@@ -983,5 +983,6 @@
|
|
|
983
983
|
"figure.text.detail-no-motion": "등록된 움직임이 없습니다.",
|
|
984
984
|
"figure.text.detail-playing": "재생 중",
|
|
985
985
|
"figure.label.detail-summary": "선택한 모델의 그리기 비용",
|
|
986
|
-
"figure.text.detail-paused": "일시정지"
|
|
986
|
+
"figure.text.detail-paused": "일시정지",
|
|
987
|
+
"figure.button.download-package": "꾸러미 내려받기"
|
|
987
988
|
}
|
package/translations/ms.json
CHANGED
|
@@ -983,5 +983,6 @@
|
|
|
983
983
|
"figure.text.detail-no-motion": "Tiada gerakan didaftarkan.",
|
|
984
984
|
"figure.text.detail-playing": "Sedang dimainkan",
|
|
985
985
|
"figure.label.detail-summary": "Kos lukisan model yang dipilih",
|
|
986
|
-
"figure.text.detail-paused": "Dijeda"
|
|
986
|
+
"figure.text.detail-paused": "Dijeda",
|
|
987
|
+
"figure.button.download-package": "muat turun pakej"
|
|
987
988
|
}
|
package/translations/zh.json
CHANGED
|
@@ -983,5 +983,6 @@
|
|
|
983
983
|
"figure.text.detail-no-motion": "没有已注册的动作。",
|
|
984
984
|
"figure.text.detail-playing": "播放中",
|
|
985
985
|
"figure.label.detail-summary": "所选模型的绘制成本",
|
|
986
|
-
"figure.text.detail-paused": "已暂停"
|
|
986
|
+
"figure.text.detail-paused": "已暂停",
|
|
987
|
+
"figure.button.download-package": "下载包"
|
|
987
988
|
}
|