@xen-orchestra/web-core 0.24.0 → 0.25.0

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.
@@ -1,4 +1,6 @@
1
1
  {
2
+ "2nd-last": "2-й последний",
3
+ "3rd-last": "3-й последний",
2
4
  "about": "О нас",
3
5
  "access-forum": "Перейти на форум",
4
6
  "access-xoa": "Доступ к XOA",
@@ -10,20 +12,22 @@
10
12
  "admin-login": "Логин администратора",
11
13
  "admin-password": "Пароль администратора",
12
14
  "admin-password-confirm": "Подтвердите пароль администратора",
13
- "alarm-type.cpu_usage": "Загрузка ЦПУ превышает {n}%",
14
- "alarm-type.disk_usage": "Использование диска превышает {n}%",
15
- "alarm-type.fs_usage": "Использование файловой системы превышает {n}%",
16
- "alarm-type.log_fs_usage": "Использование файловой системы Log превышает {n}%",
17
- "alarm-type.mem_usage": "Использование памяти превышает {n}%",
18
- "alarm-type.memory_free_kib": "Свободной памяти меньше {n}%",
19
- "alarm-type.network_usage": "Использование сети превышает {n}%",
20
- "alarm-type.physical_utilisation": "Физическое использование превышает {n}%",
21
- "alarm-type.sr_io_throughput_total_per_host": "Общая пропускная способность SR IO на один хост превышает {n}%",
15
+ "affinity-host": "Близкий хост",
16
+ "alarm-type.cpu_usage": "Загрузка ЦПУ превышает @:n-percent",
17
+ "alarm-type.disk_usage": "Использование диска превышает @:n-percent",
18
+ "alarm-type.fs_usage": "Использование файловой системы превышает @:n-percent",
19
+ "alarm-type.log_fs_usage": "Использование файловой системы Log превышает @:n-percent",
20
+ "alarm-type.mem_usage": "Использование памяти превышает @:n-percent",
21
+ "alarm-type.memory_free_kib": "Свободной памяти меньше @:n-percent",
22
+ "alarm-type.network_usage": "Использование сети превышает @:n-percent",
23
+ "alarm-type.physical_utilisation": "Физическое использование превышает @:n-percent",
24
+ "alarm-type.sr_io_throughput_total_per_host": "Общая пропускная способность SR IO на один хост превышает @:n-percent",
22
25
  "alarm-type.unknown": "Неизвестный тип оповещения",
23
26
  "alarms": "Тревога",
24
27
  "all-done": "Выполнено!",
25
28
  "all-good": "Все в порядке!",
26
29
  "allow-self-signed-ssl": "Возможно, вам потребуется разрешить самоподписанные SSL-сертификаты в вашем браузере",
30
+ "api-error-details": "Детали ошибки API",
27
31
  "appearance": "Внешний вид",
28
32
  "ascending": "по возрастанию",
29
33
  "auto-generated": "Автоматически сгенерированный",
@@ -34,6 +38,7 @@
34
38
  "back-site-dashboard": "Вернитесь на панель управления вашего сайта",
35
39
  "backup": "Резервное копирование",
36
40
  "backup-issues": "Проблемы с резервным копированием",
41
+ "backup-network": "Резервная сеть",
37
42
  "backup-repository": "Хранилище резервных копий (local, NFS, SMB)",
38
43
  "backups": "Резервные копии",
39
44
  "backups.jobs": "Работы",
@@ -49,6 +54,7 @@
49
54
  "backups.vms-protection.unprotected": "По крайней мере на 1 работе, но без защиты",
50
55
  "best-effort": "лучшее усилие",
51
56
  "bios-default": "bios (по умолчанию)",
57
+ "bios-info": "Информация о BIOS",
52
58
  "bond": "Bond",
53
59
  "bond-devices": "Устройства Bond",
54
60
  "bond-status": "Статус Bond",
@@ -74,13 +80,20 @@
74
80
  "confirm-cancel": "Вы уверены, что хотите отменить?",
75
81
  "confirm-delete": "Вы собираетесь удалить {0}",
76
82
  "connected": "Подключен",
83
+ "connecting": "соединяется",
84
+ "connection": "соединение",
85
+ "connection-failed": "Соединение неудачно",
86
+ "connections": "Соединения",
77
87
  "console": "Консоль",
78
88
  "console-actions": "Действия с консоли",
79
89
  "console-clipboard": "Буфер обмена консоли",
80
90
  "console-unavailable": "Консоль недоступна",
91
+ "control-domain-memory": "Память домена управления",
81
92
  "copy": "Копировать",
82
93
  "copy-all": "Копировать всё",
94
+ "copy-host": "Скопировать хост",
83
95
  "copy-info-json": "Скопировать информацию в JSON",
96
+ "core-socket": "Ядро (сокет)",
84
97
  "core.close": "Закрыть",
85
98
  "core.copied": "Скопировано",
86
99
  "core.copy-id": "Скопировать ID",
@@ -90,6 +103,8 @@
90
103
  "core.hide": "Скрыть",
91
104
  "core.open": "Открыть",
92
105
  "core.pagination.all": "Все",
106
+ "core.pagination.show-by": "Показать по",
107
+ "core.query-search-bar.label": "поисковый движок",
93
108
  "core.query-search-bar.placeholder": "Впишите свой запрос…",
94
109
  "core.query-search-bar.use-query-builder": "Использовать конструктор запросов",
95
110
  "core.quick-actions": "Быстрые действия",
@@ -99,6 +114,7 @@
99
114
  "core.select.n-selected-of": "{count} выбрано из {total} объектов",
100
115
  "core.select.none": "Ничего не выбирать",
101
116
  "core.select.unselect": "Снять выбор",
117
+ "core.show-by": "Показать по",
102
118
  "core.sidebar.close": "Закрыть боковую панель",
103
119
  "core.sidebar.open": "Открыть боковую панель",
104
120
  "core.sidebar.unlock": "Разблокировать боковую панель",
@@ -110,6 +126,7 @@
110
126
  "cpu-usage": "Использование CPU",
111
127
  "cpus": "CPUs",
112
128
  "create": "Создать",
129
+ "created-on": "Создан на",
113
130
  "custom-config": "Пользовательская конфигурация",
114
131
  "dark-mode.auto": "Автоматический тёмный режим",
115
132
  "dark-mode.disable": "Отключить тёмный режим",
@@ -173,6 +190,7 @@
173
190
  "mtu": "MTU",
174
191
  "n-gb-left": "{n} Гб осталось",
175
192
  "n-gb-required": "{n} Гб требуется",
193
+ "n-percent": "{n} %",
176
194
  "new-vif": "Новый VIF",
177
195
  "new-vm": "Новая ВМ",
178
196
  "new-vm.add": "Добавить новую ВМ",
@@ -180,6 +198,7 @@
180
198
  "new-vm.name": "Название ВМ",
181
199
  "news": "Новости",
182
200
  "not-found": "Не найдено",
201
+ "not-running": "не запущен",
183
202
  "not-yet-available": "Информация пока недоступна",
184
203
  "object": "Объект",
185
204
  "object-not-found": "Объект {id} не найден…",
@@ -195,6 +214,7 @@
195
214
  "pifs-status": "PIFs статус",
196
215
  "please-confirm": "Пожалуйста подтвердите",
197
216
  "pxe": "PXE",
217
+ "read": "читать",
198
218
  "scan-pifs": "Сканировать PIFs",
199
219
  "send": "Отправить",
200
220
  "send-ctrl-alt-del": "Отправить Ctrl+Alt+Del",
@@ -211,14 +231,23 @@
211
231
  "static-ip": "Статичный IP",
212
232
  "uuid": "UUID",
213
233
  "vcpus": "vCPU | vCPU | vCPUs",
234
+ "vdi-throughput": "Пропускная способность VDI",
214
235
  "vdis": "VDI | VDI | VDIs",
215
236
  "vif": "VIF",
216
237
  "vif-device": "VIF #{device}",
217
238
  "vifs": "VIFs",
239
+ "virtualization-type": "Тип виртуализации",
218
240
  "vlan": "VLAN",
219
241
  "vm-description": "Описание ВМ",
242
+ "vm-status.halted": "остановлен",
243
+ "vm-status.paused": "Пауза",
244
+ "vm-status.running": "Запущенный",
245
+ "vm-status.suspended": "Приостановлен",
220
246
  "vms-status.unknown": "Неизвестный",
247
+ "write": "Писать",
248
+ "xo-backups": "резервные копии XO",
221
249
  "xo-lite-under-construction": "XOLite находится в разработке",
250
+ "xo-replications": "Репликации XO",
222
251
  "xoa-admin-account": "Аккаунт администратора XOA",
223
252
  "xoa-deploy": "Развёртывание XOA",
224
253
  "xoa-deploy-failed": "Развёртывание не удалось!",
@@ -11,15 +11,15 @@
11
11
  "admin-password": "Admin-lösenord",
12
12
  "admin-password-confirm": "Bekräfta admin-lösenord",
13
13
  "affinity-host": "Fokus-host",
14
- "alarm-type.cpu_usage": "CPU-användning överskrider {n}%",
15
- "alarm-type.disk_usage": "Disk-användning överskrider {n}%",
16
- "alarm-type.fs_usage": "FS-användning överskrider {n}%",
17
- "alarm-type.log_fs_usage": "Logg-FS-användning överskrider {n}%",
18
- "alarm-type.mem_usage": "Minnes-användning överskrider {n}%",
19
- "alarm-type.memory_free_kib": "Ledigt minne är under {n}%",
20
- "alarm-type.network_usage": "Nätverks-användning överskrider {n}%",
21
- "alarm-type.physical_utilisation": "Fysiskt nyttjande överskrider {n}%",
22
- "alarm-type.sr_io_throughput_total_per_host": "SR IO genomströmning totalt per host överskrider {n}%",
14
+ "alarm-type.cpu_usage": "CPU-användning överskrider @:n-percent",
15
+ "alarm-type.disk_usage": "Disk-användning överskrider @:n-percent",
16
+ "alarm-type.fs_usage": "FS-användning överskrider @:n-percent",
17
+ "alarm-type.log_fs_usage": "Logg-FS-användning överskrider @:n-percent",
18
+ "alarm-type.mem_usage": "Minnes-användning överskrider @:n-percent",
19
+ "alarm-type.memory_free_kib": "Ledigt minne är under @:n-percent",
20
+ "alarm-type.network_usage": "Nätverks-användning överskrider @:n-percent",
21
+ "alarm-type.physical_utilisation": "Fysiskt nyttjande överskrider @:n-percent",
22
+ "alarm-type.sr_io_throughput_total_per_host": "SR IO genomströmning totalt per host överskrider @:n-percent",
23
23
  "alarm-type.unknown": "Okänd larm-typ",
24
24
  "alarms": "Larm",
25
25
  "all-good": "Allt är bra!",
@@ -320,6 +320,7 @@
320
320
  "n-hosts": "1 host | {n} hostar",
321
321
  "n-hosts-awaiting-patch": "{n} hosten väntar på denna uppdatering | {n} hostarna väntar på denna uppdatering",
322
322
  "n-missing": "{n} saknas",
323
+ "n-percent": "{n}%",
323
324
  "n-vms": "1 VM | {n} VM:ar",
324
325
  "name": "Namn",
325
326
  "nested-virtualization": "Nästlad virtualisering",
@@ -8,5 +8,5 @@ export const usePanelStore = defineStore('panel', () => {
8
8
  const open = () => (isExpanded.value = true)
9
9
  const close = () => (isExpanded.value = false)
10
10
 
11
- return { open, close, isExpanded: computed(() => uiStore.isDesktop || isExpanded.value) }
11
+ return { open, close, isExpanded: computed(() => !uiStore.isMobile || isExpanded.value) }
12
12
  })
@@ -51,15 +51,18 @@ export const useSidebarStore = defineStore('layout', () => {
51
51
  ifElse(isResizing, [load, resume], [pause, unload])
52
52
 
53
53
  watch(
54
- () => uiStore.isMobile,
55
- isMobile => {
56
- // keep the state of desktop expansion
54
+ () => ({
55
+ isMobile: uiStore.isMobile,
56
+ isDesktopLarge: uiStore.isDesktopLarge,
57
+ }),
58
+ ({ isMobile, isDesktopLarge }) => {
57
59
  if (isMobile) {
58
60
  desktopState = isExpanded.value
61
+ } else {
62
+ isExpanded.value = isDesktopLarge ? true : desktopState
59
63
  }
60
-
61
- isExpanded.value = desktopState && !isMobile
62
- }
64
+ },
65
+ { immediate: true }
63
66
  )
64
67
 
65
68
  return {
@@ -8,11 +8,14 @@ export const useUiStore = defineStore('ui', () => {
8
8
 
9
9
  const { store: colorMode } = useColorMode({ initialValue: 'auto' })
10
10
 
11
- const { desktop: isDesktop } = useBreakpoints({
11
+ const breakpoints = useBreakpoints({
12
12
  desktop: 1024,
13
+ desktopLarge: 1440,
13
14
  })
14
15
 
15
- const isMobile = computed(() => !isDesktop.value)
16
+ const isMobile = breakpoints.smaller('desktop')
17
+ const isDesktop = breakpoints.between('desktop', 'desktopLarge')
18
+ const isDesktopLarge = breakpoints.greater('desktopLarge')
16
19
 
17
20
  const router = useRouter()
18
21
  const route = useRoute()
@@ -27,8 +30,9 @@ export const useUiStore = defineStore('ui', () => {
27
30
  return {
28
31
  colorMode,
29
32
  currentHostOpaqueRef,
30
- isDesktop,
31
33
  isMobile,
34
+ isDesktop,
35
+ isDesktopLarge,
32
36
  hasUi,
33
37
  }
34
38
  })
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xen-orchestra/web-core",
3
3
  "type": "module",
4
- "version": "0.24.0",
4
+ "version": "0.25.0",
5
5
  "private": false,
6
6
  "exports": {
7
7
  "./*": {
@@ -1,53 +0,0 @@
1
- import { useTimestamp } from '@vueuse/core'
2
- import { computed, type MaybeRefOrGetter, toValue } from 'vue'
3
- import { useI18n } from 'vue-i18n'
4
-
5
- export enum SECONDS {
6
- MINUTE = 60,
7
- HOUR = SECONDS.MINUTE * 60,
8
- DAY = SECONDS.HOUR * 24,
9
- WEEK = SECONDS.DAY * 7,
10
- MONTH = SECONDS.DAY * 30,
11
- YEAR = SECONDS.DAY * 365,
12
- }
13
-
14
- export type TimeThreshold = [number, Intl.RelativeTimeFormatUnit]
15
-
16
- const timeThresholds: TimeThreshold[] = [
17
- [SECONDS.MINUTE, 'second'],
18
- [SECONDS.HOUR, 'minute'],
19
- [SECONDS.DAY, 'hour'],
20
- [SECONDS.WEEK, 'day'],
21
- [SECONDS.MONTH, 'week'],
22
- [SECONDS.YEAR, 'month'],
23
- [Infinity, 'year'],
24
- ]
25
-
26
- export function useTimeAgo(referenceDate: MaybeRefOrGetter<Date | number | string>) {
27
- const { locale } = useI18n()
28
-
29
- const formatter = computed(() => new Intl.RelativeTimeFormat(locale.value, { numeric: 'auto' }))
30
-
31
- const now = useTimestamp({ interval: 1000 })
32
-
33
- const referenceTime = computed(() => new Date(toValue(referenceDate)).getTime())
34
-
35
- const distance = computed(() => {
36
- const diff = Math.trunc((referenceTime.value - now.value) / 1000)
37
-
38
- if (Math.abs(diff) < 60) {
39
- return Math.trunc(diff / 10) * 10 || 0 // Avoid recomputing when the value changes from 0 to -0
40
- }
41
-
42
- return timeThresholds.reduce(
43
- (acc, [threshold]) => (Math.abs(acc) < threshold ? acc : Math.trunc(acc / threshold) * threshold),
44
- diff
45
- )
46
- })
47
-
48
- return computed(() => {
49
- const index = timeThresholds.findIndex(([threshold]) => Math.abs(distance.value) < threshold)
50
- const divisor = index > 0 ? timeThresholds[index - 1][0] : 1
51
- return formatter.value.format(Math.trunc(distance.value / divisor), timeThresholds[index][1])
52
- })
53
- }