vome-core 0.3.9 → 0.3.11

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.
Files changed (120) hide show
  1. package/dist/admin/api/client.js +9 -8
  2. package/dist/admin/components/ui/avatar/index.js +1 -1
  3. package/dist/admin/components/ui/badge/index.d.ts +1 -1
  4. package/dist/admin/components/ui/button/index.d.ts +1 -1
  5. package/dist/admin/components/ui/checkbox/index.js +1 -1
  6. package/dist/admin/components/ui/dialog/index.js +1 -1
  7. package/dist/admin/components/ui/dropdown-menu/index.js +1 -1
  8. package/dist/admin/components/ui/input/Input.vue +2 -1
  9. package/dist/admin/components/ui/input/index.js +1 -1
  10. package/dist/admin/components/ui/label/index.js +1 -1
  11. package/dist/admin/components/ui/scroll-area/index.js +1 -1
  12. package/dist/admin/components/ui/select/index.js +1 -1
  13. package/dist/admin/components/ui/separator/index.js +1 -1
  14. package/dist/admin/components/ui/sheet/index.js +1 -1
  15. package/dist/admin/components/ui/sonner/index.js +1 -1
  16. package/dist/admin/components/ui/table/index.js +1 -1
  17. package/dist/admin/components/ui/tabs/index.js +1 -1
  18. package/dist/admin/components/ui/tooltip/index.js +1 -1
  19. package/dist/admin/components/vm-aside.vue +8 -6
  20. package/dist/admin/components/vm-auto-perm-dialog.vue +12 -11
  21. package/dist/admin/components/vm-check-tree.vue +3 -2
  22. package/dist/admin/components/vm-dept-tree.vue +32 -31
  23. package/dist/admin/components/vm-empty.vue +16 -2
  24. package/dist/admin/components/vm-eps-perm-picker.vue +3 -2
  25. package/dist/admin/components/vm-form-dialog.vue +4 -3
  26. package/dist/admin/components/vm-group-cascader.vue +5 -4
  27. package/dist/admin/components/vm-icon-picker.vue +24 -15
  28. package/dist/admin/components/vm-inline-search.vue +3 -2
  29. package/dist/admin/components/vm-loading.vue +4 -3
  30. package/dist/admin/components/vm-markdown.vue +6 -5
  31. package/dist/admin/components/vm-role-picker.vue +6 -5
  32. package/dist/admin/components/vm-view-path-picker.vue +3 -2
  33. package/dist/admin/crud/auto-fields.js +1 -1
  34. package/dist/admin/crud/components/vm-avatar.vue +2 -1
  35. package/dist/admin/crud/components/vm-color-picker.vue +8 -8
  36. package/dist/admin/crud/components/vm-column-custom.vue +6 -5
  37. package/dist/admin/crud/components/vm-copy-btn.vue +4 -3
  38. package/dist/admin/crud/components/vm-date-calendar-panel.vue +30 -27
  39. package/dist/admin/crud/components/vm-date-picker.vue +6 -5
  40. package/dist/admin/crud/components/vm-date-range.vue +5 -4
  41. package/dist/admin/crud/components/vm-datetime-field.vue +4 -3
  42. package/dist/admin/crud/components/vm-json-code.vue +3 -2
  43. package/dist/admin/crud/components/vm-json-editor.vue +3 -2
  44. package/dist/admin/crud/components/vm-json-kv-editor.vue +13 -12
  45. package/dist/admin/crud/components/vm-multi-select.vue +5 -4
  46. package/dist/admin/crud/components/vm-number-range.vue +5 -4
  47. package/dist/admin/crud/components/vm-preview-viewer.vue +33 -29
  48. package/dist/admin/crud/components/vm-richtext-extensions.js +1 -1
  49. package/dist/admin/crud/components/vm-richtext.vue +33 -30
  50. package/dist/admin/crud/components/vm-select.vue +4 -3
  51. package/dist/admin/crud/components/vm-status-tag.vue +2 -1
  52. package/dist/admin/crud/components/vm-switch.vue +5 -4
  53. package/dist/admin/crud/components/vm-text-link.vue +3 -2
  54. package/dist/admin/crud/components/vm-tree-select.vue +3 -2
  55. package/dist/admin/crud/components/vm-upload-item.vue +6 -4
  56. package/dist/admin/crud/components/vm-upload.vue +6 -5
  57. package/dist/admin/crud/config.js +1 -1
  58. package/dist/admin/crud/confirm.js +1 -1
  59. package/dist/admin/crud/crud-page-request.js +1 -1
  60. package/dist/admin/crud/data-i18n.js +1 -1
  61. package/dist/admin/crud/dict.d.ts +1 -1
  62. package/dist/admin/crud/dict.js +1 -1
  63. package/dist/admin/crud/export-fetch.js +1 -1
  64. package/dist/admin/crud/key.js +1 -1
  65. package/dist/admin/crud/plugins.js +1 -1
  66. package/dist/admin/crud/span.js +1 -1
  67. package/dist/admin/crud/style.js +1 -1
  68. package/dist/admin/crud/validate.js +1 -1
  69. package/dist/admin/crud/vm-crud.vue +15 -15
  70. package/dist/admin/crud/vm-data-i18n-btn.vue +1 -1
  71. package/dist/admin/crud/vm-export-btn.vue +7 -7
  72. package/dist/admin/crud/vm-import-btn.vue +33 -27
  73. package/dist/admin/crud/vm-table.vue +7 -2
  74. package/dist/admin/crud/vm-upsert.vue +1 -0
  75. package/dist/admin/directives/perm.js +1 -1
  76. package/dist/admin/hooks/useUpload.js +1 -1
  77. package/dist/admin/lib/browser.js +1 -1
  78. package/dist/admin/lib/cn.js +1 -1
  79. package/dist/admin/lib/dialog-float.js +1 -1
  80. package/dist/admin/lib/export-excel.js +1 -1
  81. package/dist/admin/lib/file-preview.js +8 -6
  82. package/dist/admin/lib/import-excel.js +1 -1
  83. package/dist/admin/lib/json.d.ts +0 -1
  84. package/dist/admin/lib/json.js +1 -1
  85. package/dist/admin/lib/menu.js +1 -1
  86. package/dist/admin/lib/micro-locale.js +1 -1
  87. package/dist/admin/lib/micro-theme.js +1 -1
  88. package/dist/admin/lib/shell.js +1 -1
  89. package/dist/admin/lib/theme-color-options.d.ts +1 -2
  90. package/dist/admin/lib/theme-color-options.js +1 -1
  91. package/dist/admin/lib/tree.js +1 -1
  92. package/dist/admin/lib/upload.d.ts +5 -0
  93. package/dist/admin/lib/upload.js +1 -1
  94. package/dist/admin/lib/video-frame.js +1 -1
  95. package/dist/admin/router/create.js +1 -1
  96. package/dist/admin/router/guards.js +1 -1
  97. package/dist/ai/index.js +1 -1
  98. package/dist/client/ai-model-registry.js +1 -1
  99. package/dist/client/base.js +1 -1
  100. package/dist/client/configure.js +1 -1
  101. package/dist/client/dict.js +1 -1
  102. package/dist/client/eps-payload.js +1 -1
  103. package/dist/client/eps.js +1 -1
  104. package/dist/client/index.js +1 -1
  105. package/dist/client/locale-store.js +1 -1
  106. package/dist/client/service.js +1 -1
  107. package/dist/client/vite-admin.js +1 -1
  108. package/dist/client/vite-auto-import.js +1 -1
  109. package/dist/client/vite-micro-proxy.js +1 -1
  110. package/dist/client/vite-plugin-eps.js +1 -1
  111. package/dist/client/vite-resolve.js +1 -1
  112. package/dist/config/index.js +1 -1
  113. package/dist/index.js +1 -1
  114. package/dist/server/index.js +1 -1
  115. package/dist/shared/datetime-picker.js +1 -1
  116. package/dist/shared/excel.js +1 -1
  117. package/dist/shared/index.js +1 -1
  118. package/dist/shared/locale-json.js +1 -1
  119. package/dist/shared/tree.js +1 -1
  120. package/package.json +1 -1
@@ -25,6 +25,7 @@
25
25
  </template>
26
26
 
27
27
  <script setup lang="ts">
28
+ import { crudLabel } from '../style'
28
29
  import { computed, ref } from 'vue'
29
30
  import VmPreviewViewer from './vm-preview-viewer.vue'
30
31
 
@@ -59,7 +60,7 @@ const displayName = computed(() => {
59
60
 
60
61
  const fallbackText = computed(() => displayName.value.slice(0, 1).toUpperCase())
61
62
 
62
- const title = computed(() => displayName.value || '头像')
63
+ const title = computed(() => displayName.value || crudLabel('avatar'))
63
64
  const boxStyle = computed(() => ({
64
65
  width: `${props.size}px`,
65
66
  height: `${props.size}px`,
@@ -9,7 +9,7 @@
9
9
  type="button"
10
10
  class="vm-color-picker__swatch"
11
11
  :disabled="disabled"
12
- :title="disabled ? undefined : '选择颜色'"
12
+ :title="disabled ? undefined : crudLabel('pickColor')"
13
13
  @click="toggle"
14
14
  >
15
15
  <span
@@ -61,7 +61,7 @@
61
61
  role="tab"
62
62
  @click="panelMode = 'theme'"
63
63
  >
64
- 主题
64
+ {{ crudLabel('theme') }}
65
65
  </button>
66
66
  <button
67
67
  type="button"
@@ -70,15 +70,15 @@
70
70
  role="tab"
71
71
  @click="panelMode = 'picker'"
72
72
  >
73
- 取色器
73
+ {{ crudLabel('colorPickerTab') }}
74
74
  </button>
75
75
  </div>
76
76
  <span v-else class="vm-color-picker__toolbar-spacer" />
77
77
  <button
78
78
  type="button"
79
79
  class="vm-color-picker__close"
80
- title="关闭"
81
- aria-label="关闭"
80
+ :title="crudLabel('dismiss')"
81
+ :aria-label="crudLabel('dismiss')"
82
82
  @click="closePanel"
83
83
  >
84
84
  <svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true">
@@ -128,7 +128,7 @@
128
128
  v-if="hasEyeDropper"
129
129
  type="button"
130
130
  class="vm-color-picker__eyedropper"
131
- title="吸取颜色"
131
+ :title="crudLabel('eyedropper')"
132
132
  @click="pickEyeDropper"
133
133
  >
134
134
  <!-- 内联 SVG:不依赖 remixicon 字体是否已加载 -->
@@ -179,7 +179,7 @@
179
179
  type="button"
180
180
  class="vm-color-picker__format"
181
181
  :class="{ 'is-open': formatOpen }"
182
- title="颜色格式"
182
+ :title="crudLabel('colorFormat')"
183
183
  @click.stop="toggleFormatMenu"
184
184
  >
185
185
  {{ formatLabel }}
@@ -247,7 +247,7 @@ import {
247
247
  resolveCssThemeColorOptions,
248
248
  type VmColorThemeOption,
249
249
  } from '../../lib/theme-color-options'
250
- import { getCrudConfig } from '../style'
250
+ import { crudLabel, getCrudConfig } from '../style'
251
251
 
252
252
  defineOptions({ name: 'vm-color-picker' })
253
253
 
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div>
3
3
  <Button size="sm" variant="outline" class="h-8" @click="open = true">
4
- 自定义列
4
+ {{ crudLabel('customColumns') }}
5
5
  </Button>
6
6
  <Dialog :open="open" @update:open="onOpenChange">
7
7
  <DialogContent
@@ -12,7 +12,7 @@
12
12
  @interact-outside="preventDialogOutsideClose"
13
13
  >
14
14
  <DialogHeader class="vm-crud-shell__head">
15
- <DialogTitle class="vm-crud-shell__title">自定义列</DialogTitle>
15
+ <DialogTitle class="vm-crud-shell__title">{{ crudLabel('customColumns') }}</DialogTitle>
16
16
  </DialogHeader>
17
17
  <div class="vm-crud-shell__body">
18
18
  <div class="vm-col-custom">
@@ -38,13 +38,13 @@
38
38
  </div>
39
39
  <DialogFooter class="vm-crud-shell__foot">
40
40
  <button type="button" class="vm-crud-shell__btn is-ghost" @click="open = false">
41
- 取消
41
+ {{ crudLabel('close') }}
42
42
  </button>
43
43
  <button type="button" class="vm-crud-shell__btn is-danger" @click="reset">
44
- 重置
44
+ {{ crudLabel('reset') }}
45
45
  </button>
46
46
  <button type="button" class="vm-crud-shell__btn is-primary" @click="save">
47
- 保存
47
+ {{ crudLabel('save') }}
48
48
  </button>
49
49
  </DialogFooter>
50
50
  </DialogContent>
@@ -53,6 +53,7 @@
53
53
  </template>
54
54
 
55
55
  <script setup lang="ts">
56
+ import { crudLabel } from '../style'
56
57
  import { ref, watch, inject } from 'vue'
57
58
  import { preventDialogOutsideClose } from '../../lib/dialog-float'
58
59
  import { injectTableOptions, TABLE_API_KEY } from '../key'
@@ -7,11 +7,12 @@
7
7
  @click="copy"
8
8
  >
9
9
  <i :class="copying ? 'ri-loader-4-line is-spin' : icon" aria-hidden="true" />
10
- <span>{{ copying ? copyingText : label }}</span>
10
+ <span>{{ copying ? (copyingText ?? crudLabel('copying')) : (label ?? crudLabel('copy')) }}</span>
11
11
  </button>
12
12
  </template>
13
13
 
14
14
  <script setup lang="ts">
15
+ import { crudLabel } from '../style'
15
16
  import { ref } from 'vue'
16
17
 
17
18
  defineOptions({ name: 'vm-copy-btn' })
@@ -26,8 +27,8 @@ const props = withDefaults(
26
27
  disabled?: boolean
27
28
  }>(),
28
29
  {
29
- label: '复制',
30
- copyingText: '复制中…',
30
+ label: undefined,
31
+ copyingText: undefined,
31
32
  icon: 'ri-file-copy-line',
32
33
  size: 'md',
33
34
  disabled: false,
@@ -10,10 +10,10 @@
10
10
  />
11
11
  </button>
12
12
  <div class="vm-dt-cal__nav">
13
- <button type="button" class="vm-dt-cal__nav-btn" title="上一页" @click="prevPage">
13
+ <button type="button" class="vm-dt-cal__nav-btn" :title="crudLabel('prevPage')" @click="prevPage">
14
14
  <i class="ri-arrow-up-s-line" aria-hidden="true" />
15
15
  </button>
16
- <button type="button" class="vm-dt-cal__nav-btn" title="下一页" @click="nextPage">
16
+ <button type="button" class="vm-dt-cal__nav-btn" :title="crudLabel('nextPage')" @click="nextPage">
17
17
  <i class="ri-arrow-down-s-line" aria-hidden="true" />
18
18
  </button>
19
19
  </div>
@@ -88,14 +88,15 @@
88
88
  </div>
89
89
 
90
90
  <footer class="vm-dt-cal__foot">
91
- <button type="button" class="vm-dt-cal__link" @click="emit('clear')">清除</button>
92
- <button type="button" class="vm-dt-cal__link" @click="pickToday">今天</button>
91
+ <button type="button" class="vm-dt-cal__link" @click="emit('clear')">{{ crudLabel('clear') }}</button>
92
+ <button type="button" class="vm-dt-cal__link" @click="pickToday">{{ crudLabel('today') }}</button>
93
93
  </footer>
94
94
  </div>
95
95
  </template>
96
96
 
97
97
  <script setup lang="ts">
98
98
  import { computed, reactive, ref, watch } from 'vue'
99
+ import { crudFormat, crudLabel } from '../style'
99
100
  import {
100
101
  buildMonthGrid,
101
102
  clampTimePart,
@@ -125,26 +126,23 @@ const emit = defineEmits<{
125
126
 
126
127
  const precision = computed(() => normalizeDateTimePrecision(props.precision))
127
128
  const isDatetime = computed(() => precision.value === 'datetime')
128
- const weekdays = ['日', '一', '二', '三', '四', '五', '六']
129
- const monthLabels = [
130
- '1月',
131
- '2月',
132
- '3月',
133
- '4月',
134
- '5月',
135
- '6月',
136
- '7月',
137
- '8月',
138
- '9月',
139
- '10月',
140
- '11月',
141
- '12月',
142
- ]
143
- const timeFields = [
144
- { key: 'h' as const, label: '时', max: 23 },
145
- { key: 'm' as const, label: '分', max: 59 },
146
- { key: 's' as const, label: '秒', max: 59 },
147
- ]
129
+ const weekdays = computed(() => [
130
+ crudLabel('weekdaySun'),
131
+ crudLabel('weekdayMon'),
132
+ crudLabel('weekdayTue'),
133
+ crudLabel('weekdayWed'),
134
+ crudLabel('weekdayThu'),
135
+ crudLabel('weekdayFri'),
136
+ crudLabel('weekdaySat'),
137
+ ])
138
+ const monthLabels = computed(() =>
139
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map((n) => crudLabel(`month${n}`)),
140
+ )
141
+ const timeFields = computed(() => [
142
+ { key: 'h' as const, label: crudLabel('hour'), max: 23 },
143
+ { key: 'm' as const, label: crudLabel('minute'), max: 59 },
144
+ { key: 's' as const, label: crudLabel('second'), max: 59 },
145
+ ])
148
146
 
149
147
  type PanelView = 'date' | 'month' | 'year'
150
148
  const view = ref<PanelView>('date')
@@ -179,9 +177,14 @@ const yearCells = computed(() =>
179
177
  )
180
178
 
181
179
  const headTitle = computed(() => {
182
- if (view.value === 'year') return `${yearStart.value}年 - ${yearStart.value + 11}年`
183
- if (view.value === 'month') return `${viewYear.value}年`
184
- return `${viewYear.value}年${String(viewMonth.value + 1).padStart(2, '0')}月`
180
+ if (view.value === 'year')
181
+ return crudFormat(crudLabel('yearRange'), yearStart.value, yearStart.value + 11)
182
+ if (view.value === 'month') return crudFormat(crudLabel('yearLabel'), viewYear.value)
183
+ return crudFormat(
184
+ crudLabel('yearMonth'),
185
+ viewYear.value,
186
+ String(viewMonth.value + 1).padStart(2, '0'),
187
+ )
185
188
  })
186
189
 
187
190
  function currentTime() {
@@ -10,6 +10,7 @@
10
10
  </template>
11
11
 
12
12
  <script setup lang="ts">
13
+ import { crudLabel } from '../style'
13
14
  import { computed } from 'vue'
14
15
  import { useCrud } from '../useCrud'
15
16
  import VmDatetimeField from './vm-datetime-field.vue'
@@ -49,10 +50,10 @@ const TYPE_PRECISION: Record<string, DateTimePrecision> = {
49
50
  }
50
51
 
51
52
  const TYPE_PLACEHOLDER: Record<string, string> = {
52
- date: '选择日期',
53
- datetime: '选择日期时间',
54
- month: '选择月份',
55
- year: '选择年份',
53
+ date: 'pickDate',
54
+ datetime: 'pickDateTime',
55
+ month: 'pickMonth',
56
+ year: 'pickYear',
56
57
  }
57
58
 
58
59
  const precision = computed(
@@ -60,7 +61,7 @@ const precision = computed(
60
61
  )
61
62
 
62
63
  const placeholderText = computed(
63
- () => props.placeholder || TYPE_PLACEHOLDER[props.type] || '选择日期',
64
+ () => props.placeholder || crudLabel(TYPE_PLACEHOLDER[props.type] || 'pickDate'),
64
65
  )
65
66
 
66
67
  function onUpdate(v: string | null) {
@@ -4,7 +4,7 @@
4
4
  class="vm-date-range__field"
5
5
  :model-value="modelValue?.[0] ?? null"
6
6
  :precision="precision"
7
- :placeholder="startPlaceholder"
7
+ :placeholder="startPlaceholder ?? crudLabel('startTime')"
8
8
  :disabled="disabled"
9
9
  @update:model-value="(v) => set(0, v)"
10
10
  />
@@ -13,7 +13,7 @@
13
13
  class="vm-date-range__field"
14
14
  :model-value="modelValue?.[1] ?? null"
15
15
  :precision="precision"
16
- :placeholder="endPlaceholder"
16
+ :placeholder="endPlaceholder ?? crudLabel('endTime')"
17
17
  :disabled="disabled"
18
18
  @update:model-value="(v) => set(1, v)"
19
19
  />
@@ -21,6 +21,7 @@
21
21
  </template>
22
22
 
23
23
  <script setup lang="ts">
24
+ import { crudLabel } from '../style'
24
25
  import VmDatetimeField from './vm-datetime-field.vue'
25
26
  import type { DateTimePrecision } from '../../../shared/datetime-picker'
26
27
 
@@ -37,8 +38,8 @@ const props = withDefaults(
37
38
  }>(),
38
39
  {
39
40
  precision: 'day',
40
- startPlaceholder: '开始时间',
41
- endPlaceholder: '结束时间',
41
+ startPlaceholder: undefined,
42
+ endPlaceholder: undefined,
42
43
  },
43
44
  )
44
45
 
@@ -6,8 +6,8 @@
6
6
  @click="onRootClick"
7
7
  >
8
8
  <div class="vm-dt-field__box">
9
- <span v-if="!displayText && placeholder" class="vm-dt-field__ph">{{
10
- placeholder
9
+ <span v-if="!displayText" class="vm-dt-field__ph">{{
10
+ placeholder ?? crudLabel('pickDateTime')
11
11
  }}</span>
12
12
  <span class="vm-dt-field__val">{{ displayText }}</span>
13
13
  </div>
@@ -42,6 +42,7 @@
42
42
  </template>
43
43
 
44
44
  <script setup lang="ts">
45
+ import { crudLabel } from '../style'
45
46
  import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
46
47
  import { FocusScope } from 'reka-ui'
47
48
  import VmDateCalendarPanel from './vm-date-calendar-panel.vue'
@@ -64,7 +65,7 @@ const props = withDefaults(
64
65
  {
65
66
  modelValue: null,
66
67
  precision: 'day',
67
- placeholder: '选择日期时间',
68
+ placeholder: undefined,
68
69
  disabled: false,
69
70
  },
70
71
  )
@@ -3,6 +3,7 @@
3
3
  </template>
4
4
 
5
5
  <script setup lang="ts">
6
+ import { crudLabel } from '../style'
6
7
  import { computed } from 'vue'
7
8
  import { prettyJson } from '../../lib/json'
8
9
 
@@ -14,11 +15,11 @@ const props = withDefaults(
14
15
  empty?: string
15
16
  }>(),
16
17
  {
17
- empty: '(空)',
18
+ empty: undefined,
18
19
  },
19
20
  )
20
21
 
21
- const body = computed(() => prettyJson(props.modelValue, props.empty))
22
+ const body = computed(() => prettyJson(props.modelValue, props.empty ?? crudLabel('jsonEmpty')))
22
23
  </script>
23
24
 
24
25
  <style lang="scss" scoped>
@@ -5,7 +5,7 @@
5
5
  :class="{ 'is-error': Boolean(error) }"
6
6
  :value="inner"
7
7
  :disabled="disabled"
8
- :placeholder="placeholder"
8
+ :placeholder="placeholder ?? crudLabel('jsonPlaceholder')"
9
9
  :rows="fill ? undefined : rows"
10
10
  @input="onInput"
11
11
  @blur="validate"
@@ -15,6 +15,7 @@
15
15
  </template>
16
16
 
17
17
  <script setup lang="ts">
18
+ import { crudLabel } from '../style'
18
19
  import { ref, watch } from 'vue'
19
20
  import { parseJsonInput, prettyJson, textOfJson } from '../../lib/json'
20
21
 
@@ -32,7 +33,7 @@ const props = withDefaults(
32
33
  fill?: boolean
33
34
  }>(),
34
35
  {
35
- placeholder: '请输入 JSON',
36
+ placeholder: undefined,
36
37
  rows: 8,
37
38
  formatOnBlur: true,
38
39
  fill: false,
@@ -25,14 +25,14 @@
25
25
  :filterable="false"
26
26
  :refresh-on-change="false"
27
27
  width="110px"
28
- placeholder="类型"
28
+ :placeholder="crudLabel('jsonType')"
29
29
  @update:model-value="(v) => onKindChange(index, String(v))"
30
30
  />
31
31
  <input
32
32
  v-if="row.valueKind === 'string' || row.valueKind === 'number'"
33
33
  class="vm-json-kv__value"
34
34
  :value="row.stringValue"
35
- :placeholder="row.valueKind === 'number' ? '数字' : 'value'"
35
+ :placeholder="row.valueKind === 'number' ? crudLabel('jsonNumber') : 'value'"
36
36
  :type="row.valueKind === 'number' ? 'number' : 'text'"
37
37
  @input="
38
38
  patchRow(index, {
@@ -51,7 +51,7 @@
51
51
  @update:model-value="(v) => patchRow(index, { stringValue: String(v) })"
52
52
  />
53
53
  <div v-else class="vm-json-kv__value-spacer" />
54
- <div class="vm-json-kv__app" title="对App开放">
54
+ <div class="vm-json-kv__app" :title="crudLabel('openToApp')">
55
55
  <vm-switch
56
56
  :model-value="row.openToApp"
57
57
  :active-value="true"
@@ -62,13 +62,13 @@
62
62
  <vm-icon-btn
63
63
  v-if="row.valueKind === 'object'"
64
64
  icon="ri-add-line"
65
- title="新增子键值对"
65
+ :title="crudLabel('addChildKv')"
66
66
  size="sm"
67
67
  @click="addChild(index)"
68
68
  />
69
69
  <vm-icon-btn
70
70
  icon="ri-delete-bin-line"
71
- title="删除"
71
+ :title="crudLabel('delete')"
72
72
  size="sm"
73
73
  variant="danger"
74
74
  @click="removeRow(index)"
@@ -87,6 +87,7 @@
87
87
  </template>
88
88
 
89
89
  <script setup lang="ts">
90
+ import { crudLabel } from '../style'
90
91
  import { computed, toValue, type MaybeRefOrGetter } from 'vue'
91
92
  import type { JsonKvNode, JsonValueKind } from '../json-kv'
92
93
  import VmSelect from './vm-select.vue'
@@ -109,17 +110,17 @@ const emit = defineEmits<{
109
110
  'update:modelValue': [JsonKvNode[]]
110
111
  }>()
111
112
 
112
- const defaultKindOptions = [
113
- { label: '文本', value: 'string' },
114
- { label: '数字', value: 'number' },
115
- { label: '布尔', value: 'boolean' },
116
- { label: '对象', value: 'object' },
117
- ]
113
+ const defaultKindOptions = computed(() => [
114
+ { label: crudLabel('jsonText'), value: 'string' },
115
+ { label: crudLabel('jsonNumber'), value: 'number' },
116
+ { label: crudLabel('jsonBoolean'), value: 'boolean' },
117
+ { label: crudLabel('jsonObject'), value: 'object' },
118
+ ])
118
119
 
119
120
  /** 平铺为 label/value;不走索引搜索(filterable=false) */
120
121
  const kindOptions = computed(() => {
121
122
  const list = toValue(props.kindOptions)
122
- const raw = list?.length ? list : defaultKindOptions
123
+ const raw = list?.length ? list : defaultKindOptions.value
123
124
  return raw.map((opt) => ({
124
125
  label: String(opt.label ?? opt.name ?? opt.value ?? ''),
125
126
  value: opt.value as string | number,
@@ -44,7 +44,7 @@
44
44
  />
45
45
  <span>{{ opt.label }}</span>
46
46
  </label>
47
- <div v-if="!options.length" class="vm-multi-select__empty">暂无选项</div>
47
+ <div v-if="!options.length" class="vm-multi-select__empty">{{ crudLabel('noOptions') }}</div>
48
48
  </div>
49
49
  </FocusScope>
50
50
  </Teleport>
@@ -52,6 +52,7 @@
52
52
  </template>
53
53
 
54
54
  <script setup lang="ts">
55
+ import { crudFormat, crudLabel } from '../style'
55
56
  import { ref, computed, nextTick, onMounted, onUnmounted } from 'vue'
56
57
  import { FocusScope } from 'reka-ui'
57
58
  import { POPUP_TRIGGER_GAP } from '../../lib/dialog-float'
@@ -69,7 +70,7 @@ const props = withDefaults(
69
70
  {
70
71
  modelValue: () => [],
71
72
  options: () => [],
72
- placeholder: '请选择',
73
+ placeholder: undefined,
73
74
  },
74
75
  )
75
76
 
@@ -96,13 +97,13 @@ function normalizeMulti(
96
97
  const selected = computed(() => normalizeMulti(props.modelValue))
97
98
 
98
99
  const triggerText = computed(() => {
99
- if (!selected.value.length) return props.placeholder
100
+ if (!selected.value.length) return props.placeholder ?? crudLabel('pleaseSelect')
100
101
  const labels = selected.value.map((v) => {
101
102
  const hit = props.options.find((o) => String(o.value) === String(v))
102
103
  return hit?.label ?? String(v)
103
104
  })
104
105
  if (labels.length <= 2) return labels.join('、')
105
- return `已选 ${labels.length} 项`
106
+ return crudFormat(crudLabel('selectedCount'), labels.length)
106
107
  })
107
108
 
108
109
  function isChecked(v: string | number | boolean) {
@@ -5,7 +5,7 @@
5
5
  class="vm-number-range__input"
6
6
  :type="mode === 'float' ? 'text' : 'number'"
7
7
  inputmode="decimal"
8
- :placeholder="startPlaceholder"
8
+ :placeholder="startPlaceholder ?? crudLabel('min')"
9
9
  :disabled="disabled"
10
10
  :value="display(0)"
11
11
  @input="(e) => onInput(0, e)"
@@ -19,7 +19,7 @@
19
19
  class="vm-number-range__input"
20
20
  :type="mode === 'float' ? 'text' : 'number'"
21
21
  inputmode="decimal"
22
- :placeholder="endPlaceholder"
22
+ :placeholder="endPlaceholder ?? crudLabel('max')"
23
23
  :disabled="disabled"
24
24
  :value="display(1)"
25
25
  @input="(e) => onInput(1, e)"
@@ -31,6 +31,7 @@
31
31
  </template>
32
32
 
33
33
  <script setup lang="ts">
34
+ import { crudLabel } from '../style'
34
35
  defineOptions({ name: 'vm-number-range' })
35
36
 
36
37
  const props = withDefaults(
@@ -44,8 +45,8 @@ const props = withDefaults(
44
45
  }>(),
45
46
  {
46
47
  mode: 'int',
47
- startPlaceholder: '最小值',
48
- endPlaceholder: '最大值',
48
+ startPlaceholder: undefined,
49
+ endPlaceholder: undefined,
49
50
  },
50
51
  )
51
52