@xen-orchestra/web-core 0.29.0 → 0.31.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.
- package/lib/assets/css/typography/_utils.pcss +11 -0
- package/lib/assets/no-result.svg +276 -80
- package/lib/components/backup-state/VtsBackupState.vue +2 -1
- package/lib/components/console/VtsRemoteConsole.vue +6 -2
- package/lib/components/data-table/VtsDataTable.vue +11 -6
- package/lib/components/quick-info-card/VtsQuickInfoCard.vue +2 -2
- package/lib/components/quick-info-row/VtsQuickInfoRow.vue +1 -1
- package/lib/components/select/VtsSelect.vue +1 -1
- package/lib/components/state-hero/VtsStateHero.vue +107 -47
- package/lib/components/task/VtsQuickTaskList.vue +1 -1
- package/lib/components/ui/card/UiCard.vue +6 -1
- package/lib/components/ui/collapsible-list/UiCollapsibleList.vue +5 -2
- package/lib/components/ui/panel/UiPanel.vue +1 -1
- package/lib/components/ui/table-pagination/UiTablePagination.vue +2 -2
- package/lib/composables/tree-filter.composable.ts +4 -2
- package/lib/icons/index.ts +1 -1
- package/lib/icons/object-icons.ts +33 -2
- package/lib/locales/cs.json +64 -18
- package/lib/locales/de.json +1 -1
- package/lib/locales/en.json +57 -3
- package/lib/locales/es.json +73 -9
- package/lib/locales/fa.json +1 -1
- package/lib/locales/fr.json +59 -5
- package/lib/locales/it.json +9 -4
- package/lib/locales/nl.json +47 -1
- package/lib/locales/pt_BR.json +32 -2
- package/lib/locales/ru.json +83 -1
- package/lib/locales/sv.json +1 -1
- package/lib/locales/uk.json +339 -1
- package/lib/types/value-matcher.d.ts +3 -0
- package/lib/utils/speed.util.ts +12 -0
- package/lib/utils/time.util.ts +57 -0
- package/package.json +1 -1
- package/lib/components/state-hero/VtsAllDoneHero.vue +0 -16
- package/lib/components/state-hero/VtsAllGoodHero.vue +0 -16
- package/lib/components/state-hero/VtsComingSoonHero.vue +0 -16
- package/lib/components/state-hero/VtsErrorNoDataHero.vue +0 -14
- package/lib/components/state-hero/VtsLoadingHero.vue +0 -57
- package/lib/components/state-hero/VtsNoDataHero.vue +0 -14
- package/lib/components/state-hero/VtsNoSelectionHero.vue +0 -16
- package/lib/components/state-hero/VtsObjectNotFoundHero.vue +0 -17
- package/lib/components/state-hero/VtsOfflineHero.vue +0 -16
- package/lib/components/state-hero/VtsPageNotFoundHero.vue +0 -33
package/lib/locales/uk.json
CHANGED
|
@@ -1 +1,339 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"2nd-last": "2-й останній",
|
|
3
|
+
"3rd-last": "3-й останній",
|
|
4
|
+
"about": "Про нас",
|
|
5
|
+
"accept-self-signed-certificates": "Приймати самопідписані сертифікати",
|
|
6
|
+
"access-forum": "Перейти на форум",
|
|
7
|
+
"access-xoa": "Доступ до XOA",
|
|
8
|
+
"account-organization-more": "Обліковий запис, організація та багато іншого…",
|
|
9
|
+
"add": "Додати",
|
|
10
|
+
"add-filter": "Додати фільтр",
|
|
11
|
+
"add-or": "+АБО",
|
|
12
|
+
"add-sort": "Додати сортування",
|
|
13
|
+
"admin-login": "Логін адміністратора",
|
|
14
|
+
"admin-password": "Пароль адміністратора",
|
|
15
|
+
"admin-password-confirm": "Підтвердіть пароль адміністратора",
|
|
16
|
+
"affinity-host": "Близький хост",
|
|
17
|
+
"alarm-type.cpu_usage": "Завантаження ЦПУ перевищує @:n-percent",
|
|
18
|
+
"alarm-type.disk_usage": "Використання диска перевищує @:n-percent",
|
|
19
|
+
"alarm-type.fs_usage": "Використання файлової системи перевищує @:n-percent",
|
|
20
|
+
"alarm-type.log_fs_usage": "Використання файлової системи Log перевищує @:n-percent",
|
|
21
|
+
"alarm-type.mem_usage": "Використання пам'яті перевищує @:n-percent",
|
|
22
|
+
"alarm-type.memory_free_kib": "Вільна пам'ять менше @:n-percent",
|
|
23
|
+
"alarm-type.network_usage": "Використання мережі перевищує @:n-percent",
|
|
24
|
+
"alarm-type.physical_utilisation": "Фізичне використання перевищує @:n-percent",
|
|
25
|
+
"alarm-type.sr_io_throughput_total_per_host": "Загальна пропускна здатність SR IO на один хост перевищує @:n-percent",
|
|
26
|
+
"alarm-type.unknown": "Невідомий тип сповіщення",
|
|
27
|
+
"alarms": "Тривога",
|
|
28
|
+
"all-done": "Виконано!",
|
|
29
|
+
"all-good": "Все гаразд!",
|
|
30
|
+
"allow-self-signed-ssl": "Можливо, вам потрібно дозволити самопідписані SSL-сертифікати у вашому браузері",
|
|
31
|
+
"api-error-details": "Деталі помилки API",
|
|
32
|
+
"appearance": "Зовнішній вигляд",
|
|
33
|
+
"ascending": "за зростанням",
|
|
34
|
+
"auto-generated": "Автоматично згенерований",
|
|
35
|
+
"auto-power": "Автоматичне увімкнення",
|
|
36
|
+
"available": "Доступно",
|
|
37
|
+
"available-properties-for-advanced-filter": "Доступні властивості розширеного фільтра:",
|
|
38
|
+
"back-pool-dashboard": "Повернення до панелі управління пулом",
|
|
39
|
+
"back-site-dashboard": "Поверніться до панелі керування вашого сайту",
|
|
40
|
+
"backed-up-vms": "ВМ з резервними копіями",
|
|
41
|
+
"backup": "Резервне копіювання",
|
|
42
|
+
"backup-issues": "Проблеми з резервним копіюванням",
|
|
43
|
+
"backup-jobs": "Завдання на резервне копіювання",
|
|
44
|
+
"backup-network": "Резервна мережа",
|
|
45
|
+
"backup-repository": "Сховище резервних копій (local, NFS, SMB)",
|
|
46
|
+
"backup-targets": "Призначення для резервної копії",
|
|
47
|
+
"backup.continuous-replication": "Постійна реплікація",
|
|
48
|
+
"backup.disaster-recovery": "Відновлення після критичних помилок",
|
|
49
|
+
"backup.full": "Повна резервна копія",
|
|
50
|
+
"backup.incremental": "Інкрементальна резервна копія",
|
|
51
|
+
"backup.metadata": "Резервна копія метаданих",
|
|
52
|
+
"backup.mirror": "Дзеркальна резервна копія",
|
|
53
|
+
"backup.pool-metadata": "Метадані пулу",
|
|
54
|
+
"backup.rolling-snapshot": "Ковзний знімок",
|
|
55
|
+
"backup.xo-config": "Конфігурація XO",
|
|
56
|
+
"backups": "Резервні копії",
|
|
57
|
+
"backups.jobs": "Роботи",
|
|
58
|
+
"backups.jobs.at-least-one-skipped": "Як мінімум один пропущений",
|
|
59
|
+
"backups.jobs.based-on-last-three": "На основі трьох останніх робіт",
|
|
60
|
+
"backups.jobs.disabled": "Вимкнено",
|
|
61
|
+
"backups.jobs.looks-like-issue": "Схоже, є якась проблема",
|
|
62
|
+
"backups.jobs.running-good": "Працює добре",
|
|
63
|
+
"backups.vms-protection": "Захист ВМ",
|
|
64
|
+
"backups.vms-protection.no-job": "На жодній роботі",
|
|
65
|
+
"backups.vms-protection.protected": "Принаймні на 1 роботі і захищений",
|
|
66
|
+
"backups.vms-protection.tooltip": "ВМ захищена, якщо резервне копіювання за розкладом, і попередній запуск пройшов успішно",
|
|
67
|
+
"backups.vms-protection.unprotected": "Принаймні на 1 роботі, але без захисту",
|
|
68
|
+
"best-effort": "найкращі зусилля",
|
|
69
|
+
"bios-default": "bios (за замовчуванням)",
|
|
70
|
+
"bios-info": "Інформація про BIOS",
|
|
71
|
+
"bond": "Bond",
|
|
72
|
+
"bond-devices": "Пристрої Bond",
|
|
73
|
+
"bond-status": "Статус Bond",
|
|
74
|
+
"boot-firmware": "Завантажувальна прошивка",
|
|
75
|
+
"boot-firmware-bios": "Шаблон вже містить налаштування BIOS",
|
|
76
|
+
"boot-firmware-uefi": "Завантажувальна прошивка - UEFI",
|
|
77
|
+
"boot-vm": "Завантажувальна ВМ",
|
|
78
|
+
"build-number": "Номер збірки",
|
|
79
|
+
"bytes.gi": "ГБ",
|
|
80
|
+
"bytes.ki": "Кб",
|
|
81
|
+
"bytes.mi": "МіБ",
|
|
82
|
+
"cancel": "Скасування",
|
|
83
|
+
"change-state": "Змінити стан",
|
|
84
|
+
"check-errors": "Перевірте помилки:",
|
|
85
|
+
"check-summing": "Контрольна сума TX",
|
|
86
|
+
"click-to-display-alarms": "Натисніть, щоб відобразити тривоги:",
|
|
87
|
+
"click-to-return-default-pool": "Натисніть тут, щоб повернутися до пулу за замовчуванням",
|
|
88
|
+
"close": "Закрити",
|
|
89
|
+
"coming-soon": "Скоро!",
|
|
90
|
+
"community": "Спільнота",
|
|
91
|
+
"community-name": "{name} спільнота",
|
|
92
|
+
"configuration": "Налаштування",
|
|
93
|
+
"configure-in-xo-5": "Налаштувати в XO 5",
|
|
94
|
+
"confirm-cancel": "Ви впевнені, що хочете скасувати?",
|
|
95
|
+
"confirm-delete": "Ви збираєтеся видалити {0}",
|
|
96
|
+
"connect": "Підключитися",
|
|
97
|
+
"connect-another-pool": "Підключити інший пул",
|
|
98
|
+
"connect-pool": "Підключити пул",
|
|
99
|
+
"connected": "Підключено",
|
|
100
|
+
"connected-to-ip": "Підключитися до {ip}",
|
|
101
|
+
"connecting": "з'єднується",
|
|
102
|
+
"connection": "з'єднання",
|
|
103
|
+
"connection-failed": "З'єднання невдале",
|
|
104
|
+
"connections": "З'єднання",
|
|
105
|
+
"console": "Консоль",
|
|
106
|
+
"console-actions": "Дії з консолі",
|
|
107
|
+
"console-clipboard": "Буфер обміну консолі",
|
|
108
|
+
"console-unavailable": "Консоль недоступна",
|
|
109
|
+
"control-domain-memory": "Пам'ять домену управління",
|
|
110
|
+
"copy": "Копіювати",
|
|
111
|
+
"copy-all": "Копіювати все",
|
|
112
|
+
"copy-host": "Скопіювати хост",
|
|
113
|
+
"copy-info-json": "Копіювати інформацію в JSON",
|
|
114
|
+
"core-socket": "Ядро (сокет)",
|
|
115
|
+
"core.character-limit": "{count}/{max} символ | {count}/{max} символів",
|
|
116
|
+
"core.close": "Закрити",
|
|
117
|
+
"core.copied": "Скопійовано",
|
|
118
|
+
"core.copy-id": "Скопіювати ID",
|
|
119
|
+
"core.current": "Поточний",
|
|
120
|
+
"core.filter": "Фільтрувати",
|
|
121
|
+
"core.group": "Група",
|
|
122
|
+
"core.hide": "Приховати",
|
|
123
|
+
"core.open": "Відкрити",
|
|
124
|
+
"core.open-in-new-tab": "Відкрити в новій вкладці",
|
|
125
|
+
"core.pagination.all": "Все",
|
|
126
|
+
"core.pagination.show-by": "Показати за",
|
|
127
|
+
"core.query-search-bar.label": "пошуковий движок",
|
|
128
|
+
"core.query-search-bar.placeholder": "Введіть свій запит…",
|
|
129
|
+
"core.query-search-bar.use-query-builder": "Використовувати конструктор запитів",
|
|
130
|
+
"core.quick-actions": "Швидкі дії",
|
|
131
|
+
"core.search": "Пошук",
|
|
132
|
+
"core.select.all": "Вибрати все",
|
|
133
|
+
"core.select.n-object-of": "{from} - {to} з {total} об'єктів",
|
|
134
|
+
"core.select.n-selected-of": "{count} вибрано з {total} об'єктів",
|
|
135
|
+
"core.select.none": "Нічого не вибирати",
|
|
136
|
+
"core.select.unselect": "Зняти вибір",
|
|
137
|
+
"core.show-by": "Показати за",
|
|
138
|
+
"core.sidebar.close": "Закрити бічну панель",
|
|
139
|
+
"core.sidebar.lock": "Закріпити бічну панель",
|
|
140
|
+
"core.sidebar.open": "Відкрити бічну панель",
|
|
141
|
+
"core.sidebar.unlock": "Розблокувати бічну панель",
|
|
142
|
+
"core.sort.ascending": "Сортувати за зростанням",
|
|
143
|
+
"core.sort.descending": "Сортувати за спаданням",
|
|
144
|
+
"core.textarea.exceeds-max-characters": "Значення не повинно перевищувати {max} символів.",
|
|
145
|
+
"cores-with-sockets": "Ядра (сокеты)",
|
|
146
|
+
"cpu-cap": "Обмеження ЦП",
|
|
147
|
+
"cpu-mask": "Маска ЦП",
|
|
148
|
+
"cpu-model": "Модель ЦП",
|
|
149
|
+
"cpu-provisioning": "Виділення ресурсів ЦП",
|
|
150
|
+
"cpu-provisioning-warning": "Кількість виділених vCPU перевищує кількість доступних фізичних процесорів. Продуктивність системи може постраждати",
|
|
151
|
+
"cpu-usage": "Використання CPU",
|
|
152
|
+
"cpu-weight": "Вага ЦП",
|
|
153
|
+
"cpus": "CPUs",
|
|
154
|
+
"crash-dump-storage-repository": "Репозиторій дампів критичних помилок",
|
|
155
|
+
"create": "Створити",
|
|
156
|
+
"created-on": "Створено на",
|
|
157
|
+
"cron-pattern": "Патерн cron",
|
|
158
|
+
"custom-config": "Користувацька конфігурація",
|
|
159
|
+
"dark-mode.auto": "Автоматичний темний режим",
|
|
160
|
+
"dark-mode.disable": "Вимкнути темний режим",
|
|
161
|
+
"dark-mode.enable": "Увімкнути темний режим",
|
|
162
|
+
"dashboard": "Панель управління",
|
|
163
|
+
"date": "Дата",
|
|
164
|
+
"default-behavior": "Стандартна поведінка",
|
|
165
|
+
"default-locking-mode": "Режим блокування за замовчуванням",
|
|
166
|
+
"default-storage-repository": "Репозиторій сховища за замовчуванням",
|
|
167
|
+
"delete": "Видалити",
|
|
168
|
+
"delete-vms": "Видалено 1 VM | Видалено {n} VMs",
|
|
169
|
+
"deploy": "Розгорнути",
|
|
170
|
+
"deploy-xoa": "Розгорнути XOA",
|
|
171
|
+
"deploy-xoa-available-on-desktop": "Розгортання XOA доступне на вашому інтерфейсі робочого столу",
|
|
172
|
+
"deploy-xoa-custom-ntp-servers": "Ваші NTP-сервери (розділені пробілом)",
|
|
173
|
+
"deploy-xoa-status.configuring": "Налаштовуємо XOA…",
|
|
174
|
+
"deploy-xoa-status.importing": "Імпортуємо XOA…",
|
|
175
|
+
"deploy-xoa-status.not-responding": "XOA не відповідає",
|
|
176
|
+
"deploy-xoa-status.ready": "XOA готова!",
|
|
177
|
+
"deploy-xoa-status.starting": "XOA запускається…",
|
|
178
|
+
"deploy-xoa-status.waiting": "Чекаємо відповіді XOA…",
|
|
179
|
+
"descending": "за спаданням",
|
|
180
|
+
"description": "Опис",
|
|
181
|
+
"device": "Пристрій",
|
|
182
|
+
"dhcp": "DHCP",
|
|
183
|
+
"disabled": "Вимкнено",
|
|
184
|
+
"disconnected": "Відключено",
|
|
185
|
+
"disconnected-from-physical-device": "Відключено від фізичного пристрою",
|
|
186
|
+
"disk-name": "Ім'я диска",
|
|
187
|
+
"display": "Відобразити",
|
|
188
|
+
"dns": "DNS",
|
|
189
|
+
"do-you-have-needs": "Є зауваження/пропозиції? Повідомте нас",
|
|
190
|
+
"documentation": "Документація",
|
|
191
|
+
"documentation-name": "{name} документація",
|
|
192
|
+
"edit": "Редагувати",
|
|
193
|
+
"edit-config": "Редагувати конфіг",
|
|
194
|
+
"enabled": "Enabled",
|
|
195
|
+
"end-of-life": "Більше не підтримується",
|
|
196
|
+
"eol": "Більше не підтримується",
|
|
197
|
+
"error": "Помилка",
|
|
198
|
+
"error-no-data": "Помилка, неможливо отримати дані.",
|
|
199
|
+
"error-occurred": "Сталася помилка",
|
|
200
|
+
"exit-fullscreen": "Вийти з повноекранного режиму",
|
|
201
|
+
"expiration-date": "Термін придатності",
|
|
202
|
+
"export": "Експорт",
|
|
203
|
+
"export-n-vms": "Експортовано 1 VM | Експортовано {n} VMs",
|
|
204
|
+
"export-n-vms-manually": "Експорт однієї ВМ вручну | Експорт {n} ВМ вручну",
|
|
205
|
+
"export-table-to": "Експорт таблиці в {type}",
|
|
206
|
+
"export-vm": "Експорт VM",
|
|
207
|
+
"export-vms": "Експорт VMs",
|
|
208
|
+
"export-vms-manually-information": "Експорт деяких ВМ не вдалося запустити автоматично, ймовірно, через ваші налаштування браузера. Для експорту натисніть на кожну ВМ. (Або скопіюйте посилання).",
|
|
209
|
+
"failure": "Критична помилка",
|
|
210
|
+
"fast-clone": "Швидке клонування",
|
|
211
|
+
"fetching-fresh-data": "Отримання свіжих даних",
|
|
212
|
+
"filter.comparison.contains": "Містить",
|
|
213
|
+
"filter.comparison.ends-with": "Закінчується на",
|
|
214
|
+
"filter.comparison.equals": "Дорівнює",
|
|
215
|
+
"filter.comparison.is": "Є",
|
|
216
|
+
"filter.comparison.is-false": "Є хибним",
|
|
217
|
+
"filter.comparison.is-not": "Не є",
|
|
218
|
+
"filter.comparison.is-true": "Є істинним",
|
|
219
|
+
"filter.comparison.matches-regex": "Збігається з регулярним виразом",
|
|
220
|
+
"filter.comparison.not-contain": "Не містить",
|
|
221
|
+
"filter.comparison.not-end-with": "Не закінчується на",
|
|
222
|
+
"filter.comparison.not-equal": "Не дорівнює",
|
|
223
|
+
"filter.comparison.not-match-regex": "Не відповідає регулярному виразу",
|
|
224
|
+
"filter.comparison.not-start-with": "Не починається з",
|
|
225
|
+
"filter.comparison.starts-with": "Починається з",
|
|
226
|
+
"following-hosts-unreachable": "Наступні вузли недоступні",
|
|
227
|
+
"for-backup": "Для резервної копії",
|
|
228
|
+
"for-replication": "Для реплікації",
|
|
229
|
+
"force-reboot": "Примусове перезавантаження",
|
|
230
|
+
"force-shutdown": "Примусове вимкнення",
|
|
231
|
+
"forget": "Забути",
|
|
232
|
+
"fullscreen": "Повний екран",
|
|
233
|
+
"fullscreen-leave": "Залишити повний екран",
|
|
234
|
+
"gateway": "Шлюз",
|
|
235
|
+
"general-information": "Загальна інформація",
|
|
236
|
+
"go-back": "Назад",
|
|
237
|
+
"gpus": "Графічні процесори",
|
|
238
|
+
"graphics-display": "Графіка % Відображення",
|
|
239
|
+
"gzip": "gzip",
|
|
240
|
+
"hardware": "Апаратне забезпечення",
|
|
241
|
+
"hardware-specifications": "Характеристики апаратного забезпечення",
|
|
242
|
+
"heartbeat-storage-repository": "Репозиторій heartbeat-сховищ",
|
|
243
|
+
"here": "Тут",
|
|
244
|
+
"high-availability": "Висока доступність (HA)",
|
|
245
|
+
"host": "Вузол",
|
|
246
|
+
"host-description": "Опис вузла",
|
|
247
|
+
"host-internal-networks": "Внутрішні мережі вузла",
|
|
248
|
+
"host-status.halted": "Зупинено",
|
|
249
|
+
"host-status.running": "Запущений",
|
|
250
|
+
"host-status.unknown": "Невідомо",
|
|
251
|
+
"host-unknown": "Вузол невідомий",
|
|
252
|
+
"host.active": "Активний",
|
|
253
|
+
"host.inactive": "Неактивний",
|
|
254
|
+
"hosts": "Вузли",
|
|
255
|
+
"hosts-status": "Статус вузла",
|
|
256
|
+
"hosts-status.halted": "Зупинено",
|
|
257
|
+
"hosts-status.running": "Запущений",
|
|
258
|
+
"hosts-status.unknown": "Невідомо",
|
|
259
|
+
"hosts-status.unknown.tooltip": "Метрики вузла недоступні",
|
|
260
|
+
"hyper-threading": "Багатопотоковість (SMT)",
|
|
261
|
+
"id": "ID",
|
|
262
|
+
"ip-address": "IP-адреса",
|
|
263
|
+
"ip-addresses": "IP адреси",
|
|
264
|
+
"ip-mode": "Режим IP",
|
|
265
|
+
"is-primary-host": "{name} - основний хост",
|
|
266
|
+
"iso-dvd": "ISO/DVD",
|
|
267
|
+
"language": "Мова",
|
|
268
|
+
"mac-address": "MAC-адреса",
|
|
269
|
+
"mac-addresses": "MAC адреси",
|
|
270
|
+
"memory": "Пам'ять",
|
|
271
|
+
"memory-usage": "Використання пам'яті",
|
|
272
|
+
"mtu": "MTU",
|
|
273
|
+
"n-gb-left": "{n} Гб залишилося",
|
|
274
|
+
"n-gb-required": "{n} Гб потрібно",
|
|
275
|
+
"n-percent": "{n} %",
|
|
276
|
+
"new-vif": "Новий VIF",
|
|
277
|
+
"new-vm": "Нова ВМ",
|
|
278
|
+
"new-vm.add": "Додати нову ВМ",
|
|
279
|
+
"new-vm.description": "Опис ВМ",
|
|
280
|
+
"new-vm.name": "Назва ВМ",
|
|
281
|
+
"news": "Новини",
|
|
282
|
+
"not-found": "Не знайдено",
|
|
283
|
+
"not-running": "не запущено",
|
|
284
|
+
"not-yet-available": "Інформація поки недоступна",
|
|
285
|
+
"object": "Об'єкт",
|
|
286
|
+
"object-not-found": "Об'єкт {id} не знайдено…",
|
|
287
|
+
"off": "вимкнено",
|
|
288
|
+
"offline": "Не в мережі",
|
|
289
|
+
"ok": "OK",
|
|
290
|
+
"or": "Або",
|
|
291
|
+
"password": "Пароль",
|
|
292
|
+
"password-invalid": "Неправильний пароль",
|
|
293
|
+
"pif": "PIF",
|
|
294
|
+
"pif-status": "Статус PIF",
|
|
295
|
+
"pifs": "PIFs",
|
|
296
|
+
"pifs-status": "Статус PIF",
|
|
297
|
+
"please-confirm": "Будь ласка, підтвердіть",
|
|
298
|
+
"pxe": "PXE",
|
|
299
|
+
"read": "читати",
|
|
300
|
+
"scan-pifs": "Сканувати PIFs",
|
|
301
|
+
"send": "Відправити",
|
|
302
|
+
"send-ctrl-alt-del": "Надіслати Ctrl+Alt+Del",
|
|
303
|
+
"send-us-feedback": "Надіслати відгук",
|
|
304
|
+
"settings": "Налаштування",
|
|
305
|
+
"size": "Розмір",
|
|
306
|
+
"speed": "Швидкість",
|
|
307
|
+
"sr": "SR",
|
|
308
|
+
"ssh-account": "обліковий запис SSH",
|
|
309
|
+
"ssh-key": "ключ SSH",
|
|
310
|
+
"ssh-login": "ім'я SSH",
|
|
311
|
+
"ssh-password": "пароль SSH",
|
|
312
|
+
"ssh-password-confirm": "Підтвердіть пароль SSH",
|
|
313
|
+
"static-ip": "Статична IP-адреса",
|
|
314
|
+
"uuid": "UUID",
|
|
315
|
+
"vcpus": "vCPU | vCPU | vCPUs",
|
|
316
|
+
"vdi-throughput": "Пропускна здатність VDI",
|
|
317
|
+
"vdis": "VDI | VDI | VDIs",
|
|
318
|
+
"vif": "VIF",
|
|
319
|
+
"vif-device": "VIF #{device}",
|
|
320
|
+
"vifs": "VIFs",
|
|
321
|
+
"virtualization-type": "Тип віртуалізації",
|
|
322
|
+
"vlan": "VLAN",
|
|
323
|
+
"vm-description": "Опис ВМ",
|
|
324
|
+
"vm-status.halted": "зупинено",
|
|
325
|
+
"vm-status.paused": "Пауза",
|
|
326
|
+
"vm-status.running": "Запущений",
|
|
327
|
+
"vm-status.suspended": "Призупинено",
|
|
328
|
+
"vms-status.unknown": "Невідомий",
|
|
329
|
+
"write": "Писати",
|
|
330
|
+
"xo-backups": "резервні копії XO",
|
|
331
|
+
"xo-lite-under-construction": "XOLite знаходиться в розробці",
|
|
332
|
+
"xo-replications": "Реплікації XO",
|
|
333
|
+
"xoa-admin-account": "Акаунт адміністратора XOA",
|
|
334
|
+
"xoa-deploy": "Розгортання XOA",
|
|
335
|
+
"xoa-deploy-failed": "Розгортання не вдалося!",
|
|
336
|
+
"xoa-deploy-retry": "Спробуйте ще раз розгорнути XOA",
|
|
337
|
+
"xoa-deploy-successful": "XOA успішно розгорнуто!",
|
|
338
|
+
"xoa-ip": "IP-адреса XOA"
|
|
339
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { raw, Scale, type Info } from 'human-format'
|
|
2
|
+
|
|
3
|
+
const scale = Scale.create(['B/s', 'KiB/s', 'MiB/s', 'GiB/s', 'TiB/s'], 1024)
|
|
4
|
+
|
|
5
|
+
export function formatSpeedRaw(
|
|
6
|
+
bytes: number,
|
|
7
|
+
milliseconds: number = 1000
|
|
8
|
+
): Info<Scale<'B/s' | 'KiB/s' | 'MiB/s' | 'GiB/s' | 'TiB/s'>> {
|
|
9
|
+
return raw((bytes * 1e3) / milliseconds, {
|
|
10
|
+
scale,
|
|
11
|
+
})
|
|
12
|
+
}
|
package/lib/utils/time.util.ts
CHANGED
|
@@ -16,3 +16,60 @@ export function parseDateTime(dateTime: Date | string | number): number {
|
|
|
16
16
|
}
|
|
17
17
|
return date.getTime()
|
|
18
18
|
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Formats a timeout value (in milliseconds) into a human-readable format using locale-aware formatting
|
|
22
|
+
* @param timeout - Timeout value in milliseconds
|
|
23
|
+
* @param locale - Locale string for formatting (e.g., 'en', 'fr')
|
|
24
|
+
* @returns Human-readable timeout string (e.g., "5 minutes", "2 heures", "1 jour")
|
|
25
|
+
*/
|
|
26
|
+
export function formatTimeout(timeout: number, locale: string): string
|
|
27
|
+
export function formatTimeout(timeout: undefined, locale: string): undefined
|
|
28
|
+
export function formatTimeout(timeout: number | undefined, locale: string): string | undefined
|
|
29
|
+
export function formatTimeout(timeout: number | undefined, locale: string): string | undefined {
|
|
30
|
+
if (timeout === undefined) {
|
|
31
|
+
return undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const secondFormatter = new Intl.NumberFormat(locale, { style: 'unit', unit: 'second' })
|
|
35
|
+
|
|
36
|
+
if (timeout === 0) {
|
|
37
|
+
return secondFormatter.format(0)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const seconds = Math.floor(timeout / 1000)
|
|
41
|
+
|
|
42
|
+
if (seconds < 60) {
|
|
43
|
+
return secondFormatter.format(seconds)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const minuteFormatter = new Intl.NumberFormat(locale, { style: 'unit', unit: 'minute' })
|
|
47
|
+
|
|
48
|
+
const minutes = Math.floor(seconds / 60)
|
|
49
|
+
if (minutes < 60) {
|
|
50
|
+
return minuteFormatter.format(minutes)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const hourFormatter = new Intl.NumberFormat(locale, { style: 'unit', unit: 'hour' })
|
|
54
|
+
|
|
55
|
+
const hours = Math.floor(minutes / 60)
|
|
56
|
+
if (hours < 24) {
|
|
57
|
+
const remainingMinutes = minutes % 60
|
|
58
|
+
if (remainingMinutes === 0) {
|
|
59
|
+
return hourFormatter.format(hours)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return `${hourFormatter.format(hours)} ${minuteFormatter.format(remainingMinutes)}`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const days = Math.floor(hours / 24)
|
|
66
|
+
const remainingHours = hours % 24
|
|
67
|
+
|
|
68
|
+
const dayFormatter = new Intl.NumberFormat(locale, { style: 'unit', unit: 'day' })
|
|
69
|
+
|
|
70
|
+
if (remainingHours === 0) {
|
|
71
|
+
return dayFormatter.format(days)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return `${dayFormatter.format(days)} ${hourFormatter.format(remainingHours)}`
|
|
75
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero :type class="vts-all-done-hero" image="all-done">
|
|
3
|
-
{{ t('all-done') }}
|
|
4
|
-
</VtsStateHero>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts" setup>
|
|
8
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
|
-
|
|
11
|
-
defineProps<{
|
|
12
|
-
type: StateHeroType
|
|
13
|
-
}>()
|
|
14
|
-
|
|
15
|
-
const { t } = useI18n()
|
|
16
|
-
</script>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero :type class="vts-all-good-hero" image="all-good">
|
|
3
|
-
{{ t('all-good') }}
|
|
4
|
-
</VtsStateHero>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts" setup>
|
|
8
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
|
-
|
|
11
|
-
defineProps<{
|
|
12
|
-
type: StateHeroType
|
|
13
|
-
}>()
|
|
14
|
-
|
|
15
|
-
const { t } = useI18n()
|
|
16
|
-
</script>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero :type class="vts-coming-soon-hero" image="under-construction">
|
|
3
|
-
{{ t('coming-soon') }}
|
|
4
|
-
</VtsStateHero>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts" setup>
|
|
8
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
|
-
|
|
11
|
-
defineProps<{
|
|
12
|
-
type: StateHeroType
|
|
13
|
-
}>()
|
|
14
|
-
|
|
15
|
-
const { t } = useI18n()
|
|
16
|
-
</script>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero class="vts-error-hero" image="error" :type>{{ t('error-no-data') }}</VtsStateHero>
|
|
3
|
-
</template>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" setup>
|
|
6
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
7
|
-
import { useI18n } from 'vue-i18n'
|
|
8
|
-
|
|
9
|
-
defineProps<{
|
|
10
|
-
type: StateHeroType
|
|
11
|
-
}>()
|
|
12
|
-
|
|
13
|
-
const { t } = useI18n()
|
|
14
|
-
</script>
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="vts-loading-hero">
|
|
3
|
-
<VtsStateHero :type busy>
|
|
4
|
-
{{ t('loading-in-progress') }}
|
|
5
|
-
</VtsStateHero>
|
|
6
|
-
<div v-if="slots.title || slots.text" class="content">
|
|
7
|
-
<div v-if="slots.title" class="title" :class="className">
|
|
8
|
-
<slot name="title" />
|
|
9
|
-
</div>
|
|
10
|
-
<div v-if="slots.text" class="text typo-body-bold">
|
|
11
|
-
<slot name="text" />
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
</template>
|
|
16
|
-
|
|
17
|
-
<script lang="ts" setup>
|
|
18
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
19
|
-
import { computed } from 'vue'
|
|
20
|
-
import { useI18n } from 'vue-i18n'
|
|
21
|
-
|
|
22
|
-
const { type } = defineProps<{
|
|
23
|
-
type: StateHeroType
|
|
24
|
-
}>()
|
|
25
|
-
|
|
26
|
-
const slots = defineSlots<{
|
|
27
|
-
title?(): any
|
|
28
|
-
text?(): any
|
|
29
|
-
}>()
|
|
30
|
-
|
|
31
|
-
const { t } = useI18n()
|
|
32
|
-
|
|
33
|
-
const className = computed(() => (type === 'page' ? 'typo-h1' : 'typo-h2'))
|
|
34
|
-
</script>
|
|
35
|
-
|
|
36
|
-
<style lang="postcss" scoped>
|
|
37
|
-
.vts-loading-hero {
|
|
38
|
-
display: flex;
|
|
39
|
-
flex-direction: column;
|
|
40
|
-
gap: 1.6rem;
|
|
41
|
-
|
|
42
|
-
.content {
|
|
43
|
-
display: flex;
|
|
44
|
-
flex-direction: column;
|
|
45
|
-
gap: 2.4rem;
|
|
46
|
-
text-align: center;
|
|
47
|
-
|
|
48
|
-
.title {
|
|
49
|
-
color: var(--color-neutral-txt-primary);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.text {
|
|
53
|
-
color: var(--color-neutral-txt-secondary);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
</style>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero class="vts-no-data-hero" image="no-data" :type>{{ t('no-data') }}</VtsStateHero>
|
|
3
|
-
</template>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" setup>
|
|
6
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
7
|
-
import { useI18n } from 'vue-i18n'
|
|
8
|
-
|
|
9
|
-
defineProps<{
|
|
10
|
-
type: StateHeroType
|
|
11
|
-
}>()
|
|
12
|
-
|
|
13
|
-
const { t } = useI18n()
|
|
14
|
-
</script>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero :type class="vts-no-selection-hero" image="no-selection">
|
|
3
|
-
{{ t('select-to-see-details') }}
|
|
4
|
-
</VtsStateHero>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts" setup>
|
|
8
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
|
-
|
|
11
|
-
defineProps<{
|
|
12
|
-
type: StateHeroType
|
|
13
|
-
}>()
|
|
14
|
-
|
|
15
|
-
const { t } = useI18n()
|
|
16
|
-
</script>
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero class="vts-object-not-found-hero" image="no-result" :type>
|
|
3
|
-
{{ t('object-not-found', { id }) }}
|
|
4
|
-
</VtsStateHero>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts" setup>
|
|
8
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
|
-
|
|
11
|
-
defineProps<{
|
|
12
|
-
id: string
|
|
13
|
-
type: StateHeroType
|
|
14
|
-
}>()
|
|
15
|
-
|
|
16
|
-
const { t } = useI18n()
|
|
17
|
-
</script>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero :type class="vts-offline-hero" image="offline">
|
|
3
|
-
{{ t('offline') }}
|
|
4
|
-
</VtsStateHero>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts" setup>
|
|
8
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
9
|
-
import { useI18n } from 'vue-i18n'
|
|
10
|
-
|
|
11
|
-
defineProps<{
|
|
12
|
-
type: StateHeroType
|
|
13
|
-
}>()
|
|
14
|
-
|
|
15
|
-
const { t } = useI18n()
|
|
16
|
-
</script>
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<VtsStateHero class="vts-page-not-found-hero" image="not-found" :type>
|
|
3
|
-
<span class="numeric">404</span><br />
|
|
4
|
-
{{ t('page-not-found') }}
|
|
5
|
-
</VtsStateHero>
|
|
6
|
-
</template>
|
|
7
|
-
|
|
8
|
-
<script lang="ts" setup>
|
|
9
|
-
import VtsStateHero, { type StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
|
|
10
|
-
import { useI18n } from 'vue-i18n'
|
|
11
|
-
|
|
12
|
-
defineProps<{
|
|
13
|
-
type: StateHeroType
|
|
14
|
-
}>()
|
|
15
|
-
|
|
16
|
-
const { t } = useI18n()
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<style lang="postcss" scoped>
|
|
20
|
-
.vts-page-not-found-hero {
|
|
21
|
-
text-align: center;
|
|
22
|
-
margin-top: 4rem;
|
|
23
|
-
|
|
24
|
-
.numeric {
|
|
25
|
-
color: var(--color-brand-txt-base);
|
|
26
|
-
font-size: 9.6rem;
|
|
27
|
-
font-weight: 900;
|
|
28
|
-
letter-spacing: 1em;
|
|
29
|
-
line-height: 100%;
|
|
30
|
-
margin-right: -1em;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
</style>
|