@xen-orchestra/web-core 0.49.0 → 0.50.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.
@@ -0,0 +1,27 @@
1
+ <template>
2
+ <UiButton
3
+ v-tooltip="tooltip"
4
+ size="medium"
5
+ variant="tertiary"
6
+ accent="danger"
7
+ left-icon="action:delete"
8
+ :disabled
9
+ :busy
10
+ >
11
+ {{ t('action:delete') }}
12
+ </UiButton>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import UiButton from '@core/components/ui/button/UiButton.vue'
17
+ import { vTooltip } from '@core/directives/tooltip.directive'
18
+ import { useI18n } from 'vue-i18n'
19
+
20
+ defineProps<{
21
+ busy?: boolean
22
+ disabled?: boolean
23
+ tooltip?: string | false
24
+ }>()
25
+
26
+ const { t } = useI18n()
27
+ </script>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <MenuList placement="bottom-end">
3
+ <template #trigger="{ open }">
4
+ <UiButtonIcon
5
+ v-tooltip="{
6
+ placement: 'top',
7
+ content: t('quick-actions'),
8
+ }"
9
+ icon="action:more-actions"
10
+ accent="brand"
11
+ :size
12
+ @click="open($event)"
13
+ />
14
+ </template>
15
+ <MenuItem
16
+ v-for="(action, index) of actions"
17
+ :key="index"
18
+ :icon="action.icon"
19
+ :disabled="action.disabled"
20
+ :busy="action.busy"
21
+ :on-click="action.onClick"
22
+ >
23
+ {{ action.label }}
24
+ <i v-if="action.hint">{{ action.hint }}</i>
25
+ </MenuItem>
26
+ </MenuList>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import MenuItem from '@core/components/menu/MenuItem.vue'
31
+ import MenuList from '@core/components/menu/MenuList.vue'
32
+ import type { ButtonIconSize } from '@core/components/ui/button-icon/UiButtonIcon.vue'
33
+ import UiButtonIcon from '@core/components/ui/button-icon/UiButtonIcon.vue'
34
+ import { vTooltip } from '@core/directives/tooltip.directive.ts'
35
+ import type { IconName } from '@core/icons'
36
+ import { useI18n } from 'vue-i18n'
37
+
38
+ const { size = 'small', actions = [] } = defineProps<{
39
+ size?: ButtonIconSize
40
+ actions?: ActionItem[]
41
+ }>()
42
+
43
+ const { t } = useI18n()
44
+
45
+ export type ActionItem = {
46
+ label: string
47
+ hint?: string
48
+ icon?: IconName
49
+ onClick: () => any
50
+ disabled?: boolean
51
+ busy?: boolean
52
+ }
53
+ </script>
@@ -25,7 +25,7 @@ const modalStore = useModalStore()
25
25
  position: fixed;
26
26
  inset: 0;
27
27
  background-color: var(--color-opacity-primary);
28
- z-index: 1011;
28
+ z-index: 1012;
29
29
 
30
30
  .modal-component:not(:last-child) {
31
31
  filter: brightness(0.8);
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <UiTableCell align="center">
3
+ <div class="vts-action-cell">
4
+ <UiButtonIcon
5
+ :icon="buttonIcon"
6
+ :accent="buttonAccent"
7
+ :size="buttonSize"
8
+ :target-scale="1.5"
9
+ @click="emit('click')"
10
+ />
11
+ <VtsActionsMenu v-if="actions.length" :actions />
12
+ </div>
13
+ </UiTableCell>
14
+ </template>
15
+
16
+ <script setup lang="ts">
17
+ import VtsActionsMenu, { type ActionItem } from '@core/components/menu/VtsActionsMenu.vue'
18
+ import type { ButtonIconAccent, ButtonIconSize } from '@core/components/ui/button-icon/UiButtonIcon.vue'
19
+ import UiButtonIcon from '@core/components/ui/button-icon/UiButtonIcon.vue'
20
+ import UiTableCell from '@core/components/ui/table-cell/UiTableCell.vue'
21
+ import type { IconName } from '@core/icons'
22
+
23
+ const {
24
+ buttonAccent = 'brand',
25
+ buttonSize = 'small',
26
+ actions = [],
27
+ } = defineProps<{
28
+ buttonIcon: IconName
29
+ buttonAccent?: ButtonIconAccent
30
+ buttonSize?: ButtonIconSize
31
+ actions?: ActionItem[]
32
+ }>()
33
+
34
+ const emit = defineEmits<{
35
+ click: []
36
+ }>()
37
+ </script>
38
+
39
+ <style scoped lang="postcss">
40
+ .vts-action-cell {
41
+ display: flex;
42
+ gap: 0.8rem;
43
+ }
44
+ </style>
@@ -7,7 +7,8 @@ This composable manages automatic navigation to default tabs and remembers the l
7
7
  The composable watches route changes and:
8
8
 
9
9
  - Automatically redirects to the remembered or default tab when navigating to the base dispatcher route
10
- - Stores the current tab in localStorage for future visits
10
+ - Stores the last visited tab when switching between objects of the same type (e.g., VM → VM)
11
+ - Resets to default tab when navigating to a different object type or any other page
11
12
  - Uses the naming convention `{dispatcherRouteName}/{tabName}` for tab route names
12
13
 
13
14
  ## Parameters
@@ -21,22 +22,27 @@ The composable watches route changes and:
21
22
 
22
23
  ```typescript
23
24
  // In the dispatcher page component (e.g., `pages/pool/[id].vue`)
24
- useDefaultTab('pool/[id]', 'dashboard')
25
+ useDefaultTab('/pool/[id]', 'dashboard')
25
26
 
26
- // User first navigates to /pool/123
27
+ // User navigates to /pool/123
27
28
  // → Automatic redirect to /pool/123/dashboard (default tab)
28
29
 
29
- // User then navigates to /pool/123/stats
30
- // → 'stats' is stored as the last visited tab for this route
30
+ // User navigates to /pool/123/system
31
+ // → 'system' is stored as the last visited tab
31
32
 
32
- // Finally, user navigates to /pool/456
33
- // → Automatic redirect to /pool/456/stats
33
+ // User navigates to /pool/456 (same object type)
34
+ // → Automatic redirect to /pool/456/system (tab remembered)
35
+
36
+ // User navigates to /vm/789 (different object type)
37
+ // → Automatic redirect to /vm/789/dashboard (Tab memory is reset)
38
+
39
+ // User navigates back to /pool/456
40
+ // → Automatic redirect to /pool/456/dashboard (default tab)
34
41
  ```
35
42
 
36
43
  ## Storage
37
44
 
38
- Tab preferences are stored in localStorage under the key `default-tabs` with the structure:
45
+ Tab memory is stored in localStorage using two different keys:
39
46
 
40
- ```typescript
41
- Map<string, string> // dispatcherRouteName -> lastVisitedTab
42
- ```
47
+ - `tab-memory.dispatcher` — the dispatcher route name of the last visited object type
48
+ - `tab-memory.last` the last visited tab name
@@ -1,17 +1,22 @@
1
- import { useLocalStorage } from '@vueuse/core'
2
1
  import { watch } from 'vue'
3
2
  import { type RouteLocationRaw, type RouteRecordName, useRoute, useRouter } from 'vue-router'
4
3
 
4
+ const TAB_MEMORY_DISPATCHER = 'tab-memory.dispatcher'
5
+ const TAB_MEMORY_LAST = 'tab-memory.last'
6
+
5
7
  export function useDefaultTab(dispatcherRouteName: RouteRecordName & string, defaultTab: string) {
6
- const storage = useLocalStorage('default-tabs', new Map<string, string>())
7
8
  const router = useRouter()
8
9
  const route = useRoute()
9
10
 
11
+ // TODO: Delete after 2 to 3 months (once all users have cleared their local storage)
12
+ localStorage.removeItem('default-tabs')
13
+
10
14
  watch(
11
15
  () => route.name as string,
12
16
  name => {
13
17
  if (name === dispatcherRouteName) {
14
- const tabName = storage.value.get(dispatcherRouteName) ?? defaultTab
18
+ const isSameDispatcher = localStorage.getItem(TAB_MEMORY_DISPATCHER) === dispatcherRouteName
19
+ const tabName = (isSameDispatcher ? localStorage.getItem(TAB_MEMORY_LAST) : null) ?? defaultTab
15
20
  void router.replace({ name: `${dispatcherRouteName}/${tabName}` } as RouteLocationRaw)
16
21
  } else if (!name.startsWith(dispatcherRouteName)) {
17
22
  return
@@ -19,7 +24,8 @@ export function useDefaultTab(dispatcherRouteName: RouteRecordName & string, def
19
24
 
20
25
  const tab = name.slice(dispatcherRouteName.length).split('/')[1] ?? defaultTab
21
26
 
22
- storage.value.set(dispatcherRouteName, tab)
27
+ localStorage.setItem(TAB_MEMORY_DISPATCHER, dispatcherRouteName)
28
+ localStorage.setItem(TAB_MEMORY_LAST, tab)
23
29
  },
24
30
  { immediate: true }
25
31
  )
@@ -29,9 +29,10 @@
29
29
  "action:delete": "Smazat",
30
30
  "action:delete-filter": "Smazat filtr",
31
31
  "action:delete-group": "Smazat skupinu",
32
- "action:delete-vms": "Smazat 1 virt. stroj | Smazat {n} virt. strojů",
32
+ "action:delete-n-vms": "Smazat 1 virt. stroj | Smazat {n} virt. strojů",
33
33
  "action:deploy": "Nasadit",
34
34
  "action:deploy-xoa": "Nasadit XOA",
35
+ "action:download-bugtools-archive": "Stáhnout archiv s výstupem bugtools",
35
36
  "action:duplicate": "Zduplikovat",
36
37
  "action:edit": "Upravit",
37
38
  "action:edit-config": "Upravit nastavení",
@@ -150,6 +151,7 @@
150
151
  "backup:full-replication": "Úplná replikace",
151
152
  "backup:incremental": "Přírůstková záloha",
152
153
  "backup:incremental-replication": "Přírůstková replikace",
154
+ "backup:last-replication": "Poslední replikace",
153
155
  "backup:mirror:full": "Zrcadlová úplná záloha",
154
156
  "backup:mirror:incremental": "Zrcadlová přírůstková záloha",
155
157
  "backup:pool-metadata": "Metadata fondu",
@@ -162,7 +164,7 @@
162
164
  "backups:jobs:issues-ran-without-hitch": "Všechny vaše úlohy zálohování proběhly bez závady.",
163
165
  "backups:jobs:last-seven-days": "V uplynulých 7 dnech",
164
166
  "backups:jobs:no-recent-run": "Žádný nedávný běh",
165
- "backups:jobs:running-good": "Běží v pořádku",
167
+ "backups:jobs:running-good": "Vše v pořádku",
166
168
  "backups:jobs:skipped-runs": "Přeskočená spouštění, žádné chyby",
167
169
  "backups:jobs:status": "Stav úloh zálohování",
168
170
  "backups:vms-protection": "Ochrana virt. strojů",
@@ -237,6 +239,7 @@
237
239
  "crash-dump-storage-repository": "Repozitář úložiště výpisů pádů",
238
240
  "created-by": "Vytvořil/a",
239
241
  "created-on": "Vytvořeno",
242
+ "creation-date": "Datum vytvoření",
240
243
  "cron-pattern": "Vzorec plánování (cron)",
241
244
  "current": "Stávající",
242
245
  "current-attach": "Stávající připojení",
@@ -334,6 +337,7 @@
334
337
  "id": "Identif.",
335
338
  "in-last-three-runs": "V jejich posledních 3 spuštěních",
336
339
  "in-progress": "V přípravě",
340
+ "included": "Včetně",
337
341
  "info": "Informace",
338
342
  "infos": "Informace",
339
343
  "install-settings": "Nastavení instalace",
@@ -364,6 +368,7 @@
364
368
  "job:arg:sr-vdi-required": "Je zapotřebí VDI repozitáře úložiště",
365
369
  "job:arg:template-uuid-required": "Je zapotřebí UUID šablony",
366
370
  "job:arg:username-required": "Je zapotřebí uživatelské jméno",
371
+ "job:delete:in-progress": "Probíhá mazání…",
367
372
  "job:create:in-progress": "Probíhá vytváření…",
368
373
  "job:vm-copy:bad-power-state": "Je třeba, aby virt. stroj byl zastavený",
369
374
  "job:vm-copy:in-progress": "Probíhá kopírování…",
@@ -371,7 +376,6 @@
371
376
  "job:vm-create:incomplete-install-mode": "Instalační režim je nekompletní",
372
377
  "job:vm-delete:bad-power-state": "Je třeba, aby virt. stroj byl zastavený",
373
378
  "job:vm-delete:blocked-operation": "Smazání virt. stroje je blokováno",
374
- "job:vm-delete:in-progress": "Probíhá mazání…",
375
379
  "job:vm-delete:missing-vm": "Žádný virt. stroj ke smazání",
376
380
  "job:vm-export:in-progress": "Probíhá export…",
377
381
  "job:vm-export:missing-compression": "Je třeba zadat kompresi",
@@ -426,7 +430,9 @@
426
430
  "last-n-backup-archives": "Poslední archiv zálohy | Posledních {n} archivů záloh",
427
431
  "last-n-backup-runs": "Poslední spouštění zálohy | Posledních {n} spuštěních záloh",
428
432
  "last-n-runs": "Naposledy spuštěno | Posledních {n} spuštění",
433
+ "last-revert": "Poslední navrácení do předchozího stavu",
429
434
  "last-run-number": "Poslední běh č. {n}",
435
+ "last-snapshot": "Poslední zachycený stav",
430
436
  "last-week": "Uplynulý týden",
431
437
  "learn-more": "Zjistit více",
432
438
  "lets-go!": "Pojďme!",
@@ -435,7 +441,7 @@
435
441
  "license-type": "Typ licence",
436
442
  "licensing": "Licencování",
437
443
  "load-average": "Průměrné vytížení",
438
- "loading": "Načítání…",
444
+ "loading": "Načítání",
439
445
  "loading-hosts": "Načítání hostitelů…",
440
446
  "local": "Lokální",
441
447
  "locked": "Uzamčeno",
@@ -451,11 +457,13 @@
451
457
  "management-agent-not-detected": "Agent pro správu nezjištěn",
452
458
  "management-agent-version": "Verze agenta pro správu",
453
459
  "management-ip": "IP adresa správy",
460
+ "manual": "Ručně",
454
461
  "manufacturer-info": "Informace o výrobci",
455
462
  "master": "Hlavní hostitel",
456
463
  "maximum-cpu-limit": "Limit procesoru nejvýše",
457
464
  "maximum-dynamic-memory": "Dynamické přidělované paměti nejvýše",
458
465
  "maximum-static-memory": "Staticky přidělené paměti nejvýše",
466
+ "memory": "Paměť",
459
467
  "memory-usage": "Využití paměti",
460
468
  "merge-backups-synchronously": "Sloučit zálohy synchronně",
461
469
  "message": "Zpráva",
@@ -473,7 +481,7 @@
473
481
  "modal:confirm-vm-force-shutdown": "Potvrďte vynucení vypnutí virt. stroje",
474
482
  "modal:confirm-vm-reboot": "Potvrďte restart virt. stroje",
475
483
  "modal:confirm-vm-shutdown": "Potvrďte vypnutí virt. stroje",
476
- "modal:vm-force-reboot-message": "Toto virtuální stroj okamžitě vypne bez čekání na korektní vypnutí. Může dojít ke ztrátě a probíhající procesy budou přerušeny.",
484
+ "modal:vm-force-reboot-message": "Toto virtuální stroj okamžitě restartuje bez čekání na korektní vypnutí. Může dojít ke ztrátě dat a probíhající procesy budou přerušeny.",
477
485
  "modal:vm-force-shutdown-message": "Toto virtuální stroj okamžitě vypne bez čekání na korektní vypnutí. Může dojít ke ztrátě dat a probíhající procesy budou přerušeny.",
478
486
  "modal:vm-reboot-message": "Provede korektní restart virtuálního stroje jeho vypnutím a opětovným spuštěním. Spuštěné procesy budou korektně ukončeny.",
479
487
  "modal:vm-shutdown-message": "Provede korektní vypnutí virtuálního stroje. Veškeré spuštěné procesy budou ukončeny a uživatelé odpojeni. Virt. stroj je později možné znovu spustit z webového rozhraní.",
@@ -551,6 +559,7 @@
551
559
  "no-selected-vm-can-be-exported": "Žádný z označených virt. strojů není možné exportovat",
552
560
  "no-selected-vm-can-be-migrated": "Žádný z označených virt. strojů není možné přestěhovat",
553
561
  "no-server-detected": "Nezjištěny žádné servery",
562
+ "no-snapshot-detected": "Nezjištěny žádné zachycené stavy",
554
563
  "no-storage-repository-detected": "Nezjištěny žádné repozitáře úložišť",
555
564
  "no-task": "Žádné úlohy",
556
565
  "no-task-detected": "Nezjištěny žádné úlohy",
@@ -562,6 +571,7 @@
562
571
  "none": "Žádný",
563
572
  "normal": "Normální",
564
573
  "not-found": "Nenalezeno",
574
+ "not-included": "Vyjma",
565
575
  "not-resident-on": "Nenacházející se na",
566
576
  "not-running": "Nespuštěné",
567
577
  "not-yet-available": "Informace zatím ještě není k dispozici",
@@ -594,6 +604,7 @@
594
604
  "other-properties": "Ostatní vlastnosti",
595
605
  "other-settings": "Ostatní nastavení",
596
606
  "page-not-found": "Tato stránka není k nalezení…",
607
+ "page-please-wait": "Držte se pevně, astronaute! Tato stránka se připravuje odstartovat.{newline}Jen ještě zarovnáváme trysky a kalibrujeme systémy. Nebude to už dlouho trvat, zůstaňte na příjmu!",
597
608
  "pagination:all": "Vše",
598
609
  "partially-connected": "Částečně připojeno",
599
610
  "password": "Heslo",
@@ -611,6 +622,7 @@
611
622
  "pifs": "FYZICKÁ ROZHRANÍ",
612
623
  "pifs-status": "Stav FYZICKÝCH ROZHRANÍ",
613
624
  "please-confirm-to-continue": "Tuto akci nelze vzít zpět. Opravdu chcete pokračovat?",
625
+ "please-wait": "Čekejte prosím",
614
626
  "pool": "Fond",
615
627
  "pool-connection-error-auth-failed": "Při připojování k fondu došlo k chybě. Zdá se, že uživatelské jméno nebo heslo není správné.",
616
628
  "pool-connection-error-duplicate": "Při připojování k fondu došlo k chybě. Zdá se, že už je připojený.",
@@ -738,6 +750,7 @@
738
750
  "skipped": "Přeskočeno",
739
751
  "smart-mode": "Inteligentní režim",
740
752
  "snapshot": "Zachytit stav",
753
+ "snapshot-created-on": "Zachycený stav vytvořen",
741
754
  "snapshot-mode": "Režim zachyceného stavu",
742
755
  "snapshots": "Zachycené stavy",
743
756
  "sockets-with-cores-per-socket": "{nSockets} patic × {nCores} jader/patici",
@@ -758,7 +771,7 @@
758
771
  "start-console": "Aby bylo možné přistupovat ke konzoli a navázat ve fungování, {type} zapněte!",
759
772
  "start-date": "Počáteční datum",
760
773
  "start-delay": "Prodleva zapnutí",
761
- "start-host": "Pro navázání ve fungování hostitele ho zapněte (případně sem zavítejte později, až bude zapnutý).",
774
+ "start-host": "Aby začal znovu fungovat, hostitele zapněte (případně sem zavítejte později, až bude zapnutý).",
762
775
  "start-vm": "Aby bylo možné přistupovat k jeho konzoli a podrobnostem k nastavení, je třeba ho spustit.",
763
776
  "started": "Spuštěné",
764
777
  "state": "Stav",
@@ -777,6 +790,7 @@
777
790
  "status:suspended": "Uspáno",
778
791
  "status:unknown": "Neznámé | Neznámý",
779
792
  "status:unreachable": "Nedosažitelné",
793
+ "step-n-of": "Krok {current} / {total}",
780
794
  "storage": "Úložiště",
781
795
  "storage-configuration": "Nastavení úložiště",
782
796
  "storage-format": "Formát úložiště",
@@ -839,11 +853,13 @@
839
853
  "total-used:": "Celkem využito:",
840
854
  "transfer-size": "Objem přenosu",
841
855
  "translation-tool": "Nástroj pro překládání",
856
+ "trigger": "Spouštěč",
842
857
  "unable-to-connect-to": "Nebylo možné se připojit k {ip}",
843
858
  "unable-to-connect-to-the-pool": "Nebylo možné se připojit k fondu",
844
859
  "unable-to-connect-to-xo-server": "Nebylo možné se připojit k XO serveru.",
845
860
  "unknown": "Neznámé",
846
861
  "unlocked": "Odemčeno",
862
+ "unnamed": "Bez názvu",
847
863
  "unreachable-hosts": "Nedosažitelní hostitelé",
848
864
  "unreachable-hosts-reload-page": "Hotovo, načtěte stránku znovu",
849
865
  "untitled": "Bez názvu",
@@ -852,6 +868,7 @@
852
868
  "used": "Využito",
853
869
  "used-for-backup": "Použito pro zálohu",
854
870
  "used-space": "Využitý prostor",
871
+ "used-space-on-sr": "Použitý prostor na repozitáři úložiště",
855
872
  "user-config": "Nastavení uživatele",
856
873
  "username": "Uživatelské jméno",
857
874
  "uuid": "UUID",
@@ -22,7 +22,7 @@
22
22
  "action:copy-info-json": "Kopier information til JSON",
23
23
  "action:create": "Opret",
24
24
  "action:delete": "Slet",
25
- "action:delete-vms": "Slet 1 VM | Slet {n} VM'er",
25
+ "action:delete-n-vms": "Slet 1 VM | Slet {n} VM'er",
26
26
  "action:deploy": "Indsætte",
27
27
  "action:deploy-xoa": "Installer XOA",
28
28
  "action:edit": "Rediger",
@@ -241,11 +241,11 @@
241
241
  "iscsi-iqn": "iSCSI IQN",
242
242
  "iso-dvd": "ISO/DVD",
243
243
  "job-name": "Job navn",
244
+ "job:delete:in-progress": "Sletning er i gang…",
244
245
  "job:vm-copy:bad-power-state": "VM skal stoppes",
245
246
  "job:vm-copy:in-progress": "Kopiering i gang…",
246
247
  "job:vm-copy:missing-vm": "Ingen VM at kopiere",
247
248
  "job:vm-delete:bad-power-state": "VM skal stoppes",
248
- "job:vm-delete:in-progress": "Sletning er i gang…",
249
249
  "job:vm-delete:missing-vm": "Ingen VM at slette",
250
250
  "job:vm-export:in-progress": "Eksport er i gang…",
251
251
  "job:vm-export:missing-compression": "Komprimering skal angives",
@@ -277,7 +277,7 @@
277
277
  "last-week": "Sidste uge",
278
278
  "learn-more": "Lær mere",
279
279
  "licensing": "Licensering",
280
- "loading": "Indlæser",
280
+ "loading": "Indlæser",
281
281
  "local": "Lokal",
282
282
  "login": "Log ind",
283
283
  "mac-address": "MAC-adresse",
@@ -29,7 +29,7 @@
29
29
  "action:delete": "Löschen",
30
30
  "action:delete-filter": "Filter löschen",
31
31
  "action:delete-group": "Gruppe löschen",
32
- "action:delete-vms": "1 VM löschen | {n} VMs löschen",
32
+ "action:delete-n-vms": "1 VM löschen | {n} VMs löschen",
33
33
  "action:deploy": "Bereitstellen",
34
34
  "action:deploy-xoa": "XOA bereitstellen",
35
35
  "action:duplicate": "Duplizieren",
@@ -357,6 +357,7 @@
357
357
  "job:arg:sr-vdi-required": "SR VDI ist erforderlich",
358
358
  "job:arg:template-uuid-required": "Template UUID ist erforderlich",
359
359
  "job:arg:username-required": "Benutzername ist erforderlich",
360
+ "job:delete:in-progress": "Löschung läuft…",
360
361
  "job:create:in-progress": "Erstellung läuft…",
361
362
  "job:vm-copy:bad-power-state": "Die VM muss angehalten werden",
362
363
  "job:vm-copy:in-progress": "Kopiervorgang läuft…",
@@ -364,7 +365,6 @@
364
365
  "job:vm-create:incomplete-install-mode": "Installationsmodus ist unvollständig",
365
366
  "job:vm-delete:bad-power-state": "Die VM muss gestoppt werden",
366
367
  "job:vm-delete:blocked-operation": "VM Löschung ist gesperrt",
367
- "job:vm-delete:in-progress": "Löschung läuft…",
368
368
  "job:vm-delete:missing-vm": "Keine VM zu löschen",
369
369
  "job:vm-export:in-progress": "Export läuft…",
370
370
  "job:vm-export:missing-compression": "Kompression ist erforderlich",
@@ -426,7 +426,7 @@
426
426
  "license-type": "Lizenztyp",
427
427
  "licensing": "Lizensierung",
428
428
  "load-average": "Durchschnittsauslastung",
429
- "loading": "Ladevorgang läuft",
429
+ "loading": "Ladevorgang läuft",
430
430
  "loading-hosts": "Lade Hosts…",
431
431
  "local": "Lokal",
432
432
  "locked": "Gesperrt",
@@ -32,7 +32,11 @@
32
32
  "action:delete": "Delete",
33
33
  "action:delete-filter": "Delete filter",
34
34
  "action:delete-group": "Delete group",
35
- "action:delete-vms": "Delete 1 VM | Delete {n} VMs",
35
+ "action:delete-n-vbds": "Delete 1 VBD | Delete {n} VBDs",
36
+ "action:delete-n-vdis": "Delete 1 VDI | Delete {n} VDIs",
37
+ "action:delete-n-vifs": "Delete 1 VIF | Delete {n} VIFs",
38
+ "action:delete-n-vms": "Delete 1 VM | Delete {n} VMs",
39
+ "action:delete-vbd": "Delete VBD",
36
40
  "action:deploy": "Deploy",
37
41
  "action:deploy-xoa": "Deploy XOA",
38
42
  "action:download-bugtools-archive": "Download bugtools archive",
@@ -378,13 +382,19 @@
378
382
  "job:arg:username-required": "Username is required",
379
383
  "job:arg:vlan-required": "VLAN is required",
380
384
  "job:create:in-progress": "Create in progress…",
385
+ "job:delete:in-progress": "Delete in progress…",
386
+ "job:vbd-delete:missing-vbd": "No VBDs to delete",
387
+ "job:vbd-delete:vbd-attached": "Cannot delete a VBD that is currently attached",
388
+ "job:vdi-delete:missing-vdi": "No VDIs to delete",
389
+ "job:vdi-delete:vbd-attached": "Cannot delete a VDI with VBD attached",
390
+ "job:vif-delete:blocked-operation": "VIF deletion is blocked",
391
+ "job:vif-delete:missing-vif": "No VIFs to delete",
381
392
  "job:vm-copy:bad-power-state": "VM must be halted",
382
393
  "job:vm-copy:in-progress": "Copy in progress…",
383
394
  "job:vm-copy:missing-vm": "No VMs to copy",
384
395
  "job:vm-create:incomplete-install-mode": "Install mode is incomplete",
385
396
  "job:vm-delete:bad-power-state": "VM must be halted",
386
397
  "job:vm-delete:blocked-operation": "VM deletion is blocked",
387
- "job:vm-delete:in-progress": "Delete in progress…",
388
398
  "job:vm-delete:missing-vm": "No VMs to delete",
389
399
  "job:vm-export:in-progress": "Export in progress…",
390
400
  "job:vm-export:missing-compression": "Compression must be provided",
@@ -491,7 +501,7 @@
491
501
  "modal:confirm-vm-force-shutdown": "Confirm VM force shutdown",
492
502
  "modal:confirm-vm-reboot": "Confirm VM reboot",
493
503
  "modal:confirm-vm-shutdown": "Confirm VM shutdown",
494
- "modal:vm-force-reboot-message": "This will immediately power off the virtual machine without a clean shutdown. Data loss may occur and ongoing processes will be interrupted.",
504
+ "modal:vm-force-reboot-message": "This will immediately reboot the virtual machine without a clean shutdown. Data loss may occur and ongoing processes will be interrupted.",
495
505
  "modal:vm-force-shutdown-message": "This will immediately power off the virtual machine without a clean shutdown. Data loss may occur and ongoing processes will be interrupted.",
496
506
  "modal:vm-reboot-message": "Restarts the virtual machine gracefully by shutting it down and starting it again. Running processes will be closed properly.",
497
507
  "modal:vm-shutdown-message": "This will gracefully shut down the virtual machine. All running processes will stop, and users may be disconnected. You can restart the VM later from the interface.",
@@ -512,6 +522,8 @@
512
522
  "n-percent": "{n}%",
513
523
  "n-selected-of": "{count} selected of {total} objects",
514
524
  "n-subtasks": "1 subtask | {n} subtasks",
525
+ "n-vdis": "1 VDI | {n} VDIs",
526
+ "n-vifs": "1 VIF | {n} VIFs",
515
527
  "n-vms": "1 VM | {n} VMs",
516
528
  "name": "Name",
517
529
  "nbd-concurrency": "NBD concurrency",
@@ -895,16 +907,20 @@
895
907
  "user-config": "User config",
896
908
  "username": "Username",
897
909
  "uuid": "UUID",
910
+ "vbd-delete-info": "This will detach the selected VDI from the VM. The disk will not be deleted and can be reattached later.",
911
+ "vbd-delete-title": "You are about to delete 1 VBD | You are about to delete {n} VBDs",
898
912
  "vcpu": "vCPU",
899
913
  "vcpus": "vCPUs",
900
914
  "vcpus-assigned": "vCPUs assigned",
901
915
  "vdi": "VDI",
916
+ "vdi-delete-warning": "This will permanently delete the selected VDI and all data stored on it. This action cannot be undone.",
902
917
  "vdi-throughput": "VDI throughput",
903
918
  "vdis": "VDIs",
904
919
  "version": "Version",
905
920
  "vga": "VGA",
906
921
  "video-ram": "Video RAM",
907
922
  "vif": "VIF",
923
+ "vif-connected": "VIF is connected",
908
924
  "vif-device": "VIF #{device}",
909
925
  "vif-status": "VIF status",
910
926
  "vifs": "VIFs",