@things-factory/ai-dashboard 10.1.233 → 10.1.236
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-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/card/card-names.d.ts +2 -0
- package/dist-server/service/card/card-names.js +3 -1
- package/dist-server/service/card/card-names.js.map +1 -1
- package/dist-server/service/card/card-resolver.js +14 -5
- package/dist-server/service/card/card-resolver.js.map +1 -1
- package/dist-server/service/card/card-tool.js +3 -1
- package/dist-server/service/card/card-tool.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/server/service/card/card-intent.test.ts +13 -0
- package/server/service/card/card-names.ts +2 -0
- package/server/service/card/card-resolver.ts +14 -5
- package/server/service/card/card-tool.ts +3 -2
- package/test/words-not-codes.test.ts +24 -0
- package/translations/en.json +6 -4
- package/translations/es.json +6 -4
- package/translations/ja.json +6 -4
- package/translations/ko.json +6 -4
- package/translations/ms.json +6 -4
- package/translations/zh.json +6 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/ai-dashboard",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.236",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"@operato/popup": "^10.29.39",
|
|
34
34
|
"@operato/shell": "^10.29.39",
|
|
35
35
|
"@operato/styles": "^10.0.0",
|
|
36
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
37
|
-
"@things-factory/ai-client-base": "^10.1.
|
|
38
|
-
"@things-factory/auth-base": "^10.1.
|
|
36
|
+
"@things-factory/ai-assistant": "^10.1.234",
|
|
37
|
+
"@things-factory/ai-client-base": "^10.1.234",
|
|
38
|
+
"@things-factory/auth-base": "^10.1.234",
|
|
39
39
|
"@things-factory/env": "^10.1.149",
|
|
40
|
-
"@things-factory/organization": "^10.1.
|
|
41
|
-
"@things-factory/shell": "^10.1.
|
|
40
|
+
"@things-factory/organization": "^10.1.236",
|
|
41
|
+
"@things-factory/shell": "^10.1.234",
|
|
42
42
|
"graphql-scalars": "^1.22.0",
|
|
43
43
|
"graphql-tag": "^2.12.6",
|
|
44
44
|
"lit": "^3.1.2"
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"copyfiles": "^2.4.1"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "1560112ae8ae5a5d296b4fce1d5a1be05e30e8c2"
|
|
50
50
|
}
|
|
@@ -146,6 +146,19 @@ describe('"not one of" is a filter of the card (pending = not approved, rejected
|
|
|
146
146
|
expect(result).toMatchObject({ proposed: true })
|
|
147
147
|
expect(result.card.definition.rows.match).toEqual([{ column: 'status', op: 'not_in', value: ['APPROVED', 'REJECTED', 'WITHDRAWN'] }])
|
|
148
148
|
})
|
|
149
|
+
/* A name over the bound was cut at 100 without a word (inline help audit 2026-10-30) - the model is told to shorten it. */
|
|
150
|
+
it('★ a card name over the bound is turned back, not cut', async () => {
|
|
151
|
+
const propose = (name: string) =>
|
|
152
|
+
proposeDashboardCard(
|
|
153
|
+
{ name, source: { read: myRequests.key }, view: { kind: 'number', values: ['totalAmount'] } },
|
|
154
|
+
{ state: { user: { id: 'u-1', name: '정연희' }, domain: { id: 'd1' } } },
|
|
155
|
+
{ run, passesDoor: async () => true, today: '2026-10-25' }
|
|
156
|
+
) as Promise<any>
|
|
157
|
+
expect(await propose('가'.repeat(101))).toMatchObject({ rejected: true, error: 'name-too-long' })
|
|
158
|
+
const kept = await propose('가'.repeat(100))
|
|
159
|
+
expect(kept).toMatchObject({ proposed: true })
|
|
160
|
+
expect(kept.card.name).toBe('가'.repeat(100))
|
|
161
|
+
})
|
|
149
162
|
})
|
|
150
163
|
|
|
151
164
|
describe('a date column that holds a month', () => {
|
|
@@ -8,3 +8,5 @@ export const DASHBOARD_PAGE = 'my-dashboard'
|
|
|
8
8
|
* picked row of any list (ai-assistant `selectedRecords`). The client's `CARD_AXIS` (card-words.ts) is the same word.
|
|
9
9
|
*/
|
|
10
10
|
export const CARD_AXIS = 'dashboard-card'
|
|
11
|
+
/** A card name's bound - the screen's `maxlength`, refused with the bound on the server, never cut. */
|
|
12
|
+
export const CARD_NAME_MAX = 100
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
|
|
29
29
|
import { cardAccessOf, type CardAccess, type CardViewer } from './card-access.js'
|
|
30
30
|
import { CARD_SCHEMA_VERSION, checkDefinition, sourceOf, todayIn, type CardDefinition } from './card-definition.js'
|
|
31
|
+
import { CARD_NAME_MAX } from './card-names.js'
|
|
31
32
|
import { cardIdOf, findCardProposal } from './card-proposal.js'
|
|
32
33
|
import { runCard, type CardRunResult } from './card-run.js'
|
|
33
34
|
import { DashboardCard, DashboardCardPlace, DashboardCardShare, DashboardCardShareScope, DashboardCardVersion } from './dashboard-card.js'
|
|
@@ -39,11 +40,19 @@ const MUTATION = '@privilege(category: "ai-dashboard", privilege: "mutation", do
|
|
|
39
40
|
const MAX_WIDTH = 4
|
|
40
41
|
const MAX_HEIGHT = 2
|
|
41
42
|
|
|
43
|
+
/** The name as typed, or refused with the bound - a longer name was cut without a word (inline help audit 2026-10-30). */
|
|
44
|
+
function cardNameOf(name: unknown, context: ResolverContext): string {
|
|
45
|
+
const given = String(name ?? '').trim()
|
|
46
|
+
if (given.length > CARD_NAME_MAX) refuse(context, 'name-too-long', 'a card name takes up to {max} characters; this one has {length}.', { max: CARD_NAME_MAX, length: given.length })
|
|
47
|
+
return given
|
|
48
|
+
}
|
|
49
|
+
|
|
42
50
|
/** A refusal said in the reader's words, with a code the screen may read. */
|
|
43
51
|
function refuse(context: ResolverContext, code: string, fallback: string, options: Record<string, unknown> = {}): never {
|
|
44
52
|
const message = context.t ? String(context.t(`ai-dashboard.refusal.${code}`, { defaultValue: fallback, ...options })) : fallback
|
|
45
53
|
const error: any = new Error(message)
|
|
46
|
-
|
|
54
|
+
/* The issue code is for the people who keep the application - the sentence a person reads does not carry it. */
|
|
55
|
+
error.extensions = { code: `ai-dashboard.${code}`, ...(options.issue ? { issue: options.issue } : {}) }
|
|
47
56
|
throw error
|
|
48
57
|
}
|
|
49
58
|
|
|
@@ -139,9 +148,9 @@ export async function runAsViewer(definition: CardDefinition, context: ResolverC
|
|
|
139
148
|
/** A definition fit to keep - its source known and every name its own. */
|
|
140
149
|
function keepable(definition: any, context: ResolverContext): CardDefinition {
|
|
141
150
|
const { source, issue } = sourceOf(definition?.source, readTargetOf, detailReadOf)
|
|
142
|
-
if (!source) refuse(context, 'definition-unfit', 'the card reads nothing this application declares
|
|
151
|
+
if (!source) refuse(context, 'definition-unfit', 'the card reads nothing this application declares.', { issue: issue?.code })
|
|
143
152
|
const issues = checkDefinition(definition, source)
|
|
144
|
-
if (issues.length) refuse(context, 'definition-unfit', 'the card definition does not fit its source
|
|
153
|
+
if (issues.length) refuse(context, 'definition-unfit', 'the card definition does not fit its source.', { issue: issues[0].code })
|
|
145
154
|
return definition
|
|
146
155
|
}
|
|
147
156
|
|
|
@@ -280,7 +289,7 @@ export class DashboardCardResolver {
|
|
|
280
289
|
/* Keeping a card one cannot read draws nothing - the data's door is the saver's too. */
|
|
281
290
|
const { source } = sourceOf(definition.source, readTargetOf, detailReadOf)
|
|
282
291
|
if (!(await toolAccessFor(context)(rootFieldOf(source!.query, 'query')))) refuse(context, 'data-closed', 'you may not read the data this card draws.')
|
|
283
|
-
const name =
|
|
292
|
+
const name = cardNameOf(proposal.card.name, context) || String(context.t ? context.t('ai-dashboard.text.untitled-card') : 'Untitled card')
|
|
284
293
|
const description = proposal.card.description ? String(proposal.card.description).slice(0, 300) : null
|
|
285
294
|
|
|
286
295
|
let card: DashboardCard
|
|
@@ -305,7 +314,7 @@ export class DashboardCardResolver {
|
|
|
305
314
|
async renameDashboardCard(@Arg('id') id: string, @Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {
|
|
306
315
|
const { domain, user, tx } = context.state as any
|
|
307
316
|
const card = await ownCard(id, context, tx)
|
|
308
|
-
const given = (name
|
|
317
|
+
const given = cardNameOf(name, context)
|
|
309
318
|
if (!given) refuse(context, 'no-name', 'a card needs a name.')
|
|
310
319
|
const version = card.version + 1
|
|
311
320
|
await getRepository(DashboardCard, tx).save({ ...card, name: given, version, updater: user } as any)
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
import { CARD_SCHEMA_VERSION, checkCardIntent, checkDefinition, LIST_OPS, MATCH_OPS, sourceOf, todayIn, VIEW_KINDS, type CardDefinition, type CardSource } from './card-definition.js'
|
|
24
24
|
import { runCard, shapedColumnNames } from './card-run.js'
|
|
25
25
|
|
|
26
|
-
import { CARD_AXIS, CARD_CATEGORY, CARD_TOOL, DASHBOARD_PAGE } from './card-names.js'
|
|
26
|
+
import { CARD_AXIS, CARD_CATEGORY, CARD_NAME_MAX, CARD_TOOL, DASHBOARD_PAGE } from './card-names.js'
|
|
27
27
|
import { cardIdOf } from './card-proposal.js'
|
|
28
28
|
|
|
29
29
|
export { CARD_CATEGORY, CARD_TOOL, DASHBOARD_PAGE }
|
|
@@ -79,8 +79,9 @@ const cardInDomain =
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
export async function proposeDashboardCard(args: any, context: any, deps: { run?: any; passesDoor?: (door: string) => Promise<boolean>; today?: string; cardOf?: CardOf } = {}) {
|
|
82
|
-
const name = typeof args?.name === 'string' ? args.name.trim()
|
|
82
|
+
const name = typeof args?.name === 'string' ? args.name.trim() : ''
|
|
83
83
|
if (!name) return { rejected: true, error: 'no-name', message: 'give the card a short name in the person\'s language.' }
|
|
84
|
+
if (name.length > CARD_NAME_MAX) return { rejected: true, error: 'name-too-long', message: `the card name has ${name.length} characters - give one of at most ${CARD_NAME_MAX} and call again now.` }
|
|
84
85
|
const where = withoutEmpty(args?.source?.where)
|
|
85
86
|
const rows = withoutEmpty(args?.rows)
|
|
86
87
|
/* One value, or the list `in` and `not_in` take - kept as the match's value either way. */
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* What a Korean reader sees is words, not the dashboard's internal codes - inline help audit 2026-10-30: a card that
|
|
3
|
+
* could not be drawn said 「이 카드를 그릴 수 없습니다(period-unlike-condition)」, a list it could not read
|
|
4
|
+
* 「…({read}/{list})」 with the read keys, a card name was cut at 100 characters, and a proposal without a name was saved
|
|
5
|
+
* as the English word `card`.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from 'fs'
|
|
8
|
+
import { join } from 'path'
|
|
9
|
+
|
|
10
|
+
const ROOT = join(__dirname, '..')
|
|
11
|
+
const read = (file: string) => readFileSync(join(ROOT, file), 'utf8')
|
|
12
|
+
const ko: Record<string, string> = JSON.parse(read('translations/ko.json'))
|
|
13
|
+
|
|
14
|
+
test('★ no Korean sentence shows an internal code or a read key', () => {
|
|
15
|
+
expect(Object.entries(ko).filter(([, said]) => /\{code\}|\{read\}\/\{list\}/.test(said))).toEqual([])
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('★ a card name is refused with its bound on the server, not cut, and never saved as an English word', () => {
|
|
19
|
+
const resolver = read('server/service/card/card-resolver.ts')
|
|
20
|
+
expect(resolver).not.toMatch(/name\b[^\n]*\.slice\(0, 100\)/)
|
|
21
|
+
expect(resolver).not.toMatch(/\|\| 'card'/)
|
|
22
|
+
expect(resolver).toMatch(/refuse\(context, 'name-too-long'/)
|
|
23
|
+
expect(ko['ai-dashboard.refusal.name-too-long']).toBe('카드 이름은 {max}자까지입니다. 지금 {length}자입니다.')
|
|
24
|
+
})
|
package/translations/en.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ai-dashboard.text.delete-shared": "Delete \"{name}\"? It also leaves the dashboards of the people it is shared with.",
|
|
89
89
|
"ai-dashboard.issue.door-closed": "You may not read the data this card draws.",
|
|
90
90
|
"ai-dashboard.issue.not-found": "Nothing was found for these conditions.",
|
|
91
|
-
"ai-dashboard.issue.list-missing": "The data does not have the declared shape
|
|
91
|
+
"ai-dashboard.issue.list-missing": "The data does not have the declared shape. Tell the application's maintainers.",
|
|
92
92
|
"ai-dashboard.issue.query-failed": "The data could not be read: {message}",
|
|
93
93
|
"ai-dashboard.issue.condition-unreadable": "The data does not take this card's conditions. Change them with AI.",
|
|
94
94
|
"ai-dashboard.issue.mixed-currency-order": "The rows hold several currencies ({currencies}), which have no common order. Filter by currency or order by a converted column.",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"ai-dashboard.issue.unknown-list": "The list this card read is no longer there.",
|
|
100
100
|
"ai-dashboard.issue.unknown-column": "The column this card uses ({column}) is no longer in the data. Change it with AI.",
|
|
101
101
|
"ai-dashboard.issue.unknown-condition": "The data no longer takes this card's condition ({name}). Change it with AI.",
|
|
102
|
-
"ai-dashboard.issue.other": "This card cannot be drawn
|
|
102
|
+
"ai-dashboard.issue.other": "This card cannot be drawn.",
|
|
103
103
|
"ai-dashboard.refusal.unknown-card": "There is no such card.",
|
|
104
104
|
"ai-dashboard.refusal.card-not-shared": "This card is not shared with you.",
|
|
105
105
|
"ai-dashboard.refusal.not-your-card": "Only the one who made this card changes it - copy it to make your own.",
|
|
106
|
-
"ai-dashboard.refusal.definition-unfit": "The card definition does not fit its data
|
|
106
|
+
"ai-dashboard.refusal.definition-unfit": "The card definition does not fit its data.",
|
|
107
107
|
"ai-dashboard.refusal.unknown-conversation": "There is no such conversation.",
|
|
108
108
|
"ai-dashboard.refusal.conversation-closed": "This conversation is not open to you.",
|
|
109
109
|
"ai-dashboard.refusal.unknown-proposal": "There is no such card in this conversation.",
|
|
@@ -122,5 +122,7 @@
|
|
|
122
122
|
"ai-dashboard.refusal.size-out-of-range": "A card spans 1 to 4 columns and 1 to 2 rows.",
|
|
123
123
|
"ai-dashboard.refusal.people-unavailable": "People cannot be looked up here.",
|
|
124
124
|
"ai-dashboard.card.nothing": "No data meets this card's conditions right now.",
|
|
125
|
-
"ai-dashboard.card.blank": "(none)"
|
|
125
|
+
"ai-dashboard.card.blank": "(none)",
|
|
126
|
+
"ai-dashboard.refusal.name-too-long": "A card name takes up to {max} characters; this one has {length}.",
|
|
127
|
+
"ai-dashboard.text.untitled-card": "Untitled card"
|
|
126
128
|
}
|
package/translations/es.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ai-dashboard.text.delete-shared": "¿Eliminar «{name}»? También desaparece de los paneles de las personas con quienes se comparte.",
|
|
89
89
|
"ai-dashboard.issue.door-closed": "No tiene permiso para leer los datos de esta tarjeta.",
|
|
90
90
|
"ai-dashboard.issue.not-found": "No se encontró nada con estas condiciones.",
|
|
91
|
-
"ai-dashboard.issue.list-missing": "Los datos no tienen la forma declarada
|
|
91
|
+
"ai-dashboard.issue.list-missing": "Los datos no tienen la forma declarada. Avise a los responsables de la aplicación.",
|
|
92
92
|
"ai-dashboard.issue.query-failed": "No se pudieron leer los datos: {message}",
|
|
93
93
|
"ai-dashboard.issue.condition-unreadable": "Los datos no aceptan las condiciones de la tarjeta. Cámbielas con IA.",
|
|
94
94
|
"ai-dashboard.issue.mixed-currency-order": "Las filas tienen varias monedas ({currencies}) sin un orden común. Filtre por moneda u ordene por una columna convertida.",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"ai-dashboard.issue.unknown-list": "La lista que leía esta tarjeta ya no existe.",
|
|
100
100
|
"ai-dashboard.issue.unknown-column": "La columna que usa esta tarjeta ({column}) ya no está en los datos. Cámbiela con IA.",
|
|
101
101
|
"ai-dashboard.issue.unknown-condition": "Los datos ya no aceptan la condición de esta tarjeta ({name}). Cámbiela con IA.",
|
|
102
|
-
"ai-dashboard.issue.other": "No se puede dibujar esta tarjeta
|
|
102
|
+
"ai-dashboard.issue.other": "No se puede dibujar esta tarjeta.",
|
|
103
103
|
"ai-dashboard.refusal.unknown-card": "No existe esa tarjeta.",
|
|
104
104
|
"ai-dashboard.refusal.card-not-shared": "Esta tarjeta no se ha compartido con usted.",
|
|
105
105
|
"ai-dashboard.refusal.not-your-card": "Solo quien creó esta tarjeta puede cambiarla: cópiela para tener la suya.",
|
|
106
|
-
"ai-dashboard.refusal.definition-unfit": "La definición de la tarjeta no encaja con sus datos
|
|
106
|
+
"ai-dashboard.refusal.definition-unfit": "La definición de la tarjeta no encaja con sus datos.",
|
|
107
107
|
"ai-dashboard.refusal.unknown-conversation": "No existe esa conversación.",
|
|
108
108
|
"ai-dashboard.refusal.conversation-closed": "Esta conversación no está abierta para usted.",
|
|
109
109
|
"ai-dashboard.refusal.unknown-proposal": "No hay tal tarjeta en esta conversación.",
|
|
@@ -122,5 +122,7 @@
|
|
|
122
122
|
"ai-dashboard.refusal.size-out-of-range": "Una tarjeta ocupa de 1 a 4 columnas y de 1 a 2 filas.",
|
|
123
123
|
"ai-dashboard.refusal.people-unavailable": "Aquí no se pueden buscar personas.",
|
|
124
124
|
"ai-dashboard.card.nothing": "Ahora no hay datos que cumplan las condiciones de esta tarjeta.",
|
|
125
|
-
"ai-dashboard.card.blank": "(sin indicar)"
|
|
125
|
+
"ai-dashboard.card.blank": "(sin indicar)",
|
|
126
|
+
"ai-dashboard.refusal.name-too-long": "El nombre de una tarjeta admite hasta {max} caracteres; este tiene {length}.",
|
|
127
|
+
"ai-dashboard.text.untitled-card": "Tarjeta sin nombre"
|
|
126
128
|
}
|
package/translations/ja.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ai-dashboard.text.delete-shared": "「{name}」を削除します。共有された人のダッシュボードからも消えます。",
|
|
89
89
|
"ai-dashboard.issue.door-closed": "このカードが読むデータを見る権限がありません。",
|
|
90
90
|
"ai-dashboard.issue.not-found": "この条件では何も見つかりません。",
|
|
91
|
-
"ai-dashboard.issue.list-missing": "
|
|
91
|
+
"ai-dashboard.issue.list-missing": "データの形が宣言と異なります。アプリ担当者に知らせてください。",
|
|
92
92
|
"ai-dashboard.issue.query-failed": "データを読めませんでした: {message}",
|
|
93
93
|
"ai-dashboard.issue.condition-unreadable": "カードの条件をこのデータが受け付けません。AIで修正して条件を変えてください。",
|
|
94
94
|
"ai-dashboard.issue.mixed-currency-order": "複数の通貨({currencies})があるため順位を付けられません。通貨で絞るか換算列で並べるように修正してください。",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"ai-dashboard.issue.unknown-list": "このカードが読んでいた一覧はもうありません。",
|
|
100
100
|
"ai-dashboard.issue.unknown-column": "このカードが使う列({column})がデータにもうありません。AIで修正してください。",
|
|
101
101
|
"ai-dashboard.issue.unknown-condition": "このカードの条件({name})をデータがもう受け付けません。AIで修正してください。",
|
|
102
|
-
"ai-dashboard.issue.other": "
|
|
102
|
+
"ai-dashboard.issue.other": "このカードを描けません。",
|
|
103
103
|
"ai-dashboard.refusal.unknown-card": "そのカードはありません。",
|
|
104
104
|
"ai-dashboard.refusal.card-not-shared": "このカードは共有されていません。",
|
|
105
105
|
"ai-dashboard.refusal.not-your-card": "カードを変えられるのは作った人だけです。複製して自分のカードとして修正してください。",
|
|
106
|
-
"ai-dashboard.refusal.definition-unfit": "
|
|
106
|
+
"ai-dashboard.refusal.definition-unfit": "カード定義がデータと合いません。",
|
|
107
107
|
"ai-dashboard.refusal.unknown-conversation": "その会話はありません。",
|
|
108
108
|
"ai-dashboard.refusal.conversation-closed": "この会話は見られません。",
|
|
109
109
|
"ai-dashboard.refusal.unknown-proposal": "この会話にそのカードはありません。",
|
|
@@ -122,5 +122,7 @@
|
|
|
122
122
|
"ai-dashboard.refusal.size-out-of-range": "カードは横1〜4列、縦1〜2行です。",
|
|
123
123
|
"ai-dashboard.refusal.people-unavailable": "ここでは人を探せません。",
|
|
124
124
|
"ai-dashboard.card.nothing": "現在、条件に合うデータはありません。",
|
|
125
|
-
"ai-dashboard.card.blank": "(未指定)"
|
|
125
|
+
"ai-dashboard.card.blank": "(未指定)",
|
|
126
|
+
"ai-dashboard.refusal.name-too-long": "カード名は{max}文字までです。今は{length}文字です。",
|
|
127
|
+
"ai-dashboard.text.untitled-card": "名前のないカード"
|
|
126
128
|
}
|
package/translations/ko.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ai-dashboard.text.delete-shared": "「{name}」 카드를 지웁니다. 공유받은 사람의 대시보드에서도 사라집니다.",
|
|
89
89
|
"ai-dashboard.issue.door-closed": "이 카드가 읽는 데이터를 볼 권한이 없습니다.",
|
|
90
90
|
"ai-dashboard.issue.not-found": "이 조건으로 찾은 것이 없습니다.",
|
|
91
|
-
"ai-dashboard.issue.list-missing": "데이터의 모양이 선언과
|
|
91
|
+
"ai-dashboard.issue.list-missing": "데이터의 모양이 선언과 다릅니다. 앱 담당자에게 알려 주세요.",
|
|
92
92
|
"ai-dashboard.issue.query-failed": "데이터를 읽지 못했습니다: {message}",
|
|
93
93
|
"ai-dashboard.issue.condition-unreadable": "카드의 조건을 이 데이터가 받지 않습니다. AI로 고치기로 조건을 바꿔 주세요.",
|
|
94
94
|
"ai-dashboard.issue.mixed-currency-order": "통화가 여럿({currencies})이라 순위를 매길 수 없습니다. 통화로 거르거나 원화 환산 칸으로 정렬하도록 고쳐 주세요.",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"ai-dashboard.issue.unknown-list": "이 카드가 읽던 목록이 더는 없습니다.",
|
|
100
100
|
"ai-dashboard.issue.unknown-column": "이 카드가 쓰는 칸({column})이 데이터에 더는 없습니다. AI로 고치기로 바꿔 주세요.",
|
|
101
101
|
"ai-dashboard.issue.unknown-condition": "이 카드의 조건({name})을 데이터가 더는 받지 않습니다. AI로 고치기로 바꿔 주세요.",
|
|
102
|
-
"ai-dashboard.issue.other": "이 카드를 그릴 수
|
|
102
|
+
"ai-dashboard.issue.other": "이 카드를 그릴 수 없습니다. AI로 고치기로 다시 만들어 주세요.",
|
|
103
103
|
"ai-dashboard.refusal.unknown-card": "그런 카드가 없습니다.",
|
|
104
104
|
"ai-dashboard.refusal.card-not-shared": "이 카드는 공유받지 않았습니다.",
|
|
105
105
|
"ai-dashboard.refusal.not-your-card": "카드를 바꾸는 것은 만든 사람뿐입니다. 복제해서 내 카드로 고쳐 주세요.",
|
|
106
|
-
"ai-dashboard.refusal.definition-unfit": "카드 정의가 데이터와 맞지
|
|
106
|
+
"ai-dashboard.refusal.definition-unfit": "카드 정의가 데이터와 맞지 않습니다. AI에게 카드를 다시 만들어 달라고 하세요.",
|
|
107
107
|
"ai-dashboard.refusal.unknown-conversation": "그런 대화가 없습니다.",
|
|
108
108
|
"ai-dashboard.refusal.conversation-closed": "이 대화는 볼 수 없습니다.",
|
|
109
109
|
"ai-dashboard.refusal.unknown-proposal": "이 대화에 그런 카드가 없습니다.",
|
|
@@ -122,5 +122,7 @@
|
|
|
122
122
|
"ai-dashboard.refusal.size-out-of-range": "카드는 가로 1~4칸, 세로 1~2줄입니다.",
|
|
123
123
|
"ai-dashboard.refusal.people-unavailable": "여기서는 사람을 찾을 수 없습니다.",
|
|
124
124
|
"ai-dashboard.card.nothing": "지금 조건에 맞는 데이터가 없습니다.",
|
|
125
|
-
"ai-dashboard.card.blank": "(미지정)"
|
|
125
|
+
"ai-dashboard.card.blank": "(미지정)",
|
|
126
|
+
"ai-dashboard.refusal.name-too-long": "카드 이름은 {max}자까지입니다. 지금 {length}자입니다.",
|
|
127
|
+
"ai-dashboard.text.untitled-card": "이름 없는 카드"
|
|
126
128
|
}
|
package/translations/ms.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ai-dashboard.text.delete-shared": "Padam \"{name}\"? Ia juga hilang daripada papan pemuka orang yang dikongsi.",
|
|
89
89
|
"ai-dashboard.issue.door-closed": "Anda tidak dibenarkan membaca data yang dilukis oleh kad ini.",
|
|
90
90
|
"ai-dashboard.issue.not-found": "Tiada apa ditemui untuk syarat ini.",
|
|
91
|
-
"ai-dashboard.issue.list-missing": "Data tidak mempunyai bentuk yang diisytiharkan
|
|
91
|
+
"ai-dashboard.issue.list-missing": "Data tidak mempunyai bentuk yang diisytiharkan. Maklumkan kepada penyelenggara aplikasi.",
|
|
92
92
|
"ai-dashboard.issue.query-failed": "Data tidak dapat dibaca: {message}",
|
|
93
93
|
"ai-dashboard.issue.condition-unreadable": "Data tidak menerima syarat kad ini. Ubahnya dengan AI.",
|
|
94
94
|
"ai-dashboard.issue.mixed-currency-order": "Baris mempunyai beberapa mata wang ({currencies}) tanpa susunan sepunya. Tapis mengikut mata wang atau susun mengikut lajur tukaran.",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"ai-dashboard.issue.unknown-list": "Senarai yang dibaca oleh kad ini sudah tiada.",
|
|
100
100
|
"ai-dashboard.issue.unknown-column": "Lajur yang digunakan kad ini ({column}) tiada lagi dalam data. Ubahnya dengan AI.",
|
|
101
101
|
"ai-dashboard.issue.unknown-condition": "Data tidak lagi menerima syarat kad ini ({name}). Ubahnya dengan AI.",
|
|
102
|
-
"ai-dashboard.issue.other": "Kad ini tidak boleh dilukis
|
|
102
|
+
"ai-dashboard.issue.other": "Kad ini tidak boleh dilukis.",
|
|
103
103
|
"ai-dashboard.refusal.unknown-card": "Tiada kad sedemikian.",
|
|
104
104
|
"ai-dashboard.refusal.card-not-shared": "Kad ini tidak dikongsi dengan anda.",
|
|
105
105
|
"ai-dashboard.refusal.not-your-card": "Hanya pembuat kad ini boleh mengubahnya - salin untuk menjadikannya milik anda.",
|
|
106
|
-
"ai-dashboard.refusal.definition-unfit": "Definisi kad tidak sepadan dengan datanya
|
|
106
|
+
"ai-dashboard.refusal.definition-unfit": "Definisi kad tidak sepadan dengan datanya.",
|
|
107
107
|
"ai-dashboard.refusal.unknown-conversation": "Tiada perbualan sedemikian.",
|
|
108
108
|
"ai-dashboard.refusal.conversation-closed": "Perbualan ini tidak dibuka kepada anda.",
|
|
109
109
|
"ai-dashboard.refusal.unknown-proposal": "Tiada kad sedemikian dalam perbualan ini.",
|
|
@@ -122,5 +122,7 @@
|
|
|
122
122
|
"ai-dashboard.refusal.size-out-of-range": "Kad merangkumi 1 hingga 4 lajur dan 1 hingga 2 baris.",
|
|
123
123
|
"ai-dashboard.refusal.people-unavailable": "Orang tidak boleh dicari di sini.",
|
|
124
124
|
"ai-dashboard.card.nothing": "Tiada data yang memenuhi syarat kad ini sekarang.",
|
|
125
|
-
"ai-dashboard.card.blank": "(tiada)"
|
|
125
|
+
"ai-dashboard.card.blank": "(tiada)",
|
|
126
|
+
"ai-dashboard.refusal.name-too-long": "Nama kad boleh sehingga {max} aksara; nama ini ada {length}.",
|
|
127
|
+
"ai-dashboard.text.untitled-card": "Kad tanpa nama"
|
|
126
128
|
}
|
package/translations/zh.json
CHANGED
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"ai-dashboard.text.delete-shared": "将删除「{name}」。它也会从共享对象的仪表板消失。",
|
|
89
89
|
"ai-dashboard.issue.door-closed": "您没有查看此卡片数据的权限。",
|
|
90
90
|
"ai-dashboard.issue.not-found": "按这些条件未找到任何内容。",
|
|
91
|
-
"ai-dashboard.issue.list-missing": "
|
|
91
|
+
"ai-dashboard.issue.list-missing": "数据形态与声明不符。请告知应用维护者。",
|
|
92
92
|
"ai-dashboard.issue.query-failed": "无法读取数据:{message}",
|
|
93
93
|
"ai-dashboard.issue.condition-unreadable": "此数据不接受卡片的条件。请用AI修改条件。",
|
|
94
94
|
"ai-dashboard.issue.mixed-currency-order": "存在多种货币({currencies}),无法排名。请按货币筛选或按折算列排序。",
|
|
@@ -99,11 +99,11 @@
|
|
|
99
99
|
"ai-dashboard.issue.unknown-list": "此卡片读取的列表已不存在。",
|
|
100
100
|
"ai-dashboard.issue.unknown-column": "此卡片使用的列({column})已不在数据中。请用AI修改。",
|
|
101
101
|
"ai-dashboard.issue.unknown-condition": "数据不再接受此卡片的条件({name})。请用AI修改。",
|
|
102
|
-
"ai-dashboard.issue.other": "
|
|
102
|
+
"ai-dashboard.issue.other": "无法绘制此卡片。",
|
|
103
103
|
"ai-dashboard.refusal.unknown-card": "没有这张卡片。",
|
|
104
104
|
"ai-dashboard.refusal.card-not-shared": "此卡片未共享给您。",
|
|
105
105
|
"ai-dashboard.refusal.not-your-card": "只有制作者可以修改此卡片。请复制为自己的卡片后修改。",
|
|
106
|
-
"ai-dashboard.refusal.definition-unfit": "
|
|
106
|
+
"ai-dashboard.refusal.definition-unfit": "卡片定义与数据不符。",
|
|
107
107
|
"ai-dashboard.refusal.unknown-conversation": "没有这个对话。",
|
|
108
108
|
"ai-dashboard.refusal.conversation-closed": "您无法查看此对话。",
|
|
109
109
|
"ai-dashboard.refusal.unknown-proposal": "此对话中没有这张卡片。",
|
|
@@ -122,5 +122,7 @@
|
|
|
122
122
|
"ai-dashboard.refusal.size-out-of-range": "卡片横跨1至4列、1至2行。",
|
|
123
123
|
"ai-dashboard.refusal.people-unavailable": "此处无法查找人员。",
|
|
124
124
|
"ai-dashboard.card.nothing": "目前没有符合条件的数据。",
|
|
125
|
-
"ai-dashboard.card.blank": "(未指定)"
|
|
125
|
+
"ai-dashboard.card.blank": "(未指定)",
|
|
126
|
+
"ai-dashboard.refusal.name-too-long": "卡片名称最多 {max} 个字符,现在是 {length} 个。",
|
|
127
|
+
"ai-dashboard.text.untitled-card": "未命名卡片"
|
|
126
128
|
}
|