@things-factory/shell 10.1.26 → 10.1.28
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/themes/layout-theme.css +7 -7
- package/client/themes/material-theme.css +6 -46
- package/client/themes/spacing.css +11 -9
- package/client/themes/ui-tokens.css +13 -12
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/tests/control-height-tokens.test.ts +31 -60
- package/translations/en.json +54 -1
- package/translations/ja.json +55 -1
- package/translations/ko.json +55 -1
- package/translations/ms.json +55 -1
- package/translations/zh.json +55 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/shell",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.28",
|
|
4
4
|
"description": "Core module for framework",
|
|
5
5
|
"bin": {
|
|
6
6
|
"things-factory": "bin/things-factory",
|
|
@@ -126,5 +126,5 @@
|
|
|
126
126
|
"pg": "^8.7.3",
|
|
127
127
|
"sqlite3": "^5.0.8"
|
|
128
128
|
},
|
|
129
|
-
"gitHead": "
|
|
129
|
+
"gitHead": "3a260a0f79bc6b41a692a103955bfcc541aff60e"
|
|
130
130
|
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* together - change one and it fails until the other follows.
|
|
6
6
|
*
|
|
7
7
|
* Two bundles: button heights (ACTION_HEIGHT_TOKENS, ui-tokens.css) and input heights
|
|
8
|
-
* (FORM_ELEMENT_HEIGHT_TOKENS, spacing.css). Material buttons
|
|
9
|
-
*
|
|
8
|
+
* (FORM_ELEMENT_HEIGHT_TOKENS, spacing.css). Material buttons and filter chips are sized once in the
|
|
9
|
+
* theme from those tokens; Material text fields and selects keep their own size.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { existsSync, readFileSync } from 'fs'
|
|
@@ -33,14 +33,19 @@ function themeDeclarations(file: string): Record<string, string> {
|
|
|
33
33
|
return Object.fromEntries([...css.matchAll(/(--[a-z0-9-]+)\s*:\s*([^;]+);/g)].map(m => [m[1], m[2].trim()]))
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function
|
|
36
|
+
function expectPlatformSlots(constants: Record<string, number>, theme: Record<string, string>) {
|
|
37
|
+
/*
|
|
38
|
+
* Each token opens a slot for operato-suite and falls back to the platform default
|
|
39
|
+
* (ADR-0060 decision 6-1). The suite never redefines the token itself, so nothing depends on which
|
|
40
|
+
* stylesheet loads last.
|
|
41
|
+
*/
|
|
37
42
|
for (const [token, px] of Object.entries(constants)) {
|
|
38
|
-
expect({ token, value: theme[token] }).toEqual({ token, value:
|
|
43
|
+
expect({ token, value: theme[token] }).toEqual({ token, value: `var(--suite-${token.slice(2)}, ${px}px)` })
|
|
39
44
|
}
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
describe('button height tokens', () => {
|
|
43
|
-
it('the shell theme
|
|
48
|
+
it('the shell theme opens every @operato/styles action height as a suite slot over the platform default', () => {
|
|
44
49
|
const constants = stylesConstants('action-heights.js', 'ACTION_HEIGHT_TOKENS')
|
|
45
50
|
|
|
46
51
|
expect(Object.keys(constants).sort()).toEqual([
|
|
@@ -49,7 +54,7 @@ describe('button height tokens', () => {
|
|
|
49
54
|
'--form-action-height',
|
|
50
55
|
'--popup-action-height'
|
|
51
56
|
])
|
|
52
|
-
|
|
57
|
+
expectPlatformSlots(constants, themeDeclarations('ui-tokens.css'))
|
|
53
58
|
})
|
|
54
59
|
|
|
55
60
|
it('Material buttons take the form height, set once in the theme', () => {
|
|
@@ -63,15 +68,19 @@ describe('button height tokens', () => {
|
|
|
63
68
|
}
|
|
64
69
|
})
|
|
65
70
|
|
|
66
|
-
it('assist chips
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
it('assist chips: 36px (44px by finger) on the platform, the page action height in the operato products', () => {
|
|
72
|
+
const css = readFileSync(path.join(THEMES, 'layout-theme.css'), 'utf-8').replace(/\/\*[\s\S]*?\*\//g, '')
|
|
73
|
+
const values = [...css.matchAll(/--md-assist-chip-container-height\s*:\s*([^;]+);/g)].map(m => m[1].trim())
|
|
74
|
+
|
|
75
|
+
expect(values).toEqual([
|
|
76
|
+
'var(--suite-context-action-height, 36px)',
|
|
77
|
+
'var(--suite-context-action-height, var(--ui-tap, 44px))'
|
|
78
|
+
])
|
|
70
79
|
})
|
|
71
80
|
})
|
|
72
81
|
|
|
73
82
|
describe('input height tokens', () => {
|
|
74
|
-
it('the shell theme
|
|
83
|
+
it('the shell theme opens small, medium and large as suite slots over the platform defaults, and nothing else', () => {
|
|
75
84
|
const constants = stylesConstants('form-element-heights.js', 'FORM_ELEMENT_HEIGHT_TOKENS')
|
|
76
85
|
const theme = themeDeclarations('spacing.css')
|
|
77
86
|
|
|
@@ -80,7 +89,7 @@ describe('input height tokens', () => {
|
|
|
80
89
|
'--form-element-height-medium',
|
|
81
90
|
'--form-element-height-small'
|
|
82
91
|
])
|
|
83
|
-
|
|
92
|
+
expectPlatformSlots(constants, theme)
|
|
84
93
|
expect(
|
|
85
94
|
Object.keys(theme)
|
|
86
95
|
.filter(name => name.startsWith('--form-element-height-'))
|
|
@@ -88,55 +97,17 @@ describe('input height tokens', () => {
|
|
|
88
97
|
).toEqual(Object.keys(constants).sort())
|
|
89
98
|
})
|
|
90
99
|
|
|
91
|
-
it('
|
|
92
|
-
/*
|
|
93
|
-
* The tokens are separate so one use can change on its own (user decision 2026-09-17). This test
|
|
94
|
-
* is a layout rule on top of that: a field and a button that stand on one row have one height.
|
|
95
|
-
* If a change here is intended, change this rule - do not put the value back to make it pass.
|
|
96
|
-
*/
|
|
97
|
-
const actions = stylesConstants('action-heights.js', 'ACTION_HEIGHT_TOKENS')
|
|
98
|
-
const inputs = stylesConstants('form-element-heights.js', 'FORM_ELEMENT_HEIGHT_TOKENS')
|
|
99
|
-
const pairs = [
|
|
100
|
-
['--form-element-height-medium', '--form-action-height'],
|
|
101
|
-
['--form-element-height-small', '--cell-action-height']
|
|
102
|
-
] as const
|
|
103
|
-
|
|
104
|
-
for (const [input, button] of pairs) {
|
|
105
|
-
if (inputs[input] !== actions[button]) {
|
|
106
|
-
throw new Error(
|
|
107
|
-
`${input} (${inputs[input]}px) and ${button} (${actions[button]}px) stand on one row but differ in height. ` +
|
|
108
|
-
'If that is intended, change this layout rule; do not put the value back to make it pass.'
|
|
109
|
-
)
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
it('outlined Material fields take medium, filled ones take large', () => {
|
|
100
|
+
it('Material text fields, selects and filter chips keep their own size', () => {
|
|
101
|
+
/* Their label floats above the value inside the box and needs the room (user decision). */
|
|
115
102
|
const theme = themeDeclarations('material-theme.css')
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
'--md-outlined-field-top-space',
|
|
122
|
-
'--md-outlined-field-bottom-space'
|
|
123
|
-
]) {
|
|
124
|
-
expect({ name, value: theme[name] }).toEqual({ name, value: space('medium', 20) })
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
for (const name of [
|
|
128
|
-
'--md-filled-text-field-top-space',
|
|
129
|
-
'--md-filled-text-field-bottom-space',
|
|
130
|
-
'--md-filled-field-top-space',
|
|
131
|
-
'--md-filled-field-bottom-space'
|
|
132
|
-
]) {
|
|
133
|
-
expect({ name, value: theme[name] }).toEqual({ name, value: space('large', 20) })
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
for (const name of ['--md-filled-text-field-with-label-top-space', '--md-filled-field-with-label-bottom-space']) {
|
|
137
|
-
expect({ name, value: theme[name] }).toEqual({ name, value: space('large', 34) })
|
|
138
|
-
}
|
|
103
|
+
const fieldSizes = Object.keys(theme).filter(name =>
|
|
104
|
+
/^--md-(outlined|filled)-(text-field|select-text-field|field|select)-.*(space|height|text-size|line-height|populated-size)$/.test(
|
|
105
|
+
name
|
|
106
|
+
)
|
|
107
|
+
)
|
|
139
108
|
|
|
140
|
-
expect(
|
|
109
|
+
expect(fieldSizes).toEqual([])
|
|
110
|
+
/* filter chips keep Material's size on the platform; ox-input-select-buttons sizes its own */
|
|
111
|
+
expect(theme['--md-filter-chip-container-height']).toBeUndefined()
|
|
141
112
|
})
|
|
142
113
|
})
|
package/translations/en.json
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"button.add": "Add",
|
|
3
|
+
"button.cancel": "cancel",
|
|
4
|
+
"button.close": "Close",
|
|
5
|
+
"button.confirm": "confirm",
|
|
6
|
+
"button.create": "create",
|
|
7
|
+
"button.delete": "delete",
|
|
8
|
+
"button.detail": "detail",
|
|
9
|
+
"button.edit-contact": "edit contact",
|
|
10
|
+
"button.empty": "empty",
|
|
11
|
+
"button.export": "export",
|
|
12
|
+
"button.refresh": "refresh",
|
|
13
|
+
"button.reset": "Reset",
|
|
14
|
+
"button.save": "save",
|
|
15
|
+
"button.update": "update",
|
|
16
|
+
"error.value is empty": "{value} is empty",
|
|
17
|
+
"field.active": "active",
|
|
18
|
+
"field.address": "address",
|
|
19
|
+
"field.attributes": "attributes",
|
|
2
20
|
"field.brand_image": "brand_image",
|
|
3
21
|
"field.brand_name": "brand_name",
|
|
22
|
+
"field.code": "code",
|
|
23
|
+
"field.company": "company",
|
|
4
24
|
"field.content_image": "content_image",
|
|
25
|
+
"field.country_code": "country code",
|
|
5
26
|
"field.created-at": "created at",
|
|
6
27
|
"field.created_at": "created at",
|
|
7
28
|
"field.creator": "creator",
|
|
@@ -11,20 +32,43 @@
|
|
|
11
32
|
"field.deleter": "deleter",
|
|
12
33
|
"field.description": "description",
|
|
13
34
|
"field.domain": "domain",
|
|
35
|
+
"field.email": "email address",
|
|
36
|
+
"field.group": "group",
|
|
14
37
|
"field.id": "id",
|
|
15
38
|
"field.name": "name",
|
|
39
|
+
"field.params": "parameters",
|
|
40
|
+
"field.platform": "platform",
|
|
41
|
+
"field.provider": "provider",
|
|
42
|
+
"field.rank": "rank",
|
|
43
|
+
"field.required role": "required role",
|
|
44
|
+
"field.status": "status",
|
|
16
45
|
"field.subdomain": "subdomain",
|
|
17
46
|
"field.system_flag": "system_flag",
|
|
18
47
|
"field.theme": "theme",
|
|
48
|
+
"field.thumbnail": "thumbnail",
|
|
19
49
|
"field.timezone": "timezone",
|
|
50
|
+
"field.type": "type",
|
|
51
|
+
"field.uom": "unit",
|
|
20
52
|
"field.updated-at": "updated at",
|
|
21
53
|
"field.updated_at": "updated at",
|
|
22
54
|
"field.updater": "updater",
|
|
55
|
+
"field.value": "value",
|
|
56
|
+
"label.company": "company",
|
|
57
|
+
"label.days": "days",
|
|
58
|
+
"label.description": "description",
|
|
23
59
|
"label.env-var": "environment variable",
|
|
60
|
+
"label.hours": "hours",
|
|
61
|
+
"label.minutes": "minutes",
|
|
62
|
+
"label.name": "name",
|
|
63
|
+
"label.seconds": "seconds",
|
|
64
|
+
"label.state": "state",
|
|
65
|
+
"label.status": "Status",
|
|
66
|
+
"label.type": "type",
|
|
24
67
|
"prompt.sure to navigate away?": "You have unsaved changes. Are you sure you want to navigate away?",
|
|
25
68
|
"text.are_you_sure": "are you sure?",
|
|
26
69
|
"text.ask ai": "ask ai",
|
|
27
70
|
"text.column visibility setting": "column visibility",
|
|
71
|
+
"text.completed": "completed",
|
|
28
72
|
"text.copied": "copied",
|
|
29
73
|
"text.copy all": "copy all",
|
|
30
74
|
"text.copy failed": "copy failed",
|
|
@@ -32,14 +76,23 @@
|
|
|
32
76
|
"text.data_deleted_successfully": "data deleted successfully",
|
|
33
77
|
"text.data_updated_successfully": "data updated successfully",
|
|
34
78
|
"text.data_uploaded_successfully": "data uploaded successfully",
|
|
79
|
+
"text.draft": "draft",
|
|
80
|
+
"text.error": "error",
|
|
35
81
|
"text.existing_item_found": "existing item found",
|
|
82
|
+
"text.failed": "failed",
|
|
83
|
+
"text.info_x_successfully": "{x} success.",
|
|
36
84
|
"text.nothing_changed": "nothing changed",
|
|
37
85
|
"text.nothing_selected": "nothing selected",
|
|
38
86
|
"text.offline": "offline",
|
|
39
87
|
"text.online": "online",
|
|
88
|
+
"text.sure_to_x": "Sure to {x}?",
|
|
40
89
|
"text.technical detail": "technical detail",
|
|
41
90
|
"text.there_is_nothing_to_delete": "there is nothing to delete",
|
|
42
91
|
"text.there_is_nothing_to_process": "there is nothing to process",
|
|
43
92
|
"text.there_is_nothing_to_save": "there is nothing to save",
|
|
44
|
-
"text.you.are.now.in": "you are now in {state}"
|
|
93
|
+
"text.you.are.now.in": "you are now in {state}",
|
|
94
|
+
"title.event list": "event list",
|
|
95
|
+
"title.import event": "import events",
|
|
96
|
+
"title.lookup role": "lookup role",
|
|
97
|
+
"title.select_item": "select item"
|
|
45
98
|
}
|
package/translations/ja.json
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"button.add": "追加",
|
|
3
|
+
"button.cancel": "キャンセル",
|
|
4
|
+
"button.close": "閉じる",
|
|
5
|
+
"button.confirm": "確認",
|
|
6
|
+
"button.create": "作成",
|
|
7
|
+
"button.delete": "削除",
|
|
8
|
+
"button.detail": "詳細",
|
|
9
|
+
"button.edit-contact": "連絡先を編集",
|
|
10
|
+
"button.empty": "空にする",
|
|
11
|
+
"button.export": "エクスポート",
|
|
12
|
+
"button.refresh": "リロード",
|
|
13
|
+
"button.reset": "リセット",
|
|
14
|
+
"button.save": "保存",
|
|
15
|
+
"button.update": "更新",
|
|
16
|
+
"error.value is empty": "{value}の値が存在しません.",
|
|
17
|
+
"field.active": "アクティブ化",
|
|
18
|
+
"field.address": "住所",
|
|
19
|
+
"field.attributes": "属性",
|
|
2
20
|
"field.brand_image": "ブランド写真",
|
|
3
21
|
"field.brand_name": "ブランド名",
|
|
22
|
+
"field.code": "コード",
|
|
23
|
+
"field.company": "会社",
|
|
4
24
|
"field.content_image": "コンテンツ イメージ",
|
|
25
|
+
"field.country_code": "国家コード",
|
|
5
26
|
"field.created-at": "作成日時",
|
|
6
27
|
"field.created_at": "作成日時",
|
|
7
28
|
"field.creator": "作成者",
|
|
@@ -11,20 +32,43 @@
|
|
|
11
32
|
"field.deleter": "削除者",
|
|
12
33
|
"field.description": "説明",
|
|
13
34
|
"field.domain": "ドメイン",
|
|
35
|
+
"field.email": "メール",
|
|
36
|
+
"field.group": "グループ",
|
|
14
37
|
"field.id": "ID",
|
|
15
38
|
"field.name": "名前",
|
|
39
|
+
"field.params": "パラメーター",
|
|
40
|
+
"field.platform": "プラットフォーム",
|
|
41
|
+
"field.provider": "プロバイダー",
|
|
42
|
+
"field.rank": "順位",
|
|
43
|
+
"field.required role": "必要な役割",
|
|
44
|
+
"field.status": "状態",
|
|
16
45
|
"field.subdomain": "サブ ドメイン",
|
|
17
46
|
"field.system_flag": "system_flag",
|
|
18
47
|
"field.theme": "テーマ",
|
|
48
|
+
"field.thumbnail": "プレビュー",
|
|
19
49
|
"field.timezone": "タイム ゾーン",
|
|
50
|
+
"field.type": "種類",
|
|
51
|
+
"field.uom": "単位",
|
|
20
52
|
"field.updated-at": "修正日時",
|
|
21
53
|
"field.updated_at": "修正日時",
|
|
22
54
|
"field.updater": "修正者",
|
|
55
|
+
"field.value": "値",
|
|
56
|
+
"label.company": "会社",
|
|
57
|
+
"label.days": "日",
|
|
58
|
+
"label.description": "説明",
|
|
23
59
|
"label.env-var": "環境変数",
|
|
60
|
+
"label.hours": "時間",
|
|
61
|
+
"label.minutes": "分",
|
|
62
|
+
"label.name": "名前",
|
|
63
|
+
"label.seconds": "秒",
|
|
64
|
+
"label.state": "状態",
|
|
65
|
+
"label.status": "状態",
|
|
66
|
+
"label.type": "タイプ",
|
|
24
67
|
"prompt.sure to navigate away?": "未保存の変更があります。本当に移動しますか?",
|
|
25
68
|
"text.are_you_sure": "進行しますか?",
|
|
26
69
|
"text.ask ai": "AIに聞く",
|
|
27
70
|
"text.column visibility setting": "カラムの表示設定",
|
|
71
|
+
"text.completed": "完了しました.",
|
|
28
72
|
"text.copied": "コピーしました",
|
|
29
73
|
"text.copy all": "すべてコピー",
|
|
30
74
|
"text.copy failed": "コピーできませんでした",
|
|
@@ -32,13 +76,23 @@
|
|
|
32
76
|
"text.data_deleted_successfully": "資料の削除に成功しました.",
|
|
33
77
|
"text.data_updated_successfully": "資料の修正に成功しました.",
|
|
34
78
|
"text.data_uploaded_successfully": "資料が正常に作成されました.",
|
|
79
|
+
"text.draft": "ドラフト保存",
|
|
80
|
+
"text.error": "エラー",
|
|
81
|
+
"text.existing_item_found": "既にある項目です",
|
|
82
|
+
"text.failed": "失敗",
|
|
83
|
+
"text.info_x_successfully": "{x}に成功しました.",
|
|
35
84
|
"text.nothing_changed": "変更なし",
|
|
36
85
|
"text.nothing_selected": "選択されていない",
|
|
37
86
|
"text.offline": "オフライン",
|
|
38
87
|
"text.online": "オンライン",
|
|
88
|
+
"text.sure_to_x": "{x}しますか?",
|
|
39
89
|
"text.technical detail": "技術情報",
|
|
40
90
|
"text.there_is_nothing_to_delete": "削除するデータがありません.",
|
|
41
91
|
"text.there_is_nothing_to_process": "処理するデータがありません.",
|
|
42
92
|
"text.there_is_nothing_to_save": "保存するデータがありません.",
|
|
43
|
-
"text.you.are.now.in": "{state}になりました."
|
|
93
|
+
"text.you.are.now.in": "{state}になりました.",
|
|
94
|
+
"title.event list": "イベント一覧",
|
|
95
|
+
"title.import event": "イベントの取り込み",
|
|
96
|
+
"title.lookup role": "ロール検索",
|
|
97
|
+
"title.select_item": "アイテム選択"
|
|
44
98
|
}
|
package/translations/ko.json
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"button.add": "추가",
|
|
3
|
+
"button.cancel": "취소",
|
|
4
|
+
"button.close": "닫기",
|
|
5
|
+
"button.confirm": "확인",
|
|
6
|
+
"button.create": "생성",
|
|
7
|
+
"button.delete": "삭제",
|
|
8
|
+
"button.detail": "상세",
|
|
9
|
+
"button.edit-contact": "연락처 편집",
|
|
10
|
+
"button.empty": "비우기",
|
|
11
|
+
"button.export": "내보내기",
|
|
12
|
+
"button.refresh": "새로고침",
|
|
13
|
+
"button.reset": "초기화",
|
|
14
|
+
"button.save": "저장",
|
|
15
|
+
"button.update": "수정",
|
|
16
|
+
"error.value is empty": "{value}의 값이 존재하지 않습니다.",
|
|
17
|
+
"field.active": "활성화",
|
|
18
|
+
"field.address": "주소",
|
|
19
|
+
"field.attributes": "속성",
|
|
2
20
|
"field.brand_image": "브랜드 사진",
|
|
3
21
|
"field.brand_name": "브랜드 이름",
|
|
22
|
+
"field.code": "코드",
|
|
23
|
+
"field.company": "회사",
|
|
4
24
|
"field.content_image": "컨텐츠 이미지",
|
|
25
|
+
"field.country_code": "국가 코드",
|
|
5
26
|
"field.created-at": "생성일시",
|
|
6
27
|
"field.created_at": "생성일시",
|
|
7
28
|
"field.creator": "생성자",
|
|
@@ -11,20 +32,43 @@
|
|
|
11
32
|
"field.deleter": "삭제자",
|
|
12
33
|
"field.description": "설명",
|
|
13
34
|
"field.domain": "도메인",
|
|
35
|
+
"field.email": "이메일",
|
|
36
|
+
"field.group": "그룹",
|
|
14
37
|
"field.id": "아이디",
|
|
15
38
|
"field.name": "이름",
|
|
39
|
+
"field.params": "파라미터",
|
|
40
|
+
"field.platform": "플랫폼",
|
|
41
|
+
"field.provider": "공급자",
|
|
42
|
+
"field.rank": "순위",
|
|
43
|
+
"field.required role": "필수 역할",
|
|
44
|
+
"field.status": "상태",
|
|
16
45
|
"field.subdomain": "서브도메인",
|
|
17
46
|
"field.system_flag": "system_flag",
|
|
18
47
|
"field.theme": "테마",
|
|
48
|
+
"field.thumbnail": "미리보기",
|
|
19
49
|
"field.timezone": "타임존",
|
|
50
|
+
"field.type": "종류",
|
|
51
|
+
"field.uom": "단위",
|
|
20
52
|
"field.updated-at": "수정일시",
|
|
21
53
|
"field.updated_at": "수정일시",
|
|
22
54
|
"field.updater": "수정자",
|
|
55
|
+
"field.value": "값",
|
|
56
|
+
"label.company": "회사",
|
|
57
|
+
"label.days": "일",
|
|
58
|
+
"label.description": "설명",
|
|
23
59
|
"label.env-var": "환경 변수",
|
|
60
|
+
"label.hours": "시간",
|
|
61
|
+
"label.minutes": "분",
|
|
62
|
+
"label.name": "이름",
|
|
63
|
+
"label.seconds": "초",
|
|
64
|
+
"label.state": "상태",
|
|
65
|
+
"label.status": "상태",
|
|
66
|
+
"label.type": "유형",
|
|
24
67
|
"prompt.sure to navigate away?": "변경 사항이 저장되지 않았습니다. 정말 이동하시겠습니까?",
|
|
25
68
|
"text.are_you_sure": "진행하시겠습니까?",
|
|
26
69
|
"text.ask ai": "AI에게 묻기",
|
|
27
70
|
"text.column visibility setting": "컬럼 보이기",
|
|
71
|
+
"text.completed": "완료되었습니다.",
|
|
28
72
|
"text.copied": "복사했습니다",
|
|
29
73
|
"text.copy all": "전체 복사",
|
|
30
74
|
"text.copy failed": "복사하지 못했습니다",
|
|
@@ -32,13 +76,23 @@
|
|
|
32
76
|
"text.data_deleted_successfully": "성공적으로 자료를 삭제하였습니다.",
|
|
33
77
|
"text.data_updated_successfully": "성공적으로 자료를 수정하였습니다.",
|
|
34
78
|
"text.data_uploaded_successfully": "성공적으로 자료를 업로드하였습니다.",
|
|
79
|
+
"text.draft": "초안저장",
|
|
80
|
+
"text.error": "오류",
|
|
81
|
+
"text.existing_item_found": "이미 있는 항목입니다",
|
|
82
|
+
"text.failed": "실패",
|
|
83
|
+
"text.info_x_successfully": "{x}했습니다",
|
|
35
84
|
"text.nothing_changed": "변경사항 없음",
|
|
36
85
|
"text.nothing_selected": "선택되지 않음",
|
|
37
86
|
"text.offline": "오프라인",
|
|
38
87
|
"text.online": "온라인",
|
|
88
|
+
"text.sure_to_x": "{x}하시겠습니까?",
|
|
39
89
|
"text.technical detail": "기술 정보",
|
|
40
90
|
"text.there_is_nothing_to_delete": "삭제할 데이터가 없습니다.",
|
|
41
91
|
"text.there_is_nothing_to_process": "처리할 데이터가 없습니다.",
|
|
42
92
|
"text.there_is_nothing_to_save": "저장할 데이터가 없습니다.",
|
|
43
|
-
"text.you.are.now.in": "{state} 되었습니다."
|
|
93
|
+
"text.you.are.now.in": "{state} 되었습니다.",
|
|
94
|
+
"title.event list": "일정",
|
|
95
|
+
"title.import event": "일정 가져오기",
|
|
96
|
+
"title.lookup role": "역할 검색",
|
|
97
|
+
"title.select_item": "아이템 선택"
|
|
44
98
|
}
|
package/translations/ms.json
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"button.add": "Tambah",
|
|
3
|
+
"button.cancel": "batal",
|
|
4
|
+
"button.close": "tutup",
|
|
5
|
+
"button.confirm": "sahkan",
|
|
6
|
+
"button.create": "cipta",
|
|
7
|
+
"button.delete": "padam",
|
|
8
|
+
"button.detail": "perincian",
|
|
9
|
+
"button.edit-contact": "edit kenalan",
|
|
10
|
+
"button.empty": "kosongkan",
|
|
11
|
+
"button.export": "Eksport",
|
|
12
|
+
"button.refresh": "Segar Semula",
|
|
13
|
+
"button.reset": "Tetap Semula",
|
|
14
|
+
"button.save": "simpan",
|
|
15
|
+
"button.update": "Kemaskini",
|
|
16
|
+
"error.value is empty": "{value} kosong",
|
|
17
|
+
"field.active": "Aktif",
|
|
18
|
+
"field.address": "alamat",
|
|
19
|
+
"field.attributes": "ciri-ciri",
|
|
2
20
|
"field.brand_image": "imej",
|
|
3
21
|
"field.brand_name": "jenama",
|
|
22
|
+
"field.code": "kod",
|
|
23
|
+
"field.company": "syarikat",
|
|
4
24
|
"field.content_image": "isian imej",
|
|
25
|
+
"field.country_code": "kod negara",
|
|
5
26
|
"field.created-at": "dicipta pada",
|
|
6
27
|
"field.created_at": "dicipta pada",
|
|
7
28
|
"field.creator": "pencipta",
|
|
@@ -11,20 +32,43 @@
|
|
|
11
32
|
"field.deleter": "pembuang",
|
|
12
33
|
"field.description": "deskripsi",
|
|
13
34
|
"field.domain": "domain",
|
|
35
|
+
"field.email": "E-mel",
|
|
36
|
+
"field.group": "kumpulan",
|
|
14
37
|
"field.id": "id",
|
|
15
38
|
"field.name": "nama",
|
|
39
|
+
"field.params": "parameter",
|
|
40
|
+
"field.platform": "platform",
|
|
41
|
+
"field.provider": "penyedia",
|
|
42
|
+
"field.rank": "susunan",
|
|
43
|
+
"field.required role": "peranan diperlukan",
|
|
44
|
+
"field.status": "status",
|
|
16
45
|
"field.subdomain": "domain-sub",
|
|
17
46
|
"field.system_flag": "bendera sistem",
|
|
18
47
|
"field.theme": "tema",
|
|
48
|
+
"field.thumbnail": "lakaran",
|
|
19
49
|
"field.timezone": "zon waktu",
|
|
50
|
+
"field.type": "jenis",
|
|
51
|
+
"field.uom": "unit",
|
|
20
52
|
"field.updated-at": "dikemaskini pada",
|
|
21
53
|
"field.updated_at": "dikemaskini pada",
|
|
22
54
|
"field.updater": "pengemaskini",
|
|
55
|
+
"field.value": "nilai",
|
|
56
|
+
"label.company": "syarikat",
|
|
57
|
+
"label.days": "hari",
|
|
58
|
+
"label.description": "keterangan",
|
|
23
59
|
"label.env-var": "pengubahsuaian persekitaran",
|
|
60
|
+
"label.hours": "jam",
|
|
61
|
+
"label.minutes": "minit",
|
|
62
|
+
"label.name": "nama",
|
|
63
|
+
"label.seconds": "saat",
|
|
64
|
+
"label.state": "negeri",
|
|
65
|
+
"label.status": "Status",
|
|
66
|
+
"label.type": "Jenis",
|
|
24
67
|
"prompt.sure to navigate away?": "Anda mempunyai perubahan yang belum disimpan. Adakah anda pasti mahu berpindah?",
|
|
25
68
|
"text.are_you_sure": "adakah anda pasti?",
|
|
26
69
|
"text.ask ai": "tanya ai",
|
|
27
70
|
"text.column visibility setting": "tetapan kebolehlihatan kolum",
|
|
71
|
+
"text.completed": "selesai",
|
|
28
72
|
"text.copied": "disalin",
|
|
29
73
|
"text.copy all": "salin semua",
|
|
30
74
|
"text.copy failed": "gagal menyalin",
|
|
@@ -32,13 +76,23 @@
|
|
|
32
76
|
"text.data_deleted_successfully": "data telah berjaya dipadam",
|
|
33
77
|
"text.data_updated_successfully": "data berjaya dikemaskini",
|
|
34
78
|
"text.data_uploaded_successfully": "data uploaded successfully",
|
|
79
|
+
"text.draft": "draf",
|
|
80
|
+
"text.error": "Ralat",
|
|
81
|
+
"text.existing_item_found": "item ini sudah ada",
|
|
82
|
+
"text.failed": "gagal",
|
|
83
|
+
"text.info_x_successfully": "{x} berjaya.",
|
|
35
84
|
"text.nothing_changed": "nothing changed",
|
|
36
85
|
"text.nothing_selected": "nothing selected",
|
|
37
86
|
"text.offline": "luar talian",
|
|
38
87
|
"text.online": "dalam talian",
|
|
88
|
+
"text.sure_to_x": "Pasti {x}?",
|
|
39
89
|
"text.technical detail": "maklumat teknikal",
|
|
40
90
|
"text.there_is_nothing_to_delete": "there is nothing to delete",
|
|
41
91
|
"text.there_is_nothing_to_process": "there is nothing to process",
|
|
42
92
|
"text.there_is_nothing_to_save": "there is nothing to save",
|
|
43
|
-
"text.you.are.now.in": "anda berada di {state}"
|
|
93
|
+
"text.you.are.now.in": "anda berada di {state}",
|
|
94
|
+
"title.event list": "senarai acara",
|
|
95
|
+
"title.import event": "import acara",
|
|
96
|
+
"title.lookup role": "cari peranan",
|
|
97
|
+
"title.select_item": "pilih item"
|
|
44
98
|
}
|
package/translations/zh.json
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"button.add": "添加",
|
|
3
|
+
"button.cancel": "取消",
|
|
4
|
+
"button.close": "关闭",
|
|
5
|
+
"button.confirm": "确认",
|
|
6
|
+
"button.create": "创建",
|
|
7
|
+
"button.delete": "删除",
|
|
8
|
+
"button.detail": "详情",
|
|
9
|
+
"button.edit-contact": "编辑联系人",
|
|
10
|
+
"button.empty": "清空",
|
|
11
|
+
"button.export": "导出",
|
|
12
|
+
"button.refresh": "刷新",
|
|
13
|
+
"button.reset": "初始化",
|
|
14
|
+
"button.save": "保存",
|
|
15
|
+
"button.update": "更新",
|
|
16
|
+
"error.value is empty": "{value}为空",
|
|
17
|
+
"field.active": "激活",
|
|
18
|
+
"field.address": "地址",
|
|
19
|
+
"field.attributes": "属性",
|
|
2
20
|
"field.brand_image": "品牌图片",
|
|
3
21
|
"field.brand_name": "品牌名称",
|
|
22
|
+
"field.code": "代码",
|
|
23
|
+
"field.company": "公司",
|
|
4
24
|
"field.content_image": "内容图片",
|
|
25
|
+
"field.country_code": "国家代码",
|
|
5
26
|
"field.created-at": "创建时间",
|
|
6
27
|
"field.created_at": "创建时间",
|
|
7
28
|
"field.creator": "创建者",
|
|
@@ -11,20 +32,43 @@
|
|
|
11
32
|
"field.deleter": "删除者",
|
|
12
33
|
"field.description": "描述",
|
|
13
34
|
"field.domain": "域名",
|
|
35
|
+
"field.email": "电子邮件",
|
|
36
|
+
"field.group": "组合",
|
|
14
37
|
"field.id": "账号",
|
|
15
38
|
"field.name": "姓名",
|
|
39
|
+
"field.params": "参数",
|
|
40
|
+
"field.platform": "platform",
|
|
41
|
+
"field.provider": "提供者",
|
|
42
|
+
"field.rank": "列为",
|
|
43
|
+
"field.required role": "所需角色",
|
|
44
|
+
"field.status": "状态",
|
|
16
45
|
"field.subdomain": "子域名",
|
|
17
46
|
"field.system_flag": "系统标志",
|
|
18
47
|
"field.theme": "主题",
|
|
48
|
+
"field.thumbnail": "缩略图",
|
|
19
49
|
"field.timezone": "时区",
|
|
50
|
+
"field.type": "类型",
|
|
51
|
+
"field.uom": "单位",
|
|
20
52
|
"field.updated-at": "更新时间",
|
|
21
53
|
"field.updated_at": "更新时间",
|
|
22
54
|
"field.updater": "更新者",
|
|
55
|
+
"field.value": "值",
|
|
56
|
+
"label.company": "公司",
|
|
57
|
+
"label.days": "天",
|
|
58
|
+
"label.description": "描述",
|
|
23
59
|
"label.env-var": "环境变量",
|
|
60
|
+
"label.hours": "小时",
|
|
61
|
+
"label.minutes": "分钟",
|
|
62
|
+
"label.name": "名称",
|
|
63
|
+
"label.seconds": "秒",
|
|
64
|
+
"label.state": "状态",
|
|
65
|
+
"label.status": "状态",
|
|
66
|
+
"label.type": "类型",
|
|
24
67
|
"prompt.sure to navigate away?": "更改未保存。您确定要离开吗?",
|
|
25
68
|
"text.are_you_sure": "您确定要进行吗?",
|
|
26
69
|
"text.ask ai": "询问 AI",
|
|
27
70
|
"text.column visibility setting": "列显示",
|
|
71
|
+
"text.completed": "已完成",
|
|
28
72
|
"text.copied": "已复制",
|
|
29
73
|
"text.copy all": "复制全部",
|
|
30
74
|
"text.copy failed": "复制失败",
|
|
@@ -32,13 +76,23 @@
|
|
|
32
76
|
"text.data_deleted_successfully": "数据删除成功。",
|
|
33
77
|
"text.data_updated_successfully": "数据更新成功。",
|
|
34
78
|
"text.data_uploaded_successfully": "数据上传成功。",
|
|
79
|
+
"text.draft": "草稿",
|
|
80
|
+
"text.error": "错误",
|
|
81
|
+
"text.existing_item_found": "该项目已存在",
|
|
82
|
+
"text.failed": "失败",
|
|
83
|
+
"text.info_x_successfully": "{x} 成功。",
|
|
35
84
|
"text.nothing_changed": "无更改",
|
|
36
85
|
"text.nothing_selected": "未选择",
|
|
37
86
|
"text.offline": "离线",
|
|
38
87
|
"text.online": "在线",
|
|
88
|
+
"text.sure_to_x": "确定 {x}?",
|
|
39
89
|
"text.technical detail": "技术信息",
|
|
40
90
|
"text.there_is_nothing_to_delete": "没有要删除的数据。",
|
|
41
91
|
"text.there_is_nothing_to_process": "没有要处理的数据。",
|
|
42
92
|
"text.there_is_nothing_to_save": "没有要保存的数据。",
|
|
43
|
-
"text.you.are.now.in": "您现在是 {state}。"
|
|
93
|
+
"text.you.are.now.in": "您现在是 {state}。",
|
|
94
|
+
"title.event list": "事件列表",
|
|
95
|
+
"title.import event": "导入事件",
|
|
96
|
+
"title.lookup role": "查找角色",
|
|
97
|
+
"title.select_item": "选择项目"
|
|
44
98
|
}
|