@things-factory/figure-service 10.1.156 → 10.1.159
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/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +2 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/figure/figure-format.js +94 -0
- package/dist-server/service/figure/figure-format.js.map +1 -1
- package/dist-server/service/figure/figure-namespace.d.ts +4 -2
- package/dist-server/service/figure/figure-namespace.js +6 -3
- package/dist-server/service/figure/figure-namespace.js.map +1 -1
- package/dist-server/service/figure/figure-subject.d.ts +12 -0
- package/dist-server/service/figure/figure-subject.js +24 -0
- package/dist-server/service/figure/figure-subject.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/server/index.ts +2 -0
- package/server/service/figure/figure-format.ts +94 -0
- package/server/service/figure/figure-namespace-db.test.ts +16 -6
- package/server/service/figure/figure-namespace.ts +6 -3
- package/server/service/figure/figure-subject.test.ts +41 -0
- package/server/service/figure/figure-subject.ts +21 -0
- package/translations/en.json +35 -1
- package/translations/es.json +35 -1
- package/translations/ja.json +35 -1
- package/translations/ko.json +35 -1
- package/translations/ms.json +35 -1
- package/translations/zh.json +35 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/figure-service",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.159",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"@things-factory:registry": "https://registry.npmjs.org"
|
|
@@ -25,18 +25,18 @@
|
|
|
25
25
|
"test:templates": "node --test scripts/templates.test.mts"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@hatiolab/figure-model": "^0.6.
|
|
28
|
+
"@hatiolab/figure-model": "^0.6.5",
|
|
29
29
|
"@operato/typeorm-history": "^10.0.0",
|
|
30
|
-
"@things-factory/ai-client-base": "^10.1.
|
|
31
|
-
"@things-factory/attachment-base": "^10.1.
|
|
32
|
-
"@things-factory/auth-base": "^10.1.
|
|
30
|
+
"@things-factory/ai-client-base": "^10.1.159",
|
|
31
|
+
"@things-factory/attachment-base": "^10.1.159",
|
|
32
|
+
"@things-factory/auth-base": "^10.1.159",
|
|
33
33
|
"@things-factory/env": "^10.1.149",
|
|
34
|
-
"@things-factory/setting-base": "^10.1.
|
|
35
|
-
"@things-factory/shell": "^10.1.
|
|
34
|
+
"@things-factory/setting-base": "^10.1.159",
|
|
35
|
+
"@things-factory/shell": "^10.1.157",
|
|
36
36
|
"graphql-scalars": "^1.22.4",
|
|
37
37
|
"graphql-upload": "^15.0.2",
|
|
38
38
|
"jszip": "^3.10.1",
|
|
39
39
|
"koa-router": "^7.4.0"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "fc15cdcb18e562ca1e723a1e1bf042f9582cbbfb"
|
|
42
42
|
}
|
package/server/index.ts
CHANGED
|
@@ -9,6 +9,8 @@ import './routes.js'
|
|
|
9
9
|
*/
|
|
10
10
|
import { registerFigureToolCategories } from './service/figure/figure-tools.js'
|
|
11
11
|
registerFigureToolCategories()
|
|
12
|
+
/* The figure the modeller has open, said to the AI each turn (design/ai/screen-pattern.md §2-1). */
|
|
13
|
+
import './service/figure/figure-subject.js'
|
|
12
14
|
|
|
13
15
|
/*
|
|
14
16
|
* The recipe templates are read once at start (ADR-0095, amended): what was served, and any file whose form is wrong,
|
|
@@ -424,6 +424,23 @@ function figureContractWording(change: FigureContractChange, say: Say): Pick<Gat
|
|
|
424
424
|
message: say(key('message'), v, `The place '${v.binding}' is new.`),
|
|
425
425
|
why: say(key('why'), {}, 'Placed instances do not know it yet and stand as they are.')
|
|
426
426
|
}
|
|
427
|
+
/* Slots a slot layout unfolds into, and the anchors they stand on (ADR-0051 §4.1, the old ADR-0118 decision 6). */
|
|
428
|
+
case 'slot-moved':
|
|
429
|
+
return {
|
|
430
|
+
message: say(key('message'), v, `The slot '${v.binding}' is somewhere else on its anchor.`),
|
|
431
|
+
why: say(key('why'), {}, 'What sits in it moves with it. Data that names the slot by its address now means the new place.')
|
|
432
|
+
}
|
|
433
|
+
case 'slot-anchor-gone':
|
|
434
|
+
return {
|
|
435
|
+
message: say(key('message'), v, `The anchor '${v.anchor}' that slots stand on is gone.`),
|
|
436
|
+
why: say(key('why'), {}, 'A placement that lays its own slots on this anchor holds nothing after this release.'),
|
|
437
|
+
...gone
|
|
438
|
+
}
|
|
439
|
+
case 'slot-anchor-moved':
|
|
440
|
+
return {
|
|
441
|
+
message: say(key('message'), v, `The anchor '${v.anchor}' moved from the ${v.before} face to the ${v.after} face.`),
|
|
442
|
+
why: say(key('why'), {}, 'Every slot on it, and what sits there, stands on the new face after this release.')
|
|
443
|
+
}
|
|
427
444
|
case 'capability-gone':
|
|
428
445
|
return {
|
|
429
446
|
message: say(key('message'), v, `The capability '${v.name}' is gone.`),
|
|
@@ -484,6 +501,83 @@ function figureContractWording(change: FigureContractChange, say: Say): Pick<Gat
|
|
|
484
501
|
message: say(key('message'), v, `The figure is now carrier type ${v.type}.`),
|
|
485
502
|
why: say(key('why'), {}, 'Live data with this code finds this figure once the type map takes this release.')
|
|
486
503
|
}
|
|
504
|
+
/* What a consumer's data mapping and a board's motion selection lean on (ADR-0051 §2.2, §3.2). */
|
|
505
|
+
case 'data-property-gone':
|
|
506
|
+
return {
|
|
507
|
+
message: say(key('message'), v, `The data property '${v.id}' is gone.`),
|
|
508
|
+
why: say(key('why'), {}, 'Boards map their data onto this id. After this release that data moves nothing.'),
|
|
509
|
+
...gone
|
|
510
|
+
}
|
|
511
|
+
case 'data-property-kind-changed':
|
|
512
|
+
return {
|
|
513
|
+
message: say(key('message'), v, `The data property '${v.id}' changed from ${v.before} to ${v.after}.`),
|
|
514
|
+
why: say(key('why'), {}, 'Mapped data was written for the old kind or unit. After this release the same data is refused or means something else.'),
|
|
515
|
+
...gone
|
|
516
|
+
}
|
|
517
|
+
case 'data-property-narrowed':
|
|
518
|
+
return {
|
|
519
|
+
message: say(key('message'), v, `The data property '${v.id}' takes less: ${v.before} → ${v.after}.`),
|
|
520
|
+
why: say(key('why'), {}, 'Data with a value it no longer takes is refused whole, and the figure keeps what it showed.'),
|
|
521
|
+
...gone
|
|
522
|
+
}
|
|
523
|
+
case 'data-property-added':
|
|
524
|
+
return {
|
|
525
|
+
message: say(key('message'), v, `The data property '${v.id}' is new.`),
|
|
526
|
+
why: say(key('why'), {}, 'Until a board maps data onto it, it stands at its default.')
|
|
527
|
+
}
|
|
528
|
+
case 'data-property-label-changed':
|
|
529
|
+
return {
|
|
530
|
+
message: say(key('message'), v, `The data property '${v.id}' is now called '${v.after}'.`),
|
|
531
|
+
why: say(key('why'), {}, 'Mappings name the id, so they keep working.')
|
|
532
|
+
}
|
|
533
|
+
case 'data-property-default-changed':
|
|
534
|
+
return {
|
|
535
|
+
message: say(key('message'), v, `The default of the data property '${v.id}' changed from ${v.before} to ${v.after}.`),
|
|
536
|
+
why: say(key('why'), {}, 'A placed figure with no data or saved value for it stands differently after this release.')
|
|
537
|
+
}
|
|
538
|
+
case 'data-connections-changed':
|
|
539
|
+
return {
|
|
540
|
+
message: say(key('message'), v, 'What the data properties move changed.'),
|
|
541
|
+
why: say(key('why'), {}, 'The same data gives another pose, colour or clip after this release.')
|
|
542
|
+
}
|
|
543
|
+
case 'motion-group-gone':
|
|
544
|
+
return {
|
|
545
|
+
message: say(key('message'), v, `The motion group '${v.group}' is gone.`),
|
|
546
|
+
why: say(key('why'), {}, 'Boards and data choose its clip by this id. After this release that choice does nothing.'),
|
|
547
|
+
...gone
|
|
548
|
+
}
|
|
549
|
+
case 'motion-group-clip-removed':
|
|
550
|
+
return {
|
|
551
|
+
message: say(key('message'), v, `The motion group '${v.group}' no longer holds '${v.clip}'.`),
|
|
552
|
+
why: say(key('why'), {}, 'A board or data that chooses this clip in the group is refused after this release.'),
|
|
553
|
+
...gone
|
|
554
|
+
}
|
|
555
|
+
case 'motion-clip-group-changed':
|
|
556
|
+
return {
|
|
557
|
+
message: say(key('message'), v, `The clip '${v.clip}' played on its own and is now in the motion group '${v.group}'.`),
|
|
558
|
+
why: say(key('why'), {}, "Boards played it by its own speed. After this release it plays only when the group's choice is this clip."),
|
|
559
|
+
...gone
|
|
560
|
+
}
|
|
561
|
+
case 'motion-group-added':
|
|
562
|
+
return {
|
|
563
|
+
message: say(key('message'), v, `The motion group '${v.group}' is new.`),
|
|
564
|
+
why: say(key('why'), {}, 'Placed instances play its default clip until a board or data chooses another.')
|
|
565
|
+
}
|
|
566
|
+
case 'motion-group-clip-added':
|
|
567
|
+
return {
|
|
568
|
+
message: say(key('message'), v, `The motion group '${v.group}' now holds '${v.clip}'.`),
|
|
569
|
+
why: say(key('why'), {}, 'It plays when a board or data chooses it.')
|
|
570
|
+
}
|
|
571
|
+
case 'motion-group-default-changed':
|
|
572
|
+
return {
|
|
573
|
+
message: say(key('message'), v, `The motion group '${v.group}' now starts with '${v.after}', not '${v.before}'.`),
|
|
574
|
+
why: say(key('why'), {}, 'Placed instances with no choice of their own play the new default after this release.')
|
|
575
|
+
}
|
|
576
|
+
case 'motion-group-transition-changed':
|
|
577
|
+
return {
|
|
578
|
+
message: say(key('message'), v, `A change of clip in '${v.group}' now blends over ${v.after} s, not ${v.before} s.`),
|
|
579
|
+
why: say(key('why'), {}, 'Only how a change of clip looks changes; which clip plays does not.')
|
|
580
|
+
}
|
|
487
581
|
/* The joints a controller drives (ADR-0107 decision 7): what writing a state input moves, compared release to release. */
|
|
488
582
|
case 'state-input-joints-changed': {
|
|
489
583
|
const after = v.after || say('figure.gate.contract.joints-none', {}, 'nothing')
|
|
@@ -90,15 +90,25 @@ describe('the namespace a figure is created under', () => {
|
|
|
90
90
|
expect(figure.type).toBe('conveyor')
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
-
it('
|
|
94
|
-
for (const value of [null, '
|
|
95
|
-
const { context } = await domainWith(value)
|
|
96
|
-
await
|
|
97
|
-
|
|
98
|
-
).rejects.toMatchObject({ code: 'figure-namespace-missing' })
|
|
93
|
+
it('with no setting, or an empty one, is the subdomain', async () => {
|
|
94
|
+
for (const value of [null, '', ' ']) {
|
|
95
|
+
const { domain, context } = await domainWith(value)
|
|
96
|
+
const figure = await new FigureMutation().saveFigure(releasable(), context, undefined, undefined, creationId(), undefined, 'conveyor')
|
|
97
|
+
expect(figure.namespace).toBe(domain.subdomain)
|
|
99
98
|
}
|
|
100
99
|
})
|
|
101
100
|
|
|
101
|
+
it('is refused by name when the setting is not a namespace, or there is none and the subdomain is not one either', async () => {
|
|
102
|
+
const { context } = await domainWith('Hatiolab.COM')
|
|
103
|
+
await expect(
|
|
104
|
+
new FigureMutation().saveFigure(releasable(), context, undefined, undefined, creationId(), undefined, 'conveyor')
|
|
105
|
+
).rejects.toMatchObject({ code: 'figure-namespace-missing' })
|
|
106
|
+
const odd = await dataSource!.getRepository(shell.Domain).save({ name: `odd-${++seq}`, subdomain: 'Odd_Sub' })
|
|
107
|
+
await expect(
|
|
108
|
+
new FigureMutation().saveFigure(releasable(), { state: { domain: odd, user: undefined, tx: dataSource!.manager } }, undefined, undefined, creationId(), undefined, 'conveyor')
|
|
109
|
+
).rejects.toMatchObject({ code: 'figure-namespace-missing' })
|
|
110
|
+
})
|
|
111
|
+
|
|
102
112
|
it('cannot change: a new figure or a release is refused while the setting disagrees with the figures already made', async () => {
|
|
103
113
|
const { domain, context } = await domainWith('hatiolab.com')
|
|
104
114
|
const draft = await new FigureMutation().saveFigure(releasable(), context, undefined, undefined, creationId(), undefined, 'conveyor')
|
|
@@ -13,14 +13,17 @@ export const FIGURE_NAMESPACE_SETTING = 'figure-namespace'
|
|
|
13
13
|
* The namespace a new figure is created under.
|
|
14
14
|
*
|
|
15
15
|
* It is read from the domain setting and copied onto the figure, so the full name `{namespace}/{type}` a board stores
|
|
16
|
-
* never moves.
|
|
17
|
-
*
|
|
16
|
+
* never moves. A domain with no setting, or an empty one, takes its subdomain (user, 2026-10-13: 「기본적으로는
|
|
17
|
+
* subdomain 명을 사용하면 되는데」) -- refused only when the subdomain is not a namespace either. A value written in
|
|
18
|
+
* the setting is used as it is, and refused when it is not a namespace. Either way it is set once: a value that differs
|
|
19
|
+
* from the namespace this domain's figures already carry is refused, so editing the setting cannot rename anything.
|
|
18
20
|
*/
|
|
19
21
|
export async function namespaceForNewFigure(tx: EntityManager, domain: Domain): Promise<string> {
|
|
20
22
|
const setting = await tx.getRepository(Setting).findOne({
|
|
21
23
|
where: { domain: { id: domain.id }, name: FIGURE_NAMESPACE_SETTING }
|
|
22
24
|
})
|
|
23
|
-
const
|
|
25
|
+
const written = setting?.value?.trim() ?? ''
|
|
26
|
+
const namespace = written || (domain.subdomain ?? '').trim()
|
|
24
27
|
if (!isFigureNamespace(namespace)) {
|
|
25
28
|
throw new Refusal(
|
|
26
29
|
'figure-namespace-missing',
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The modeller's open figure, named for the AI (operato-application design/ai/screen-pattern.md §2-1).
|
|
3
|
+
*/
|
|
4
|
+
const mockFigures: any[] = [
|
|
5
|
+
{ id: 'f1', domain: 'plant-a', name: '선풍기', type: 'system/fan' },
|
|
6
|
+
{ id: 'f2', domain: 'plant-a', name: '', type: 'system/agv-lift' },
|
|
7
|
+
{ id: 'f3', domain: 'plant-b', name: '남의 도형', type: 'other/one' }
|
|
8
|
+
]
|
|
9
|
+
const mockRegistered: any[] = []
|
|
10
|
+
|
|
11
|
+
jest.mock('@things-factory/shell', () => ({
|
|
12
|
+
getRepository: (name: string) => {
|
|
13
|
+
if (name !== 'Figure') throw new Error(`unexpected repository ${name}`)
|
|
14
|
+
return {
|
|
15
|
+
findOne: async ({ where }: any) => mockFigures.find(one => one.id === where.id && one.domain === where.domain.id) ?? null
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}))
|
|
19
|
+
jest.mock('@things-factory/ai-client-base', () => ({ registerAssistantSubject: (one: any) => mockRegistered.push(one) }))
|
|
20
|
+
|
|
21
|
+
/* Required after the mocks hold their lists - an import would load it before them. */
|
|
22
|
+
const { figureSubject } = require('./figure-subject')
|
|
23
|
+
|
|
24
|
+
describe('the figure the modeller has open', () => {
|
|
25
|
+
it('★ is registered for the figure anchor when the package loads', () => {
|
|
26
|
+
expect(mockRegistered).toEqual([figureSubject])
|
|
27
|
+
expect(figureSubject.anchorType).toBe('figure')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('★ is named by its name, in this domain', async () => {
|
|
31
|
+
expect(await figureSubject.describe({ anchorId: 'f1', domain: { id: 'plant-a' } })).toEqual({ noun: 'figure', name: '선풍기' })
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
it('a figure with no name yet is called by its type', async () => {
|
|
35
|
+
expect(await figureSubject.describe({ anchorId: 'f2', domain: { id: 'plant-a' } })).toEqual({ noun: 'figure', name: 'system/agv-lift' })
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('★ another domain\'s figure is not named', async () => {
|
|
39
|
+
expect(await figureSubject.describe({ anchorId: 'f3', domain: { id: 'plant-a' } })).toBeUndefined()
|
|
40
|
+
})
|
|
41
|
+
})
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The figure the modeller has open, named for the AI (operato-application design/ai/screen-pattern.md §2-1).
|
|
3
|
+
*
|
|
4
|
+
* A conversation in the modeller is anchored to the open figure. Each turn the door reads this to say which figure
|
|
5
|
+
* that is, so the model starts from "the figure 선풍기 is open" and passes its id to the tools. A figure of another
|
|
6
|
+
* domain, or one that is gone, is not named.
|
|
7
|
+
*/
|
|
8
|
+
import { registerAssistantSubject } from '@things-factory/ai-client-base'
|
|
9
|
+
import { getRepository } from '@things-factory/shell'
|
|
10
|
+
|
|
11
|
+
/* By entity name - the entity's decorators stay out of what a test of this has to load. */
|
|
12
|
+
export const figureSubject = {
|
|
13
|
+
anchorType: 'figure',
|
|
14
|
+
async describe({ anchorId, domain }: { anchorId: string; domain: { id: string } }) {
|
|
15
|
+
const figure: any = await getRepository('Figure').findOne({ where: { id: anchorId, domain: { id: domain.id } } })
|
|
16
|
+
if (!figure) return undefined
|
|
17
|
+
return { noun: 'figure', name: figure.name || figure.type }
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
registerAssistantSubject(figureSubject)
|
package/translations/en.json
CHANGED
|
@@ -115,5 +115,39 @@
|
|
|
115
115
|
"error.figure-mesh-empty": "the file holds no mesh to draw.",
|
|
116
116
|
"error.figure-mesh-too-large": "the file is larger than {max} MB, the most a board downloads for one part. make it smaller and upload it again.",
|
|
117
117
|
"error.figure-mesh-missing": "this figure uses a mesh file this domain does not hold ({hash}). upload the file again.",
|
|
118
|
-
"error.figure-package-mesh-missing": "{ref} uses a mesh file this server does not hold ({hash}); it cannot be packaged."
|
|
118
|
+
"error.figure-package-mesh-missing": "{ref} uses a mesh file this server does not hold ({hash}); it cannot be packaged.",
|
|
119
|
+
"figure.gate.contract.data-property-gone.message": "The data property '{id}' is gone.",
|
|
120
|
+
"figure.gate.contract.data-property-gone.why": "Boards map their data onto this id. After this release that data moves nothing.",
|
|
121
|
+
"figure.gate.contract.data-property-kind-changed.message": "The data property '{id}' changed from {before} to {after}.",
|
|
122
|
+
"figure.gate.contract.data-property-kind-changed.why": "Mapped data was written for the old kind or unit. After this release the same data is refused or means something else.",
|
|
123
|
+
"figure.gate.contract.data-property-narrowed.message": "The data property '{id}' takes less: {before} → {after}.",
|
|
124
|
+
"figure.gate.contract.data-property-narrowed.why": "Data with a value it no longer takes is refused whole, and the figure keeps what it showed.",
|
|
125
|
+
"figure.gate.contract.data-property-added.message": "The data property '{id}' is new.",
|
|
126
|
+
"figure.gate.contract.data-property-added.why": "Until a board maps data onto it, it stands at its default.",
|
|
127
|
+
"figure.gate.contract.data-property-label-changed.message": "The data property '{id}' is now called '{after}'.",
|
|
128
|
+
"figure.gate.contract.data-property-label-changed.why": "Mappings name the id, so they keep working.",
|
|
129
|
+
"figure.gate.contract.data-property-default-changed.message": "The default of the data property '{id}' changed from {before} to {after}.",
|
|
130
|
+
"figure.gate.contract.data-property-default-changed.why": "A placed figure with no data or saved value for it stands differently after this release.",
|
|
131
|
+
"figure.gate.contract.data-connections-changed.message": "What the data properties move changed.",
|
|
132
|
+
"figure.gate.contract.data-connections-changed.why": "The same data gives another pose, colour or clip after this release.",
|
|
133
|
+
"figure.gate.contract.motion-group-gone.message": "The motion group '{group}' is gone.",
|
|
134
|
+
"figure.gate.contract.motion-group-gone.why": "Boards and data choose its clip by this id. After this release that choice does nothing.",
|
|
135
|
+
"figure.gate.contract.motion-group-clip-removed.message": "The motion group '{group}' no longer holds '{clip}'.",
|
|
136
|
+
"figure.gate.contract.motion-group-clip-removed.why": "A board or data that chooses this clip in the group is refused after this release.",
|
|
137
|
+
"figure.gate.contract.motion-clip-group-changed.message": "The clip '{clip}' played on its own and is now in the motion group '{group}'.",
|
|
138
|
+
"figure.gate.contract.motion-clip-group-changed.why": "Boards played it by its own speed. After this release it plays only when the group's choice is this clip.",
|
|
139
|
+
"figure.gate.contract.motion-group-added.message": "The motion group '{group}' is new.",
|
|
140
|
+
"figure.gate.contract.motion-group-added.why": "Placed instances play its default clip until a board or data chooses another.",
|
|
141
|
+
"figure.gate.contract.motion-group-clip-added.message": "The motion group '{group}' now holds '{clip}'.",
|
|
142
|
+
"figure.gate.contract.motion-group-clip-added.why": "It plays when a board or data chooses it.",
|
|
143
|
+
"figure.gate.contract.motion-group-default-changed.message": "The motion group '{group}' now starts with '{after}', not '{before}'.",
|
|
144
|
+
"figure.gate.contract.motion-group-default-changed.why": "Placed instances with no choice of their own play the new default after this release.",
|
|
145
|
+
"figure.gate.contract.motion-group-transition-changed.message": "A change of clip in '{group}' now blends over {after} s, not {before} s.",
|
|
146
|
+
"figure.gate.contract.motion-group-transition-changed.why": "Only how a change of clip looks changes; which clip plays does not.",
|
|
147
|
+
"figure.gate.contract.slot-moved.message": "The slot '{binding}' is somewhere else on its anchor.",
|
|
148
|
+
"figure.gate.contract.slot-moved.why": "What sits in it moves with it. Data that names the slot by its address now means the new place.",
|
|
149
|
+
"figure.gate.contract.slot-anchor-gone.message": "The anchor '{anchor}' that slots stand on is gone.",
|
|
150
|
+
"figure.gate.contract.slot-anchor-gone.why": "A placement that lays its own slots on this anchor holds nothing after this release.",
|
|
151
|
+
"figure.gate.contract.slot-anchor-moved.message": "The anchor '{anchor}' moved from the {before} face to the {after} face.",
|
|
152
|
+
"figure.gate.contract.slot-anchor-moved.why": "Every slot on it, and what sits there, stands on the new face after this release."
|
|
119
153
|
}
|
package/translations/es.json
CHANGED
|
@@ -115,5 +115,39 @@
|
|
|
115
115
|
"error.figure-mesh-empty": "el archivo no contiene ninguna malla que dibujar.",
|
|
116
116
|
"error.figure-mesh-too-large": "el archivo supera los {max} MB, lo máximo que un tablero descarga para una pieza. redúzcalo y vuelva a subirlo.",
|
|
117
117
|
"error.figure-mesh-missing": "esta figura usa un archivo de malla que este dominio no tiene ({hash}). vuelva a subir el archivo.",
|
|
118
|
-
"error.figure-package-mesh-missing": "{ref} usa un archivo de malla que este servidor no tiene ({hash}); no se puede empaquetar."
|
|
118
|
+
"error.figure-package-mesh-missing": "{ref} usa un archivo de malla que este servidor no tiene ({hash}); no se puede empaquetar.",
|
|
119
|
+
"figure.gate.contract.data-property-gone.message": "La propiedad de datos '{id}' ya no existe.",
|
|
120
|
+
"figure.gate.contract.data-property-gone.why": "Los tableros asignan sus datos a este id. Tras esta publicación esos datos no mueven nada.",
|
|
121
|
+
"figure.gate.contract.data-property-kind-changed.message": "La propiedad de datos '{id}' cambió de {before} a {after}.",
|
|
122
|
+
"figure.gate.contract.data-property-kind-changed.why": "Los datos asignados se escribieron para el tipo o la unidad anterior. Tras esta publicación se rechazan o significan otra cosa.",
|
|
123
|
+
"figure.gate.contract.data-property-narrowed.message": "La propiedad de datos '{id}' admite menos: {before} → {after}.",
|
|
124
|
+
"figure.gate.contract.data-property-narrowed.why": "Los datos con un valor que ya no admite se rechazan enteros y la figura conserva lo que mostraba.",
|
|
125
|
+
"figure.gate.contract.data-property-added.message": "La propiedad de datos '{id}' es nueva.",
|
|
126
|
+
"figure.gate.contract.data-property-added.why": "Hasta que un tablero le asigne datos, queda en su valor predeterminado.",
|
|
127
|
+
"figure.gate.contract.data-property-label-changed.message": "La propiedad de datos '{id}' se llama ahora '{after}'.",
|
|
128
|
+
"figure.gate.contract.data-property-label-changed.why": "Las asignaciones usan el id, así que siguen funcionando.",
|
|
129
|
+
"figure.gate.contract.data-property-default-changed.message": "El valor predeterminado de la propiedad '{id}' cambió de {before} a {after}.",
|
|
130
|
+
"figure.gate.contract.data-property-default-changed.why": "Una figura colocada sin datos ni valor guardado se verá distinta tras esta publicación.",
|
|
131
|
+
"figure.gate.contract.data-connections-changed.message": "Cambió lo que mueven las propiedades de datos.",
|
|
132
|
+
"figure.gate.contract.data-connections-changed.why": "Los mismos datos dan otra postura, color o clip tras esta publicación.",
|
|
133
|
+
"figure.gate.contract.motion-group-gone.message": "El grupo de movimiento '{group}' ya no existe.",
|
|
134
|
+
"figure.gate.contract.motion-group-gone.why": "Tableros y datos eligen su clip por este id. Tras esta publicación esa elección no hace nada.",
|
|
135
|
+
"figure.gate.contract.motion-group-clip-removed.message": "El grupo '{group}' ya no contiene '{clip}'.",
|
|
136
|
+
"figure.gate.contract.motion-group-clip-removed.why": "Un tablero o datos que elijan este clip se rechazan tras esta publicación.",
|
|
137
|
+
"figure.gate.contract.motion-clip-group-changed.message": "El clip '{clip}' se reproducía solo y ahora está en el grupo '{group}'.",
|
|
138
|
+
"figure.gate.contract.motion-clip-group-changed.why": "Los tableros lo reproducían a su velocidad. Tras esta publicación solo se reproduce cuando el grupo lo elige.",
|
|
139
|
+
"figure.gate.contract.motion-group-added.message": "El grupo de movimiento '{group}' es nuevo.",
|
|
140
|
+
"figure.gate.contract.motion-group-added.why": "Las instancias reproducen su clip predeterminado hasta que un tablero o datos elijan otro.",
|
|
141
|
+
"figure.gate.contract.motion-group-clip-added.message": "El grupo '{group}' contiene ahora '{clip}'.",
|
|
142
|
+
"figure.gate.contract.motion-group-clip-added.why": "Se reproduce cuando un tablero o datos lo eligen.",
|
|
143
|
+
"figure.gate.contract.motion-group-default-changed.message": "El grupo '{group}' empieza ahora con '{after}', no con '{before}'.",
|
|
144
|
+
"figure.gate.contract.motion-group-default-changed.why": "Las instancias sin elección propia reproducen el nuevo predeterminado tras esta publicación.",
|
|
145
|
+
"figure.gate.contract.motion-group-transition-changed.message": "El cambio de clip en '{group}' dura ahora {after} s, no {before} s.",
|
|
146
|
+
"figure.gate.contract.motion-group-transition-changed.why": "Solo cambia cómo se ve el cambio de clip; qué clip se reproduce no cambia.",
|
|
147
|
+
"figure.gate.contract.slot-moved.message": "La ranura '{binding}' está en otro lugar de su anclaje.",
|
|
148
|
+
"figure.gate.contract.slot-moved.why": "Lo que contiene se mueve con ella. Los datos que nombran la ranura por su dirección significan ahora el nuevo lugar.",
|
|
149
|
+
"figure.gate.contract.slot-anchor-gone.message": "El anclaje '{anchor}' sobre el que están las ranuras ya no existe.",
|
|
150
|
+
"figure.gate.contract.slot-anchor-gone.why": "Una colocación que pone sus propias ranuras en este anclaje no contiene nada tras esta publicación.",
|
|
151
|
+
"figure.gate.contract.slot-anchor-moved.message": "El anclaje '{anchor}' pasó de la cara {before} a la cara {after}.",
|
|
152
|
+
"figure.gate.contract.slot-anchor-moved.why": "Cada ranura sobre él, y lo que contiene, queda en la nueva cara tras esta publicación."
|
|
119
153
|
}
|
package/translations/ja.json
CHANGED
|
@@ -115,5 +115,39 @@
|
|
|
115
115
|
"error.figure-mesh-empty": "ファイルに描画するメッシュがありません。",
|
|
116
116
|
"error.figure-mesh-too-large": "ファイルが {max} MB を超えています。ボードが部品 1 つにダウンロードする上限です。小さくして再度アップロードしてください。",
|
|
117
117
|
"error.figure-mesh-missing": "この図形が使うメッシュファイル({hash})がこのドメインにありません。ファイルを再度アップロードしてください。",
|
|
118
|
-
"error.figure-package-mesh-missing": "{ref} が使うメッシュファイル({hash})がこのサーバーにないため、パッケージにできません。"
|
|
118
|
+
"error.figure-package-mesh-missing": "{ref} が使うメッシュファイル({hash})がこのサーバーにないため、パッケージにできません。",
|
|
119
|
+
"figure.gate.contract.data-property-gone.message": "データ属性 '{id}' がなくなりました。",
|
|
120
|
+
"figure.gate.contract.data-property-gone.why": "ボードはデータをこのIDに対応させます。このリリース以降、そのデータは何も動かしません。",
|
|
121
|
+
"figure.gate.contract.data-property-kind-changed.message": "データ属性 '{id}' が {before} から {after} に変わりました。",
|
|
122
|
+
"figure.gate.contract.data-property-kind-changed.why": "対応したデータは以前の種類や単位で書かれています。このリリース以降、同じデータは拒否されるか別の意味になります。",
|
|
123
|
+
"figure.gate.contract.data-property-narrowed.message": "データ属性 '{id}' が受け取る値が減りました: {before} → {after}。",
|
|
124
|
+
"figure.gate.contract.data-property-narrowed.why": "受け取らなくなった値を含むデータは全体が拒否され、Figureは直前の姿を保ちます。",
|
|
125
|
+
"figure.gate.contract.data-property-added.message": "データ属性 '{id}' が新しく追加されました。",
|
|
126
|
+
"figure.gate.contract.data-property-added.why": "ボードがデータを対応させるまで既定値のままです。",
|
|
127
|
+
"figure.gate.contract.data-property-label-changed.message": "データ属性 '{id}' の名前が '{after}' になりました。",
|
|
128
|
+
"figure.gate.contract.data-property-label-changed.why": "対応はIDで行うので、そのまま動作します。",
|
|
129
|
+
"figure.gate.contract.data-property-default-changed.message": "データ属性 '{id}' の既定値が {before} から {after} に変わりました。",
|
|
130
|
+
"figure.gate.contract.data-property-default-changed.why": "データや保存値がないFigureは、このリリース以降は違う姿になります。",
|
|
131
|
+
"figure.gate.contract.data-connections-changed.message": "データ属性が動かす対象が変わりました。",
|
|
132
|
+
"figure.gate.contract.data-connections-changed.why": "このリリース以降、同じデータが別の姿勢・色・クリップになります。",
|
|
133
|
+
"figure.gate.contract.motion-group-gone.message": "モーショングループ '{group}' がなくなりました。",
|
|
134
|
+
"figure.gate.contract.motion-group-gone.why": "ボードとデータはこのIDでクリップを選びます。このリリース以降、その選択は何もしません。",
|
|
135
|
+
"figure.gate.contract.motion-group-clip-removed.message": "モーショングループ '{group}' から '{clip}' が外れました。",
|
|
136
|
+
"figure.gate.contract.motion-group-clip-removed.why": "このクリップを選ぶボードやデータは、このリリース以降拒否されます。",
|
|
137
|
+
"figure.gate.contract.motion-clip-group-changed.message": "単独で再生していたクリップ '{clip}' がモーショングループ '{group}' に入りました。",
|
|
138
|
+
"figure.gate.contract.motion-clip-group-changed.why": "ボードはこのクリップを速度で再生していました。このリリース以降は、グループでこのクリップを選んだときだけ再生します。",
|
|
139
|
+
"figure.gate.contract.motion-group-added.message": "モーショングループ '{group}' が新しく追加されました。",
|
|
140
|
+
"figure.gate.contract.motion-group-added.why": "ボードやデータが別のクリップを選ぶまで既定クリップを再生します。",
|
|
141
|
+
"figure.gate.contract.motion-group-clip-added.message": "モーショングループ '{group}' に '{clip}' が入りました。",
|
|
142
|
+
"figure.gate.contract.motion-group-clip-added.why": "ボードやデータが選ぶと再生します。",
|
|
143
|
+
"figure.gate.contract.motion-group-default-changed.message": "モーショングループ '{group}' の既定クリップが '{before}' から '{after}' に変わりました。",
|
|
144
|
+
"figure.gate.contract.motion-group-default-changed.why": "選択のないインスタンスは、このリリース以降新しい既定クリップを再生します。",
|
|
145
|
+
"figure.gate.contract.motion-group-transition-changed.message": "'{group}' のクリップ切替時間が {before} 秒から {after} 秒に変わりました。",
|
|
146
|
+
"figure.gate.contract.motion-group-transition-changed.why": "クリップの切り替わり方だけが変わり、どのクリップを再生するかは変わりません。",
|
|
147
|
+
"figure.gate.contract.slot-moved.message": "'{binding}' スロットが基準面上の別の位置に移りました。",
|
|
148
|
+
"figure.gate.contract.slot-moved.why": "そこに置かれたものも一緒に移ります。スロットのアドレスで指すデータは新しい位置を意味します。",
|
|
149
|
+
"figure.gate.contract.slot-anchor-gone.message": "スロットが立つ '{anchor}' 基準面がなくなりました。",
|
|
150
|
+
"figure.gate.contract.slot-anchor-gone.why": "この基準面に独自のスロットを置いた配置は、このリリース以降何も保持できません。",
|
|
151
|
+
"figure.gate.contract.slot-anchor-moved.message": "'{anchor}' 基準面が {before} 面から {after} 面に移りました。",
|
|
152
|
+
"figure.gate.contract.slot-anchor-moved.why": "その上のすべてのスロットと置かれたものは、このリリース以降新しい面に立ちます。"
|
|
119
153
|
}
|
package/translations/ko.json
CHANGED
|
@@ -115,5 +115,39 @@
|
|
|
115
115
|
"error.figure-mesh-empty": "파일에 그릴 메시가 없습니다.",
|
|
116
116
|
"error.figure-mesh-too-large": "파일이 {max} MB 보다 큽니다. 보드가 부품 하나에 내려받는 최대 크기입니다. 줄여서 다시 올려 주세요.",
|
|
117
117
|
"error.figure-mesh-missing": "이 도형이 쓰는 메시 파일({hash})이 이 도메인에 없습니다. 파일을 다시 올려 주세요.",
|
|
118
|
-
"error.figure-package-mesh-missing": "{ref} 가 쓰는 메시 파일({hash})이 이 서버에 없어 묶을 수 없습니다."
|
|
118
|
+
"error.figure-package-mesh-missing": "{ref} 가 쓰는 메시 파일({hash})이 이 서버에 없어 묶을 수 없습니다.",
|
|
119
|
+
"figure.gate.contract.data-property-gone.message": "'{id}' 데이터 속성이 없어졌습니다.",
|
|
120
|
+
"figure.gate.contract.data-property-gone.why": "보드는 데이터를 이 ID에 대응합니다. 이 발행 뒤에는 그 데이터가 아무것도 움직이지 않습니다.",
|
|
121
|
+
"figure.gate.contract.data-property-kind-changed.message": "'{id}' 데이터 속성이 {before} 에서 {after} 로 바뀌었습니다.",
|
|
122
|
+
"figure.gate.contract.data-property-kind-changed.why": "대응한 데이터는 이전 종류나 단위로 쓰였습니다. 이 발행 뒤에는 같은 데이터가 거절되거나 다른 뜻이 됩니다.",
|
|
123
|
+
"figure.gate.contract.data-property-narrowed.message": "'{id}' 데이터 속성이 받는 값이 줄었습니다: {before} → {after}.",
|
|
124
|
+
"figure.gate.contract.data-property-narrowed.why": "더 받지 않는 값이 든 데이터는 통째로 거절되고, Figure는 직전 모습을 유지합니다.",
|
|
125
|
+
"figure.gate.contract.data-property-added.message": "'{id}' 데이터 속성이 새로 생겼습니다.",
|
|
126
|
+
"figure.gate.contract.data-property-added.why": "보드가 데이터를 대응하기 전까지 기본값으로 섭니다.",
|
|
127
|
+
"figure.gate.contract.data-property-label-changed.message": "'{id}' 데이터 속성의 이름이 '{after}' 이름으로 바뀌었습니다.",
|
|
128
|
+
"figure.gate.contract.data-property-label-changed.why": "대응은 ID로 하므로 그대로 동작합니다.",
|
|
129
|
+
"figure.gate.contract.data-property-default-changed.message": "'{id}' 데이터 속성의 기본값이 {before} 에서 {after} 로 바뀌었습니다.",
|
|
130
|
+
"figure.gate.contract.data-property-default-changed.why": "데이터나 저장값이 없는 Figure는 이 발행 뒤에 다르게 섭니다.",
|
|
131
|
+
"figure.gate.contract.data-connections-changed.message": "데이터 속성이 움직이는 대상이 바뀌었습니다.",
|
|
132
|
+
"figure.gate.contract.data-connections-changed.why": "이 발행 뒤에는 같은 데이터가 다른 자세, 색, 클립을 만듭니다.",
|
|
133
|
+
"figure.gate.contract.motion-group-gone.message": "'{group}' 동작 그룹이 없어졌습니다.",
|
|
134
|
+
"figure.gate.contract.motion-group-gone.why": "보드와 데이터는 이 ID로 클립을 고릅니다. 이 발행 뒤에는 그 선택이 아무것도 하지 않습니다.",
|
|
135
|
+
"figure.gate.contract.motion-group-clip-removed.message": "'{group}' 동작 그룹에서 '{clip}' 클립이 빠졌습니다.",
|
|
136
|
+
"figure.gate.contract.motion-group-clip-removed.why": "이 클립을 고르는 보드나 데이터는 이 발행 뒤에 거절됩니다.",
|
|
137
|
+
"figure.gate.contract.motion-clip-group-changed.message": "혼자 재생하던 '{clip}' 클립이 '{group}' 동작 그룹에 들어갔습니다.",
|
|
138
|
+
"figure.gate.contract.motion-clip-group-changed.why": "보드는 이 클립을 배속으로 재생했습니다. 이 발행 뒤에는 그룹에서 이 클립을 골랐을 때만 재생합니다.",
|
|
139
|
+
"figure.gate.contract.motion-group-added.message": "'{group}' 동작 그룹이 새로 생겼습니다.",
|
|
140
|
+
"figure.gate.contract.motion-group-added.why": "보드나 데이터가 다른 클립을 고르기 전까지 기본 클립을 재생합니다.",
|
|
141
|
+
"figure.gate.contract.motion-group-clip-added.message": "'{group}' 동작 그룹에 '{clip}' 클립이 들어갔습니다.",
|
|
142
|
+
"figure.gate.contract.motion-group-clip-added.why": "보드나 데이터가 고르면 재생합니다.",
|
|
143
|
+
"figure.gate.contract.motion-group-default-changed.message": "'{group}' 동작 그룹의 기본 클립이 '{before}' 클립에서 '{after}' 클립으로 바뀌었습니다.",
|
|
144
|
+
"figure.gate.contract.motion-group-default-changed.why": "선택이 없는 인스턴스는 이 발행 뒤에 새 기본 클립을 재생합니다.",
|
|
145
|
+
"figure.gate.contract.motion-group-transition-changed.message": "'{group}' 동작 그룹에서 클립을 바꿀 때의 전환 시간이 {before}초에서 {after}초로 바뀌었습니다.",
|
|
146
|
+
"figure.gate.contract.motion-group-transition-changed.why": "클립이 바뀌는 모습만 달라지고, 어느 클립을 재생하는지는 그대로입니다.",
|
|
147
|
+
"figure.gate.contract.slot-moved.message": "'{binding}' 자리가 기준면 위의 다른 위치로 옮겨졌습니다.",
|
|
148
|
+
"figure.gate.contract.slot-moved.why": "그 자리에 놓인 것도 함께 옮겨집니다. 자리 주소로 이 자리를 가리키는 데이터는 이제 새 위치를 뜻합니다.",
|
|
149
|
+
"figure.gate.contract.slot-anchor-gone.message": "자리가 서는 '{anchor}' 기준면이 없어졌습니다.",
|
|
150
|
+
"figure.gate.contract.slot-anchor-gone.why": "이 기준면에 자기 자리를 둔 배치는 이 발행 뒤에 아무것도 담지 못합니다.",
|
|
151
|
+
"figure.gate.contract.slot-anchor-moved.message": "'{anchor}' 기준면이 {before} 면에서 {after} 면으로 옮겨졌습니다.",
|
|
152
|
+
"figure.gate.contract.slot-anchor-moved.why": "그 위의 모든 자리와 놓인 것이 이 발행 뒤에 새 면에 섭니다."
|
|
119
153
|
}
|
package/translations/ms.json
CHANGED
|
@@ -115,5 +115,39 @@
|
|
|
115
115
|
"error.figure-mesh-empty": "fail ini tidak mengandungi jejaring untuk dilukis.",
|
|
116
116
|
"error.figure-mesh-too-large": "fail ini melebihi {max} MB, had muat turun papan untuk satu bahagian. kecilkan dan muat naik semula.",
|
|
117
117
|
"error.figure-mesh-missing": "figura ini menggunakan fail jejaring yang tiada dalam domain ini ({hash}). muat naik fail itu semula.",
|
|
118
|
-
"error.figure-package-mesh-missing": "{ref} menggunakan fail jejaring yang tiada pada pelayan ini ({hash}); ia tidak dapat dipakej."
|
|
118
|
+
"error.figure-package-mesh-missing": "{ref} menggunakan fail jejaring yang tiada pada pelayan ini ({hash}); ia tidak dapat dipakej.",
|
|
119
|
+
"figure.gate.contract.data-property-gone.message": "Sifat data '{id}' telah tiada.",
|
|
120
|
+
"figure.gate.contract.data-property-gone.why": "Papan memetakan data kepada id ini. Selepas keluaran ini data itu tidak menggerakkan apa-apa.",
|
|
121
|
+
"figure.gate.contract.data-property-kind-changed.message": "Sifat data '{id}' berubah daripada {before} kepada {after}.",
|
|
122
|
+
"figure.gate.contract.data-property-kind-changed.why": "Data yang dipetakan ditulis untuk jenis atau unit lama. Selepas keluaran ini data yang sama ditolak atau bermaksud lain.",
|
|
123
|
+
"figure.gate.contract.data-property-narrowed.message": "Sifat data '{id}' menerima kurang: {before} → {after}.",
|
|
124
|
+
"figure.gate.contract.data-property-narrowed.why": "Data dengan nilai yang tidak lagi diterima ditolak sepenuhnya, dan figure kekal seperti sebelumnya.",
|
|
125
|
+
"figure.gate.contract.data-property-added.message": "Sifat data '{id}' adalah baharu.",
|
|
126
|
+
"figure.gate.contract.data-property-added.why": "Sehingga papan memetakan data kepadanya, ia kekal pada nilai lalai.",
|
|
127
|
+
"figure.gate.contract.data-property-label-changed.message": "Sifat data '{id}' kini dinamakan '{after}'.",
|
|
128
|
+
"figure.gate.contract.data-property-label-changed.why": "Pemetaan menggunakan id, jadi ia terus berfungsi.",
|
|
129
|
+
"figure.gate.contract.data-property-default-changed.message": "Nilai lalai sifat data '{id}' berubah daripada {before} kepada {after}.",
|
|
130
|
+
"figure.gate.contract.data-property-default-changed.why": "Figure tanpa data atau nilai tersimpan kelihatan berbeza selepas keluaran ini.",
|
|
131
|
+
"figure.gate.contract.data-connections-changed.message": "Apa yang digerakkan oleh sifat data telah berubah.",
|
|
132
|
+
"figure.gate.contract.data-connections-changed.why": "Data yang sama memberi postur, warna atau klip lain selepas keluaran ini.",
|
|
133
|
+
"figure.gate.contract.motion-group-gone.message": "Kumpulan gerakan '{group}' telah tiada.",
|
|
134
|
+
"figure.gate.contract.motion-group-gone.why": "Papan dan data memilih klipnya melalui id ini. Selepas keluaran ini pilihan itu tidak berkesan.",
|
|
135
|
+
"figure.gate.contract.motion-group-clip-removed.message": "Kumpulan gerakan '{group}' tidak lagi mengandungi '{clip}'.",
|
|
136
|
+
"figure.gate.contract.motion-group-clip-removed.why": "Papan atau data yang memilih klip ini ditolak selepas keluaran ini.",
|
|
137
|
+
"figure.gate.contract.motion-clip-group-changed.message": "Klip '{clip}' yang dimainkan sendiri kini dalam kumpulan gerakan '{group}'.",
|
|
138
|
+
"figure.gate.contract.motion-clip-group-changed.why": "Papan memainkannya mengikut kelajuan sendiri. Selepas keluaran ini ia dimainkan hanya apabila kumpulan memilihnya.",
|
|
139
|
+
"figure.gate.contract.motion-group-added.message": "Kumpulan gerakan '{group}' adalah baharu.",
|
|
140
|
+
"figure.gate.contract.motion-group-added.why": "Instans memainkan klip lalainya sehingga papan atau data memilih yang lain.",
|
|
141
|
+
"figure.gate.contract.motion-group-clip-added.message": "Kumpulan gerakan '{group}' kini mengandungi '{clip}'.",
|
|
142
|
+
"figure.gate.contract.motion-group-clip-added.why": "Ia dimainkan apabila papan atau data memilihnya.",
|
|
143
|
+
"figure.gate.contract.motion-group-default-changed.message": "Kumpulan gerakan '{group}' kini bermula dengan '{after}', bukan '{before}'.",
|
|
144
|
+
"figure.gate.contract.motion-group-default-changed.why": "Instans tanpa pilihan sendiri memainkan klip lalai baharu selepas keluaran ini.",
|
|
145
|
+
"figure.gate.contract.motion-group-transition-changed.message": "Peralihan klip dalam '{group}' kini {after} s, bukan {before} s.",
|
|
146
|
+
"figure.gate.contract.motion-group-transition-changed.why": "Hanya rupa peralihan berubah; klip yang dimainkan tidak berubah.",
|
|
147
|
+
"figure.gate.contract.slot-moved.message": "Slot '{binding}' berada di tempat lain pada anchornya.",
|
|
148
|
+
"figure.gate.contract.slot-moved.why": "Apa yang ada di dalamnya bergerak bersama. Data yang menamakan slot melalui alamatnya kini bermaksud tempat baharu.",
|
|
149
|
+
"figure.gate.contract.slot-anchor-gone.message": "Anchor '{anchor}' tempat slot berdiri telah tiada.",
|
|
150
|
+
"figure.gate.contract.slot-anchor-gone.why": "Penempatan yang meletakkan slotnya sendiri pada anchor ini tidak memegang apa-apa selepas keluaran ini.",
|
|
151
|
+
"figure.gate.contract.slot-anchor-moved.message": "Anchor '{anchor}' beralih daripada muka {before} ke muka {after}.",
|
|
152
|
+
"figure.gate.contract.slot-anchor-moved.why": "Setiap slot padanya, dan apa yang ada di situ, berdiri pada muka baharu selepas keluaran ini."
|
|
119
153
|
}
|
package/translations/zh.json
CHANGED
|
@@ -115,5 +115,39 @@
|
|
|
115
115
|
"error.figure-mesh-empty": "文件中没有可绘制的网格。",
|
|
116
116
|
"error.figure-mesh-too-large": "文件大于 {max} MB,这是看板为一个部件下载的上限。请缩小后重新上传。",
|
|
117
117
|
"error.figure-mesh-missing": "此图形使用的网格文件({hash})不在此域中。请重新上传该文件。",
|
|
118
|
-
"error.figure-package-mesh-missing": "{ref} 使用的网格文件({hash})不在此服务器上,无法打包。"
|
|
118
|
+
"error.figure-package-mesh-missing": "{ref} 使用的网格文件({hash})不在此服务器上,无法打包。",
|
|
119
|
+
"figure.gate.contract.data-property-gone.message": "数据属性 '{id}' 已删除。",
|
|
120
|
+
"figure.gate.contract.data-property-gone.why": "看板将数据对应到此 ID。本次发布后,这些数据不再驱动任何东西。",
|
|
121
|
+
"figure.gate.contract.data-property-kind-changed.message": "数据属性 '{id}' 从 {before} 改为 {after}。",
|
|
122
|
+
"figure.gate.contract.data-property-kind-changed.why": "已对应的数据按旧类型或单位写入。本次发布后,同样的数据会被拒绝或含义改变。",
|
|
123
|
+
"figure.gate.contract.data-property-narrowed.message": "数据属性 '{id}' 接受的值变少:{before} → {after}。",
|
|
124
|
+
"figure.gate.contract.data-property-narrowed.why": "含有不再接受之值的数据会被整体拒绝,Figure 保持之前的状态。",
|
|
125
|
+
"figure.gate.contract.data-property-added.message": "新增数据属性 '{id}'。",
|
|
126
|
+
"figure.gate.contract.data-property-added.why": "在看板对应数据之前,保持默认值。",
|
|
127
|
+
"figure.gate.contract.data-property-label-changed.message": "数据属性 '{id}' 的名称改为 '{after}'。",
|
|
128
|
+
"figure.gate.contract.data-property-label-changed.why": "对应使用 ID,因此照常工作。",
|
|
129
|
+
"figure.gate.contract.data-property-default-changed.message": "数据属性 '{id}' 的默认值从 {before} 改为 {after}。",
|
|
130
|
+
"figure.gate.contract.data-property-default-changed.why": "没有数据或保存值的 Figure 在本次发布后呈现不同。",
|
|
131
|
+
"figure.gate.contract.data-connections-changed.message": "数据属性驱动的对象已改变。",
|
|
132
|
+
"figure.gate.contract.data-connections-changed.why": "本次发布后,同样的数据会产生不同的姿态、颜色或片段。",
|
|
133
|
+
"figure.gate.contract.motion-group-gone.message": "动作组 '{group}' 已删除。",
|
|
134
|
+
"figure.gate.contract.motion-group-gone.why": "看板和数据通过此 ID 选择片段。本次发布后该选择不起作用。",
|
|
135
|
+
"figure.gate.contract.motion-group-clip-removed.message": "动作组 '{group}' 不再包含 '{clip}'。",
|
|
136
|
+
"figure.gate.contract.motion-group-clip-removed.why": "本次发布后,选择该片段的看板或数据会被拒绝。",
|
|
137
|
+
"figure.gate.contract.motion-clip-group-changed.message": "原先单独播放的片段 '{clip}' 已加入动作组 '{group}'。",
|
|
138
|
+
"figure.gate.contract.motion-clip-group-changed.why": "看板按倍速播放它。本次发布后,只有组选择该片段时才播放。",
|
|
139
|
+
"figure.gate.contract.motion-group-added.message": "新增动作组 '{group}'。",
|
|
140
|
+
"figure.gate.contract.motion-group-added.why": "在看板或数据选择其他片段之前,播放默认片段。",
|
|
141
|
+
"figure.gate.contract.motion-group-clip-added.message": "动作组 '{group}' 现在包含 '{clip}'。",
|
|
142
|
+
"figure.gate.contract.motion-group-clip-added.why": "看板或数据选择时播放。",
|
|
143
|
+
"figure.gate.contract.motion-group-default-changed.message": "动作组 '{group}' 的默认片段从 '{before}' 改为 '{after}'。",
|
|
144
|
+
"figure.gate.contract.motion-group-default-changed.why": "没有自身选择的实例在本次发布后播放新的默认片段。",
|
|
145
|
+
"figure.gate.contract.motion-group-transition-changed.message": "'{group}' 中切换片段的过渡时间从 {before} 秒改为 {after} 秒。",
|
|
146
|
+
"figure.gate.contract.motion-group-transition-changed.why": "只改变切换的样子,播放哪个片段不变。",
|
|
147
|
+
"figure.gate.contract.slot-moved.message": "'{binding}' 槽位移到了基准面上的其他位置。",
|
|
148
|
+
"figure.gate.contract.slot-moved.why": "放在其中的物件随之移动。用槽位地址指向它的数据现在表示新位置。",
|
|
149
|
+
"figure.gate.contract.slot-anchor-gone.message": "槽位所在的 '{anchor}' 基准面已删除。",
|
|
150
|
+
"figure.gate.contract.slot-anchor-gone.why": "在此基准面上放置自有槽位的布置在本次发布后无法容纳任何东西。",
|
|
151
|
+
"figure.gate.contract.slot-anchor-moved.message": "'{anchor}' 基准面从 {before} 面移到 {after} 面。",
|
|
152
|
+
"figure.gate.contract.slot-anchor-moved.why": "其上的所有槽位及放置物在本次发布后位于新面上。"
|
|
119
153
|
}
|