brać aktualizacji',\n\n  // Original text: \"Upgrade successful\"\n  promptUpgradeReloadTitle: 'Aktualizacja zakończona sukcesem',\n\n  // Original text: \"Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?\"\n  promptUpgradeReloadMessage:\n    'Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?',\n\n  // Original text: \"Xen Orchestra from the sources\"\n  disclaimerTitle: 'Xen Orchestra z źródeł',\n\n  // Original text: \"You are using XO from the sources! That's great for a personal/non-profit usage.\"\n  disclaimerText1: 'Używasz XO z źródeł!. To dobre rozwiązanie tylko do prywatnego/nieprodukcyjnego użytku',\n\n  // Original text: \"If you are a company, it's better to use it with our appliance + pro support included:\"\n  disclaimerText2: \"If you are a company, it's better to use it with our appliance + pro support included:\",\n\n  // Original text: \"This version is not bundled with any support nor updates. Use it with caution for critical tasks.\"\n  disclaimerText3: 'This version is not bundled with any support nor updates. Use it with caution.',\n\n  // Original text: \"Connect PIF\"\n  connectPif: 'Connect PIF',\n\n  // Original text: \"Are you sure you want to connect this PIF?\"\n  connectPifConfirm: 'Are you sure you want to connect this PIF?',\n\n  // Original text: \"Disconnect PIF\"\n  disconnectPif: 'Disconnect PIF',\n\n  // Original text: \"Are you sure you want to disconnect this PIF?\"\n  disconnectPifConfirm: 'Are you sure you want to disconnect this PIF ?',\n\n  // Original text: \"Delete PIF\"\n  deletePif: 'Delete PIF',\n\n  // Original text: \"Are you sure you want to delete this PIF?\"\n  deletePifConfirm: 'Are you sure you want to delete this PIF?',\n\n  // Original text: \"Username\"\n  username: 'Użytkownik',\n\n  // Original text: \"Password\"\n  password: 'Hasło',\n\n  // Original text: \"Language\"\n  language: 'Język',\n\n  // Original text: \"Old password\"\n  oldPasswordPlaceholder: 'Stare hasło',\n\n  // Original text: \"New password\"\n  newPasswordPlaceholder: 'Nowe hasło',\n\n  // Original text: \"Confirm new password\"\n  confirmPasswordPlaceholder: 'Potwierdź nowe hasło',\n\n  // Original text: \"Confirmation password incorrect\"\n  confirmationPasswordError: 'Potwierdzenie hasła niepoprawne',\n\n  // Original text: \"Password does not match the confirm password.\"\n  confirmationPasswordErrorBody: 'Hasło nie zgadza się z potwierdzeniem',\n\n  // Original text: \"Password changed\"\n  pwdChangeSuccess: 'Hasło zmienione',\n\n  // Original text: \"Your password has been successfully changed.\"\n  pwdChangeSuccessBody: 'Twoje hasło zostało pomyślnie zmienione',\n\n  // Original text: \"Incorrect password\"\n  pwdChangeError: 'Nieprawidłowe hasło',\n\n  // Original text: \"The old password provided is incorrect. Your password has not been changed.\"\n  pwdChangeErrorBody: 'The old password provided is incorrect. Your password has not been changed.',\n\n  // Original text: \"OK\"\n  changePasswordOk: 'OK',\n\n  // Original text: \"SSH keys\"\n  sshKeys: 'Klucze SSH',\n\n  // Original text: \"New SSH key\"\n  newSshKey: 'Nowy klucz SSH',\n\n  // Original text: \"Delete\"\n  deleteSshKey: 'Usuń',\n\n  // Original text: \"No SSH keys\"\n  noSshKeys: 'Brak kluczy SSH',\n\n  // Original text: \"New SSH key\"\n  newSshKeyModalTitle: 'Nowy klucz SSH',\n\n  // Original text: \"Invalid key\"\n  sshKeyErrorTitle: 'Nieprawidłowy klucz',\n\n  // Original text: \"An SSH key requires both a title and a key.\"\n  sshKeyErrorMessage: 'An SSH key requires both a title and a key.',\n\n  // Original text: \"Title\"\n  title: 'Title',\n\n  // Original text: \"Key\"\n  key: 'Klucz',\n\n  // Original text: \"Delete SSH key\"\n  deleteSshKeyConfirm: 'Usuń klucz SSH',\n\n  // Original text: \"Are you sure you want to delete the SSH key {title}?\"\n  deleteSshKeyConfirmMessage: 'Are you sure you want to delete the SSH key {title}?',\n\n  // Original text: \"Others\"\n  others: 'Inne',\n\n  // Original text: \"Loading logs…\"\n  loadingLogs: 'Ładowanie logów…',\n\n  // Original text: \"User\"\n  logUser: 'Użytkownik',\n\n  // Original text: \"Method\"\n  logMethod: 'Metoda',\n\n  // Original text: \"Params\"\n  logParams: 'Params',\n\n  // Original text: \"Message\"\n  logMessage: 'Wiadomość',\n\n  // Original text: \"Error\"\n  logError: 'Błąd',\n\n  // Original text: \"Display details\"\n  logDisplayDetails: 'Wyświetl szczegóły',\n\n  // Original text: \"Date\"\n  logTime: 'Data',\n\n  // Original text: \"No stack trace\"\n  logNoStackTrace: 'No stack trace',\n\n  // Original text: \"No params\"\n  logNoParams: 'No params',\n\n  // Original text: \"Delete log\"\n  logDelete: 'Usuń logi',\n\n  // Original text: \"Delete all logs\"\n  logDeleteAll: 'Usuń wszystkie logi',\n\n  // Original text: \"Delete all logs\"\n  logDeleteAllTitle: 'Usuń wszystkie logi',\n\n  // Original text: \"Are you sure you want to delete all the logs?\"\n  logDeleteAllMessage: 'Are you sure you want to delete all the logs?',\n\n  // Original text: \"Name\"\n  ipPoolName: 'Nazwa',\n\n  // Original text: \"IPs\"\n  ipPoolIps: 'IPs',\n\n  // Original text: \"IPs (e.g.: 1.0.0.12-1.0.0.17;1.0.0.23)\"\n  ipPoolIpsPlaceholder: 'IPs (np.: 1.0.0.12-1.0.0.17;1.0.0.23)',\n\n  // Original text: \"Networks\"\n  ipPoolNetworks: 'Sieci',\n\n  // Original text: \"No IP pools\"\n  ipsNoIpPool: 'Brak puli IP',\n\n  // Original text: \"Create\"\n  ipsCreate: 'Utwórz',\n\n  // Original text: \"Delete all IP pools\"\n  ipsDeleteAllTitle: 'Usuń wszystkie pule IP',\n\n  // Original text: \"Are you sure you want to delete all the IP pools?\"\n  ipsDeleteAllMessage: 'Jesteś pewien że chcesz usunąć wszystkie pule IP?',\n\n  // Original text: \"VIFs\"\n  ipsVifs: 'VIFs',\n\n  // Original text: \"Not used\"\n  ipsNotUsed: 'Nieużywany',\n\n  // Original text: \"Keyboard shortcuts\"\n  shortcutModalTitle: 'Skróty klawiszowe',\n\n  // Original text: \"Global\"\n  shortcut_XoApp: 'Global',\n\n  // Original text: \"Go to hosts list\"\n  shortcut_GO_TO_HOSTS: 'Idź do listy hostów',\n\n  // Original text: \"Go to pools list\"\n  shortcut_GO_TO_POOLS: 'Idź do listy pul',\n\n  // Original text: \"Go to VMs list\"\n  shortcut_GO_TO_VMS: 'Idź do listy VMs',\n\n  // Original text: \"Create a new VM\"\n  shortcut_CREATE_VM: 'Utwórz nową VM',\n\n  // Original text: \"Unfocus field\"\n  shortcut_UNFOCUS: 'Niepodświetlone pole',\n\n  // Original text: \"Show shortcuts key bindings\"\n  shortcut_HELP: 'Show shortcuts key bindings',\n\n  // Original text: \"Home\"\n  shortcut_Home: 'Home',\n\n  // Original text: \"Focus search bar\"\n  shortcut_SEARCH: 'Focus search bar',\n\n  // Original text: \"Next item\"\n  shortcut_NAV_DOWN: 'Next item',\n\n  // Original text: \"Previous item\"\n  shortcut_NAV_UP: 'Previous item',\n\n  // Original text: \"Select item\"\n  shortcut_SELECT: 'Select item',\n\n  // Original text: \"Open\"\n  shortcut_JUMP_INTO: 'Otwarte',\n\n  // Original text: \"VM\"\n  settingsAclsButtonTooltipVM: 'VM',\n\n  // Original text: \"Hosts\"\n  settingsAclsButtonTooltiphost: 'Hosty',\n\n  // Original text: \"Pool\"\n  settingsAclsButtonTooltippool: 'Pule',\n\n  // Original text: \"SR\"\n  settingsAclsButtonTooltipSR: 'SR',\n\n  // Original text: \"Network\"\n  settingsAclsButtonTooltipnetwork: 'Sieć',\n}\n","// See http://momentjs.com/docs/#/use-it/browserify/\nimport 'moment/locale/pt'\n\nimport reactIntlData from 'react-intl/locale-data/pt'\nimport { addLocaleData } from 'react-intl'\naddLocaleData(reactIntlData)\n\n// ===================================================================\n\nexport default {\n  // Original text: 'Connecting'\n  statusConnecting: undefined,\n\n  // Original text: 'Disconnected'\n  statusDisconnected: undefined,\n\n  // Original text: 'Loading…'\n  statusLoading: undefined,\n\n  // Original text: 'Page not found'\n  errorPageNotFound: undefined,\n\n  // Original text: 'no such item'\n  errorNoSuchItem: undefined,\n\n  // Original text: \"Long click to edit\"\n  editableLongClickPlaceholder: 'Longo clique para editar',\n\n  // Original text: \"Click to edit\"\n  editableClickPlaceholder: 'Clique para editar',\n\n  // Original text: \"OK\"\n  alertOk: 'OK',\n\n  // Original text: \"OK\"\n  confirmOk: 'Confirmar',\n\n  // Original text: \"Cancel\"\n  confirmCancel: 'Cancelar',\n\n  // Original text: 'On error'\n  onError: undefined,\n\n  // Original text: 'Successful'\n  successful: undefined,\n\n  // Original text: 'Copy to clipboard'\n  copyToClipboard: undefined,\n\n  // Original text: 'Master'\n  pillMaster: undefined,\n\n  // Original text: \"Home\"\n  homePage: 'Principal',\n\n  // Original text: 'VMs'\n  homeVmPage: undefined,\n\n  // Original text: 'Hosts'\n  homeHostPage: undefined,\n\n  // Original text: 'Pools'\n  homePoolPage: undefined,\n\n  // Original text: 'Templates'\n  homeTemplatePage: undefined,\n\n  // Original text: \"Dashboard\"\n  dashboardPage: 'Painel de Controle',\n\n  // Original text: \"Overview\"\n  overviewDashboardPage: 'Visão Geral',\n\n  // Original text: \"Visualizations\"\n  overviewVisualizationDashboardPage: 'Visualizações',\n\n  // Original text: \"Statistics\"\n  overviewStatsDashboardPage: 'Estatisticas',\n\n  // Original text: \"Health\"\n  overviewHealthDashboardPage: 'Diagnóstico',\n\n  // Original text: \"Self service\"\n  selfServicePage: 'Auto-Serviço',\n\n  // Original text: \"Backup\"\n  backupPage: 'Backup',\n\n  // Original text: \"Jobs\"\n  jobsPage: 'Tarefas',\n\n  // Original text: \"Updates\"\n  updatePage: 'Atualizações',\n\n  // Original text: \"Settings\"\n  settingsPage: 'Configurações',\n\n  // Original text: \"Servers\"\n  settingsServersPage: 'Servidores',\n\n  // Original text: \"Users\"\n  settingsUsersPage: 'Usuários',\n\n  // Original text: \"Groups\"\n  settingsGroupsPage: 'Grupos',\n\n  // Original text: \"ACLs\"\n  settingsAclsPage: 'Controle de Acessos',\n\n  // Original text: \"Plugins\"\n  settingsPluginsPage: 'Plugins',\n\n  // Original text: 'Logs'\n  settingsLogsPage: undefined,\n\n  // Original text: 'IPs'\n  settingsIpsPage: undefined,\n\n  // Original text: \"About\"\n  aboutPage: 'Sobre',\n\n  // Original text: \"New\"\n  newMenu: 'Novo(a)',\n\n  // Original text: \"Tasks\"\n  taskMenu: 'Tarefas',\n\n  // Original text: 'Tasks'\n  taskPage: undefined,\n\n  // Original text: \"VM\"\n  newVmPage: 'VM',\n\n  // Original text: \"Storage\"\n  newSrPage: 'Armazenamento (Storage)',\n\n  // Original text: \"Server\"\n  newServerPage: 'Servidor',\n\n  // Original text: \"Import\"\n  newImport: 'Importar',\n\n  // Original text: \"Overview\"\n  backupOverviewPage: 'Visão Geral',\n\n  // Original text: \"New\"\n  backupNewPage: 'Novo(a)',\n\n  // Original text: \"Remotes\"\n  backupRemotesPage: 'Armazenamento a distância',\n\n  // Original text: \"Restore\"\n  backupRestorePage: 'Recuperar',\n\n  // Original text: \"Schedule\"\n  schedule: 'Agendamento',\n\n  // Original text: \"New VM backup\"\n  newVmBackup: 'Criar novo backup VM',\n\n  // Original text: \"Edit VM backup\"\n  editVmBackup: 'Editar backup VM',\n\n  // Original text: \"Backup\"\n  backup: 'Backup',\n\n  // Original text: \"Rolling Snapshot\"\n  rollingSnapshot: 'Snapshots ativos',\n\n  // Original text: \"Delta Backup\"\n  deltaBackup: 'Backup Diferencial',\n\n  // Original text: \"Disaster Recovery\"\n  disasterRecovery: 'Recuperação de Desastres',\n\n  // Original text: \"Continuous Replication\"\n  continuousReplication: 'Replicação Contínua',\n\n  // Original text: \"Overview\"\n  jobsOverviewPage: 'Visão Geral',\n\n  // Original text: \"New\"\n  jobsNewPage: 'Novo(a)',\n\n  // Original text: \"Scheduling\"\n  jobsSchedulingPage: 'Agendamentos',\n\n  // Original text: \"Custom Job\"\n  customJob: 'Personalização do Trabalho',\n\n  // Original text: 'User'\n  userPage: undefined,\n\n  // Original text: 'No support'\n  noSupport: undefined,\n\n  // Original text: 'Free upgrade!'\n  freeUpgrade: undefined,\n\n  // Original text: \"Sign out\"\n  signOut: 'Sair',\n\n  // Original text: 'Edit my settings {username}'\n  editUserProfile: undefined,\n\n  // Original text: \"Fetching data…\"\n  homeFetchingData: 'Obtendo dados…',\n\n  // Original text: \"Welcome on Xen Orchestra!\"\n  homeWelcome: 'Bem-vindo ao Xen Orchestra',\n\n  // Original text: \"Add your XCP-ng hosts or pools\"\n  homeWelcomeText: 'Adicione seu XenServer hosts e pools',\n\n  // Original text: \"Want some help?\"\n  homeHelp: 'Posso te ajudar?',\n\n  // Original text: \"Add server\"\n  homeAddServer: 'Adicionar Servidor',\n\n  // Original text: \"Online Doc\"\n  homeOnlineDoc: 'Documentação Online',\n\n  // Original text: \"Pro Support\"\n  homeProSupport: 'Suporte Especializado',\n\n  // Original text: \"There are no VMs!\"\n  homeNoVms: 'Não foram encontradas VMs!',\n\n  // Original text: \"Or…\"\n  homeNoVmsOr: 'Ou…',\n\n  // Original text: \"Import VM\"\n  homeImportVm: 'Importar VM',\n\n  // Original text: \"Import an existing VM in xva format\"\n  homeImportVmMessage: 'Importar uma VM existente no formato XVA',\n\n  // Original text: \"Restore a backup\"\n  homeRestoreBackup: 'Restaurar um backup',\n\n  // Original text: \"Restore a backup from a remote store\"\n  homeRestoreBackupMessage: 'Restaurar um backup remoto',\n\n  // Original text: \"This will create a new VM\"\n  homeNewVmMessage: 'Pronto para criar uma nova VM?',\n\n  // Original text: \"Filters\"\n  homeFilters: 'Filtros',\n\n  // Original text: 'No results! Click here to reset your filters'\n  homeNoMatches: undefined,\n\n  // Original text: \"Pool\"\n  homeTypePool: 'Pool',\n\n  // Original text: \"Host\"\n  homeTypeHost: 'Host',\n\n  // Original text: \"VM\"\n  homeTypeVm: 'VM',\n\n  // Original text: \"SR\"\n  homeTypeSr: 'SR',\n\n  // Original text: 'Template'\n  homeTypeVmTemplate: undefined,\n\n  // Original text: \"Sort\"\n  homeSort: 'Classificar',\n\n  // Original text: \"Pools\"\n  homeAllPools: 'Pools',\n\n  // Original text: \"Hosts\"\n  homeAllHosts: 'Hosts',\n\n  // Original text: \"Tags\"\n  homeAllTags: 'Etiquetas',\n\n  // Original text: \"New VM\"\n  homeNewVm: 'Criar nova VM',\n\n  // Original text: \"Running hosts\"\n  homeFilterRunningHosts: 'Hosts Ativos',\n\n  // Original text: \"Disabled hosts\"\n  homeFilterDisabledHosts: 'Hosts Desativados',\n\n  // Original text: \"Running VMs\"\n  homeFilterRunningVms: 'VMs Ativas',\n\n  // Original text: \"Non running VMs\"\n  homeFilterNonRunningVms: 'VMs Paradas',\n\n  // Original text: \"Pending VMs\"\n  homeFilterPendingVms: 'VMs pendentes',\n\n  // Original text: \"HVM guests\"\n  homeFilterHvmGuests: 'HVM guests',\n\n  // Original text: \"Tags\"\n  homeFilterTags: 'Etiquetas',\n\n  // Original text: \"Sort by\"\n  homeSortBy: 'Ordenar por',\n\n  // Original text: \"Name\"\n  homeSortByName: 'Nome',\n\n  // Original text: \"Power state\"\n  homeSortByPowerstate: 'Estado de energia',\n\n  // Original text: \"RAM\"\n  homeSortByRAM: 'RAM',\n\n  // Original text: \"vCPUs\"\n  homeSortByvCPUs: 'vCPUs',\n\n  // Original text: 'CPUs'\n  homeSortByCpus: undefined,\n\n  // Original text: '{displayed, number}x {icon} (on {total, number})'\n  homeDisplayedItems: undefined,\n\n  // Original text: '{selected, number}x {icon} selected (on {total, number})'\n  homeSelectedItems: undefined,\n\n  // Original text: \"More\"\n  homeMore: 'Mais',\n\n  // Original text: \"Migrate to…\"\n  homeMigrateTo: 'Migrar para…',\n\n  // Original text: 'Missing patches'\n  homeMissingPatches: undefined,\n\n  // Original text: 'Master:'\n  homePoolMaster: undefined,\n\n  // Original text: 'High Availability'\n  highAvailability: undefined,\n\n  // Original text: \"Add\"\n  add: 'Adicionar',\n\n  // Original text: \"Remove\"\n  remove: 'Remover',\n\n  // Original text: \"Preview\"\n  preview: 'Pré-visualização',\n\n  // Original text: \"Item\"\n  item: 'Item',\n\n  // Original text: \"No selected value\"\n  noSelectedValue: 'Valor não selecionado',\n\n  // Original text: \"Choose user(s) and/or group(s)\"\n  selectSubjects: 'Escolha um usuário(s) e/ou grupo(s)',\n\n  // Original text: \"Select Object(s)…\"\n  selectObjects: 'Selecionar Objeto(s)…',\n\n  // Original text: \"Choose a role\"\n  selectRole: 'Escolha uma função',\n\n  // Original text: \"Select Host(s)…\"\n  selectHosts: 'Selecionar Host(s)…',\n\n  // Original text: \"Select object(s)…\"\n  selectHostsVms: 'Selecionar Objeto(s)…',\n\n  // Original text: \"Select Network(s)…\"\n  selectNetworks: 'Selecionar Rede(s)…',\n\n  // Original text: \"Select PIF(s)…\"\n  selectPifs: 'Selecionar PIF(s)…',\n\n  // Original text: \"Select Pool(s)…\"\n  selectPools: 'Selecionar Pool(s)…',\n\n  // Original text: \"Select Remote(s)…\"\n  selectRemotes: 'Selecionar Remote(s)…',\n\n  // Original text: 'Select resource set(s)…'\n  selectResourceSets: undefined,\n\n  // Original text: 'Select template(s)…'\n  selectResourceSetsVmTemplate: undefined,\n\n  // Original text: 'Select SR(s)…'\n  selectResourceSetsSr: undefined,\n\n  // Original text: 'Select network(s)…'\n  selectResourceSetsNetwork: undefined,\n\n  // Original text: 'Select disk(s)…'\n  selectResourceSetsVdi: undefined,\n\n  // Original text: 'Select SSH key(s)…'\n  selectSshKey: undefined,\n\n  // Original text: \"Select SR(s)…\"\n  selectSrs: 'Selecionar SR(s)…',\n\n  // Original text: \"Select VM(s)…\"\n  selectVms: 'Selecionar VM(s)…',\n\n  // Original text: \"Select VM template(s)…\"\n  selectVmTemplates: 'Selecionar VM(s) modelo(s)…',\n\n  // Original text: \"Select tag(s)…\"\n  selectTags: 'Selecionar etiqueta(s)…',\n\n  // Original text: \"Select disk(s)…\"\n  selectVdis: 'Selecionar disco(s)…',\n\n  // Original text: 'Select timezone…'\n  selectTimezone: undefined,\n\n  // Original text: 'Select IP(s)…'\n  selectIp: undefined,\n\n  // Original text: 'Select IP pool(s)…'\n  selectIpPool: undefined,\n\n  // Original text: \"Fill required informations.\"\n  fillRequiredInformations: 'Preencha as informações necessárias.',\n\n  // Original text: \"Fill informations (optional)\"\n  fillOptionalInformations: 'Preencha as informações (opcional)',\n\n  // Original text: \"Reset\"\n  selectTableReset: 'Reiniciar',\n\n  // Original text: \"Month\"\n  schedulingMonth: 'Agendamento Mensal',\n\n  // Original text: \"Each selected month\"\n  schedulingEachSelectedMonth: 'Agendamento escolhido por mês',\n\n  // Original text: \"Day of the month\"\n  schedulingMonthDay: 'Dia do mês',\n\n  // Original text: \"Each selected day\"\n  schedulingEachSelectedMonthDay: 'Agendamento por dia selecionado',\n\n  // Original text: \"Day of the week\"\n  schedulingWeekDay: 'Dia da semana',\n\n  // Original text: \"Each selected day\"\n  schedulingEachSelectedWeekDay: 'Cada dia selecionado',\n\n  // Original text: \"Hour\"\n  schedulingHour: 'Hora',\n\n  // Original text: \"Every N hour\"\n  schedulingEveryNHour: 'Todas N horas',\n\n  // Original text: \"Each selected hour\"\n  schedulingEachSelectedHour: 'Cada hora selecionada',\n\n  // Original text: \"Minute\"\n  schedulingMinute: 'Minuto',\n\n  // Original text: \"Every N minute\"\n  schedulingEveryNMinute: 'Todos N minutos',\n\n  // Original text: \"Each selected minute\"\n  schedulingEachSelectedMinute: 'Cada minuto selecionado',\n\n  // Original text: \"Reset\"\n  schedulingReset: 'Reiniciar',\n\n  // Original text: \"Unknown\"\n  unknownSchedule: 'Desconhecido',\n\n  // Original text: 'Xo-server timezone:'\n  timezonePickerServerValue: undefined,\n\n  // Original text: 'Web browser timezone'\n  timezonePickerUseLocalTime: undefined,\n\n  // Original text: 'Xo-server timezone'\n  timezonePickerUseServerTime: undefined,\n\n  // Original text: 'Server timezone ({value})'\n  serverTimezoneOption: undefined,\n\n  // Original text: 'Cron Pattern:'\n  cronPattern: undefined,\n\n  // Original text: 'Cannot edit backup'\n  backupEditNotFoundTitle: undefined,\n\n  // Original text: 'Missing required info for edition'\n  backupEditNotFoundMessage: undefined,\n\n  // Original text: \"Job\"\n  job: 'Tarefa',\n\n  // Original text: \"Job ID\"\n  jobId: 'ID tarefa',\n\n  // Original text: \"Name\"\n  jobName: 'Nome',\n\n  // Original text: 'Name of your job (forbidden: \"_\")'\n  jobNamePlaceholder: undefined,\n\n  // Original text: \"Start\"\n  jobStart: 'Inicia',\n\n  // Original text: \"End\"\n  jobEnd: 'Termina',\n\n  // Original text: \"Duration\"\n  jobDuration: 'Duração',\n\n  // Original text: \"Status\"\n  jobStatus: 'Status',\n\n  // Original text: \"Action\"\n  jobAction: 'Ação',\n\n  // Original text: \"Tag\"\n  jobTag: 'Etiqueta',\n\n  // Original text: \"Scheduling\"\n  jobScheduling: 'Agendamento',\n\n  // Original text: \"State\"\n  jobState: 'Estado',\n\n  // Original text: 'Timezone'\n  jobTimezone: undefined,\n\n  // Original text: 'xo-server'\n  jobServerTimezone: undefined,\n\n  // Original text: \"Run job\"\n  runJob: 'Iniciar tarefa',\n\n  // Original text: \"One shot running started. See overview for logs.\"\n  runJobVerbose: 'O backup manual foi executado. Clique em Visão Geral para ver os Logs',\n\n  // Original text: \"Started\"\n  jobStarted: 'Iniciado',\n\n  // Original text: \"Finished\"\n  jobFinished: 'Terminado',\n\n  // Original text: \"Save\"\n  saveBackupJob: 'Salvar',\n\n  // Original text: \"Remove backup job\"\n  deleteBackupSchedule: 'Remover tarefa de backup',\n\n  // Original text: \"Are you sure you want to delete this backup job?\"\n  deleteBackupScheduleQuestion: 'Você tem certeza que você quer deletar esta tarefa de backup?',\n\n  // Original text: \"Enable immediately after creation\"\n  scheduleEnableAfterCreation: 'Ativar imediatamente após criação',\n\n  // Original text: \"You are editing Schedule {name} ({id}). Saving will override previous schedule state.\"\n  scheduleEditMessage:\n    'Você esta editando o Agendamento {name} ({id}). Este procedimento irá substituir o agendamento atual.',\n\n  // Original text: \"You are editing job {name} ({id}). Saving will override previous job state.\"\n  jobEditMessage: 'Você esta editando a Tarefa {name} ({id}). Este procedimento irá substituir a tarefa atual.',\n\n  // Original text: \"No scheduled jobs.\"\n  noScheduledJobs: 'Sem agendamentos',\n\n  // Original text: \"No jobs found.\"\n  noJobs: 'Tarefas não encontradas',\n\n  // Original text: \"No schedules found\"\n  noSchedules: 'Nenhum agendamento foi encontrado',\n\n  // Original text: \"Select a xo-server API command\"\n  jobActionPlaceHolder: 'Selecione um comando para xo-server API',\n\n  // Original text: 'Schedules'\n  jobSchedules: undefined,\n\n  // Original text: 'Name of your schedule'\n  jobScheduleNamePlaceHolder: undefined,\n\n  // Original text: 'Select a Job'\n  jobScheduleJobPlaceHolder: undefined,\n\n  // Original text: \"Select your backup type:\"\n  newBackupSelection: 'Selecione seu tipo de backup',\n\n  // Original text: 'Select backup mode:'\n  smartBackupModeSelection: undefined,\n\n  // Original text: 'Normal backup'\n  normalBackup: undefined,\n\n  // Original text: 'Smart backup'\n  smartBackup: undefined,\n\n  // Original text: 'Local remote selected'\n  localRemoteWarningTitle: undefined,\n\n  // Original text: 'Warning: local remotes will use limited XOA disk space. Only for advanced users.'\n  localRemoteWarningMessage: undefined,\n\n  // Original text: 'VMs'\n  editBackupVmsTitle: undefined,\n\n  // Original text: 'VMs statuses'\n  editBackupSmartStatusTitle: undefined,\n\n  // Original text: 'Resident on'\n  editBackupSmartResidentOn: undefined,\n\n  // Original text: 'VMs Tags'\n  editBackupSmartTagsTitle: undefined,\n\n  // Original text: 'Tag'\n  editBackupTagTitle: undefined,\n\n  // Original text: 'Report'\n  editBackupReportTitle: undefined,\n\n  // Original text: 'Enable immediately after creation'\n  editBackupScheduleEnabled: undefined,\n\n  // Original text: 'Depth'\n  editBackupDepthTitle: undefined,\n\n  // Original text: 'Remote'\n  editBackupRemoteTitle: undefined,\n\n  // Original text: \"Remote stores for backup\"\n  remoteList: 'Backups remotos',\n\n  // Original text: \"New File System Remote\"\n  newRemote: 'Novo Arquivo de Sistema Remoto',\n\n  // Original text: \"Local\"\n  remoteTypeLocal: 'Local',\n\n  // Original text: \"NFS\"\n  remoteTypeNfs: 'NFS',\n\n  // Original text: \"SMB\"\n  remoteTypeSmb: 'SMB',\n\n  // Original text: \"Type\"\n  remoteType: 'Type',\n\n  // Original text: 'Test your remote'\n  remoteTestTip: undefined,\n\n  // Original text: 'Test Remote'\n  testRemote: undefined,\n\n  // Original text: 'Test failed for {name}'\n  remoteTestFailure: undefined,\n\n  // Original text: 'Test passed for {name}'\n  remoteTestSuccess: undefined,\n\n  // Original text: 'Error'\n  remoteTestError: undefined,\n\n  // Original text: 'Test Step'\n  remoteTestStep: undefined,\n\n  // Original text: 'Test file'\n  remoteTestFile: undefined,\n\n  // Original text: 'The remote appears to work correctly'\n  remoteTestSuccessMessage: undefined,\n\n  // Original text: 'Name'\n  remoteName: undefined,\n\n  // Original text: 'Path'\n  remotePath: undefined,\n\n  // Original text: 'State'\n  remoteState: undefined,\n\n  // Original text: 'Device'\n  remoteDevice: undefined,\n\n  // Original text: 'Share'\n  remoteShare: undefined,\n\n  // Original text: 'Auth'\n  remoteAuth: undefined,\n\n  // Original text: 'Mounted'\n  remoteMounted: undefined,\n\n  // Original text: 'Unmounted'\n  remoteUnmounted: undefined,\n\n  // Original text: 'Connect'\n  remoteConnectTip: undefined,\n\n  // Original text: 'Disconnect'\n  remoteDisconnectTip: undefined,\n\n  // Original text: 'Delete'\n  remoteDeleteTip: undefined,\n\n  // Original text: 'remote name *'\n  remoteNamePlaceHolder: undefined,\n\n  // Original text: 'Name *'\n  remoteMyNamePlaceHolder: undefined,\n\n  // Original text: '/path/to/backup'\n  remoteLocalPlaceHolderPath: undefined,\n\n  // Original text: 'host *'\n  remoteNfsPlaceHolderHost: undefined,\n\n  // Original text: '/path/to/backup'\n  remoteNfsPlaceHolderPath: undefined,\n\n  // Original text: 'subfolder [path\\\\to\\\\backup]'\n  remoteSmbPlaceHolderRemotePath: undefined,\n\n  // Original text: 'Username'\n  remoteSmbPlaceHolderUsername: undefined,\n\n  // Original text: 'Password'\n  remoteSmbPlaceHolderPassword: undefined,\n\n  // Original text: 'Domain'\n  remoteSmbPlaceHolderDomain: undefined,\n\n  // Original text: '<address>\\\\<share> *'\n  remoteSmbPlaceHolderAddressShare: undefined,\n\n  // Original text: 'password(fill to edit)'\n  remotePlaceHolderPassword: undefined,\n\n  // Original text: 'Create a new SR'\n  newSrTitle: undefined,\n\n  // Original text: \"General\"\n  newSrGeneral: 'Geral',\n\n  // Original text: \"Select Storage Type:\"\n  newSrTypeSelection: 'Selecionar o tipo de armazenamento (storage)',\n\n  // Original text: \"Settings\"\n  newSrSettings: 'Configurações',\n\n  // Original text: \"Storage Usage\"\n  newSrUsage: 'Uso de armazenamento (storage)',\n\n  // Original text: \"Summary\"\n  newSrSummary: 'Sumário',\n\n  // Original text: \"Host\"\n  newSrHost: 'Host',\n\n  // Original text: \"Type\"\n  newSrType: 'Tipo',\n\n  // Original text: \"Name\"\n  newSrName: 'Nome',\n\n  // Original text: \"Description\"\n  newSrDescription: 'Descrição',\n\n  // Original text: \"Server\"\n  newSrServer: 'Servidor',\n\n  // Original text: \"Path\"\n  newSrPath: 'Caminho',\n\n  // Original text: \"IQN\"\n  newSrIqn: 'IQN',\n\n  // Original text: \"LUN\"\n  newSrLun: 'LUN',\n\n  // Original text: \"with auth.\"\n  newSrAuth: 'Com autenticação',\n\n  // Original text: \"User Name\"\n  newSrUsername: 'Nome de Usuário',\n\n  // Original text: \"Password\"\n  newSrPassword: 'Senha',\n\n  // Original text: \"Device\"\n  newSrDevice: 'Dispositivo',\n\n  // Original text: \"in use\"\n  newSrInUse: 'Em uso',\n\n  // Original text: \"Size\"\n  newSrSize: 'Tamanho',\n\n  // Original text: \"Create\"\n  newSrCreate: 'Criar',\n\n  // Original text: 'Storage name'\n  newSrNamePlaceHolder: undefined,\n\n  // Original text: 'Storage description'\n  newSrDescPlaceHolder: undefined,\n\n  // Original text: 'Address'\n  newSrAddressPlaceHolder: undefined,\n\n  // Original text: '[port]'\n  newSrPortPlaceHolder: undefined,\n\n  // Original text: 'Username'\n  newSrUsernamePlaceHolder: undefined,\n\n  // Original text: 'Password'\n  newSrPasswordPlaceHolder: undefined,\n\n  // Original text: 'Device, e.g /dev/sda…'\n  newSrLvmDevicePlaceHolder: undefined,\n\n  // Original text: '/path/to/directory'\n  newSrLocalPathPlaceHolder: undefined,\n\n  // Original text: \"Users/Groups\"\n  subjectName: 'Usuários/Grupos',\n\n  // Original text: \"Object\"\n  objectName: 'Objeto',\n\n  // Original text: 'No acls found'\n  aclNoneFound: undefined,\n\n  // Original text: \"Role\"\n  roleName: 'Função',\n\n  // Original text: 'Create'\n  aclCreate: undefined,\n\n  // Original text: \"New Group Name\"\n  newGroupName: 'Novo Nome de Grupo',\n\n  // Original text: \"Create Group\"\n  createGroup: 'Criar Grupo',\n\n  // Original text: \"Create\"\n  createGroupButton: 'Criar',\n\n  // Original text: \"Delete Group\"\n  deleteGroup: 'Deletar Grupo',\n\n  // Original text: \"Are you sure you want to delete this group?\"\n  deleteGroupConfirm: 'Você tem certeza que deseja deletar este grupo?',\n\n  // Original text: \"Remove user from Group\"\n  removeUserFromGroup: 'Remover usuário do Grupo',\n\n  // Original text: \"Are you sure you want to delete this user?\"\n  deleteUserConfirm: 'Você tem certeza que deseja deletar este usuário?',\n\n  // Original text: 'Delete User'\n  deleteUser: undefined,\n\n  // Original text: 'no user'\n  noUser: undefined,\n\n  // Original text: \"unknown user\"\n  unknownUser: 'Usuário desconhecido',\n\n  // Original text: \"No group found\"\n  noGroupFound: 'Grupo não encontrado',\n\n  // Original text: \"Name\"\n  groupNameColumn: 'Nome',\n\n  // Original text: \"Users\"\n  groupUsersColumn: 'Usuários',\n\n  // Original text: \"Add User\"\n  addUserToGroupColumn: 'Adicionar Usuário',\n\n  // Original text: \"Email\"\n  userNameColumn: 'e-mail',\n\n  // Original text: \"Permissions\"\n  userPermissionColumn: 'Permissões',\n\n  // Original text: \"Password\"\n  userPasswordColumn: 'Senha',\n\n  // Original text: \"Email\"\n  userName: 'e-mail',\n\n  // Original text: \"Password\"\n  userPassword: 'Senha',\n\n  // Original text: \"Create\"\n  createUserButton: 'Criar',\n\n  // Original text: \"No user found\"\n  noUserFound: 'Usuário não encontrado',\n\n  // Original text: \"User\"\n  userLabel: 'Usuário',\n\n  // Original text: \"Admin\"\n  adminLabel: 'Administrador',\n\n  // Original text: \"No user in group\"\n  noUserInGroup: 'Nenhum usuário neste grupo',\n\n  // Original text: \"{users} user{users, plural, one {} other {s}}\"\n  countUsers: '{users} user{users, plural, one {} other {s}}',\n\n  // Original text: \"Select Permission\"\n  selectPermission: 'Selecionar Permissão',\n\n  // Original text: \"Auto-load at server start\"\n  autoloadPlugin: 'Carregamento automático na inicialização do servidor',\n\n  // Original text: \"Save configuration\"\n  savePluginConfiguration: 'Salvar configuração',\n\n  // Original text: \"Delete configuration\"\n  deletePluginConfiguration: 'Deletar configuração',\n\n  // Original text: \"Plugin error\"\n  pluginError: 'Erro Plugin',\n\n  // Original text: \"Unknown error\"\n  unknownPluginError: 'Erro desconhecido',\n\n  // Original text: \"Purge plugin configuration\"\n  purgePluginConfiguration: 'Configuração de limpeza do plugin',\n\n  // Original text: \"Are you sure you want to purge this configuration ?\"\n  purgePluginConfigurationQuestion: 'Você tem certeza que deseja executar esta configuração?',\n\n  // Original text: \"Edit\"\n  editPluginConfiguration: 'Editar',\n\n  // Original text: \"Cancel\"\n  cancelPluginEdition: 'Cancelar',\n\n  // Original text: \"Plugin configuration\"\n  pluginConfigurationSuccess: 'Configuração do Plugin',\n\n  // Original text: \"Plugin configuration successfully saved!\"\n  pluginConfigurationChanges: 'Configuração do plugin foi efetuada com sucesso!',\n\n  // Original text: 'Predefined configuration'\n  pluginConfigurationPresetTitle: undefined,\n\n  // Original text: 'Choose a predefined configuration.'\n  pluginConfigurationChoosePreset: undefined,\n\n  // Original text: 'Apply'\n  applyPluginPreset: undefined,\n\n  // Original text: 'Save filter error'\n  saveNewUserFilterErrorTitle: undefined,\n\n  // Original text: 'Bad parameter: name must be given.'\n  saveNewUserFilterErrorBody: undefined,\n\n  // Original text: 'Name:'\n  filterName: undefined,\n\n  // Original text: 'Value:'\n  filterValue: undefined,\n\n  // Original text: 'Save new filter'\n  saveNewFilterTitle: undefined,\n\n  // Original text: 'Set custom filters'\n  setUserFiltersTitle: undefined,\n\n  // Original text: 'Are you sure you want to set custom filters?'\n  setUserFiltersBody: undefined,\n\n  // Original text: 'Remove custom filter'\n  removeUserFilterTitle: undefined,\n\n  // Original text: 'Are you sure you want to remove custom filter?'\n  removeUserFilterBody: undefined,\n\n  // Original text: 'Default filter'\n  defaultFilter: undefined,\n\n  // Original text: 'Default filters'\n  defaultFilters: undefined,\n\n  // Original text: 'Custom filters'\n  customFilters: undefined,\n\n  // Original text: 'Customize filters'\n  customizeFilters: undefined,\n\n  // Original text: 'Save custom filters'\n  saveCustomFilters: undefined,\n\n  // Original text: \"Start\"\n  startVmLabel: 'Iniciar',\n\n  // Original text: \"Recovery start\"\n  recoveryModeLabel: 'Iniciar recuperação',\n\n  // Original text: \"Suspend\"\n  suspendVmLabel: 'Suspender',\n\n  // Original text: \"Stop\"\n  stopVmLabel: 'Parar',\n\n  // Original text: \"Force shutdown\"\n  forceShutdownVmLabel: 'Forçar desligamento',\n\n  // Original text: \"Reboot\"\n  rebootVmLabel: 'Reiniciar',\n\n  // Original text: \"Force reboot\"\n  forceRebootVmLabel: 'Forçar reinicialização',\n\n  // Original text: \"Delete\"\n  deleteVmLabel: 'Deletar',\n\n  // Original text: \"Migrate\"\n  migrateVmLabel: 'Migrar',\n\n  // Original text: \"Snapshot\"\n  snapshotVmLabel: 'Snapshot',\n\n  // Original text: \"Export\"\n  exportVmLabel: 'Exportar',\n\n  // Original text: \"Resume\"\n  resumeVmLabel: 'Continuar',\n\n  // Original text: \"Copy\"\n  copyVmLabel: 'Copiar',\n\n  // Original text: \"Clone\"\n  cloneVmLabel: 'Clonar',\n\n  // Original text: \"Fast clone\"\n  fastCloneVmLabel: 'Clonagem rápida',\n\n  // Original text: \"Convert to template\"\n  convertVmToTemplateLabel: 'Convertir para template',\n\n  // Original text: \"Console\"\n  vmConsoleLabel: 'Console',\n\n  // Original text: \"Rescan all disks\"\n  srRescan: 'Examinar novamente todos os discos',\n\n  // Original text: \"Connect to all hosts\"\n  srReconnectAll: 'Conectar-se a todos os hosts',\n\n  // Original text: \"Disconnect to all hosts\"\n  srDisconnectAll: 'Desconectar-se de todos os hosts',\n\n  // Original text: \"Forget this SR\"\n  srForget: 'Esquecer esta SR',\n\n  // Original text: \"Remove this SR\"\n  srRemoveButton: 'Remover esta SR',\n\n  // Original text: \"No VDIs in this storage\"\n  srNoVdis: 'Nenhuma VDI neste armazenamento',\n\n  // Original text: 'Pool RAM usage:'\n  poolTitleRamUsage: undefined,\n\n  // Original text: '{used} used on {total}'\n  poolRamUsage: undefined,\n\n  // Original text: 'Master:'\n  poolMaster: undefined,\n\n  // Original text: \"Hosts\"\n  hostsTabName: 'Hosts',\n\n  // Original text: \"High Availability\"\n  poolHaStatus: 'Alta Disponibilidade',\n\n  // Original text: \"Enabled\"\n  poolHaEnabled: 'Habilitado',\n\n  // Original text: \"Disabled\"\n  poolHaDisabled: 'Desativado',\n\n  // Original text: \"Name\"\n  hostNameLabel: 'Nome',\n\n  // Original text: \"Description\"\n  hostDescription: 'Descrição',\n\n  // Original text: \"Memory\"\n  hostMemory: 'Memória',\n\n  // Original text: \"No hosts\"\n  noHost: 'Nenhum host',\n\n  // Original text: '{used}% used ({free} free)'\n  memoryLeftTooltip: undefined,\n\n  // Original text: \"Name\"\n  poolNetworkNameLabel: 'Nome',\n\n  // Original text: \"Description\"\n  poolNetworkDescription: 'Descrição',\n\n  // Original text: \"PIFs\"\n  poolNetworkPif: 'PIFs',\n\n  // Original text: \"No networks\"\n  poolNoNetwork: 'Nenhuma Rede',\n\n  // Original text: \"MTU\"\n  poolNetworkMTU: 'MTU',\n\n  // Original text: \"Connected\"\n  poolNetworkPifAttached: 'Conectado',\n\n  // Original text: \"Disconnected\"\n  poolNetworkPifDetached: 'Desconectado',\n\n  // Original text: 'Show PIFs'\n  showPifs: undefined,\n\n  // Original text: 'Hide PIFs'\n  hidePifs: undefined,\n\n  // Original text: \"Add SR\"\n  addSrLabel: 'Adicionar SR',\n\n  // Original text: \"Add VM\"\n  addVmLabel: 'Adicionar VM',\n\n  // Original text: \"Add Host\"\n  addHostLabel: 'Adicionar Host',\n\n  // Original text: \"Disconnect\"\n  disconnectServer: 'Desconectar',\n\n  // Original text: \"Start\"\n  startHostLabel: 'Iniciar',\n\n  // Original text: \"Stop\"\n  stopHostLabel: 'Parar',\n\n  // Original text: \"Enable\"\n  enableHostLabel: 'Habilitar',\n\n  // Original text: \"Disable\"\n  disableHostLabel: 'Desabilitar',\n\n  // Original text: \"Restart toolstack\"\n  restartHostAgent: 'Reiniciar toolstack',\n\n  // Original text: \"Force reboot\"\n  forceRebootHostLabel: 'Forçar reinicialização',\n\n  // Original text: \"Reboot\"\n  rebootHostLabel: 'Reinicializar',\n\n  // Original text: 'Reboot to apply updates'\n  rebootUpdateHostLabel: undefined,\n\n  // Original text: \"Emergency mode\"\n  emergencyModeLabel: 'Modo de emergência',\n\n  // Original text: \"Storage\"\n  storageTabName: 'Armazenamento',\n\n  // Original text: \"Patches\"\n  patchesTabName: 'Correções',\n\n  // Original text: \"Load average\"\n  statLoad: 'Carregar média',\n\n  // Original text: \"Hardware\"\n  hardwareHostSettingsLabel: 'Hardware',\n\n  // Original text: \"Address\"\n  hostAddress: 'Endereço',\n\n  // Original text: \"Status\"\n  hostStatus: 'Status',\n\n  // Original text: \"Build number\"\n  hostBuildNumber: 'Número de compilação',\n\n  // Original text: \"iSCSI name\"\n  hostIscsiName: 'Nome iSCSI',\n\n  // Original text: \"Version\"\n  hostXenServerVersion: 'Versão',\n\n  // Original text: \"Enabled\"\n  hostStatusEnabled: 'Ativado',\n\n  // Original text: \"Disabled\"\n  hostStatusDisabled: 'Desativado',\n\n  // Original text: \"Power on mode\"\n  hostPowerOnMode: 'Modo de energia',\n\n  // Original text: \"Host uptime\"\n  hostStartedSince: 'Tempo de atividade do Host',\n\n  // Original text: \"Toolstack uptime\"\n  hostStackStartedSince: 'Tempo de atividade Toolstack',\n\n  // Original text: \"CPU model\"\n  hostCpusModel: 'Modelo CPU',\n\n  // Original text: \"Core (socket)\"\n  hostCpusNumber: 'Núcleo (soquete)',\n\n  // Original text: \"Manufacturer info\"\n  hostManufacturerinfo: 'Informações do Fabricante',\n\n  // Original text: \"BIOS info\"\n  hostBiosinfo: 'Informações BIOS',\n\n  // Original text: \"Licence\"\n  licenseHostSettingsLabel: 'Licença',\n\n  // Original text: \"Type\"\n  hostLicenseType: 'Tipo',\n\n  // Original text: \"Socket\"\n  hostLicenseSocket: 'Soquete',\n\n  // Original text: \"Expiry\"\n  hostLicenseExpiry: 'Expiração',\n\n  // Original text: \"Add a network\"\n  networkCreateButton: 'Adicionar a Rede',\n\n  // Original text: 'Add a bonded network'\n  networkCreateBondedButton: undefined,\n\n  // Original text: \"Device\"\n  pifDeviceLabel: 'Dispositivo',\n\n  // Original text: \"Network\"\n  pifNetworkLabel: 'Rede',\n\n  // Original text: \"VLAN\"\n  pifVlanLabel: 'VLAN',\n\n  // Original text: \"Address\"\n  pifAddressLabel: 'Endereço',\n\n  // Original text: 'Mode'\n  pifModeLabel: undefined,\n\n  // Original text: \"MAC\"\n  pifMacLabel: 'MAC',\n\n  // Original text: \"MTU\"\n  pifMtuLabel: 'MTU',\n\n  // Original text: \"Status\"\n  pifStatusLabel: 'Status',\n\n  // Original text: \"Connected\"\n  pifStatusConnected: 'Conectado',\n\n  // Original text: \"Disconnected\"\n  pifStatusDisconnected: 'Desconectado',\n\n  // Original text: \"No physical interface detected\"\n  pifNoInterface: 'Nenhuma interface física foi detectada',\n\n  // Original text: 'This interface is currently in use'\n  pifInUse: undefined,\n\n  // Original text: 'Default locking mode'\n  defaultLockingMode: undefined,\n\n  // Original text: 'Configure IP address'\n  pifConfigureIp: undefined,\n\n  // Original text: 'Invalid parameters'\n  configIpErrorTitle: undefined,\n\n  // Original text: 'Static IP address'\n  staticIp: undefined,\n\n  // Original text: 'Netmask'\n  netmask: undefined,\n\n  // Original text: 'DNS'\n  dns: undefined,\n\n  // Original text: 'Gateway'\n  gateway: undefined,\n\n  // Original text: \"Add a storage\"\n  addSrDeviceButton: 'Adicionar um armazenamento',\n\n  // Original text: \"Name\"\n  srNameLabel: 'Nome',\n\n  // Original text: \"Type\"\n  srType: 'Tipo',\n\n  // Original text: \"Status\"\n  pbdStatus: 'Status',\n\n  // Original text: \"Connected\"\n  pbdStatusConnected: 'Conectado',\n\n  // Original text: \"Disconnected\"\n  pbdStatusDisconnected: 'Desconectado',\n\n  // Original text: 'Connect'\n  pbdConnect: undefined,\n\n  // Original text: 'Disconnect'\n  pbdDisconnect: undefined,\n\n  // Original text: 'Forget'\n  pbdForget: undefined,\n\n  // Original text: \"Shared\"\n  srShared: 'Compartilhado',\n\n  // Original text: \"Not shared\"\n  srNotShared: 'Não compartilhado',\n\n  // Original text: \"No storage detected\"\n  pbdNoSr: 'Nenhum armazenamento detectado',\n\n  // Original text: \"Name\"\n  patchNameLabel: 'Nome',\n\n  // Original text: \"Install all patches\"\n  patchUpdateButton: 'Instalar todas as correções',\n\n  // Original text: \"Description\"\n  patchDescription: 'Descrição',\n\n  // Original text: \"Applied date\"\n  patchApplied: 'Data de lançamento',\n\n  // Original text: \"Size\"\n  patchSize: 'Tamanho',\n\n  // Original text: \"Status\"\n  patchStatus: 'Status',\n\n  // Original text: \"Applied\"\n  patchStatusApplied: 'Aplicado',\n\n  // Original text: \"Missing patches\"\n  patchStatusNotApplied: 'Correções faltando',\n\n  // Original text: \"No patch detected\"\n  patchNothing: 'Nenhuma correção foi detectada',\n\n  // Original text: \"Release date\"\n  patchReleaseDate: 'Data de lançamento',\n\n  // Original text: \"Guidance\"\n  patchGuidance: 'Direção',\n\n  // Original text: \"Action\"\n  patchAction: 'Ação',\n\n  // Original text: 'Applied patches'\n  hostAppliedPatches: undefined,\n\n  // Original text: \"Missing patches\"\n  hostMissingPatches: 'Correções faltando',\n\n  // Original text: \"Host up-to-date!\"\n  hostUpToDate: 'Host pronto para atualizar!',\n\n  // Original text: 'Refresh patches'\n  refreshPatches: undefined,\n\n  // Original text: 'Install pool patches'\n  installPoolPatches: undefined,\n\n  // Original text: 'Default SR'\n  defaultSr: undefined,\n\n  // Original text: 'Set as default SR'\n  setAsDefaultSr: undefined,\n\n  // Original text: \"General\"\n  generalTabName: 'Geral',\n\n  // Original text: \"Stats\"\n  statsTabName: 'Estatísticas',\n\n  // Original text: \"Console\"\n  consoleTabName: 'Console',\n\n  // Original text: 'Container'\n  containersTabName: undefined,\n\n  // Original text: \"Snapshots\"\n  snapshotsTabName: 'Snapshots',\n\n  // Original text: \"Logs\"\n  logsTabName: 'Logs',\n\n  // Original text: \"Advanced\"\n  advancedTabName: 'Avançado',\n\n  // Original text: \"Network\"\n  networkTabName: 'Rede',\n\n  // Original text: \"Disk{disks, plural, one {} other {s}}\"\n  disksTabName: 'Disco{disks, plural, one {} other {s}}',\n\n  // Original text: \"halted\"\n  powerStateHalted: 'Interrompido',\n\n  // Original text: \"running\"\n  powerStateRunning: 'Executando',\n\n  // Original text: \"suspended\"\n  powerStateSuspended: 'Suspendido',\n\n  // Original text: \"No Xen tools detected\"\n  vmStatus: 'Nenhum Xen tools foi detectado',\n\n  // Original text: \"No IPv4 record\"\n  vmName: 'Nenhum registro IPv4',\n\n  // Original text: \"No IP record\"\n  vmDescription: 'Nenhum registro IP',\n\n  // Original text: \"Started {ago}\"\n  vmSettings: 'Iniciado {ago}',\n\n  // Original text: \"Current status:\"\n  vmCurrentStatus: 'Status atual',\n\n  // Original text: \"Not running\"\n  vmNotRunning: 'Parado',\n\n  // Original text: \"No Xen tools detected\"\n  noToolsDetected: 'Nenhum Xen tools foi detectado',\n\n  // Original text: \"No IPv4 record\"\n  noIpv4Record: 'Nenhum registro IPv4',\n\n  // Original text: \"No IP record\"\n  noIpRecord: 'Nenhum registro IP',\n\n  // Original text: \"Started {ago}\"\n  started: 'Iniciado {ago}',\n\n  // Original text: \"Paravirtualization (PV)\"\n  paraVirtualizedMode: 'Paravirtualização',\n\n  // Original text: \"Hardware virtualization (HVM)\"\n  hardwareVirtualizedMode: 'Virtualização de Hadware (HVM)',\n\n  // Original text: \"CPU usage\"\n  statsCpu: 'Uso de CPU',\n\n  // Original text: \"Memory usage\"\n  statsMemory: 'Uso de Memória',\n\n  // Original text: \"Network throughput\"\n  statsNetwork: 'Taxa de transferência de Rede',\n\n  // Original text: 'Stacked values'\n  useStackedValuesOnStats: undefined,\n\n  // Original text: \"Disk throughput\"\n  statDisk: 'Taxa de transferência de Disco',\n\n  // Original text: \"Last 10 minutes\"\n  statLastTenMinutes: 'Últimos 10 minutos',\n\n  // Original text: \"Last 2 hours\"\n  statLastTwoHours: 'Últimas 2 horas',\n\n  // Original text: \"Last week\"\n  statLastWeek: 'Semana passada',\n\n  // Original text: \"Last year\"\n  statLastYear: 'Ano passado',\n\n  // Original text: \"Copy\"\n  copyToClipboardLabel: 'Copiar',\n\n  // Original text: \"Ctrl+Alt+Del\"\n  ctrlAltDelButtonLabel: 'Ctrl+Alt+Del',\n\n  // Original text: \"Tip:\"\n  tipLabel: 'Dica',\n\n  // Original text: \"non-US keyboard could have issues with console: switch your own layout to US.\"\n  tipConsoleLabel:\n    'Teclados fora do padrão US-Keyboard podem apresentar problemas com o console: Altere seu teclado e verifique!',\n\n  // Original text: 'Hide infos'\n  hideHeaderTooltip: undefined,\n\n  // Original text: 'Show infos'\n  showHeaderTooltip: undefined,\n\n  // Original text: 'Name'\n  containerName: undefined,\n\n  // Original text: 'Command'\n  containerCommand: undefined,\n\n  // Original text: 'Creation date'\n  containerCreated: undefined,\n\n  // Original text: 'Status'\n  containerStatus: undefined,\n\n  // Original text: 'Action'\n  containerAction: undefined,\n\n  // Original text: 'No existing containers'\n  noContainers: undefined,\n\n  // Original text: 'Stop this container'\n  containerStop: undefined,\n\n  // Original text: 'Start this container'\n  containerStart: undefined,\n\n  // Original text: 'Pause this container'\n  containerPause: undefined,\n\n  // Original text: 'Resume this container'\n  containerResume: undefined,\n\n  // Original text: 'Restart this container'\n  containerRestart: undefined,\n\n  // Original text: \"Action\"\n  vdiAction: 'Ação',\n\n  // Original text: \"Attach disk\"\n  vdiAttachDevice: 'Anexar disco',\n\n  // Original text: \"New disk\"\n  vbdCreateDeviceButton: 'Novo disco',\n\n  // Original text: \"Boot order\"\n  vdiBootOrder: 'Ordem de boot',\n\n  // Original text: \"Name\"\n  vdiNameLabel: 'Nome',\n\n  // Original text: \"Description\"\n  vdiNameDescription: 'Descrição',\n\n  // Original text: \"Tags\"\n  vdiTags: 'Etiquetas',\n\n  // Original text: \"Size\"\n  vdiSize: 'Tamanho',\n\n  // Original text: \"SR\"\n  vdiSr: 'SR',\n\n  // Original text: 'VM'\n  vdiVm: undefined,\n\n  // Original text: 'Migrate VDI'\n  vdiMigrate: undefined,\n\n  // Original text: 'Destination SR:'\n  vdiMigrateSelectSr: undefined,\n\n  // Original text: 'No SR'\n  vdiMigrateNoSr: undefined,\n\n  // Original text: 'A target SR is required to migrate a VDI'\n  vdiMigrateNoSrMessage: undefined,\n\n  // Original text: 'Forget'\n  vdiForget: undefined,\n\n  // Original text: 'Remove VDI'\n  vdiRemove: undefined,\n\n  // Original text: \"Boot flag\"\n  vbdBootableStatus: 'Indicador de inicialização',\n\n  // Original text: \"Status\"\n  vbdStatus: 'Status',\n\n  // Original text: \"Connected\"\n  vbdStatusConnected: 'Conectado',\n\n  // Original text: \"Disconnected\"\n  vbdStatusDisconnected: 'Desconectado',\n\n  // Original text: \"No disks\"\n  vbdNoVbd: 'Nenhum disco encontrado',\n\n  // Original text: 'Connect VBD'\n  vbdConnect: undefined,\n\n  // Original text: 'Disconnect VBD'\n  vbdDisconnect: undefined,\n\n  // Original text: 'Bootable'\n  vbdBootable: undefined,\n\n  // Original text: 'Readonly'\n  vbdReadonly: undefined,\n\n  // Original text: 'Create'\n  vbdCreate: undefined,\n\n  // Original text: 'Disk name'\n  vbdNamePlaceHolder: undefined,\n\n  // Original text: 'Size'\n  vbdSizePlaceHolder: undefined,\n\n  // Original text: 'Save'\n  saveBootOption: undefined,\n\n  // Original text: 'Reset'\n  resetBootOption: undefined,\n\n  // Original text: \"New device\"\n  vifCreateDeviceButton: 'Novo dispositivo',\n\n  // Original text: \"No interface\"\n  vifNoInterface: 'Nenhuma interface encontrada',\n\n  // Original text: \"Device\"\n  vifDeviceLabel: 'Dispositivo',\n\n  // Original text: \"MAC address\"\n  vifMacLabel: 'Endereço MAC',\n\n  // Original text: \"MTU\"\n  vifMtuLabel: 'MTU',\n\n  // Original text: \"Network\"\n  vifNetworkLabel: 'Rede',\n\n  // Original text: \"Status\"\n  vifStatusLabel: 'Status',\n\n  // Original text: \"Connected\"\n  vifStatusConnected: 'Conectado',\n\n  // Original text: \"Disconnected\"\n  vifStatusDisconnected: 'Desconectado',\n\n  // Original text: 'Connect'\n  vifConnect: undefined,\n\n  // Original text: 'Disconnect'\n  vifDisconnect: undefined,\n\n  // Original text: 'Remove'\n  vifRemove: undefined,\n\n  // Original text: \"IP addresses\"\n  vifIpAddresses: 'Endereço IP',\n\n  // Original text: 'Auto-generated if empty'\n  vifMacAutoGenerate: undefined,\n\n  // Original text: 'Allowed IPs'\n  vifAllowedIps: undefined,\n\n  // Original text: 'No IPs'\n  vifNoIps: undefined,\n\n  // Original text: 'Network locked'\n  vifLockedNetwork: undefined,\n\n  // Original text: 'Network locked and no IPs are allowed for this interface'\n  vifLockedNetworkNoIps: undefined,\n\n  // Original text: 'Network not locked'\n  vifUnLockedNetwork: undefined,\n\n  // Original text: 'Unknown network'\n  vifUnknownNetwork: undefined,\n\n  // Original text: 'Create'\n  vifCreate: undefined,\n\n  // Original text: \"No snapshots\"\n  noSnapshots: 'Nenhum snapshot encontrado',\n\n  // Original text: \"New snapshot\"\n  snapshotCreateButton: 'Novo snapshot',\n\n  // Original text: \"Just click on the snapshot button to create one!\"\n  tipCreateSnapshotLabel: 'Clique sobre o botão snapshop para criar!',\n\n  // Original text: 'Revert VM to this snapshot'\n  revertSnapshot: undefined,\n\n  // Original text: 'Remove this snapshot'\n  deleteSnapshot: undefined,\n\n  // Original text: 'Create a VM from this snapshot'\n  copySnapshot: undefined,\n\n  // Original text: 'Export this snapshot'\n  exportSnapshot: undefined,\n\n  // Original text: \"Creation date\"\n  snapshotDate: 'Data de criação',\n\n  // Original text: \"Name\"\n  snapshotName: 'Nome',\n\n  // Original text: \"Action\"\n  snapshotAction: 'Ação',\n\n  // Original text: \"Remove all logs\"\n  logRemoveAll: 'Remover todos os logs',\n\n  // Original text: \"No logs so far\"\n  noLogs: 'Sem registros até o momento',\n\n  // Original text: \"Creation date\"\n  logDate: 'Data de criação',\n\n  // Original text: \"Name\"\n  logName: 'Nome',\n\n  // Original text: \"Content\"\n  logContent: 'Conteúdo',\n\n  // Original text: \"Action\"\n  logAction: 'Ação',\n\n  // Original text: \"Remove\"\n  vmRemoveButton: 'Remover',\n\n  // Original text: \"Convert\"\n  vmConvertButton: 'Converter',\n\n  // Original text: \"Xen settings\"\n  xenSettingsLabel: 'Configurações Xen',\n\n  // Original text: \"Guest OS\"\n  guestOsLabel: 'Convidado OS',\n\n  // Original text: \"Misc\"\n  miscLabel: 'Misc',\n\n  // Original text: \"UUID\"\n  uuid: 'UUID',\n\n  // Original text: \"Virtualization mode\"\n  virtualizationMode: 'Modo de virtualização',\n\n  // Original text: \"CPU weight\"\n  cpuWeightLabel: 'Carga da CPU',\n\n  // Original text: \"Default ({value, number})\"\n  defaultCpuWeight: 'Padrão',\n\n  // Original text: 'CPU cap'\n  cpuCapLabel: undefined,\n\n  // Original text: 'Default ({value, number})'\n  defaultCpuCap: undefined,\n\n  // Original text: \"PV args\"\n  pvArgsLabel: 'PV argos',\n\n  // Original text: \"Xen tools status\"\n  xenToolsStatus: 'Status de ferramentas Xen',\n\n  // Original text: \"{status}\"\n  xenToolsStatusValue: '{status}',\n\n  // Original text: \"OS name\"\n  osName: 'Nome OS',\n\n  // Original text: \"OS kernel\"\n  osKernel: 'OS kernel (núcleo)',\n\n  // Original text: \"Auto power on\"\n  autoPowerOn: 'Ligar automaticamente',\n\n  // Original text: \"HA\"\n  ha: 'HA',\n\n  // Original text: \"Original template\"\n  originalTemplate: 'Modelo original (template)',\n\n  // Original text: \"Unknown\"\n  unknownOsName: 'Desconhecido',\n\n  // Original text: \"Unknown\"\n  unknownOsKernel: 'Desconhecido',\n\n  // Original text: \"Unknown\"\n  unknownOriginalTemplate: 'Desconhecido',\n\n  // Original text: \"VM limits\"\n  vmLimitsLabel: 'Limites de VM',\n\n  // Original text: \"CPU limits\"\n  vmCpuLimitsLabel: 'Limites de CPU',\n\n  // Original text: \"Memory limits (min/max)\"\n  vmMemoryLimitsLabel: 'Limites de memória (min/max)',\n\n  // Original text: \"vCPUs max:\"\n  vmMaxVcpus: 'máximo',\n\n  // Original text: \"Memory max:\"\n  vmMaxRam: 'Limite máximo de memória',\n\n  // Original text: \"Long click to add a name\"\n  vmHomeNamePlaceholder: 'Faça um longo clique para adicionar um nome',\n\n  // Original text: \"Long click to add a description\"\n  vmHomeDescriptionPlaceholder: 'Faça um longo clique para adicionar uma descrição',\n\n  // Original text: \"Click to add a name\"\n  vmViewNamePlaceholder: 'Clique para adicionar um nome',\n\n  // Original text: \"Click to add a description\"\n  vmViewDescriptionPlaceholder: 'Clique para adicionar uma descrição',\n\n  // Original text: 'Click to add a name'\n  templateHomeNamePlaceholder: undefined,\n\n  // Original text: 'Click to add a description'\n  templateHomeDescriptionPlaceholder: undefined,\n\n  // Original text: 'Delete template'\n  templateDelete: undefined,\n\n  // Original text: 'Delete VM template{templates, plural, one {} other {s}}'\n  templateDeleteModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?'\n  templateDeleteModalBody: undefined,\n\n  // Original text: \"Pool{pools, plural, one {} other {s}}\"\n  poolPanel: 'Pool{pools, plural, one {} other {s}}',\n\n  // Original text: \"Host{hosts, plural, one {} other {s}}\"\n  hostPanel: 'Host{hosts, plural, one {} other {s}}',\n\n  // Original text: \"VM{vms, plural, one {} other {s}}\"\n  vmPanel: 'VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"RAM Usage\"\n  memoryStatePanel: 'Utilização RAM',\n\n  // Original text: \"CPUs Usage\"\n  cpuStatePanel: 'Utilização de CPU',\n\n  // Original text: \"VMs Power state\"\n  vmStatePanel: 'Estado de energia das VMs',\n\n  // Original text: \"Pending tasks\"\n  taskStatePanel: 'Tarefas pendentes',\n\n  // Original text: \"Users\"\n  usersStatePanel: 'Usuários',\n\n  // Original text: \"Storage state\"\n  srStatePanel: 'Data do armazenamento (storage)',\n\n  // Original text: \"{usage} (of {total})\"\n  ofUsage: 'de',\n\n  // Original text: \"No storage\"\n  noSrs: 'Nenhum armazenamento (storage)',\n\n  // Original text: \"Name\"\n  srName: 'Nome',\n\n  // Original text: \"Pool\"\n  srPool: 'Pool',\n\n  // Original text: \"Host\"\n  srHost: 'Host',\n\n  // Original text: \"Type\"\n  srFormat: 'Tipo',\n\n  // Original text: \"Size\"\n  srSize: 'Tamanho',\n\n  // Original text: \"Usage\"\n  srUsage: 'Utilização',\n\n  // Original text: \"used\"\n  srUsed: 'Usado',\n\n  // Original text: \"free\"\n  srFree: 'Livre',\n\n  // Original text: \"Storage Usage\"\n  srUsageStatePanel: 'Utilização atual de armazenamento',\n\n  // Original text: \"Top 5 SR Usage (in %)\"\n  srTopUsageStatePanel: 'Top 5 de Utilização SR (em %)',\n\n  // Original text: '{running} running ({halted} halted)'\n  vmsStates: undefined,\n\n  // Original text: 'Clear selection'\n  dashboardStatsButtonRemoveAll: undefined,\n\n  // Original text: 'Add all hosts'\n  dashboardStatsButtonAddAllHost: undefined,\n\n  // Original text: 'Add all VMs'\n  dashboardStatsButtonAddAllVM: undefined,\n\n  // Original text: \"{value} {date, date, medium}\"\n  weekHeatmapData: '{value} {date, date, medium}',\n\n  // Original text: \"No data.\"\n  weekHeatmapNoData: 'Nenhum dado encontrado',\n\n  // Original text: 'Weekly Heatmap'\n  weeklyHeatmap: undefined,\n\n  // Original text: 'Weekly Charts'\n  weeklyCharts: undefined,\n\n  // Original text: 'Synchronize scale:'\n  weeklyChartsScaleInfo: undefined,\n\n  // Original text: \"Stats error\"\n  statsDashboardGenericErrorTitle: 'Erro de estatísticas',\n\n  // Original text: \"There is no stats available for:\"\n  statsDashboardGenericErrorMessage: 'Não há estatísticas disponíveis para:',\n\n  // Original text: \"No selected metric\"\n  noSelectedMetric: 'Nenhuma métrica selecionada',\n\n  // Original text: \"Select\"\n  statsDashboardSelectObjects: 'Selecionar',\n\n  // Original text: \"Loading…\"\n  metricsLoading: 'Carregando…',\n\n  // Original text: \"Coming soon!\"\n  comingSoon: 'Em breve!',\n\n  // Original text: \"Orphaned snapshot VDIs\"\n  orphanedVdis: 'VDI órfãs',\n\n  // Original text: \"Orphaned VMs snapshot\"\n  orphanedVms: 'VMs órfãs',\n\n  // Original text: \"No orphans\"\n  noOrphanedObject: 'Sem órfãs',\n\n  // Original text: \"Remove all orphaned snapshot VDIs\"\n  removeAllOrphanedObject: 'Remover todos as VDIs órfãs',\n\n  // Original text: \"Name\"\n  vmNameLabel: 'Nome',\n\n  // Original text: \"Description\"\n  vmNameDescription: 'Descrição',\n\n  // Original text: \"Resident on\"\n  vmContainer: 'Residente em',\n\n  // Original text: \"Alarms\"\n  alarmMessage: 'Alarmes',\n\n  // Original text: \"No alarms\"\n  noAlarms: 'Sem alarmes',\n\n  // Original text: \"Date\"\n  alarmDate: 'Data',\n\n  // Original text: \"Content\"\n  alarmContent: 'Conteúdo',\n\n  // Original text: \"Issue on\"\n  alarmObject: 'Tipo de alarme',\n\n  // Original text: \"Pool\"\n  alarmPool: 'Pool',\n\n  // Original text: \"Remove all alarms\"\n  alarmRemoveAll: 'Remover todos os alarmes',\n\n  // Original text: '{used}% used ({free} left)'\n  spaceLeftTooltip: undefined,\n\n  // Original text: \"Create a new VM on {select}\"\n  newVmCreateNewVmOn: 'Criar uma nova VM em {pool}',\n\n  // Original text: 'Create a new VM on {select1} or {select2}'\n  newVmCreateNewVmOn2: undefined,\n\n  // Original text: 'You have no permission to create a VM'\n  newVmCreateNewVmNoPermission: undefined,\n\n  // Original text: \"Infos\"\n  newVmInfoPanel: 'Informações',\n\n  // Original text: \"Name\"\n  newVmNameLabel: 'Nome',\n\n  // Original text: \"Template\"\n  newVmTemplateLabel: 'Modelo (Template)',\n\n  // Original text: \"Description\"\n  newVmDescriptionLabel: 'Descrição',\n\n  // Original text: \"Performances\"\n  newVmPerfPanel: 'Desempenho',\n\n  // Original text: \"vCPUs\"\n  newVmVcpusLabel: 'vCPUs',\n\n  // Original text: \"RAM\"\n  newVmRamLabel: 'RAM',\n\n  // Original text: 'Static memory max'\n  newVmStaticMaxLabel: undefined,\n\n  // Original text: 'Dynamic memory min'\n  newVmDynamicMinLabel: undefined,\n\n  // Original text: 'Dynamic memory max'\n  newVmDynamicMaxLabel: undefined,\n\n  // Original text: \"Install settings\"\n  newVmInstallSettingsPanel: 'Definições de instalação',\n\n  // Original text: \"ISO/DVD\"\n  newVmIsoDvdLabel: 'ISO/DVD',\n\n  // Original text: \"Network\"\n  newVmNetworkLabel: 'Rede',\n\n  // Original text: 'e.g: http://httpredir.debian.org/debian'\n  newVmInstallNetworkPlaceHolder: undefined,\n\n  // Original text: \"PV Args\"\n  newVmPvArgsLabel: 'PV argos',\n\n  // Original text: \"PXE\"\n  newVmPxeLabel: 'PXE',\n\n  // Original text: \"Interfaces\"\n  newVmInterfacesPanel: 'Interfaces',\n\n  // Original text: \"MAC\"\n  newVmMacLabel: 'MAC',\n\n  // Original text: \"Add interface\"\n  newVmAddInterface: 'Adicionar uma interface',\n\n  // Original text: \"Disks\"\n  newVmDisksPanel: 'Discos',\n\n  // Original text: \"SR\"\n  newVmSrLabel: 'SR',\n\n  // Original text: \"Bootable\"\n  newVmBootableLabel: 'Inicializável',\n\n  // Original text: \"Size\"\n  newVmSizeLabel: 'Tamanho',\n\n  // Original text: \"Add disk\"\n  newVmAddDisk: 'Adicionar disco',\n\n  // Original text: \"Summary\"\n  newVmSummaryPanel: 'Sumário',\n\n  // Original text: \"Create\"\n  newVmCreate: 'Criar',\n\n  // Original text: \"Reset\"\n  newVmReset: 'Reiniciar',\n\n  // Original text: \"Select template\"\n  newVmSelectTemplate: 'Selecionar modelo (template)',\n\n  // Original text: \"SSH key\"\n  newVmSshKey: 'Chave SSH',\n\n  // Original text: \"Config drive\"\n  newVmConfigDrive: 'Configuração do drive',\n\n  // Original text: \"Custom config\"\n  newVmCustomConfig: 'Configuração personalizada',\n\n  // Original text: \"Boot VM after creation\"\n  newVmBootAfterCreate: 'Inicializar VM após sua criação',\n\n  // Original text: \"Auto-generated if empty\"\n  newVmMacPlaceholder: 'Auto-gerada se vazio',\n\n  // Original text: \"CPU weight\"\n  newVmCpuWeightLabel: 'Carga da CPU',\n\n  // Original text: 'Default: {value, number}'\n  newVmDefaultCpuWeight: undefined,\n\n  // Original text: 'CPU cap'\n  newVmCpuCapLabel: undefined,\n\n  // Original text: 'Default: {value, number}'\n  newVmDefaultCpuCap: undefined,\n\n  // Original text: \"Cloud config\"\n  newVmCloudConfig: 'Configuração do Cloud',\n\n  // Original text: \"Create VMs\"\n  newVmCreateVms: 'Criar VMs',\n\n  // Original text: \"Are you sure you want to create {nbVms} VMs?\"\n  newVmCreateVmsConfirm: 'Você tem certeza que deseja criar {nbVms} VMs?',\n\n  // Original text: \"Multiple VMs:\"\n  newVmMultipleVms: 'Multiplas VMs',\n\n  // Original text: 'Select a resource set:'\n  newVmSelectResourceSet: undefined,\n\n  // Original text: 'Name pattern:'\n  newVmMultipleVmsPattern: undefined,\n\n  // Original text: 'e.g.: \\\\{name\\\\}_%'\n  newVmMultipleVmsPatternPlaceholder: undefined,\n\n  // Original text: 'First index:'\n  newVmFirstIndex: undefined,\n\n  // Original text: 'Recalculate VMs number'\n  newVmNumberRecalculate: undefined,\n\n  // Original text: 'Refresh VMs name'\n  newVmNameRefresh: undefined,\n\n  // Original text: 'Advanced'\n  newVmAdvancedPanel: undefined,\n\n  // Original text: 'Show advanced settings'\n  newVmShowAdvanced: undefined,\n\n  // Original text: 'Hide advanced settings'\n  newVmHideAdvanced: undefined,\n\n  // Original text: \"Resource sets\"\n  resourceSets: 'Ajustes de recursos',\n\n  // Original text: 'No resource sets.'\n  noResourceSets: undefined,\n\n  // Original text: 'Loading resource sets'\n  loadingResourceSets: undefined,\n\n  // Original text: \"Resource set name\"\n  resourceSetName: 'Ajuste de nome do recurso',\n\n  // Original text: 'Recompute all limits'\n  recomputeResourceSets: undefined,\n\n  // Original text: \"Save\"\n  saveResourceSet: 'Salvar',\n\n  // Original text: \"Reset\"\n  resetResourceSet: 'Redefinir',\n\n  // Original text: \"Edit\"\n  editResourceSet: 'Editar',\n\n  // Original text: \"Delete\"\n  deleteResourceSet: 'Deletar',\n\n  // Original text: \"Delete resource set\"\n  deleteResourceSetWarning: 'Deletar grupo de recurso',\n\n  // Original text: \"Are you sure you want to delete this resource set?\"\n  deleteResourceSetQuestion: 'Você tem certeza que deseja deletar este ajuste?',\n\n  // Original text: \"Missing objects:\"\n  resourceSetMissingObjects: 'Objetos faltando',\n\n  // Original text: \"vCPUs\"\n  resourceSetVcpus: 'vCPUs',\n\n  // Original text: \"Memory\"\n  resourceSetMemory: 'Memória',\n\n  // Original text: \"Storage\"\n  resourceSetStorage: 'Armazenamento (Storage)',\n\n  // Original text: \"Unknown\"\n  unknownResourceSetValue: 'Desconhecido',\n\n  // Original text: \"Available hosts\"\n  availableHosts: 'Hosts disponiveis',\n\n  // Original text: \"Excluded hosts\"\n  excludedHosts: 'Hosts excluídos',\n\n  // Original text: \"No hosts available.\"\n  noHostsAvailable: 'Sem hosts disponiveis',\n\n  // Original text: \"VMs created from this resource set shall run on the following hosts.\"\n  availableHostsDescription: 'VMs criadas a partir desse conjunto de recursos deve ser executado nos hosts indicados.',\n\n  // Original text: \"Maximum CPUs\"\n  maxCpus: 'Limite de CPUs',\n\n  // Original text: \"Maximum RAM (GiB)\"\n  maxRam: 'Limite de RAM (GiB)',\n\n  // Original text: \"Maximum disk space\"\n  maxDiskSpace: 'Limite de espaço de disco',\n\n  // Original text: 'IP pool'\n  ipPool: undefined,\n\n  // Original text: 'Quantity'\n  quantity: undefined,\n\n  // Original text: \"No limits.\"\n  noResourceSetLimits: 'Sem limites',\n\n  // Original text: \"Total:\"\n  totalResource: 'Total',\n\n  // Original text: \"Remaining:\"\n  remainingResource: 'Restando;',\n\n  // Original text: \"Used:\"\n  usedResource: 'Usado:',\n\n  // Original text: 'New'\n  resourceSetNew: undefined,\n\n  // Original text: \"Try dropping some VMs files here, or click to select VMs to upload. Accept only .xva/.ova files.\"\n  importVmsList:\n    'Tente soltar alguns backups aqui, ou clique para selecionar os backups para que seja feito o upload. Apenas arquivos .xva são aceitos.',\n\n  // Original text: \"No selected VMs.\"\n  noSelectedVms: 'Nenhuma VM selecionada',\n\n  // Original text: \"To Pool:\"\n  vmImportToPool: 'Enviar para Pool:',\n\n  // Original text: \"To SR:\"\n  vmImportToSr: 'Enviar para SR:',\n\n  // Original text: \"VM{nVms, plural, one {} other {s}} to import\"\n  vmsToImport: 'Importar VM{nVms, plural, one {} other {s}} ',\n\n  // Original text: \"Reset\"\n  importVmsCleanList: 'Reiniciar',\n\n  // Original text: \"VM import success\"\n  vmImportSuccess: 'Importação feita com sucesso',\n\n  // Original text: \"VM import failed\"\n  vmImportFailed: 'Falha na importação',\n\n  // Original text: \"Import starting…\"\n  startVmImport: 'Iniciando importação…',\n\n  // Original text: \"Export starting…\"\n  startVmExport: 'Iniciando exportação…',\n\n  // Original text: 'Number of CPUs'\n  nCpus: undefined,\n\n  // Original text: 'Memory'\n  vmMemory: undefined,\n\n  // Original text: 'Disk {position} ({capacity})'\n  diskInfo: undefined,\n\n  // Original text: 'Disk description'\n  diskDescription: undefined,\n\n  // Original text: 'No disks.'\n  noDisks: undefined,\n\n  // Original text: 'No networks.'\n  noNetworks: undefined,\n\n  // Original text: 'Network {name}'\n  networkInfo: undefined,\n\n  // Original text: 'No description available'\n  noVmImportErrorDescription: undefined,\n\n  // Original text: 'Error:'\n  vmImportError: undefined,\n\n  // Original text: '{type} file:'\n  vmImportFileType: undefined,\n\n  // Original text: 'Please to check and/or modify the VM configuration.'\n  vmImportConfigAlert: undefined,\n\n  // Original text: \"No pending tasks\"\n  noTasks: 'Nenhuma tarefa pendente',\n\n  // Original text: \"Currently, there are not any pending XenServer tasks\"\n  xsTasks: 'Atualmente nenhuma tarefa esta pendente no XenServer',\n\n  // Original text: 'Schedules'\n  backupSchedules: undefined,\n\n  // Original text: 'Get remote'\n  getRemote: undefined,\n\n  // Original text: 'List Remote'\n  listRemote: undefined,\n\n  // Original text: 'simple'\n  simpleBackup: undefined,\n\n  // Original text: \"delta\"\n  delta: 'delta',\n\n  // Original text: \"Restore Backups\"\n  restoreBackups: 'Recuperação de Backups',\n\n  // Original text: 'Click on a VM to display restore options'\n  restoreBackupsInfo: undefined,\n\n  // Original text: \"Enabled\"\n  remoteEnabled: 'Habilitado',\n\n  // Original text: \"Error\"\n  remoteError: 'erro',\n\n  // Original text: \"No backup available\"\n  noBackup: 'Nenhum backup disponível',\n\n  // Original text: 'VM Name'\n  backupVmNameColumn: undefined,\n\n  // Original text: 'Tags'\n  backupTags: undefined,\n\n  // Original text: 'Last Backup'\n  lastBackupColumn: undefined,\n\n  // Original text: 'Available Backups'\n  availableBackupsColumn: undefined,\n\n  // Original text: 'Missing parameters'\n  backupRestoreErrorTitle: undefined,\n\n  // Original text: 'Choose a SR and a backup'\n  backupRestoreErrorMessage: undefined,\n\n  // Original text: 'Display backups'\n  displayBackup: undefined,\n\n  // Original text: 'Import VM'\n  importBackupTitle: undefined,\n\n  // Original text: 'Starting your backup import'\n  importBackupMessage: undefined,\n\n  // Original text: 'VMs to backup'\n  vmsToBackup: undefined,\n\n  // Original text: 'Emergency shutdown Host{nHosts, plural, one {} other {s}}'\n  emergencyShutdownHostsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to shutdown {nHosts} Host{nHosts, plural, one {} other {s}}?'\n  emergencyShutdownHostsModalMessage: undefined,\n\n  // Original text: \"Shutdown host\"\n  stopHostModalTitle: 'Desligar host',\n\n  // Original text: \"This will shutdown your host. Do you want to continue? If it's the pool master, your connection to the pool will be lost\"\n  stopHostModalMessage: 'O host será desligado. Você tem certeza que deseja continuar?',\n\n  // Original text: 'Add host'\n  addHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to add {host} to {pool}?'\n  addHostModalMessage: undefined,\n\n  // Original text: \"Restart host\"\n  restartHostModalTitle: 'Reiniciar host',\n\n  // Original text: \"This will restart your host. Do you want to continue?\"\n  restartHostModalMessage: 'O host será reiniciado. Você tem certeza que deseja continuar?',\n\n  // Original text: 'Restart Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}'\n  restartHostsAgentsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to restart {nHosts} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?'\n  restartHostsAgentsModalMessage: undefined,\n\n  // Original text: 'Restart Host{nHosts, plural, one {} other {s}}'\n  restartHostsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to restart {nHosts} Host{nHosts, plural, one {} other {s}}?'\n  restartHostsModalMessage: undefined,\n\n  // Original text: \"Start VM{vms, plural, one {} other {s}}\"\n  startVmsModalTitle: 'Iniciar VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to start {vms} VM{vms, plural, one {} other {s}}?\"\n  startVmsModalMessage: 'Você tem certeza que deseja iniciar {vms} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: 'Stop Host{nHosts, plural, one {} other {s}}'\n  stopHostsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to stop {nHosts} Host{nHosts, plural, one {} other {s}}?'\n  stopHostsModalMessage: undefined,\n\n  // Original text: \"Stop VM{vms, plural, one {} other {s}}\"\n  stopVmsModalTitle: 'Parar VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to stop {vms} VM{vms, plural, one {} other {s}}?\"\n  stopVmsModalMessage: 'Você tem certeza que deseja parar {vms} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: \"Restart VM\"\n  restartVmModalTitle: 'Reiniciar VM',\n\n  // Original text: \"Are you sure you want to restart {name}?\"\n  restartVmModalMessage: 'Você tem certeza que deseja reiniciar {name}?',\n\n  // Original text: \"Stop VM\"\n  stopVmModalTitle: 'Parar VM',\n\n  // Original text: \"Are you sure you want to stop {name}?\"\n  stopVmModalMessage: 'Você tem certeza que deseja parar {name}?',\n\n  // Original text: \"Restart VM{vms, plural, one {} other {s}}\"\n  restartVmsModalTitle: 'Reiniciar VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to restart {vms} VM{vms, plural, one {} other {s}}?\"\n  restartVmsModalMessage: 'Você tem certeza que deseja reiniciar {vms} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: \"Snapshot VM{vms, plural, one {} other {s}}\"\n  snapshotVmsModalTitle: 'Snapshot VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to snapshot {vms} VM{vms, plural, one {} other {s}}?\"\n  snapshotVmsModalMessage:\n    'Você tem certeza que deseja executar snapshop para {vms} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: \"Delete VM{vms, plural, one {} other {s}}\"\n  deleteVmsModalTitle: 'Deletar VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to delete {vms} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmsModalMessage:\n    'Você tem certeza que deseja deletar {vms} VM{vms, plural, one {} other {s}}? Todos os discos de VM serão removidos',\n\n  // Original text: \"Delete VM\"\n  deleteVmModalTitle: 'Deletar VM',\n\n  // Original text: \"Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmModalMessage: 'Você tem certeza que deseja deletar esta VM? Todos os discos de VM serão removidos',\n\n  // Original text: \"Migrate VM\"\n  migrateVmModalTitle: 'Migrar VM',\n\n  // Original text: 'Select a destination host:'\n  migrateVmSelectHost: undefined,\n\n  // Original text: 'Select a migration network:'\n  migrateVmSelectMigrationNetwork: undefined,\n\n  // Original text: 'For each VDI, select an SR:'\n  migrateVmSelectSrs: undefined,\n\n  // Original text: 'For each VIF, select a network:'\n  migrateVmSelectNetworks: undefined,\n\n  // Original text: 'Select a destination SR:'\n  migrateVmsSelectSr: undefined,\n\n  // Original text: 'Select a destination SR for local disks:'\n  migrateVmsSelectSrIntraPool: undefined,\n\n  // Original text: 'Select a network on which to connect each VIF:'\n  migrateVmsSelectNetwork: undefined,\n\n  // Original text: 'Smart mapping'\n  migrateVmsSmartMapping: undefined,\n\n  // Original text: 'Name'\n  migrateVmName: undefined,\n\n  // Original text: 'SR'\n  migrateVmSr: undefined,\n\n  // Original text: 'VIF'\n  migrateVmVif: undefined,\n\n  // Original text: 'Network'\n  migrateVmNetwork: undefined,\n\n  // Original text: 'No target host'\n  migrateVmNoTargetHost: undefined,\n\n  // Original text: 'A target host is required to migrate a VM'\n  migrateVmNoTargetHostMessage: undefined,\n\n  // Original text: 'Delete VDI'\n  deleteVdiModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete this disk? ALL DATA ON THIS DISK WILL BE LOST'\n  deleteVdiModalMessage: undefined,\n\n  // Original text: 'Revert your VM'\n  revertVmModalTitle: undefined,\n\n  // Original text: 'Delete snapshot'\n  deleteSnapshotModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete this snapshot?'\n  deleteSnapshotModalMessage: undefined,\n\n  // Original text: 'Are you sure you want to revert this VM to the snapshot state? This operation is irreversible.'\n  revertVmModalMessage: undefined,\n\n  // Original text: 'Snapshot before'\n  revertVmModalSnapshotBefore: undefined,\n\n  // Original text: \"Import a {name} Backup\"\n  importBackupModalTitle: 'Importar este Backup: {name}',\n\n  // Original text: \"Start VM after restore\"\n  importBackupModalStart: 'Iniciar VM após restauração',\n\n  // Original text: \"Select your backup…\"\n  importBackupModalSelectBackup: 'Selecionar backup…',\n\n  // Original text: \"Are you sure you want to remove all orphaned snapshot VDIs?\"\n  removeAllOrphanedModalWarning: 'Você tem certeza que deseja remover todos as VDIs orfãs?',\n\n  // Original text: \"Remove all logs\"\n  removeAllLogsModalTitle: 'Remover todos os logs',\n\n  // Original text: \"Are you sure you want to remove all logs?\"\n  removeAllLogsModalWarning: 'Você tem certeza que deseja remover todos os logs?',\n\n  // Original text: \"This operation is definitive.\"\n  definitiveMessageModal: 'Esta operação é definitiva.',\n\n  // Original text: \"Previous SR Usage\"\n  existingSrModalTitle: 'Uso anterior SR',\n\n  // Original text: \"This path has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingSrModalText:\n    'Este caminho foi previamente utilizado como um dispositivo de armazenamento por um host XenServer. Todos os dados serão perdidos se você optar por continuar a criação do SR.',\n\n  // Original text: \"Previous LUN Usage\"\n  existingLunModalTitle: 'Uso anterior LUN',\n\n  // Original text: \"This LUN has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingLunModalText:\n    'Este LUN foi previamente utilizado como um dispositivo de armazenamento por um host XenServer. Todos os dados serão perdidos se você optar por continuar a criação do SR.',\n\n  // Original text: \"Replace current registration?\"\n  alreadyRegisteredModal: 'Deseja substituir o registro atual?',\n\n  // Original text: \"Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?\"\n  alreadyRegisteredModalText:\n    'O seu XO appliance já foi registrado com o e-mail {email}, você tem certeza que gostaria de substituir este registro?',\n\n  // Original text: \"Ready for trial?\"\n  trialReadyModal: 'Pronto para iniciar o teste (trial)?',\n\n  // Original text: \"During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!\"\n  trialReadyModalText:\n    'Durante o período experimental, XOA precisa de uma conexão internet. Esta limitação não se aplica em nossos planos pagos!',\n\n  // Original text: \"Host\"\n  serverHost: 'Host',\n\n  // Original text: \"Username\"\n  serverUsername: 'Nome de Usuário',\n\n  // Original text: \"Password\"\n  serverPassword: 'Senha',\n\n  // Original text: \"Action\"\n  serverAction: 'Ação',\n\n  // Original text: \"Read Only\"\n  serverReadOnly: 'Modo Leitura',\n\n  // Original text: 'username'\n  serverPlaceHolderUser: undefined,\n\n  // Original text: 'password'\n  serverPlaceHolderPassword: undefined,\n\n  // Original text: 'address[:port]'\n  serverPlaceHolderAddress: undefined,\n\n  // Original text: 'Connect'\n  serverConnect: undefined,\n\n  // Original text: \"Copy VM\"\n  copyVm: 'Copiar VM',\n\n  // Original text: \"Are you sure you want to copy this VM to {SR}?\"\n  copyVmConfirm: 'Você tem certeza que deseja copiar esta VM para {SR}?',\n\n  // Original text: \"Name\"\n  copyVmName: 'Nome',\n\n  // Original text: 'Name pattern'\n  copyVmNamePattern: undefined,\n\n  // Original text: \"If empty: name of the copied VM\"\n  copyVmNamePlaceholder: 'Se vazio: Nome da VM copiada',\n\n  // Original text: 'e.g.: \"\\\\{name\\\\}_COPY\"'\n  copyVmNamePatternPlaceholder: undefined,\n\n  // Original text: \"Select SR\"\n  copyVmSelectSr: 'Selecionar SR',\n\n  // Original text: \"Use compression\"\n  copyVmCompress: 'Compressão',\n\n  // Original text: 'No target SR'\n  copyVmsNoTargetSr: undefined,\n\n  // Original text: 'A target SR is required to copy a VM'\n  copyVmsNoTargetSrMessage: undefined,\n\n  // Original text: 'Detach host'\n  detachHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to detach {host} from its pool? THIS WILL REMOVE ALL VMs ON ITS LOCAL STORAGE AND REBOOT THE HOST.'\n  detachHostModalMessage: undefined,\n\n  // Original text: 'Detach'\n  detachHost: undefined,\n\n  // Original text: \"Create network\"\n  newNetworkCreate: 'Criar rede',\n\n  // Original text: 'Create bonded network'\n  newBondedNetworkCreate: undefined,\n\n  // Original text: \"Interface\"\n  newNetworkInterface: 'Inerface',\n\n  // Original text: \"Name\"\n  newNetworkName: 'Nome',\n\n  // Original text: \"Description\"\n  newNetworkDescription: 'Descrição',\n\n  // Original text: \"VLAN\"\n  newNetworkVlan: 'VLAN',\n\n  // Original text: \"No VLAN if empty\"\n  newNetworkDefaultVlan: 'Sem VLAN, caso esteja vazia',\n\n  // Original text: \"MTU\"\n  newNetworkMtu: 'MTU',\n\n  // Original text: \"Default: 1500\"\n  newNetworkDefaultMtu: 'Padrão: 1500',\n\n  // Original text: 'Name required'\n  newNetworkNoNameErrorTitle: undefined,\n\n  // Original text: 'A name is required to create a network'\n  newNetworkNoNameErrorMessage: undefined,\n\n  // Original text: 'Bond mode'\n  newNetworkBondMode: undefined,\n\n  // Original text: \"Delete network\"\n  deleteNetwork: 'Deletar rede',\n\n  // Original text: \"Are you sure you want to delete this network?\"\n  deleteNetworkConfirm: 'Você tem certeza que deseja deletar esta rede?',\n\n  // Original text: 'This network is currently in use'\n  networkInUse: undefined,\n\n  // Original text: 'Bonded'\n  pillBonded: undefined,\n\n  // Original text: 'Host'\n  addHostSelectHost: undefined,\n\n  // Original text: 'No host'\n  addHostNoHost: undefined,\n\n  // Original text: 'No host selected to be added'\n  addHostNoHostMessage: undefined,\n\n  // Original text: \"Xen Orchestra\"\n  xenOrchestra: 'Xen Orchestra',\n\n  // Original text: \"No pro support provided!\"\n  noProSupport: 'Nenhum suporte pro fornecido!',\n\n  // Original text: \"Use in production at your own risks\"\n  noProductionUse: 'O uso deste em produção é por sua conta e risco',\n\n  // Original text: \"You can download our turnkey appliance at\"\n  downloadXoa: 'Você pode baixar nosso turnkey appliance em',\n\n  // Original text: \"Bug Tracker\"\n  bugTracker: 'Rastreador de bug',\n\n  // Original text: \"Issues? Report it!\"\n  bugTrackerText: 'Problemas? Envie agora!',\n\n  // Original text: \"Community\"\n  community: 'Comunidade',\n\n  // Original text: \"Join our community forum!\"\n  communityText: 'Participe do nosso forum e de nossa comunidade!',\n\n  // Original text: \"Free Trial for Premium Edition!\"\n  freeTrial: 'Versão Premium Edition disponível para período de teste (Trial)',\n\n  // Original text: \"Request your trial now!\"\n  freeTrialNow: 'Peça já seu período de teste (Trial)',\n\n  // Original text: \"Any issue?\"\n  issues: 'Algum problema encontrado?',\n\n  // Original text: \"Problem? Contact us!\"\n  issuesText: 'Problemas? Entre em contato conosco',\n\n  // Original text: \"Documentation\"\n  documentation: 'Documentação',\n\n  // Original text: \"Read our official doc\"\n  documentationText: 'Leia nossa documentação oficial (Em inglês)',\n\n  // Original text: \"Pro support included\"\n  proSupportIncluded: 'Suporte Pro incluído',\n\n  // Original text: \"Acces your XO Account\"\n  xoAccount: 'Acesse sua conta XO',\n\n  // Original text: \"Report a problem\"\n  openTicket: 'Enviar um problema',\n\n  // Original text: \"Problem? Open a ticket!\"\n  openTicketText: 'Algum problema? Abra um ticket agora!',\n\n  // Original text: \"Upgrade needed\"\n  upgradeNeeded: 'Atualização necessária',\n\n  // Original text: \"Upgrade now!\"\n  upgradeNow: 'Atualize agora!',\n\n  // Original text: \"Or\"\n  or: 'Ou',\n\n  // Original text: \"Try it for free!\"\n  tryIt: 'Teste agora, é grátis!',\n\n  // Original text: \"This feature is available starting from {plan} Edition\"\n  availableIn: 'Este recurso é disponível a partir da versão {plan}',\n\n  // Original text: 'This feature is not available in your version, contact your administrator to know more.'\n  notAvailable: undefined,\n\n  // Original text: 'Updates'\n  updateTitle: undefined,\n\n  // Original text: \"Registration\"\n  registration: 'Inscrição',\n\n  // Original text: \"Trial\"\n  trial: 'Teste (Trial)',\n\n  // Original text: \"Settings\"\n  settings: 'Configurações',\n\n  // Original text: 'Proxy settings'\n  proxySettings: undefined,\n\n  // Original text: 'Host (myproxy.example.org)'\n  proxySettingsHostPlaceHolder: undefined,\n\n  // Original text: 'Port (eg: 3128)'\n  proxySettingsPortPlaceHolder: undefined,\n\n  // Original text: 'Username'\n  proxySettingsUsernamePlaceHolder: undefined,\n\n  // Original text: 'Password'\n  proxySettingsPasswordPlaceHolder: undefined,\n\n  // Original text: 'Your email account'\n  updateRegistrationEmailPlaceHolder: undefined,\n\n  // Original text: 'Your password'\n  updateRegistrationPasswordPlaceHolder: undefined,\n\n  // Original text: \"Update\"\n  update: 'Atualizar (Update)',\n\n  // Original text: 'Refresh'\n  refresh: undefined,\n\n  // Original text: \"Upgrade\"\n  upgrade: 'Atualização (Upgrade)',\n\n  // Original text: \"No updater available for Community Edition\"\n  noUpdaterCommunity: 'Nenhuma atualização disponível para a versão Community Edition',\n\n  // Original text: \"Please consider subscribe and try it with all features for free during 30 days on\"\n  noUpdaterSubscribe: 'Oi, inscreva-se e venha testar todos nossos recursos e serviços gratuitamente por 30 dias!',\n\n  // Original text: \"Manual update could break your current installation due to dependencies issues, do it with caution\"\n  noUpdaterWarning:\n    'Atualização feita de forma manual pode corromper sua instalação atual devido a problema de dependências, tenha cuidado!',\n\n  // Original text: \"Current version:\"\n  currentVersion: 'Versão atual:',\n\n  // Original text: \"Register\"\n  register: 'Registrar',\n\n  // Original text: 'Edit registration'\n  editRegistration: undefined,\n\n  // Original text: \"Please, take time to register in order to enjoy your trial.\"\n  trialRegistration: 'Por favor, tome seu tempo para se registrar a fim de desfrutar do seu período de teste (trial)',\n\n  // Original text: \"Start trial\"\n  trialStartButton: 'Iniciar teste (trial)',\n\n  // Original text: \"You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.\"\n  trialAvailableUntil:\n    'Sua versao de teste é válida até {date, date, medium}. Após esta data escolha um de nossos planos e continue a desfrutar de nosso software e serviços!',\n\n  // Original text: \"Your trial has been ended. Contact us or downgrade to Free version\"\n  trialConsumed:\n    'Seu período de teste chegou ao fim. Entre em contato conosco ou faça o downgrade para a versão grátis',\n\n  // Original text: \"Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.\"\n  trialLocked:\n    'Seu serviço de atualização XOA parece não funcionar. Seu XOA não pode funcionar corretamente sem este serviço.',\n\n  // Original text: 'No update information available'\n  noUpdateInfo: undefined,\n\n  // Original text: 'Update information may be available'\n  waitingUpdateInfo: undefined,\n\n  // Original text: 'Your XOA is up-to-date'\n  upToDate: undefined,\n\n  // Original text: 'You need to update your XOA (new version is available)'\n  mustUpgrade: undefined,\n\n  // Original text: 'Your XOA is not registered for updates'\n  registerNeeded: undefined,\n\n  // Original text: \"Can't fetch update information\"\n  updaterError: undefined,\n\n  // Original text: 'Upgrade successful'\n  promptUpgradeReloadTitle: undefined,\n\n  // Original text: 'Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?'\n  promptUpgradeReloadMessage: undefined,\n\n  // Original text: \"Xen Orchestra from the sources\"\n  disclaimerTitle: 'Xen Orchestra versão Open-Source',\n\n  // Original text: \"You are using XO from the sources! That's great for a personal/non-profit usage.\"\n  disclaimerText1: 'Você está usando XO Open-Source! Isso é ótimo para um uso pessoal / sem fins lucrativos.',\n\n  // Original text: \"If you are a company, it's better to use it with our appliance + pro support included:\"\n  disclaimerText2: 'Se você é uma empresa, é melhor usá-lo com o nosso sistema appliance + suporte pro inclusos:',\n\n  // Original text: \"This version is not bundled with any support nor updates. Use it with caution for critical tasks.\"\n  disclaimerText3: 'Esta versão não está vinculada a qualquer tipo de suporte nem atualizações. Use-a com cuidado.',\n\n  // Original text: \"Connect PIF\"\n  connectPif: 'Conectar PIF',\n\n  // Original text: \"Are you sure you want to connect this PIF?\"\n  connectPifConfirm: 'Você tem certeza que deseja conectar este PIF?',\n\n  // Original text: \"Disconnect PIF\"\n  disconnectPif: 'Desconectar PIF',\n\n  // Original text: \"Are you sure you want to disconnect this PIF?\"\n  disconnectPifConfirm: 'Você tem certeza que deseja desconectar este PIF?',\n\n  // Original text: \"Delete PIF\"\n  deletePif: 'Deletar PIF',\n\n  // Original text: \"Are you sure you want to delete this PIF?\"\n  deletePifConfirm: 'Você tem certeza que deseja conectar este PIF?',\n\n  // Original text: 'Username'\n  username: undefined,\n\n  // Original text: 'Password'\n  password: undefined,\n\n  // Original text: 'Language'\n  language: undefined,\n\n  // Original text: 'Old password'\n  oldPasswordPlaceholder: undefined,\n\n  // Original text: 'New password'\n  newPasswordPlaceholder: undefined,\n\n  // Original text: 'Confirm new password'\n  confirmPasswordPlaceholder: undefined,\n\n  // Original text: 'Confirmation password incorrect'\n  confirmationPasswordError: undefined,\n\n  // Original text: 'Password does not match the confirm password.'\n  confirmationPasswordErrorBody: undefined,\n\n  // Original text: 'Password changed'\n  pwdChangeSuccess: undefined,\n\n  // Original text: 'Your password has been successfully changed.'\n  pwdChangeSuccessBody: undefined,\n\n  // Original text: 'Incorrect password'\n  pwdChangeError: undefined,\n\n  // Original text: 'The old password provided is incorrect. Your password has not been changed.'\n  pwdChangeErrorBody: undefined,\n\n  // Original text: 'OK'\n  changePasswordOk: undefined,\n\n  // Original text: 'SSH keys'\n  sshKeys: undefined,\n\n  // Original text: 'New SSH key'\n  newSshKey: undefined,\n\n  // Original text: 'Delete'\n  deleteSshKey: undefined,\n\n  // Original text: 'No SSH keys'\n  noSshKeys: undefined,\n\n  // Original text: 'New SSH key'\n  newSshKeyModalTitle: undefined,\n\n  // Original text: 'Invalid key'\n  sshKeyErrorTitle: undefined,\n\n  // Original text: 'An SSH key requires both a title and a key.'\n  sshKeyErrorMessage: undefined,\n\n  // Original text: 'Title'\n  title: undefined,\n\n  // Original text: 'Key'\n  key: undefined,\n\n  // Original text: 'Delete SSH key'\n  deleteSshKeyConfirm: undefined,\n\n  // Original text: 'Are you sure you want to delete the SSH key {title}?'\n  deleteSshKeyConfirmMessage: undefined,\n\n  // Original text: 'Others'\n  others: undefined,\n\n  // Original text: 'Loading logs…'\n  loadingLogs: undefined,\n\n  // Original text: 'User'\n  logUser: undefined,\n\n  // Original text: 'Method'\n  logMethod: undefined,\n\n  // Original text: 'Params'\n  logParams: undefined,\n\n  // Original text: 'Message'\n  logMessage: undefined,\n\n  // Original text: 'Error'\n  logError: undefined,\n\n  // Original text: 'Display details'\n  logDisplayDetails: undefined,\n\n  // Original text: 'Date'\n  logTime: undefined,\n\n  // Original text: 'No stack trace'\n  logNoStackTrace: undefined,\n\n  // Original text: 'No params'\n  logNoParams: undefined,\n\n  // Original text: 'Delete log'\n  logDelete: undefined,\n\n  // Original text: 'Delete all logs'\n  logDeleteAll: undefined,\n\n  // Original text: 'Delete all logs'\n  logDeleteAllTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete all the logs?'\n  logDeleteAllMessage: undefined,\n\n  // Original text: 'Name'\n  ipPoolName: undefined,\n\n  // Original text: 'IPs'\n  ipPoolIps: undefined,\n\n  // Original text: 'IPs (e.g.: 1.0.0.12-1.0.0.17;1.0.0.23)'\n  ipPoolIpsPlaceholder: undefined,\n\n  // Original text: 'Networks'\n  ipPoolNetworks: undefined,\n\n  // Original text: 'No IP pools'\n  ipsNoIpPool: undefined,\n\n  // Original text: 'Create'\n  ipsCreate: undefined,\n\n  // Original text: 'Delete all IP pools'\n  ipsDeleteAllTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete all the IP pools?'\n  ipsDeleteAllMessage: undefined,\n\n  // Original text: 'VIFs'\n  ipsVifs: undefined,\n\n  // Original text: 'Not used'\n  ipsNotUsed: undefined,\n\n  // Original text: 'Keyboard shortcuts'\n  shortcutModalTitle: undefined,\n\n  // Original text: 'Global'\n  shortcut_XoApp: undefined,\n\n  // Original text: 'Go to hosts list'\n  shortcut_GO_TO_HOSTS: undefined,\n\n  // Original text: 'Go to pools list'\n  shortcut_GO_TO_POOLS: undefined,\n\n  // Original text: 'Go to VMs list'\n  shortcut_GO_TO_VMS: undefined,\n\n  // Original text: 'Create a new VM'\n  shortcut_CREATE_VM: undefined,\n\n  // Original text: 'Unfocus field'\n  shortcut_UNFOCUS: undefined,\n\n  // Original text: 'Show shortcuts key bindings'\n  shortcut_HELP: undefined,\n\n  // Original text: 'Home'\n  shortcut_Home: undefined,\n\n  // Original text: 'Focus search bar'\n  shortcut_SEARCH: undefined,\n\n  // Original text: 'Next item'\n  shortcut_NAV_DOWN: undefined,\n\n  // Original text: 'Previous item'\n  shortcut_NAV_UP: undefined,\n\n  // Original text: 'Select item'\n  shortcut_SELECT: undefined,\n\n  // Original text: 'Open'\n  shortcut_JUMP_INTO: undefined,\n\n  // Original text: 'VM'\n  settingsAclsButtonTooltipVM: undefined,\n\n  // Original text: 'Hosts'\n  settingsAclsButtonTooltiphost: undefined,\n\n  // Original text: 'Pool'\n  settingsAclsButtonTooltippool: undefined,\n\n  // Original text: 'SR'\n  settingsAclsButtonTooltipSR: undefined,\n\n  // Original text: 'Network'\n  settingsAclsButtonTooltipnetwork: undefined,\n}\n","// See http://momentjs.com/docs/#/use-it/browserify/\nimport 'moment/locale/ru'\n\nimport reactIntlData from 'react-intl/locale-data/ru'\nimport { addLocaleData } from 'react-intl'\naddLocaleData(reactIntlData)\n\n// ===================================================================\n\nexport default {\n  // Original text: 'Alpha'\n  alpha: undefined,\n\n  // Original text: 'Alerts'\n  alerts: undefined,\n\n  // Original text: 'Connected'\n  connected: undefined,\n\n  // Original text: 'Description'\n  description: undefined,\n\n  // Original text: 'Delete source VM'\n  deleteSourceVm: undefined,\n\n  // Original text: 'Disable'\n  disable: undefined,\n\n  // Original text: 'Disk state'\n  diskState: undefined,\n\n  // Original text: 'Download'\n  download: undefined,\n\n  // Original text: 'Enable'\n  enable: undefined,\n\n  // Original text: 'Expiration'\n  expiration: undefined,\n\n  // Original text: 'Host IP'\n  hostIp: undefined,\n\n  // Original text: 'Interfaces'\n  interfaces: undefined,\n\n  // Original text: '{key}: {value}'\n  keyValue: undefined,\n\n  // Original text: 'Skip SSL check'\n  esxiImportSslCertificate: undefined,\n\n  // Original text: 'Thin mode'\n  esxiImportThin: undefined,\n\n  // Original text: 'Disk created in thin mode (less space used). Data is read twice, no visible task or progress at first'\n  esxiImportThinDescription: undefined,\n\n  // Original text: 'Stop the source VM'\n  esxiImportStopSource: undefined,\n\n  // Original text: 'Source VM stopped before the last delta transfer (after final snapshot). Needed to fully transfer a running VM'\n  esxiImportStopSourceDescription: undefined,\n\n  // Original text: 'Stop on the first error when importing VMs'\n  esxiImportStopOnErrorDescription: undefined,\n\n  // Original text: 'In use'\n  inUse: undefined,\n\n  // Original text: 'Number of VMs to import in parallel'\n  nImportVmsInParallel: undefined,\n\n  // Original text: 'Node'\n  node: undefined,\n\n  // Original text: 'PIFs'\n  pifs: undefined,\n\n  // Original text: 'Stop on error'\n  stopOnError: undefined,\n\n  // Original text: 'UUID'\n  uuid: undefined,\n\n  // Original text: 'VDI'\n  vdi: undefined,\n\n  // Original text: 'Storage: {used} used of {total} ({free} free)'\n  vmSrUsage: undefined,\n\n  // Original text: 'New'\n  new: undefined,\n\n  // Original text: 'Node status'\n  nodeStatus: undefined,\n\n  // Original text: 'Not defined'\n  notDefined: undefined,\n\n  // Original text: 'Status'\n  status: undefined,\n\n  // Original text: \"Connecting\"\n  statusConnecting: 'Подключение',\n\n  // Original text: \"Disconnected\"\n  statusDisconnected: 'Отключено',\n\n  // Original text: \"Loading…\"\n  statusLoading: 'Загружается...',\n\n  // Original text: \"Page not found\"\n  errorPageNotFound: 'Страница не найдена',\n\n  // Original text: \"No such item\"\n  errorNoSuchItem: 'элемент не найден',\n\n  // Original text: 'Unknown {type}'\n  errorUnknownItem: undefined,\n\n  // Original text: 'Generate new MAC addresses'\n  generateNewMacAddress: undefined,\n\n  // Original text: '{memoryFree} RAM free'\n  memoryFree: undefined,\n\n  // Original text: 'Configured'\n  configured: undefined,\n\n  // Original text: 'Not configured'\n  notConfigured: undefined,\n\n  // Original text: 'UTC date'\n  utcDate: undefined,\n\n  // Original text: 'UTC time'\n  utcTime: undefined,\n\n  // Original text: 'Date'\n  date: undefined,\n\n  // Original text: 'Notifications'\n  notifications: undefined,\n\n  // Original text: 'No notifications so far.'\n  noNotifications: undefined,\n\n  // Original text: 'NEW!'\n  notificationNew: undefined,\n\n  // Original text: 'More details'\n  moreDetails: undefined,\n\n  // Original text: 'Subject'\n  messageSubject: undefined,\n\n  // Original text: 'From'\n  messageFrom: undefined,\n\n  // Original text: 'Reply'\n  messageReply: undefined,\n\n  // Original text: 'SR'\n  sr: undefined,\n\n  // Original text: 'Subdirectory'\n  subdirectory: undefined,\n\n  // Original text: 'Try XOA for free and deploy it here.'\n  tryXoa: undefined,\n\n  // Original text: 'Not installed'\n  notInstalled: undefined,\n\n  // Original text: \"Long click to edit\"\n  editableLongClickPlaceholder: 'Долгое нажатие для редактирования',\n\n  // Original text: \"Click to edit\"\n  editableClickPlaceholder: 'Нажмите для редактирования',\n\n  // Original text: \"Browse files\"\n  browseFiles: 'Просмотреть файлы',\n\n  // Original text: 'Show logs'\n  showLogs: undefined,\n\n  // Original text: 'None'\n  noValue: undefined,\n\n  // Original text: 'No expiration'\n  noExpiration: undefined,\n\n  // Original text: 'Compression'\n  compression: undefined,\n\n  // Original text: 'Core'\n  core: undefined,\n\n  // Original text: 'CPU'\n  cpu: undefined,\n\n  // Original text: 'Multipathing'\n  multipathing: undefined,\n\n  // Original text: 'Multipathing disabled'\n  multipathingDisabled: undefined,\n\n  // Original text: 'Enable multipathing'\n  enableMultipathing: undefined,\n\n  // Original text: 'Disable multipathing'\n  disableMultipathing: undefined,\n\n  // Original text: 'Enable multipathing for all hosts'\n  enableAllHostsMultipathing: undefined,\n\n  // Original text: 'Disable multipathing for all hosts'\n  disableAllHostsMultipathing: undefined,\n\n  // Original text: 'Paths'\n  paths: undefined,\n\n  // Original text: 'PBD disconnected'\n  pbdDisconnected: undefined,\n\n  // Original text: 'Has an inactive path'\n  hasInactivePath: undefined,\n\n  // Original text: 'Pools'\n  pools: undefined,\n\n  // Original text: 'Remotes'\n  remotes: undefined,\n\n  // Original text: 'Scheduler granularity'\n  schedulerGranularity: undefined,\n\n  // Original text: 'Socket'\n  socket: undefined,\n\n  // Original text: 'Type'\n  type: undefined,\n\n  // Original text: 'Restore'\n  restore: undefined,\n\n  // Original text: 'Delete'\n  delete: undefined,\n\n  // Original text: 'VMs'\n  vms: undefined,\n\n  // Original text: 'Max vCPUs'\n  cpusMax: undefined,\n\n  // Original text: 'Metadata'\n  metadata: undefined,\n\n  // Original text: 'Choose a backup'\n  chooseBackup: undefined,\n\n  // Original text: 'Temporarily disabled'\n  temporarilyDisabled: undefined,\n\n  // Original text: 'Click to show error'\n  clickToShowError: undefined,\n\n  // Original text: 'Backup jobs'\n  backupJobs: undefined,\n\n  // Original text: '({ nSessions, number }) iSCSI session{nSessions, plural, one {} other {s}}'\n  iscsiSessions: undefined,\n\n  // Original text: 'Requires admin permissions'\n  requiresAdminPermissions: undefined,\n\n  // Original text: 'Proxy'\n  proxy: undefined,\n\n  // Original text: 'Proxies'\n  proxies: undefined,\n\n  // Original text: 'Name'\n  name: undefined,\n\n  // Original text: 'Value'\n  value: undefined,\n\n  // Original text: 'Address'\n  address: undefined,\n\n  // Original text: 'VM'\n  vm: undefined,\n\n  // Original text: 'Destination SR'\n  destinationSR: undefined,\n\n  // Original text: 'Destination network'\n  destinationNetwork: undefined,\n\n  // Original text: 'DHCP'\n  dhcp: undefined,\n\n  // Original text: 'ID'\n  id: undefined,\n\n  // Original text: 'IP'\n  ip: undefined,\n\n  // Original text: 'Static'\n  static: undefined,\n\n  // Original text: 'User'\n  user: undefined,\n\n  // Original text: 'deleted ({ name })'\n  deletedUser: undefined,\n\n  // Original text: 'Network configuration'\n  networkConfiguration: undefined,\n\n  // Original text: 'Integrity'\n  integrity: undefined,\n\n  // Original text: 'Altered'\n  altered: undefined,\n\n  // Original text: 'Missing'\n  missing: undefined,\n\n  // Original text: 'Verified'\n  verified: undefined,\n\n  // Original text: 'Snapshot mode'\n  snapshotMode: undefined,\n\n  // Original text: 'Normal'\n  normal: undefined,\n\n  // Original text: 'With memory'\n  withMemory: undefined,\n\n  // Original text: 'Offline'\n  offline: undefined,\n\n  // Original text: 'No license available'\n  noLicenseAvailable: undefined,\n\n  // Original text: 'Email address, e.g.: it@company.net'\n  emailPlaceholderExample: undefined,\n\n  // Original text: 'Unknown'\n  unknown: undefined,\n\n  // Original text: 'Upgrades available'\n  upgradesAvailable: undefined,\n\n  // Original text: 'Advanced settings'\n  advancedSettings: undefined,\n\n  // Original text: 'Force upgrade'\n  forceUpgrade: undefined,\n\n  // Original text: 'TX checksumming'\n  txChecksumming: undefined,\n\n  // Original text: 'Thick'\n  thick: undefined,\n\n  // Original text: 'Thin'\n  thin: undefined,\n\n  // Original text: 'Unknown size'\n  unknownSize: undefined,\n\n  // Original text: 'Installed certificates'\n  installedCertificates: undefined,\n\n  // Original text: 'Expiry'\n  expiry: undefined,\n\n  // Original text: 'Fingerprint'\n  fingerprint: undefined,\n\n  // Original text: 'Certificate (PEM)'\n  certificate: undefined,\n\n  // Original text: 'Certificate chain (PEM)'\n  certificateChain: undefined,\n\n  // Original text: 'Private key (PKCS#8)'\n  privateKey: undefined,\n\n  // Original text: 'Install new certificate'\n  installNewCertificate: undefined,\n\n  // Original text: 'Replace existing certificate'\n  replaceExistingCertificate: undefined,\n\n  // Original text: 'Custom fields'\n  customFields: undefined,\n\n  // Original text: 'Add color'\n  addColor: undefined,\n\n  // Original text: 'Add custom field'\n  addCustomField: undefined,\n\n  // Original text: 'Advanced tag creation'\n  advancedTagCreation: undefined,\n\n  // Original text: 'Available in XOA Premium'\n  availableXoaPremium: undefined,\n\n  // Original text: 'Detach'\n  detach: undefined,\n\n  // Original text: 'Edit custom field'\n  editCustomField: undefined,\n\n  // Original text: 'Delete custom field'\n  deleteCustomField: undefined,\n\n  // Original text: 'Only available to XOA users'\n  onlyAvailableXoaUsers: undefined,\n\n  // Original text: 'Remove color'\n  removeColor: undefined,\n\n  // Original text: 'XCP-ng'\n  xcpNg: undefined,\n\n  // Original text: 'No file selected'\n  noFileSelected: undefined,\n\n  // Original text: 'Number of retries if VM backup fails'\n  nRetriesVmBackupFailures: undefined,\n\n  // Original text: \"OK\"\n  alertOk: 'OK',\n\n  // Original text: \"OK\"\n  confirmOk: 'OK',\n\n  // Original text: 'OK'\n  formOk: undefined,\n\n  // Original text: \"Cancel\"\n  genericCancel: 'Отмена',\n\n  // Original text: 'Enter the following text to confirm:'\n  enterConfirmText: undefined,\n\n  // Original text: \"On error\"\n  onError: 'При ошибке',\n\n  // Original text: \"Successful\"\n  successful: 'Успешно',\n\n  // Original text: 'Hide short tasks'\n  filterOutShortTasks: undefined,\n\n  // Original text: \"Managed disks\"\n  filterOnlyManaged: 'Управляемые диски',\n\n  // Original text: 'Orphaned disks'\n  filterOnlyOrphaned: undefined,\n\n  // Original text: 'Normal disks'\n  filterOnlyRegular: undefined,\n\n  // Original text: 'Running VMs'\n  filterOnlyRunningVms: undefined,\n\n  // Original text: \"Snapshot disks\"\n  filterOnlySnapshots: 'Снимки дисков',\n\n  // Original text: 'Unmanaged disks'\n  filterOnlyUnmanaged: undefined,\n\n  // Original text: 'Save…'\n  filterSaveAs: undefined,\n\n  // Original text: 'Explore the search syntax in the documentation'\n  filterSyntaxLinkTooltip: undefined,\n\n  // Original text: 'Connected VIFs'\n  filterVifsOnlyConnected: undefined,\n\n  // Original text: 'Disconnected VIFs'\n  filterVifsOnlyDisconnected: undefined,\n\n  // Original text: 'Connected remotes'\n  filterRemotesOnlyConnected: undefined,\n\n  // Original text: 'Disconnected remotes'\n  filterRemotesOnlyDisconnected: undefined,\n\n  // Original text: \"Copy to clipboard\"\n  copyToClipboard: 'Копировать в буфер обмена',\n\n  // Original text: 'Copy VDI UUID'\n  copyToClipboardVdiUuid: undefined,\n\n  // Original text: 'Copy {uuid}'\n  copyUuid: undefined,\n\n  // Original text: 'Copy {value}'\n  copyValue: undefined,\n\n  // Original text: 'Master'\n  pillMaster: undefined,\n\n  // Original text: \"Home\"\n  homePage: 'Главная',\n\n  // Original text: \"VMs\"\n  homeVmPage: 'Виртуальные машины',\n\n  // Original text: \"Hosts\"\n  homeHostPage: 'Хосты',\n\n  // Original text: \"Pools\"\n  homePoolPage: 'Пулы',\n\n  // Original text: \"Templates\"\n  homeTemplatePage: 'Шаблоны',\n\n  // Original text: \"Storage\"\n  homeSrPage: 'Хранилища',\n\n  // Original text: \"Dashboard\"\n  dashboardPage: 'Контрольная панель',\n\n  // Original text: \"Overview\"\n  overviewDashboardPage: 'Обзор',\n\n  // Original text: \"Visualizations\"\n  overviewVisualizationDashboardPage: 'Визуализация',\n\n  // Original text: \"Statistics\"\n  overviewStatsDashboardPage: 'Статистика',\n\n  // Original text: \"Health\"\n  overviewHealthDashboardPage: 'Здоровье',\n\n  // Original text: \"Self service\"\n  selfServicePage: 'Самообслуживание',\n\n  // Original text: \"Backup\"\n  backupPage: 'Резервная копия',\n\n  // Original text: \"Jobs\"\n  jobsPage: 'Задачи',\n\n  // Original text: 'XOA'\n  xoaPage: undefined,\n\n  // Original text: \"Updates\"\n  updatePage: 'Обновления',\n\n  // Original text: 'Licenses'\n  licensesPage: undefined,\n\n  // Original text: 'Notifications'\n  notificationsPage: undefined,\n\n  // Original text: 'Support'\n  supportPage: undefined,\n\n  // Original text: \"Settings\"\n  settingsPage: 'Настройки',\n\n  // Original text: 'Audit'\n  settingsAuditPage: undefined,\n\n  // Original text: \"Servers\"\n  settingsServersPage: 'Серверы',\n\n  // Original text: \"Users\"\n  settingsUsersPage: 'Пользователи',\n\n  // Original text: \"Groups\"\n  settingsGroupsPage: 'Группы',\n\n  // Original text: \"ACLs\"\n  settingsAclsPage: 'Управление доступом',\n\n  // Original text: \"Plugins\"\n  settingsPluginsPage: 'Плагины',\n\n  // Original text: \"Logs\"\n  settingsLogsPage: 'Журналы',\n\n  // Original text: 'Cloud configs'\n  settingsCloudConfigsPage: undefined,\n\n  // Original text: \"IPs\"\n  settingsIpsPage: 'IP адреса',\n\n  // Original text: \"About\"\n  aboutPage: 'О программе',\n\n  // Original text: \"About XO {xoaPlan}\"\n  aboutXoaPlan: 'О Xen Orchestra {xoaPlan}',\n\n  // Original text: \"New\"\n  newMenu: 'Добавить',\n\n  // Original text: \"Tasks\"\n  taskMenu: 'Задачи',\n\n  // Original text: \"Tasks\"\n  taskPage: 'Задачи',\n\n  // Original text: 'Network'\n  newNetworkPage: undefined,\n\n  // Original text: \"VM\"\n  newVmPage: 'ВМ',\n\n  // Original text: \"Storage\"\n  newSrPage: 'Хранилище',\n\n  // Original text: \"Server\"\n  newServerPage: 'Сервер',\n\n  // Original text: \"Import\"\n  newImport: 'Импорт',\n\n  // Original text: 'XOSAN'\n  xosan: undefined,\n\n  // Original text: \"Overview\"\n  backupOverviewPage: 'Обзор',\n\n  // Original text: \"New\"\n  backupNewPage: 'Создать',\n\n  // Original text: 'Remotes'\n  backupRemotesPage: undefined,\n\n  // Original text: \"Restore\"\n  backupRestorePage: 'Восстановление',\n\n  // Original text: \"File restore\"\n  backupFileRestorePage: 'Восстановление файлов',\n\n  // Original text: \"Schedule\"\n  schedule: 'Расписание',\n\n  // Original text: \"Backup\"\n  backup: 'Резервная копия',\n\n  // Original text: 'Rolling Snapshot'\n  rollingSnapshot: undefined,\n\n  // Original text: 'Delta Backup'\n  deltaBackup: undefined,\n\n  // Original text: 'Disaster Recovery'\n  disasterRecovery: undefined,\n\n  // Original text: 'Continuous Replication'\n  continuousReplication: undefined,\n\n  // Original text: 'Backup type'\n  backupType: undefined,\n\n  // Original text: 'Pool metadata'\n  poolMetadata: undefined,\n\n  // Original text: 'XO config'\n  xoConfig: undefined,\n\n  // Original text: 'VM Backup & Replication'\n  backupVms: undefined,\n\n  // Original text: 'XO config & Pool metadata Backup'\n  backupMetadata: undefined,\n\n  // Original text: 'Mirror backup'\n  mirrorBackup: undefined,\n\n  // Original text: 'VM Mirror Backup'\n  mirrorBackupVms: undefined,\n\n  // Original text: \"Overview\"\n  jobsOverviewPage: 'Обзор',\n\n  // Original text: \"New\"\n  jobsNewPage: 'Добавить',\n\n  // Original text: \"Scheduling\"\n  jobsSchedulingPage: 'Планировщик',\n\n  // Original text: \"Custom Job\"\n  customJob: 'Пользовательская задача',\n\n  // Original text: \"User\"\n  userPage: 'Пользователь',\n\n  // Original text: 'XOA'\n  xoa: undefined,\n\n  // Original text: \"No support\"\n  noSupport: 'Без поддержки',\n\n  // Original text: \"Free upgrade!\"\n  freeUpgrade: 'Бесплатное обновление!',\n\n  // Original text: 'Check XOA'\n  checkXoa: undefined,\n\n  // Original text: 'XOA check'\n  xoaCheck: undefined,\n\n  // Original text: 'Close tunnel'\n  closeTunnel: undefined,\n\n  // Original text: 'Create a support ticket'\n  createSupportTicket: undefined,\n\n  // Original text: 'Restart XO Server'\n  restartXoServer: undefined,\n\n  // Original text: 'Restarting XO Server will interrupt any backup job or XO task that is currently running. Xen Orchestra will also be unavailable for a few seconds. Are you sure you want to restart XO Server?'\n  restartXoServerConfirm: undefined,\n\n  // Original text: 'Open tunnel'\n  openTunnel: undefined,\n\n  // Original text: 'The XOA check and the support tunnel are available in XOA.'\n  supportCommunity: undefined,\n\n  // Original text: 'Support tunnel'\n  supportTunnel: undefined,\n\n  // Original text: 'The support tunnel is closed.'\n  supportTunnelClosed: undefined,\n\n  // Original text: \"Sign out\"\n  signOut: 'Выйти',\n\n  // Original text: \"Edit my settings {username}\"\n  editUserProfile: 'Изменить мои настройки {username}',\n\n  // Original text: 'XenServer Client ID'\n  xsClientId: undefined,\n\n  // Original text: 'Upload Client ID file'\n  uploadClientId: undefined,\n\n  // Original text: 'Forget Client ID'\n  forgetClientId: undefined,\n\n  // Original text: 'Are you sure you want to forget your XenServer Client ID?'\n  forgetXsCredentialsConfirm: undefined,\n\n  // Original text: 'Could not forget Client ID'\n  forgetXsCredentialsError: undefined,\n\n  // Original text: 'Client ID forgotten'\n  forgetXsCredentialsSuccess: undefined,\n\n  // Original text: 'Could not upload Client ID'\n  setXsCredentialsError: undefined,\n\n  // Original text: 'Client ID uploaded'\n  setXsCredentialsSuccess: undefined,\n\n  // Original text: 'All VMs'\n  allVms: undefined,\n\n  // Original text: 'Backed up VMs'\n  backedUpVms: undefined,\n\n  // Original text: 'Not backed up VMs'\n  notBackedUpVms: undefined,\n\n  // Original text: \"Fetching data…\"\n  homeFetchingData: 'Извлечение  данных…',\n\n  // Original text: \"Welcome to Xen Orchestra!\"\n  homeWelcome: 'Добро пожаловать в Xen Orchestra!',\n\n  // Original text: \"Add your XCP-ng hosts or pools\"\n  homeWelcomeText: 'Добавьте свои хосты и пулы XCP-ng',\n\n  // Original text: \"Some XCP-ng hosts have been registered but are not connected\"\n  homeConnectServerText: 'Некоторые серверы XenServer зарегистрированы, но не подключены',\n\n  // Original text: \"Want some help?\"\n  homeHelp: 'Нужна помощь?',\n\n  // Original text: \"Add server\"\n  homeAddServer: 'Добавить сервер',\n\n  // Original text: \"Connect servers\"\n  homeConnectServer: 'Подключить серверы',\n\n  // Original text: \"Online doc\"\n  homeOnlineDoc: 'Онлайн документация',\n\n  // Original text: \"Pro support\"\n  homeProSupport: 'Поддержка уровня \"Pro\"',\n\n  // Original text: \"There are no VMs!\"\n  homeNoVms: 'Виртуальных машин нет!',\n\n  // Original text: \"Or…\"\n  homeNoVmsOr: 'Или…',\n\n  // Original text: \"Import VM\"\n  homeImportVm: 'Импорт ВМ',\n\n  // Original text: \"Import an existing VM in xva format\"\n  homeImportVmMessage: 'Импорт существующей виртуальной машины в формате xva',\n\n  // Original text: \"Restore a backup\"\n  homeRestoreBackup: 'Восстановить резервную копию',\n\n  // Original text: \"Restore a backup from a remote store\"\n  homeRestoreBackupMessage: 'Восстановить резервную копию из удаленного хранилища',\n\n  // Original text: \"This will create a new VM\"\n  homeNewVmMessage: 'Это создаст новую ВМ',\n\n  // Original text: \"Filters\"\n  homeFilters: 'Фильтры',\n\n  // Original text: \"No results! Click here to reset your filters\"\n  homeNoMatches: 'Ничего не найдено! Нажмите, что-бы сбросить фильтры',\n\n  // Original text: \"Pool\"\n  homeTypePool: 'Пул',\n\n  // Original text: \"Host\"\n  homeTypeHost: 'Хост',\n\n  // Original text: \"VM\"\n  homeTypeVm: 'ВМ',\n\n  // Original text: 'SR'\n  homeTypeSr: undefined,\n\n  // Original text: \"Template\"\n  homeTypeVmTemplate: 'Шаблон',\n\n  // Original text: \"Sort\"\n  homeSort: 'Сортировка',\n\n  // Original text: \"Pools\"\n  homeAllPools: 'Пулы',\n\n  // Original text: \"Hosts\"\n  homeAllHosts: 'Хосты',\n\n  // Original text: \"Tags\"\n  homeAllTags: 'Тэги',\n\n  // Original text: 'Resource sets'\n  homeAllResourceSets: undefined,\n\n  // Original text: \"New VM\"\n  homeNewVm: 'Новая ВМ',\n\n  // Original text: 'None'\n  homeFilterNone: undefined,\n\n  // Original text: \"Disabled hosts\"\n  homeFilterDisabledHosts: 'Отключенные хосты',\n\n  // Original text: \"Pending VMs\"\n  homeFilterPendingVms: 'Ожидание ВМ',\n\n  // Original text: 'HVM guests'\n  homeFilterHvmGuests: undefined,\n\n  // Original text: \"Sort by\"\n  homeSortBy: 'Сортировать по',\n\n  // Original text: 'CPUs'\n  homeSortByCpus: undefined,\n\n  // Original text: 'Start time'\n  homeSortByStartTime: undefined,\n\n  // Original text: \"Name\"\n  homeSortByName: 'Название',\n\n  // Original text: \"Power state\"\n  homeSortByPowerstate: 'Состояние питания',\n\n  // Original text: 'RAM'\n  homeSortByRAM: undefined,\n\n  // Original text: \"Shared/Not shared\"\n  homeSortByShared: 'Общий доступ/Без общего доступа',\n\n  // Original text: \"Size\"\n  homeSortBySize: 'Размер',\n\n  // Original text: \"Type\"\n  homeSortByType: 'Тип',\n\n  // Original text: \"Usage\"\n  homeSortByUsage: 'Используется',\n\n  // Original text: 'Snapshots'\n  homeSortVmsBySnapshots: undefined,\n\n  // Original text: 'Container'\n  homeSortByContainer: undefined,\n\n  // Original text: 'Pool'\n  homeSortByPool: undefined,\n\n  // Original text: \"{displayed, number}x {icon} (of {total, number})\"\n  homeDisplayedItems: '{displayed, number}x {icon} (на {total, number})',\n\n  // Original text: \"{selected, number}x {icon} selected (of {total, number})\"\n  homeSelectedItems: '{selected, number}x {icon} выбранных (на {total, number})',\n\n  // Original text: \"More\"\n  homeMore: 'Больше',\n\n  // Original text: \"Migrate to…\"\n  homeMigrateTo: 'Переместить на…',\n\n  // Original text: \"Missing patches\"\n  homeMissingPatches: 'Отсутствующие исправления',\n\n  // Original text: 'Master:'\n  homePoolMaster: undefined,\n\n  // Original text: \"Resource set: {resourceSet}\"\n  homeResourceSet: 'Набор ресурсов',\n\n  // Original text: 'Some VDIs need to be coalesced'\n  homeSrVdisToCoalesce: undefined,\n\n  // Original text: \"High Availability\"\n  highAvailability: 'Высокая доступность',\n\n  // Original text: 'Power state'\n  powerState: undefined,\n\n  // Original text: \"Shared {type}\"\n  srSharedType: 'Общий доступ {type}',\n\n  // Original text: 'Host time and XOA time are not consistent with each other'\n  warningHostTimeTooltip: undefined,\n\n  // Original text: 'Not all hosts within {pool} have the same version'\n  notAllHostsHaveTheSameVersion: undefined,\n\n  // Original text: 'Disks usage'\n  sortByDisksUsage: undefined,\n\n  // Original text: 'Name'\n  snapshotVmsName: undefined,\n\n  // Original text: 'Description'\n  snapshotVmsDescription: undefined,\n\n  // Original text: 'All of them are selected ({nItems, number})'\n  sortedTableAllItemsSelected: undefined,\n\n  // Original text: 'No items found'\n  sortedTableNoItems: undefined,\n\n  // Original text: '{nFiltered, number} of {nTotal, number} items'\n  sortedTableNumberOfFilteredItems: undefined,\n\n  // Original text: '{nTotal, number} items'\n  sortedTableNumberOfItems: undefined,\n\n  // Original text: '{nSelected, number} selected'\n  sortedTableNumberOfSelectedItems: undefined,\n\n  // Original text: 'Click here to select all items'\n  sortedTableSelectAllItems: undefined,\n\n  // Original text: 'GZIP (very slow)'\n  chooseCompressionGzipOption: undefined,\n\n  // Original text: 'Zstd (fast, XCP-ng only)'\n  chooseCompressionZstdOption: undefined,\n\n  // Original text: 'State'\n  state: undefined,\n\n  // Original text: 'Disabled'\n  stateDisabled: undefined,\n\n  // Original text: 'Enabled'\n  stateEnabled: undefined,\n\n  // Original text: 'Disk'\n  labelDisk: undefined,\n\n  // Original text: 'Merge'\n  labelMerge: undefined,\n\n  // Original text: 'Size'\n  labelSize: undefined,\n\n  // Original text: 'Speed'\n  labelSpeed: undefined,\n\n  // Original text: 'SR'\n  labelSr: undefined,\n\n  // Original text: 'Transfer'\n  labelTransfer: undefined,\n\n  // Original text: 'VM'\n  labelVm: undefined,\n\n  // Original text: 'Cancel'\n  formCancel: undefined,\n\n  // Original text: 'Create'\n  formCreate: undefined,\n\n  // Original text: 'Description'\n  formDescription: undefined,\n\n  // Original text: 'Edit'\n  formEdit: undefined,\n\n  // Original text: 'ID'\n  formId: undefined,\n\n  // Original text: 'Name'\n  formName: undefined,\n\n  // Original text: 'Reset'\n  formReset: undefined,\n\n  // Original text: 'Save'\n  formSave: undefined,\n\n  // Original text: 'Notes'\n  formNotes: undefined,\n\n  // Original text: \"Add\"\n  add: 'Добавить',\n\n  // Original text: \"Select all\"\n  selectAll: 'Выбрать всё',\n\n  // Original text: \"Remove\"\n  remove: 'Удалить',\n\n  // Original text: \"Preview\"\n  preview: 'Предпросмотр',\n\n  // Original text: 'Action'\n  action: undefined,\n\n  // Original text: \"Item\"\n  item: 'Элемент',\n\n  // Original text: \"No selected value\"\n  noSelectedValue: 'Нет выбранных значений',\n\n  // Original text: \"Choose user(s) and/or group(s)\"\n  selectSubjects: 'Выберите пользователя(ей) и/или группу(ы)',\n\n  // Original text: \"Select object(s)…\"\n  selectObjects: 'Выберите объект(ы)…',\n\n  // Original text: \"Choose a role\"\n  selectRole: 'Выберите роль',\n\n  // Original text: 'Select a host first'\n  selectHostFirst: undefined,\n\n  // Original text: \"Select host(s)…\"\n  selectHosts: 'Выберите Хост(ы)…',\n\n  // Original text: \"Select object(s)…\"\n  selectHostsVms: 'Выберите объект(ы)…',\n\n  // Original text: \"Select network(s)…\"\n  selectNetworks: 'Выберите сеть/сети…',\n\n  // Original text: 'Select PCI(s)…'\n  selectPcis: undefined,\n\n  // Original text: \"Select PIF(s)…\"\n  selectPifs: 'Выберите физический(ие) сетевой(вые) интерфейс(ы)…',\n\n  // Original text: \"Select pool(s)…\"\n  selectPools: 'Выберите Пул(ы)…',\n\n  // Original text: \"Select remote(s)…\"\n  selectRemotes: 'Выберите удаленное(ые) хранилище(я)…',\n\n  // Original text: 'Select proxy(ies)…'\n  selectProxies: undefined,\n\n  // Original text: 'Select proxy…'\n  selectProxy: undefined,\n\n  // Original text: \"Select resource set(s)…\"\n  selectResourceSets: 'Выберите набор(ы) ресурсов',\n\n  // Original text: \"Select template(s)…\"\n  selectResourceSetsVmTemplate: 'Выберите шаблон(ы)…',\n\n  // Original text: \"Select SR(s)…\"\n  selectResourceSetsSr: 'Выберите SR(s)…',\n\n  // Original text: \"Select network(s)…\"\n  selectResourceSetsNetwork: 'Выберите сеть(и)…',\n\n  // Original text: \"Select disk(s)…\"\n  selectResourceSetsVdi: 'Выберите диск(и)…',\n\n  // Original text: \"Select SSH key(s)…\"\n  selectSshKey: 'Выберите SSH-ключ(и)…',\n\n  // Original text: \"Select SR(s)…\"\n  selectSrs: 'Выберите SR(s)…',\n\n  // Original text: \"Select VM(s)…\"\n  selectVms: 'Выберите виртуальную(ые) машину(ы)…',\n\n  // Original text: 'Select snapshot(s)…'\n  selectVmSnapshots: undefined,\n\n  // Original text: \"Select VM template(s)…\"\n  selectVmTemplates: 'Выберите шаблон(ы) ВМ…',\n\n  // Original text: \"Select tag(s)…\"\n  selectTags: 'Выберите тэги(s)…',\n\n  // Original text: \"Select disk(s)…\"\n  selectVdis: 'Выберите диск(и)…',\n\n  // Original text: \"Select timezone…\"\n  selectTimezone: 'Выберите часовой пояс…',\n\n  // Original text: \"Select IP(s)…\"\n  selectIp: 'Выберите IP-адрес(а)…',\n\n  // Original text: \"Select IP pool(s)…\"\n  selectIpPool: 'Выберите пул(ы) IP-адресов…',\n\n  // Original text: 'Select VGPU type(s)…'\n  selectVgpuType: undefined,\n\n  // Original text: \"Fill information (optional)\"\n  fillOptionalInformations: 'Введите данные (опционально)',\n\n  // Original text: \"Reset\"\n  selectTableReset: 'Сброс',\n\n  // Original text: 'Select cloud config(s)…'\n  selectCloudConfigs: undefined,\n\n  // Original text: 'Select network config(s)…'\n  selectNetworkConfigs: undefined,\n\n  // Original text: \"Month\"\n  schedulingMonth: 'Месяц',\n\n  // Original text: \"Day\"\n  schedulingDay: 'День',\n\n  // Original text: \"Switch to week days\"\n  schedulingSetWeekDayMode: 'Переключиться на дни недели',\n\n  // Original text: \"Switch to month days\"\n  schedulingSetMonthDayMode: 'Переключиться на дни месяца',\n\n  // Original text: \"Hour\"\n  schedulingHour: 'Час',\n\n  // Original text: \"Minute\"\n  schedulingMinute: 'Минута',\n\n  // Original text: \"Every month\"\n  selectTableAllMonth: 'Каждый месяц',\n\n  // Original text: \"Every day\"\n  selectTableAllDay: 'Каждый день',\n\n  // Original text: \"Every hour\"\n  selectTableAllHour: 'Каждый час',\n\n  // Original text: \"Every minute\"\n  selectTableAllMinute: 'Каждую минуту',\n\n  // Original text: \"Web browser timezone\"\n  timezonePickerUseLocalTime: 'Часовой пояс WEB-браузера',\n\n  // Original text: \"Server timezone ({value})\"\n  serverTimezoneOption: 'Часовой пояс сервера ({value})',\n\n  // Original text: \"Cron Pattern:\"\n  cronPattern: 'Cron-шаблон: ',\n\n  // Original text: \"Successful\"\n  successfulJobCall: 'Успешно',\n\n  // Original text: \"Failed\"\n  failedJobCall: 'Провал',\n\n  // Original text: 'Skipped'\n  jobCallSkipped: undefined,\n\n  // Original text: \"In progress\"\n  jobCallInProgess: 'Выполняется',\n\n  // Original text: \"Transfer size:\"\n  jobTransferredDataSize: 'размер',\n\n  // Original text: \"Transfer speed:\"\n  jobTransferredDataSpeed: 'скорость',\n\n  // Original text: 'Size'\n  operationSize: undefined,\n\n  // Original text: 'Speed'\n  operationSpeed: undefined,\n\n  // Original text: 'Type'\n  exportType: undefined,\n\n  // Original text: 'Merge size:'\n  jobMergedDataSize: undefined,\n\n  // Original text: 'Merge speed:'\n  jobMergedDataSpeed: undefined,\n\n  // Original text: 'All'\n  allJobCalls: undefined,\n\n  // Original text: \"Job\"\n  job: 'Задача',\n\n  // Original text: \"Job {job}\"\n  jobModalTitle: 'Задача {job}',\n\n  // Original text: \"ID\"\n  jobId: 'ID задачи',\n\n  // Original text: \"Type\"\n  jobType: 'Тип',\n\n  // Original text: \"Name\"\n  jobName: 'Имя',\n\n  // Original text: 'Modes'\n  jobModes: undefined,\n\n  // Original text: \"Name of your job (forbidden: \\\"_\\\")\"\n  jobNamePlaceholder: 'Имя для вашей задачи (запрещено: \"_\")',\n\n  // Original text: \"Start\"\n  jobStart: 'Начало',\n\n  // Original text: \"End\"\n  jobEnd: 'Конец',\n\n  // Original text: \"Duration\"\n  jobDuration: 'Длительность',\n\n  // Original text: \"Status\"\n  jobStatus: 'Статус',\n\n  // Original text: \"Action\"\n  jobAction: 'Действие',\n\n  // Original text: \"Tag\"\n  jobTag: 'Тэг',\n\n  // Original text: \"Scheduling\"\n  jobScheduling: 'Расписание',\n\n  // Original text: \"Timezone\"\n  jobTimezone: 'Часовой пояс',\n\n  // Original text: \"Server\"\n  jobServerTimezone: 'Сервер',\n\n  // Original text: \"Run job\"\n  runJob: 'Запустить задачу',\n\n  // Original text: 'Cancel job'\n  cancelJob: undefined,\n\n  // Original text: \"Onetime job started. See overview for logs.\"\n  runJobVerbose: 'Запуск резервного копирования вручную. Перейдите в Обзор, чтобы просмотреть журналы.',\n\n  // Original text: 'Edit job'\n  jobEdit: undefined,\n\n  // Original text: 'Delete'\n  jobDelete: undefined,\n\n  // Original text: \"Finished\"\n  jobFinished: 'Завершено',\n\n  // Original text: 'Interrupted'\n  jobInterrupted: undefined,\n\n  // Original text: \"Started\"\n  jobStarted: 'Запущено',\n\n  // Original text: 'Failed'\n  jobFailed: undefined,\n\n  // Original text: 'Skipped'\n  jobSkipped: undefined,\n\n  // Original text: 'Successful'\n  jobSuccess: undefined,\n\n  // Original text: 'All'\n  allTasks: undefined,\n\n  // Original text: 'Start'\n  taskStart: undefined,\n\n  // Original text: 'End'\n  taskEnd: undefined,\n\n  // Original text: 'Duration'\n  taskDuration: undefined,\n\n  // Original text: 'Successful'\n  taskSuccess: undefined,\n\n  // Original text: 'Failed'\n  taskFailed: undefined,\n\n  // Original text: 'Skipped'\n  taskSkipped: undefined,\n\n  // Original text: 'Started'\n  taskStarted: undefined,\n\n  // Original text: 'Interrupted'\n  taskInterrupted: undefined,\n\n  // Original text: 'Aborted'\n  taskAborted: undefined,\n\n  // Original text: 'Transfer size'\n  taskTransferredDataSize: undefined,\n\n  // Original text: 'Transfer speed'\n  taskTransferredDataSpeed: undefined,\n\n  // Original text: 'Merge size'\n  taskMergedDataSize: undefined,\n\n  // Original text: 'Merge speed'\n  taskMergedDataSpeed: undefined,\n\n  // Original text: 'Error'\n  taskError: undefined,\n\n  // Original text: 'Estimated end'\n  taskEstimatedEnd: undefined,\n\n  // Original text: 'Reason'\n  taskReason: undefined,\n\n  // Original text: 'Open raw log'\n  taskOpenRawLog: undefined,\n\n  // Original text: \"Save\"\n  saveBackupJob: 'Сохранить',\n\n  // Original text: \"Remove backup job\"\n  deleteBackupSchedule: 'Удалить задачу резервного копирования',\n\n  // Original text: \"Are you sure you want to delete this backup job?\"\n  deleteBackupScheduleQuestion: 'Вы уверены, что хотите удалить это задание резервного копирования?',\n\n  // Original text: 'Delete selected jobs'\n  deleteSelectedJobs: undefined,\n\n  // Original text: \"Enable immediately after creation\"\n  scheduleEnableAfterCreation: 'Активировать после создания',\n\n  // Original text: \"You are editing schedule {name} ({id}). Saving will override previous schedule state.\"\n  scheduleEditMessage: 'Вы редактируете расписание {name} ({id}). Текущее состояние будет изменено при сохранении.',\n\n  // Original text: \"You are editing job {name} ({id}). Saving will override previous job state.\"\n  jobEditMessage: 'Вы редактируете задачу {name} ({id}). Текущее состояние будет изменено при сохранении.',\n\n  // Original text: 'Edit schedule'\n  scheduleEdit: undefined,\n\n  // Original text: \"A name is required to create the backup's job!\"\n  missingBackupName: undefined,\n\n  // Original text: 'Missing VMs!'\n  missingVms: undefined,\n\n  // Original text: 'You need to choose a backup mode!'\n  missingBackupMode: undefined,\n\n  // Original text: 'Missing remote!'\n  missingRemote: undefined,\n\n  // Original text: 'Missing remotes!'\n  missingRemotes: undefined,\n\n  // Original text: 'Missing SRs!'\n  missingSrs: undefined,\n\n  // Original text: 'Missing pools!'\n  missingPools: undefined,\n\n  // Original text: 'Missing schedules!'\n  missingSchedules: undefined,\n\n  // Original text: 'The modes need at least a schedule with retention higher than 0'\n  missingRetentions: undefined,\n\n  // Original text: 'The Backup mode and the Delta Backup mode require backup retention to be higher than 0!'\n  missingExportRetention: undefined,\n\n  // Original text: 'The CR mode and The DR mode require replication retention to be higher than 0!'\n  missingCopyRetention: undefined,\n\n  // Original text: 'The Rolling Snapshot mode requires snapshot retention to be higher than 0!'\n  missingSnapshotRetention: undefined,\n\n  // Original text: 'Either the full backup interval or the backup retention should be lower than 50.'\n  deltaChainRetentionWarning: undefined,\n\n  // Original text: 'Requires one retention to be higher than 0!'\n  retentionNeeded: undefined,\n\n  // Original text: 'Invalid schedule'\n  newScheduleError: undefined,\n\n  // Original text: 'No remotes found, please click on the remotes settings button to create one!'\n  createRemoteMessage: undefined,\n\n  // Original text: 'Remotes settings'\n  remotesSettings: undefined,\n\n  // Original text: 'Plugins settings'\n  pluginsSettings: undefined,\n\n  // Original text: 'To receive the report, the plugins backup-reports and transport-email need to be loaded.'\n  pluginsWarning: undefined,\n\n  // Original text: 'Add a schedule'\n  scheduleAdd: undefined,\n\n  // Original text: 'Delete'\n  scheduleDelete: undefined,\n\n  // Original text: 'Run schedule'\n  scheduleRun: undefined,\n\n  // Original text: 'Delete selected schedules'\n  deleteSelectedSchedules: undefined,\n\n  // Original text: \"No scheduled jobs.\"\n  noScheduledJobs: 'Нет запланированных задач',\n\n  // Original text: 'You can delete all your legacy backup snapshots.'\n  legacySnapshotsLink: undefined,\n\n  // Original text: 'New schedule'\n  newSchedule: undefined,\n\n  // Original text: \"No schedules found\"\n  noSchedules: 'Расписания не найдены',\n\n  // Original text: \"Select an xo-server API command\"\n  jobActionPlaceHolder: 'Выберите команду API xo-server',\n\n  // Original text: \"Timeout (number of seconds after which a VM is considered failed)\"\n  jobTimeoutPlaceHolder: 'Таймаут (количество секунд, после которого виртуальная машина считается неисправной)',\n\n  // Original text: \"Schedules\"\n  jobSchedules: 'Расписания',\n\n  // Original text: \"Name of your schedule\"\n  jobScheduleNamePlaceHolder: 'Название расписания',\n\n  // Original text: \"Select a job\"\n  jobScheduleJobPlaceHolder: 'Выберите задачу',\n\n  // Original text: \"Job owner\"\n  jobOwnerPlaceholder: 'Владелец задачи',\n\n  // Original text: \"This job's creator no longer exists\"\n  jobUserNotFound: 'Создатель задачи больше не существует',\n\n  // Original text: 'Click here to see the matching VMs'\n  redirectToMatchingVms: undefined,\n\n  // Original text: 'There are no matching VMs!'\n  noMatchingVms: undefined,\n\n  // Original text: '{icon} See the matching VMs ({nMatchingVms, number})'\n  allMatchingVms: undefined,\n\n  // Original text: 'Are you sure you want to run {name} ({id})?'\n  runBackupNgJobConfirm: undefined,\n\n  // Original text: 'This job will backup {nVms, number} VM{nVms, plural, one {} other {s}}.'\n  runBackupJobWarningNVms: undefined,\n\n  // Original text: 'Are you sure you want to cancel {name} ({id})?'\n  cancelJobConfirm: undefined,\n\n  // Original text: 'If your country participates in DST, it is advised that you avoid scheduling jobs at the time of change. e.g. 2AM to 3AM for US.'\n  scheduleDstWarning: undefined,\n\n  // Original text: 'Restore health check'\n  checkBackup: undefined,\n\n  // Original text: 'Advanced settings'\n  newBackupAdvancedSettings: undefined,\n\n  // Original text: 'Settings'\n  newBackupSettings: undefined,\n\n  // Original text: 'Always'\n  reportWhenAlways: undefined,\n\n  // Original text: 'Failure'\n  reportWhenFailure: undefined,\n\n  // Original text: 'Never'\n  reportWhenNever: undefined,\n\n  // Original text: 'Report recipients'\n  reportRecipients: undefined,\n\n  // Original text: 'Report when'\n  reportWhen: undefined,\n\n  // Original text: 'Concurrency'\n  concurrency: undefined,\n\n  // Original text: \"Select your backup type:\"\n  newBackupSelection: 'Выберите тип резервной копии:',\n\n  // Original text: 'Snapshot retention'\n  snapshotRetention: undefined,\n\n  // Original text: 'Name'\n  backupName: undefined,\n\n  // Original text: 'Checkpoint snapshot'\n  checkpointSnapshot: undefined,\n\n  // Original text: 'Offline snapshot'\n  offlineSnapshot: undefined,\n\n  // Original text: 'Offline backup'\n  offlineBackup: undefined,\n\n  // Original text: 'Export VMs without snapshotting them. The VMs will be shutdown during the export.'\n  offlineBackupInfo: undefined,\n\n  // Original text: 'Timeout'\n  timeout: undefined,\n\n  // Original text: 'Number of hours after which a job is considered failed'\n  timeoutInfo: undefined,\n\n  // Original text: 'Full backup interval'\n  fullBackupInterval: undefined,\n\n  // Original text: 'Force full backup'\n  forceFullBackup: undefined,\n\n  // Original text: 'In hours'\n  timeoutUnit: undefined,\n\n  // Original text: 'Delta Backup and DR require an Enterprise plan'\n  dbAndDrRequireEnterprisePlan: undefined,\n\n  // Original text: 'CR requires a Premium plan'\n  crRequiresPremiumPlan: undefined,\n\n  // Original text: 'Smart mode'\n  smartBackupModeTitle: undefined,\n\n  // Original text: 'Target remotes (for export)'\n  backupTargetRemotes: undefined,\n\n  // Original text: 'Target SRs (for replication)'\n  backupTargetSrs: undefined,\n\n  // Original text: 'Local remote selected'\n  localRemoteWarningTitle: undefined,\n\n  // Original text: 'Tip: Using thin-provisioned storage will consume less space. Please click on the icon to get more information'\n  crOnThickProvisionedSrWarning: undefined,\n\n  // Original text: 'Tip: Creating VMs on thin-provisioned storage will consume less space. Please click on the icon to get more information'\n  vmsOnThinProvisionedSrTip: undefined,\n\n  // Original text: 'Delta Backup and Continuous Replication require at least XenServer 6.5.'\n  deltaBackupOnOutdatedXenServerWarning: undefined,\n\n  // Original text: 'Click for more information about the backup methods.'\n  backupNgLinkToDocumentationMessage: undefined,\n\n  // Original text: 'Warning: Local remotes will use limited XOA disk space. Only for advanced users.'\n  localRemoteWarningMessage: undefined,\n\n  // Original text: \"VMs\"\n  editBackupVmsTitle: 'ВМ',\n\n  // Original text: \"VMs statuses\"\n  editBackupSmartStatusTitle: 'Статусы ВМ',\n\n  // Original text: 'Resident on'\n  editBackupSmartResidentOn: undefined,\n\n  // Original text: 'Not resident on'\n  editBackupSmartNotResidentOn: undefined,\n\n  // Original text: \"Pools\"\n  editBackupSmartPools: 'Пулы',\n\n  // Original text: \"Tags\"\n  editBackupSmartTags: 'Тэги',\n\n  // Original text: \"VMs with tags in the form of <b>xo:no-bak</b> or <b>xo:no-bak=Reason</b>won't be included in any backup.For example, ephemeral VMs created by health check have this tag\"\n  editBackupSmartTagsInfo: undefined,\n\n  // Original text: 'Sample of matching VMs'\n  sampleOfMatchingVms: undefined,\n\n  // Original text: 'Replicated VMs (VMs with Continuous Replication or Disaster Recovery tag) must be excluded!'\n  backupReplicatedVmsInfo: undefined,\n\n  // Original text: \"VMs Tags\"\n  editBackupSmartTagsTitle: 'Тэги ВМ',\n\n  // Original text: 'Excluded VMs tags'\n  editBackupSmartExcludedTagsTitle: undefined,\n\n  // Original text: \"Delete first\"\n  deleteOldBackupsFirst: 'Сперва удалите старые резервные копии',\n\n  // Original text: 'Delete old backups before backing up the VMs. If the new backup fails, you will lose your old backups.'\n  deleteOldBackupsFirstMessage: undefined,\n\n  // Original text: 'Custom tag'\n  customTag: undefined,\n\n  // Original text: \"The job you're trying to edit wasn't found\"\n  editJobNotFound: undefined,\n\n  // Original text: 'Use NBD + CBT to transfer disk if available'\n  preferNbd: undefined,\n\n  // Original text: 'A network accessible by XO or the proxy must have NBD enabled. Storage must support Change Block Tracking (CBT) to use it in a backup'\n  preferNbdInformation: undefined,\n\n  // Original text: 'Number of NBD connection per disk'\n  nbdConcurrency: undefined,\n\n  // Original text: 'Purge snapshot data when using CBT'\n  cbtDestroySnapshotData: undefined,\n\n  // Original text: \"The snapshot won't use any notable space on the SR, won't be shown in the UI and won't be usable to do a rollback\"\n  cbtDestroySnapshotDataInformation: undefined,\n\n  // Original text: 'Snapshot data can be purged only when NBD is enabled and rolling snapshot is not used'\n  cbtDestroySnapshotDataDisabledInformation: undefined,\n\n  // Original text: 'New file system remote'\n  newRemote: undefined,\n\n  // Original text: \"Local\"\n  remoteTypeLocal: 'Локальный',\n\n  // Original text: 'NFS'\n  remoteTypeNfs: undefined,\n\n  // Original text: 'SMB'\n  remoteTypeSmb: undefined,\n\n  // Original text: 'Amazon Web Services S3'\n  remoteTypeS3: undefined,\n\n  // Original text: \"Type\"\n  remoteType: 'Тип',\n\n  // Original text: 'SMB remotes are meant to work with Windows Server. For other systems (Linux Samba, which means almost all NAS), please use NFS.'\n  remoteSmbWarningMessage: undefined,\n\n  // Original text: 'Test your remote'\n  remoteTestTip: undefined,\n\n  // Original text: 'Test remote'\n  testRemote: undefined,\n\n  // Original text: 'Test failed for {name}'\n  remoteTestFailure: undefined,\n\n  // Original text: 'Test passed for {name}'\n  remoteTestSuccess: undefined,\n\n  // Original text: \"Error\"\n  remoteTestError: 'Ошибка',\n\n  // Original text: 'Test step'\n  remoteTestStep: undefined,\n\n  // Original text: 'Test name'\n  remoteTestName: undefined,\n\n  // Original text: 'Remote name already exists!'\n  remoteTestNameFailure: undefined,\n\n  // Original text: 'The remote appears to work correctly'\n  remoteTestSuccessMessage: undefined,\n\n  // Original text: \"Connection failed\"\n  remoteConnectionFailed: 'Подключение не удалось',\n\n  // Original text: 'Delete backup job{nJobs, plural, one {} other {s}}'\n  confirmDeleteBackupJobsTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nJobs, number} backup job{nJobs, plural, one {} other {s}}?'\n  confirmDeleteBackupJobsBody: undefined,\n\n  // Original text: 'Mirror full backup'\n  mirrorFullBackup: undefined,\n\n  // Original text: 'Mirror incremental backup'\n  mirrorIncrementalBackup: undefined,\n\n  // Original text: 'Run backup job once'\n  runBackupJob: undefined,\n\n  // Original text: 'Speed limit (in MiB/s)'\n  speedLimit: undefined,\n\n  // Original text: 'Source remote'\n  sourceRemote: undefined,\n\n  // Original text: 'Target remotes'\n  targetRemotes: undefined,\n\n  // Original text: \"Name\"\n  remoteName: 'Имя',\n\n  // Original text: \"Path\"\n  remotePath: 'Путь',\n\n  // Original text: \"State\"\n  remoteState: 'Состояние',\n\n  // Original text: \"Device\"\n  remoteDevice: 'Устройство',\n\n  // Original text: 'Disk (Used / Total)'\n  remoteDisk: undefined,\n\n  // Original text: 'Speed (Write / Read)'\n  remoteSpeed: undefined,\n\n  // Original text: 'Read and write rate speed performed during latest test'\n  remoteSpeedInfo: undefined,\n\n  // Original text: 'Options'\n  remoteOptions: undefined,\n\n  // Original text: 'Share'\n  remoteShare: undefined,\n\n  // Original text: \"Auth\"\n  remoteAuth: 'Авторизация',\n\n  // Original text: \"Delete\"\n  remoteDeleteTip: 'Удалить',\n\n  // Original text: 'Delete selected remotes'\n  remoteDeleteSelected: undefined,\n\n  // Original text: \"Name\"\n  remoteMyNamePlaceHolder: 'Имя *',\n\n  // Original text: '/path/to/backup'\n  remoteLocalPlaceHolderPath: undefined,\n\n  // Original text: \"Host\"\n  remoteNfsPlaceHolderHost: 'хост *',\n\n  // Original text: 'Port'\n  remoteNfsPlaceHolderPort: undefined,\n\n  // Original text: 'path/to/backup'\n  remoteNfsPlaceHolderPath: undefined,\n\n  // Original text: 'Custom mount options'\n  remoteNfsPlaceHolderOptions: undefined,\n\n  // Original text: 'Subfolder [path\\\\\\\\to\\\\\\\\backup]'\n  remoteSmbPlaceHolderRemotePath: undefined,\n\n  // Original text: 'Username'\n  remoteSmbPlaceHolderUsername: undefined,\n\n  // Original text: 'Password'\n  remoteSmbPlaceHolderPassword: undefined,\n\n  // Original text: 'Domain'\n  remoteSmbPlaceHolderDomain: undefined,\n\n  // Original text: '<address>\\\\\\\\<share>'\n  remoteSmbPlaceHolderAddressShare: undefined,\n\n  // Original text: 'Custom mount options'\n  remoteSmbPlaceHolderOptions: undefined,\n\n  // Original text: 'Use HTTPS'\n  remoteS3LabelUseHttps: undefined,\n\n  // Original text: 'Allow unauthorized'\n  remoteS3LabelAllowInsecure: undefined,\n\n  // Original text: 'AWS S3 endpoint (ex: s3.us-east-2.amazonaws.com)'\n  remoteS3PlaceHolderEndpoint: undefined,\n\n  // Original text: 'AWS S3 bucket name'\n  remoteS3PlaceHolderBucket: undefined,\n\n  // Original text: 'Directory'\n  remoteS3PlaceHolderDirectory: undefined,\n\n  // Original text: 'Access key ID'\n  remoteS3PlaceHolderAccessKeyID: undefined,\n\n  // Original text: 'Paste secret here to change it'\n  remoteS3PlaceHolderSecret: undefined,\n\n  // Original text: 'Enter your encryption key here (32 characters)'\n  remoteS3PlaceHolderEncryptionKey: undefined,\n\n  // Original text: 'Region, leave blank for default'\n  remoteS3Region: undefined,\n\n  // Original text: 'Uncheck if you want HTTP instead of HTTPS'\n  remoteS3TooltipProtocol: undefined,\n\n  // Original text: 'Check if you want to accept self signed certificates'\n  remoteS3TooltipAcceptInsecure: undefined,\n\n  // Original text: 'Password(fill to edit)'\n  remotePlaceHolderPassword: undefined,\n\n  // Original text: 'Store backup as multiple data blocks instead of a whole VHD file. (creates 500-1000 files per backed up GB but allows faster merge)'\n  remoteUseVhdDirectory: undefined,\n\n  // Original text: 'Your remote must be able to handle parallel access (up to 16 write processes per backup) and the number of files (500-1000 files per GB of backed up data)'\n  remoteUseVhdDirectoryTooltip: undefined,\n\n  // Original text: 'Size of backup is not updated when using encryption.'\n  remoteEncryptionBackupSize: undefined,\n\n  // Original text: 'All the files of the remote except the encryption.json are encrypted, that means you can only activate encryption or change key on an empty remote.'\n  remoteEncryptionEncryptedfiles: undefined,\n\n  // Original text: 'Delta backup must use VHD saved as blocks (note: should be enforced when saving settings)'\n  remoteEncryptionMustUseVhd: undefined,\n\n  // Original text: 'Encrypt all new data sent to this remote'\n  remoteEncryptionKey: undefined,\n\n  // Original text: \"You won't be able to get your data back if you lose the encryption key. The encryption key is saved in the XO config backup, they should be secured correctly. Be careful, if you saved it on an encrypted remote, then you won't be able to access it without the remote encryption key.\"\n  remoteEncryptionKeyStorageLocation: undefined,\n\n  // Original text: 'Encryption'\n  encryption: undefined,\n\n  // Original text: 'A legacy encryption algorithm is used ({algorithm}), please create a new remote with the recommended algorithm {recommendedAlgorithm}'\n  remoteEncryptionLegacy: undefined,\n\n  // Original text: 'New SR'\n  newSr: undefined,\n\n  // Original text: 'This will erase the entire disk or partition ({name}) to create a new storage repository. Are you sure you want to continue?'\n  newSrConfirm: undefined,\n\n  // Original text: 'Create a new SR'\n  newSrTitle: undefined,\n\n  // Original text: \"General\"\n  newSrGeneral: 'Общий',\n\n  // Original text: \"Select storage type:\"\n  newSrTypeSelection: 'Выберите тип хранилища:',\n\n  // Original text: \"Settings\"\n  newSrSettings: 'Настройки',\n\n  // Original text: \"Storage usage\"\n  newSrUsage: 'Использование хранилища',\n\n  // Original text: 'Summary'\n  newSrSummary: undefined,\n\n  // Original text: \"Host\"\n  newSrHost: 'Хост',\n\n  // Original text: \"Type\"\n  newSrType: 'Тип',\n\n  // Original text: \"Name\"\n  newSrName: 'Имя',\n\n  // Original text: \"Description\"\n  newSrDescription: 'Описание',\n\n  // Original text: \"Server\"\n  newSrServer: 'Сервер',\n\n  // Original text: \"Path\"\n  newSrPath: 'Путь',\n\n  // Original text: 'IQN'\n  newSrIqn: undefined,\n\n  // Original text: 'LUN'\n  newSrLun: undefined,\n\n  // Original text: 'No HBA devices'\n  newSrNoHba: undefined,\n\n  // Original text: \"With auth.\"\n  newSrAuth: 'с авторизацией',\n\n  // Original text: \"User name\"\n  newSrUsername: 'Имя пользователя',\n\n  // Original text: \"Password\"\n  newSrPassword: 'Пароль',\n\n  // Original text: \"Device\"\n  newSrDevice: 'Устройство',\n\n  // Original text: \"In use\"\n  newSrInUse: 'используется',\n\n  // Original text: \"Size\"\n  newSrSize: 'Размер',\n\n  // Original text: \"Create\"\n  newSrCreate: 'Создать',\n\n  // Original text: \"Storage name\"\n  newSrNamePlaceHolder: 'Имя хранилища',\n\n  // Original text: \"Storage description\"\n  newSrDescPlaceHolder: 'Описание хранилища',\n\n  // Original text: 'e.g 93.184.216.34 or iscsi.example.net'\n  newSrIscsiAddressPlaceHolder: undefined,\n\n  // Original text: 'e.g 93.184.216.34 or nfs.example.net'\n  newSrNfsAddressPlaceHolder: undefined,\n\n  // Original text: 'e.g \\\\\\\\server\\\\sharename'\n  newSrSmbAddressPlaceHolder: undefined,\n\n  // Original text: \"[port]\"\n  newSrPortPlaceHolder: '[порт]',\n\n  // Original text: \"Username\"\n  newSrUsernamePlaceHolder: 'Имя пользователя',\n\n  // Original text: \"Password\"\n  newSrPasswordPlaceHolder: 'Пароль',\n\n  // Original text: 'Device, e.g /dev/sda…'\n  newSrLvmDevicePlaceHolder: undefined,\n\n  // Original text: '/path/to/directory'\n  newSrLocalPathPlaceHolder: undefined,\n\n  // Original text: 'Default NFS version'\n  newSrNfsDefaultVersion: undefined,\n\n  // Original text: 'Comma delimited NFS options'\n  newSrNfsOptions: undefined,\n\n  // Original text: 'NFS version'\n  newSrNfs: undefined,\n\n  // Original text: 'No shared ZFS available'\n  noSharedZfsAvailable: undefined,\n\n  // Original text: 'Reattach SR'\n  reattachNewSrTooltip: undefined,\n\n  // Original text: 'Storage location'\n  srLocation: undefined,\n\n  // Original text: 'You do not have permission to create a network'\n  createNewNetworkNoPermission: undefined,\n\n  // Original text: 'Create a new network on {select}'\n  createNewNetworkOn: undefined,\n\n  // Original text: \"Users/Groups\"\n  subjectName: 'Пользователи/Группы',\n\n  // Original text: \"Object\"\n  objectName: 'Объект',\n\n  // Original text: \"Role\"\n  roleName: 'Роль',\n\n  // Original text: \"Create\"\n  aclCreate: 'Создать',\n\n  // Original text: \"New group name\"\n  newGroupName: 'Имя новой группы',\n\n  // Original text: \"Create group\"\n  createGroup: 'Создать группу',\n\n  // Original text: 'Synchronize LDAP groups'\n  syncLdapGroups: undefined,\n\n  // Original text: 'Install and configure the auth-ldap plugin first'\n  ldapPluginNotConfigured: undefined,\n\n  // Original text: 'Are you sure you want to synchronize LDAP groups with XO? This may delete XO groups and their ACLs.'\n  syncLdapGroupsWarning: undefined,\n\n  // Original text: \"Create\"\n  createGroupButton: 'Создать',\n\n  // Original text: \"Delete group\"\n  deleteGroup: 'Удалить группу',\n\n  // Original text: \"Are you sure you want to delete this group?\"\n  deleteGroupConfirm: 'Вы уверены, что хотите удалить эту группу?',\n\n  // Original text: 'Delete selected groups'\n  deleteSelectedGroups: undefined,\n\n  // Original text: 'Delete group{nGroups, plural, one {} other {s}}'\n  deleteGroupsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nGroups, number} group{nGroups, plural, one {} other {s}}?'\n  deleteGroupsModalMessage: undefined,\n\n  // Original text: \"Remove user from group\"\n  removeUserFromGroup: 'Удалить пользователя из группы',\n\n  // Original text: \"Are you sure you want to delete this user?\"\n  deleteUserConfirm: 'Вы уверены, что хотите удалить этого пользователя?',\n\n  // Original text: \"Delete user\"\n  deleteUser: 'Удалить пользователя',\n\n  // Original text: 'Delete selected users'\n  deleteSelectedUsers: undefined,\n\n  // Original text: 'Delete user{nUsers, plural, one {} other {s}}'\n  deleteUsersModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nUsers, number} user{nUsers, plural, one {} other {s}}?'\n  deleteUsersModalMessage: undefined,\n\n  // Original text: 'No user'\n  noUser: undefined,\n\n  // Original text: \"Unknown user\"\n  unknownUser: 'неизвестный пользователь',\n\n  // Original text: \"No group found\"\n  noGroupFound: 'Группа не найдена',\n\n  // Original text: \"Name\"\n  groupNameColumn: 'Имя',\n\n  // Original text: \"Users\"\n  groupUsersColumn: 'Пользователи',\n\n  // Original text: \"Add user\"\n  addUserToGroupColumn: 'Добавить пользователя',\n\n  // Original text: \"Username\"\n  userNameColumn: 'Email',\n\n  // Original text: 'Member of'\n  userGroupsColumn: undefined,\n\n  // Original text: '{nGroups, number} group{nGroups, plural, one {} other {s}}'\n  userCountGroups: undefined,\n\n  // Original text: \"Permissions\"\n  userPermissionColumn: 'Разрешения',\n\n  // Original text: 'Password / Authentication methods'\n  userAuthColumn: undefined,\n\n  // Original text: 'Username'\n  userName: undefined,\n\n  // Original text: \"Password\"\n  userPassword: 'Пароль',\n\n  // Original text: \"Create\"\n  createUserButton: 'Создать',\n\n  // Original text: \"No user found\"\n  noUserFound: 'Пользователь не найден',\n\n  // Original text: \"User\"\n  userLabel: 'Пользователь',\n\n  // Original text: \"Admin\"\n  adminLabel: 'Admin',\n\n  // Original text: \"No user in group\"\n  noUserInGroup: 'В группе нет пользователя',\n\n  // Original text: \"{users, number} user{users, plural, one {} other {s}}\"\n  countUsers: '{users, number} пользователь{users, plural, one {} other {s}}',\n\n  // Original text: 'Select permission'\n  selectPermission: undefined,\n\n  // Original text: 'Delete ACL'\n  deleteAcl: undefined,\n\n  // Original text: 'Delete selected ACLs'\n  deleteSelectedAcls: undefined,\n\n  // Original text: 'Delete ACL{nAcls, plural, one {} other {s}}'\n  deleteAclsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nAcls, number} ACL{nAcls, plural, one {} other {s}}?'\n  deleteAclsModalMessage: undefined,\n\n  // Original text: 'No plugins found'\n  noPlugins: undefined,\n\n  // Original text: \"Auto-load at server start\"\n  autoloadPlugin: 'Автозагрузка при запуске сервера',\n\n  // Original text: \"Save configuration\"\n  savePluginConfiguration: 'Сохранить конфигурацию',\n\n  // Original text: \"Delete configuration\"\n  deletePluginConfiguration: 'Удалить конфигурацию',\n\n  // Original text: 'The test appears to be working.'\n  pluginConfirmation: undefined,\n\n  // Original text: \"Plugin error\"\n  pluginError: 'Ошибка плагина',\n\n  // Original text: 'Plugin test'\n  pluginTest: undefined,\n\n  // Original text: \"Unknown error\"\n  unknownPluginError: 'Неизвестная ошибка',\n\n  // Original text: \"Purge plugin configuration\"\n  purgePluginConfiguration: 'Сбросить конфигурацию плагина',\n\n  // Original text: \"Are you sure you want to purge this configuration?\"\n  purgePluginConfigurationQuestion: 'Вы уверены, что хотите сбросить эту конфигурацию?',\n\n  // Original text: \"Cancel\"\n  cancelPluginEdition: 'Отменить',\n\n  // Original text: \"Plugin configuration\"\n  pluginConfigurationSuccess: 'Конфигурация плагина',\n\n  // Original text: \"Plugin configuration successfully saved!\"\n  pluginConfigurationChanges: 'Конфигурация плагина успешно сохранена!',\n\n  // Original text: \"Predefined configuration\"\n  pluginConfigurationPresetTitle: 'Предопределенная конфигурация',\n\n  // Original text: \"Choose a predefined configuration.\"\n  pluginConfigurationChoosePreset: 'Выберите предопределенную конфигурацию',\n\n  // Original text: \"Apply\"\n  applyPluginPreset: 'Применить',\n\n  // Original text: 'This plugin is not loaded'\n  disabledTestPluginTootltip: undefined,\n\n  // Original text: \"Save filter error\"\n  saveNewUserFilterErrorTitle: 'Сохранить фильтр ошибок',\n\n  // Original text: \"Bad parameter: name must be given.\"\n  saveNewUserFilterErrorBody: 'Неверный параметр: имя должно быть задано',\n\n  // Original text: \"Name:\"\n  filterName: 'Имя',\n\n  // Original text: \"Value:\"\n  filterValue: 'Значение',\n\n  // Original text: \"Save new filter\"\n  saveNewFilterTitle: 'Сохранить новый фильтр',\n\n  // Original text: \"Remove custom filter\"\n  removeUserFilterTitle: 'Удалить пользовательский фильтр',\n\n  // Original text: \"Are you sure you want to remove the custom filter?\"\n  removeUserFilterBody: 'Вы уверены, что хотите удалить пользовательский фильтр?',\n\n  // Original text: \"Default filter\"\n  defaultFilter: 'Фильтр по умолчанию',\n\n  // Original text: \"Default filters\"\n  defaultFilters: 'Фильтры по умолчанию',\n\n  // Original text: \"Custom filters\"\n  customFilters: 'Пользовательские фильтры',\n\n  // Original text: \"Customize filters\"\n  customizeFilters: 'Настройка фильтров',\n\n  // Original text: 'Interpool copy requires at least Enterprise plan'\n  cantInterPoolCopy: undefined,\n\n  // Original text: 'Copy the export URL of the VM'\n  copyExportedUrl: undefined,\n\n  // Original text: 'Download VM'\n  downloadVm: undefined,\n\n  // Original text: \"Start\"\n  startVmLabel: 'Запустить',\n\n  // Original text: 'Start on…'\n  startVmOnLabel: undefined,\n\n  // Original text: 'No host selected'\n  startVmOnMissingHostTitle: undefined,\n\n  // Original text: 'You must select a host'\n  startVmOnMissingHostMessage: undefined,\n\n  // Original text: \"Recovery start\"\n  recoveryModeLabel: 'Запустить восстановление',\n\n  // Original text: \"Suspend\"\n  suspendVmLabel: 'Приостановить',\n\n  // Original text: 'Pause'\n  pauseVmLabel: undefined,\n\n  // Original text: \"Stop\"\n  stopVmLabel: 'Остановить',\n\n  // Original text: \"Force shutdown\"\n  forceShutdownVmLabel: 'Принудительное выключение',\n\n  // Original text: \"Reboot\"\n  rebootVmLabel: 'Перезагрузка',\n\n  // Original text: \"Force reboot\"\n  forceRebootVmLabel: 'Принудительная перезагрузка',\n\n  // Original text: \"Delete\"\n  deleteVmLabel: 'Удалить',\n\n  // Original text: 'Delete selected VMs'\n  deleteSelectedVmsLabel: undefined,\n\n  // Original text: \"Migrate\"\n  migrateVmLabel: 'Переместить',\n\n  // Original text: \"Snapshot\"\n  snapshotVmLabel: 'Снимок',\n\n  // Original text: \"Export\"\n  exportVmLabel: 'Экспорт',\n\n  // Original text: \"Resume\"\n  resumeVmLabel: 'Возобновить',\n\n  // Original text: \"Copy\"\n  copyVmLabel: 'Копировать',\n\n  // Original text: \"Clone\"\n  cloneVmLabel: 'Клонировать',\n\n  // Original text: 'Clean VM directory'\n  cleanVm: undefined,\n\n  // Original text: \"Fast clone\"\n  fastCloneVmLabel: 'Быстрое клонирование',\n\n  // Original text: 'Start the migrated VM'\n  startMigratedVm: undefined,\n\n  // Original text: \"Console\"\n  vmConsoleLabel: 'Консоль',\n\n  // Original text: 'The URL is valid once for a short period of time.'\n  vmExportUrlValidity: undefined,\n\n  // Original text: 'Warm migration'\n  vmWarmMigration: undefined,\n\n  // Original text: 'Warm migration process will first create a copy of the VM on the destination while the source VM is still running, then shutdown the source VM and send the changes that happened during the migration to the destination to minimize downtime.'\n  vmWarmMigrationProcessInfo: undefined,\n\n  // Original text: 'Backup'\n  backupLabel: undefined,\n\n  // Original text: '{n, number} base cop{n, plural, one {y} other {ies}} ({usage})'\n  baseCopyTooltip: undefined,\n\n  // Original text: '{name} ({usage})'\n  diskTooltip: undefined,\n\n  // Original text: '{n, number} snapshot{n, plural, one {} other {s}} ({usage})'\n  snapshotsTooltip: undefined,\n\n  // Original text: '{name} ({usage}) on {vmName}'\n  vdiOnVmTooltip: undefined,\n\n  // Original text: '{n, number} VDI{n, plural, one {} other {s}} ({usage})'\n  vdisTooltip: undefined,\n\n  // Original text: 'Provisioning'\n  provisioning: undefined,\n\n  // Original text: 'Depth'\n  srUnhealthyVdiDepth: undefined,\n\n  // Original text: 'Name'\n  srUnhealthyVdiNameLabel: undefined,\n\n  // Original text: 'Size'\n  srUnhealthyVdiSize: undefined,\n\n  // Original text: 'VDI to coalesce ({total, number})'\n  srUnhealthyVdiTitle: undefined,\n\n  // Original text: 'UUID'\n  srUnhealthyVdiUuid: undefined,\n\n  // Original text: 'No stats'\n  srNoStats: undefined,\n\n  // Original text: 'IOPS'\n  statsIops: undefined,\n\n  // Original text: 'IO throughput'\n  statsIoThroughput: undefined,\n\n  // Original text: 'Latency'\n  statsLatency: undefined,\n\n  // Original text: 'IOwait'\n  statsIowait: undefined,\n\n  // Original text: \"Rescan all disks\"\n  srRescan: 'Перечитать все диски',\n\n  // Original text: \"Connect to all hosts\"\n  srReconnectAll: 'Подключить ко всем хостам',\n\n  // Original text: \"Disconnect from all hosts\"\n  srDisconnectAll: 'Отключить от всех хостов',\n\n  // Original text: \"Forget this SR\"\n  srForget: 'Забыть этот SR',\n\n  // Original text: 'Forget SRs'\n  srsForget: undefined,\n\n  // Original text: 'Forget {nSrs, number} SR{nSrs, plural, one {} other{s}}'\n  nSrsForget: undefined,\n\n  // Original text: \"Remove this SR\"\n  srRemoveButton: 'Удалить этот SR',\n\n  // Original text: \"No VDIs in this storage\"\n  srNoVdis: 'На этом хранилище нет VDI',\n\n  // Original text: 'Reclaim freed space'\n  srReclaimSpace: undefined,\n\n  // Original text: 'Are you sure you want to reclaim freed space on this SR?'\n  srReclaimSpaceConfirm: undefined,\n\n  // Original text: 'Space reclaim not supported. Only supported on block based/LVM based SRs.'\n  srReclaimSpaceNotSupported: undefined,\n\n  // Original text: '{firstVdi} and {nVdis} more'\n  multipleActiveVdis: undefined,\n\n  // Original text: 'No active VDI'\n  noActiveVdi: undefined,\n\n  // Original text: 'Earliest expiration: {dateString}'\n  earliestExpirationDate: undefined,\n\n  // Original text: 'No XCP-ng Pro support enabled on this pool'\n  poolNoSupport: undefined,\n\n  // Original text: 'Only {nHostsLicense, number} host{nHostsLicense, plural, one {} other {s}} under license on {nHosts, number} host{nHosts, plural, one {} other {s}}. This means this pool is not supported at all until you license all its hosts.'\n  poolPartialSupport: undefined,\n\n  // Original text: 'Pool RAM usage:'\n  poolTitleRamUsage: undefined,\n\n  // Original text: '{used} used of {total} ({free} free)'\n  poolRamUsage: undefined,\n\n  // Original text: 'Master:'\n  poolMaster: undefined,\n\n  // Original text: \"Display all hosts of this pool\"\n  displayAllHosts: 'Отобразить все хосты в этом пуле',\n\n  // Original text: \"Display all storage for this pool\"\n  displayAllStorages: 'Отобразить все хранилища в этом пуле',\n\n  // Original text: \"Display all VMs of this pool\"\n  displayAllVMs: 'Отобразить все ВМ в этом пуле',\n\n  // Original text: 'License restrictions'\n  licenseRestrictions: undefined,\n\n  // Original text: 'Warning: You are using a Free XenServer license'\n  licenseRestrictionsModalTitle: undefined,\n\n  // Original text: 'Some functionality is restricted.'\n  actionsRestricted: undefined,\n\n  // Original text: 'You can:'\n  counterRestrictionsOptions: undefined,\n\n  // Original text: 'upgrade to XCP-ng for free to get rid of these restrictions'\n  counterRestrictionsOptionsXcp: undefined,\n\n  // Original text: 'or get a commercial Citrix license'\n  counterRestrictionsOptionsXsLicense: undefined,\n\n  // Original text: \"Hosts\"\n  hostsTabName: 'Хосты',\n\n  // Original text: 'VMs'\n  vmsTabName: undefined,\n\n  // Original text: 'SRs'\n  srsTabName: undefined,\n\n  // Original text: 'Backup network'\n  backupNetwork: undefined,\n\n  // Original text: 'Crash dump SR'\n  crashDumpSr: undefined,\n\n  // Original text: 'Default migration network'\n  defaultMigrationNetwork: undefined,\n\n  // Original text: 'Migration compression'\n  migrationCompression: undefined,\n\n  // Original text: 'Migration compression is not available on this pool'\n  migrationCompressionDisabled: undefined,\n\n  // Original text: 'Disabling high availability'\n  poolDisableHa: undefined,\n\n  // Original text: 'Are you sure you want to disable high availability on this pool?'\n  poolDisableHaConfirm: undefined,\n\n  // Original text: 'Enabling high availability'\n  poolEnableHa: undefined,\n\n  // Original text: 'Edit all'\n  poolEditAll: undefined,\n\n  // Original text: 'Select heartbeat SR candidates'\n  poolHaSelectSrs: undefined,\n\n  // Original text: 'The XAPI will pick one of these SR as heartbeat SR'\n  poolHaSelectSrsDetails: undefined,\n\n  // Original text: \"Enabled\"\n  poolHaEnabled: 'Включена',\n\n  // Original text: \"Disabled\"\n  poolHaDisabled: 'Выключена',\n\n  // Original text: \"High Availability\"\n  poolHaStatus: 'Высокая доступность',\n\n  // Original text: 'Heartbeat SR'\n  poolHeartbeatSr: undefined,\n\n  // Original text: 'GPU groups'\n  poolGpuGroups: undefined,\n\n  // Original text: 'Logging host'\n  poolRemoteSyslogPlaceHolder: undefined,\n\n  // Original text: 'XCP-ng Pro Support not available for source users'\n  poolSupportSourceUsers: undefined,\n\n  // Original text: 'Only available for pool of XCP-ng hosts'\n  poolSupportXcpngOnly: undefined,\n\n  // Original text: 'The pool is already fully supported'\n  poolLicenseAlreadyFullySupported: undefined,\n\n  // Original text: 'Rolling Pool Reboot'\n  rollingPoolReboot: undefined,\n\n  // Original text: 'High Availability is enabled. This will automatically disable it during the reboot.'\n  rollingPoolRebootHaWarning: undefined,\n\n  // Original text: 'Load Balancer plugin is running. This will automatically pause it during the reboot.'\n  rollingPoolRebootLoadBalancerWarning: undefined,\n\n  // Original text: 'Are you sure you want to start a Rolling Pool Reboot? Running VMs will be migrated back and forth and this can take a while. Scheduled backups that may concern this pool will be disabled.'\n  rollingPoolRebootMessage: undefined,\n\n  // Original text: 'Master'\n  setpoolMaster: undefined,\n\n  // Original text: 'Remote syslog host'\n  syslogRemoteHost: undefined,\n\n  // Original text: 'Synchronize with Netbox'\n  syncNetbox: undefined,\n\n  // Original text: 'Are you sure you want to synchronize with Netbox?'\n  syncNetboxWarning: undefined,\n\n  // Original text: '{networkID} not found, please select a new one'\n  updateMissingNetwork: undefined,\n\n  // Original text: \"Name\"\n  hostNameLabel: 'Имя',\n\n  // Original text: \"Description\"\n  hostDescription: 'Описание',\n\n  // Original text: \"No hosts\"\n  noHost: 'Нет хостов',\n\n  // Original text: '{used}% used ({free} free)'\n  memoryLeftTooltip: undefined,\n\n  // Original text: 'PIF'\n  pif: undefined,\n\n  // Original text: 'Automatic'\n  poolNetworkAutomatic: undefined,\n\n  // Original text: \"Name\"\n  poolNetworkNameLabel: 'Имя',\n\n  // Original text: \"Description\"\n  poolNetworkDescription: 'Описание',\n\n  // Original text: 'PIFs'\n  poolNetworkPif: undefined,\n\n  // Original text: 'Private networks'\n  privateNetworks: undefined,\n\n  // Original text: 'Manage'\n  manage: undefined,\n\n  // Original text: \"No networks\"\n  poolNoNetwork: 'Нет сетей',\n\n  // Original text: 'MTU'\n  poolNetworkMTU: undefined,\n\n  // Original text: \"Connected\"\n  poolNetworkPifAttached: 'Подключено',\n\n  // Original text: \"Disconnected\"\n  poolNetworkPifDetached: 'Отключено',\n\n  // Original text: \"Show PIFs\"\n  showPifs: 'Показать PIFs',\n\n  // Original text: \"Hide PIFs\"\n  hidePifs: 'Скрыть PIFs',\n\n  // Original text: 'Network(s) selected by default for new VMs'\n  networkAutomaticTooltip: undefined,\n\n  // Original text: 'No NBD Connection'\n  noNbdConnection: undefined,\n\n  // Original text: 'NBD Connection'\n  nbdConnection: undefined,\n\n  // Original text: 'Insecure NBD Connection (not allowed through XO)'\n  insecureNbdConnection: undefined,\n\n  // Original text: \"Rolling pool update can only work when there's multiple hosts in a pool with a shared storage\"\n  multiHostPoolUpdate: undefined,\n\n  // Original text: '{nVms, number} VM{nVms, plural, one {} other {s}} {nVms, plural, one {is} other {are}} currently running and using at least one local storage. A shared storage for all your VMs is needed to start a rolling pool update'\n  nVmsRunningOnLocalStorage: undefined,\n\n  // Original text: 'No stats'\n  poolNoStats: undefined,\n\n  // Original text: \"All hosts\"\n  poolAllHosts: 'Все хосты',\n\n  // Original text: \"Add SR\"\n  addSrLabel: 'Добавить SR',\n\n  // Original text: \"Add VM\"\n  addVmLabel: 'Добавить ВМ',\n\n  // Original text: 'Add hosts'\n  addHostsLabel: undefined,\n\n  // Original text: 'The pool needs to install {nMissingPatches, number} patch{nMissingPatches, plural, one {} other {es}}. This operation may take a while.'\n  missingPatchesPool: undefined,\n\n  // Original text: 'The selected host{nHosts, plural, one {} other {s}} need{nHosts, plural, one {s} other {}} to install {nMissingPatches, number} patch{nMissingPatches, plural, one {} other {es}}. This operation may take a while.'\n  missingPatchesHost: undefined,\n\n  // Original text: 'The selected host{nHosts, plural, one {} other {s}} cannot be added to the pool because the patches are not homogeneous.'\n  patchUpdateNoInstall: undefined,\n\n  // Original text: 'Adding host{nHosts, plural, one {} other {s}} failed'\n  addHostsErrorTitle: undefined,\n\n  // Original text: 'Host patches could not be homogenized.'\n  addHostNotHomogeneousErrorMessage: undefined,\n\n  // Original text: \"Disconnect\"\n  disconnectServer: 'Отключен',\n\n  // Original text: 'Host'\n  host: undefined,\n\n  // Original text: 'Hardware-assisted virtualization is not enabled on this host'\n  hostHvmDisabled: undefined,\n\n  // Original text: 'This host does not have an active license, even though it is in a pool with licensed hosts. In order for XCP-ng Pro Support to be enabled on a pool, all hosts within the pool must have an active license'\n  hostNoLicensePartialProSupport: undefined,\n\n  // Original text: 'No XCP-ng Pro Support enabled on this host'\n  hostNoSupport: undefined,\n\n  // Original text: 'XCP-ng Pro Support enabled on this host'\n  hostSupportEnabled: undefined,\n\n  // Original text: 'This host version is no longer maintained'\n  noMoreMaintained: undefined,\n\n  // Original text: 'Disable maintenance mode'\n  disableMaintenanceMode: undefined,\n\n  // Original text: 'Enable maintenance mode'\n  enableMaintenanceMode: undefined,\n\n  // Original text: 'It appears that this host will be more up-to-date than the master ({master}) after the restart. This will result in the slave being unable to contact the pool master. Please update and restart your master node first.'\n  slaveHostMoreUpToDateThanMasterAfterRestart: undefined,\n\n  // Original text: \"Start\"\n  startHostLabel: 'Запустить',\n\n  // Original text: \"Stop\"\n  stopHostLabel: 'Остановить',\n\n  // Original text: \"Enable\"\n  enableHostLabel: 'Включить',\n\n  // Original text: \"Disable\"\n  disableHostLabel: 'Выключить',\n\n  // Original text: 'Restart toolstack'\n  restartHostAgent: undefined,\n\n  // Original text: 'As the XOA is hosted on the host that is scheduled for a reboot, it will also be restarted. Consequently, XO won\\'t be able to resume VMs, and VMs with the \"Protect from accidental shutdown\" option enabled will not have this option reactivated automatically.'\n  smartRebootBypassCurrentVmCheck: undefined,\n\n  // Original text: 'Smart reboot'\n  smartRebootHostLabel: undefined,\n\n  // Original text: 'Suspend resident VMs, reboot host and resume VMs automatically'\n  smartRebootHostTooltip: undefined,\n\n  // Original text: \"Force reboot\"\n  forceRebootHostLabel: 'Принудительная перезагрузка',\n\n  // Original text: 'Smart Reboot failed because {nVms, number} VM{nVms, plural, one {} other {s}} ha{nVms, plural, one {s} other {ve}} {nVms, plural, one {its} other {their}} Suspend operation blocked. Would you like to force?'\n  forceSmartRebootHost: undefined,\n\n  // Original text: 'Restart anyway'\n  restartAnyway: undefined,\n\n  // Original text: \"Reboot\"\n  rebootHostLabel: 'Перезагрузка',\n\n  // Original text: \"Error while restarting host\"\n  noHostsAvailableErrorTitle: 'Ошибка при перезапуске хоста',\n\n  // Original text: \"Some VMs cannot be migrated without first rebooting this host. Please try force reboot.\"\n  noHostsAvailableErrorMessage:\n    'Некоторые виртуальные машины невозможно перенести до перезапуска этого хоста. Пожалуйста, попробуйте выполнить принудительную перезагрузку.',\n\n  // Original text: \"Error while restarting hosts\"\n  failHostBulkRestartTitle: 'Ошибка при перезапуске хостов',\n\n  // Original text: '{failedHosts, number}/{totalHosts, number} host{failedHosts, plural, one {} other {s}} could not be restarted.'\n  failHostBulkRestartMessage: undefined,\n\n  // Original text: \"Reboot to apply updates\"\n  rebootUpdateHostLabel: 'Перезагрузите для применения обновлений',\n\n  // Original text: \"Emergency mode\"\n  emergencyModeLabel: 'Аварийный режим',\n\n  // Original text: \"Storage\"\n  storageTabName: 'Хранилище',\n\n  // Original text: \"Patches\"\n  patchesTabName: 'Исправления',\n\n  // Original text: \"Load average\"\n  statLoad: 'Средняя нагрузка',\n\n  // Original text: 'This operation will reboot the host in order to apply the change on the PCI{nPcis, plural, one {} other {s}}. Are you sure you want to continue?'\n  applyChangeOnPcis: undefined,\n\n  // Original text: 'Class name'\n  className: undefined,\n\n  // Original text: 'Force reboot?'\n  confirmForceRebootHost: undefined,\n\n  // Original text: 'Device name'\n  deviceName: undefined,\n\n  // Original text: 'Enabled'\n  enabled: undefined,\n\n  // Original text: 'All disks are healthy ✅'\n  disksSystemHealthy: undefined,\n\n  // Original text: 'Edit iSCSI IQN'\n  editHostIscsiIqnTitle: undefined,\n\n  // Original text: 'Are you sure you want to edit the iSCSI IQN? This may result in failures connecting to existing SRs if the host is attached to iSCSI SRs.'\n  editHostIscsiIqnMessage: undefined,\n\n  // Original text: 'Host RAM usage:'\n  hostTitleRamUsage: undefined,\n\n  // Original text: 'The host evacuation failed, do you want to force reboot?'\n  hostEvacuationFailed: undefined,\n\n  // Original text: 'Are you sure you want to enter maintenance mode? This will migrate all the VMs running on this host to other hosts of the pool.'\n  maintenanceHostModalMessage: undefined,\n\n  // Original text: 'Maintenance mode'\n  maintenanceHostModalTitle: undefined,\n\n  // Original text: 'Evacuate and disable the host'\n  maintenanceHostTooltip: undefined,\n\n  // Original text: \"RAM: {memoryUsed} used of {memoryTotal} ({memoryFree} free)\"\n  memoryHostState: 'Использование RAM: {memoryUsed}',\n\n  // Original text: \"Hardware\"\n  hardwareHostSettingsLabel: 'Hardware',\n\n  // Original text: 'Hyper-threading (SMT)'\n  hyperThreading: undefined,\n\n  // Original text: 'HT detection is only available on XCP-ng 7.6 and higher'\n  hyperThreadingNotAvailable: undefined,\n\n  // Original text: 'Download system logs'\n  hostDownloadLogs: undefined,\n\n  // Original text: \"The logs you are about to download contain the entire host's logs, potentially hundreds of megabytes. Please note that these logs can be technical and complex to analyze, requiring some expertise.\"\n  hostDownloadLogsContainEntireHostLogs: undefined,\n\n  // Original text: \"Address\"\n  hostAddress: 'Адрес',\n\n  // Original text: \"Status\"\n  hostStatus: 'Статус',\n\n  // Original text: \"Build number\"\n  hostBuildNumber: 'Номер сборки',\n\n  // Original text: 'iSCSI IQN'\n  hostIscsiIqn: undefined,\n\n  // Original text: 'PCI passthrough capable'\n  hostIommuTooltip: undefined,\n\n  // Original text: 'Not connected to an iSCSI SR'\n  hostNoIscsiSr: undefined,\n\n  // Original text: 'Click to see concerned SRs'\n  hostMultipathingSrs: undefined,\n\n  // Original text: '{nActives, number} of {nPaths, number} path{nPaths, plural, one {} other {s}}'\n  hostMultipathingPaths: undefined,\n\n  // Original text: 'This action will not be fulfilled if a VM is in a running state. Please ensure that all VMs are evacuated or stopped before performing this action!'\n  hostMultipathingRequiredState: undefined,\n\n  // Original text: 'The host{nHosts, plural, one {} other {s}} will lose their connection to the SRs. Do you want to continue?'\n  hostMultipathingWarning: undefined,\n\n  // Original text: \"Version\"\n  hostXenServerVersion: 'Версия',\n\n  // Original text: \"Enabled\"\n  hostStatusEnabled: 'Включен',\n\n  // Original text: \"Disabled\"\n  hostStatusDisabled: 'Выключен',\n\n  // Original text: \"Power on mode\"\n  hostPowerOnMode: 'Режим включения',\n\n  // Original text: 'Control domain memory'\n  hostControlDomainMemory: undefined,\n\n  // Original text: 'Set control domain memory'\n  setControlDomainMemory: undefined,\n\n  // Original text: 'Editing the control domain memory will immediately restart the host in order to apply the changes.'\n  setControlDomainMemoryMessage: undefined,\n\n  // Original text: 'The host needs to be in maintenance mode'\n  maintenanceModeRequired: undefined,\n\n  // Original text: \"Host uptime\"\n  hostStartedSince: 'Время работы хоста',\n\n  // Original text: 'Toolstack uptime'\n  hostStackStartedSince: undefined,\n\n  // Original text: \"CPU model\"\n  hostCpusModel: 'Модель CPU',\n\n  // Original text: 'GPUs'\n  hostGpus: undefined,\n\n  // Original text: \"Core (socket)\"\n  hostCpusNumber: 'Ядра (сокеты)',\n\n  // Original text: \"Manufacturer info\"\n  hostManufacturerinfo: 'Производитель',\n\n  // Original text: \"BIOS info\"\n  hostBiosinfo: 'BIOS',\n\n  // Original text: \"License\"\n  licenseHostSettingsLabel: 'Лицензия',\n\n  // Original text: \"Type\"\n  hostLicenseType: 'Тип',\n\n  // Original text: \"Socket\"\n  hostLicenseSocket: 'Сокет',\n\n  // Original text: \"Expiry\"\n  hostLicenseExpiry: 'Срок действия',\n\n  // Original text: 'Remote syslog'\n  hostRemoteSyslog: undefined,\n\n  // Original text: 'IOMMU'\n  hostIommu: undefined,\n\n  // Original text: 'No certificates installed on this host'\n  hostNoCertificateInstalled: undefined,\n\n  // Original text: 'Only available for XCP-ng 8.3.0 or higher'\n  'onlyAvailableXcp8.3OrHigher': undefined,\n\n  // Original text: 'PCI Devices'\n  pciDevices: undefined,\n\n  // Original text: 'PCI ID'\n  pciId: undefined,\n\n  // Original text: 'PCI{nPcis, plural, one {} other {s}} enable'\n  pcisEnable: undefined,\n\n  // Original text: 'PCI{nPcis, plural, one {} other {s}} disable'\n  pcisDisable: undefined,\n\n  // Original text: 'PUSB Devices'\n  pusbDevices: undefined,\n\n  // Original text: 'Smartctl plugin not installed'\n  smartctlPluginNotInstalled: undefined,\n\n  // Original text: \"Installed supplemental packs\"\n  supplementalPacks: 'Установленные пакеты дополнений',\n\n  // Original text: \"Install new supplemental pack\"\n  supplementalPackNew: 'Установить новый пакет дополнений',\n\n  // Original text: \"Install supplemental pack on every host\"\n  supplementalPackPoolNew: 'Установить пакет дополнений на каждый хост',\n\n  // Original text: \"{name} (by {author})\"\n  supplementalPackTitle: '{name} (by {author})',\n\n  // Original text: \"Installation started\"\n  supplementalPackInstallStartedTitle: 'Установка началась',\n\n  // Original text: \"Installing new supplemental pack…\"\n  supplementalPackInstallStartedMessage: 'Установка нового пакета дополнений…',\n\n  // Original text: \"Installation error\"\n  supplementalPackInstallErrorTitle: 'Ошибка установки',\n\n  // Original text: \"The installation of the supplemental pack failed.\"\n  supplementalPackInstallErrorMessage: 'Не удалось установить пакет дополнений',\n\n  // Original text: \"Installation success\"\n  supplementalPackInstallSuccessTitle: 'Установка успешна',\n\n  // Original text: \"Supplemental pack successfully installed.\"\n  supplementalPackInstallSuccessMessage: 'Пакет дополнений успешно установлен.',\n\n  // Original text: 'System disks health'\n  systemDisksHealth: undefined,\n\n  // Original text: 'The iSCSI IQN must be unique. '\n  uniqueHostIscsiIqnInfo: undefined,\n\n  // Original text: 'Vendor ID'\n  vendorId: undefined,\n\n  // Original text: \"Add a network\"\n  networkCreateButton: 'Добавить сеть',\n\n  // Original text: \"Device\"\n  pifDeviceLabel: 'Устройство',\n\n  // Original text: \"Network\"\n  pifNetworkLabel: 'Сеть',\n\n  // Original text: \"VLAN\"\n  pifVlanLabel: 'VLAN',\n\n  // Original text: \"Address\"\n  pifAddressLabel: 'Адрес',\n\n  // Original text: \"Mode\"\n  pifModeLabel: 'Режим',\n\n  // Original text: \"MAC\"\n  pifMacLabel: 'MAC',\n\n  // Original text: \"MTU\"\n  pifMtuLabel: 'MTU',\n\n  // Original text: 'Speed'\n  pifSpeedLabel: undefined,\n\n  // Original text: \"Status\"\n  pifStatusLabel: 'Статус',\n\n  // Original text: 'This interface is currently in use'\n  pifInUse: undefined,\n\n  // Original text: 'Default locking mode'\n  defaultLockingMode: undefined,\n\n  // Original text: \"Configure IP address\"\n  pifConfigureIp: 'Настройка IP адреса',\n\n  // Original text: 'Invalid parameters'\n  configIpErrorTitle: undefined,\n\n  // Original text: \"Static IP address\"\n  staticIp: 'Статичный IP адрес',\n\n  // Original text: 'Static IPv6 address'\n  staticIpv6: undefined,\n\n  // Original text: \"Netmask\"\n  netmask: 'Маска сети',\n\n  // Original text: \"DNS\"\n  dns: 'DNS',\n\n  // Original text: \"Gateway\"\n  gateway: 'Сетевой шлюз',\n\n  // Original text: 'An IP address is required'\n  ipRequired: undefined,\n\n  // Original text: 'Netmask required'\n  netmaskRequired: undefined,\n\n  // Original text: \"Add a storage\"\n  addSrDeviceButton: 'Добавить хранилище',\n\n  // Original text: \"Type\"\n  srType: 'Тип',\n\n  // Original text: 'PBD details'\n  pbdDetails: undefined,\n\n  // Original text: \"Status\"\n  pbdStatus: 'Статус',\n\n  // Original text: \"Connected\"\n  pbdStatusConnected: 'Подключен',\n\n  // Original text: \"Disconnected\"\n  pbdStatusDisconnected: 'Отключен',\n\n  // Original text: \"Connect\"\n  pbdConnect: 'Подключить',\n\n  // Original text: \"Disconnect\"\n  pbdDisconnect: 'Отключить',\n\n  // Original text: \"Forget\"\n  pbdForget: 'Забыть',\n\n  // Original text: \"Shared\"\n  srShared: 'С общим доступом',\n\n  // Original text: \"Not shared\"\n  srNotShared: 'Без общего доступа',\n\n  // Original text: \"No storage detected\"\n  pbdNoSr: 'Хранилища не обнаружены',\n\n  // Original text: \"Name\"\n  patchNameLabel: 'Имя',\n\n  // Original text: \"Install all patches\"\n  patchUpdateButton: 'Установить все исправления',\n\n  // Original text: \"Description\"\n  patchDescription: 'Описание',\n\n  // Original text: 'Version'\n  patchVersion: undefined,\n\n  // Original text: \"Applied date\"\n  patchApplied: 'Дата публикации',\n\n  // Original text: \"Size\"\n  patchSize: 'Размер',\n\n  // Original text: \"No patches detected\"\n  patchNothing: 'Исправления не найдены',\n\n  // Original text: \"Release date\"\n  patchReleaseDate: 'Дата релиза',\n\n  // Original text: \"Guidance\"\n  patchGuidance: 'Руководство',\n\n  // Original text: \"Applied patches\"\n  hostAppliedPatches: 'Примененные исправления',\n\n  // Original text: \"Missing patches\"\n  hostMissingPatches: 'Отсутствующие исправления',\n\n  // Original text: \"Host up-to-date!\"\n  hostUpToDate: 'Хост в актуальном состоянии!',\n\n  // Original text: 'Install all patches'\n  installAllPatchesTitle: undefined,\n\n  // Original text: 'To install all patches go to pool.'\n  installAllPatchesContent: undefined,\n\n  // Original text: 'Go to pool'\n  installAllPatchesRedirect: undefined,\n\n  // Original text: 'The pool master must always be updated FIRST. Updating will automatically restart the toolstack. Running VMs will not be affected. Are you sure you want to continue and install all patches on this host?'\n  installAllPatchesOnHostContent: undefined,\n\n  // Original text: 'Release'\n  patchRelease: undefined,\n\n  // Original text: 'An error occurred while fetching the patches. Please make sure the updater plugin is installed by running `yum install xcp-ng-updater` on the host.'\n  updatePluginNotInstalled: undefined,\n\n  // Original text: 'Show changelog'\n  showChangelog: undefined,\n\n  // Original text: 'Changelog'\n  changelog: undefined,\n\n  // Original text: 'Patch'\n  changelogPatch: undefined,\n\n  // Original text: 'Author'\n  changelogAuthor: undefined,\n\n  // Original text: 'Date'\n  changelogDate: undefined,\n\n  // Original text: 'Description'\n  changelogDescription: undefined,\n\n  // Original text: 'Install'\n  install: undefined,\n\n  // Original text: 'Install patch{nPatches, plural, one {} other {es}}'\n  installPatchesTitle: undefined,\n\n  // Original text: 'This will automatically restart the toolstack on every host. Running VMs will not be affected. Are you sure you want to continue and install {nPatches, number} patch{nPatches, plural, one {} other {es}}?'\n  installPatchesContent: undefined,\n\n  // Original text: \"Install pool patches\"\n  installPoolPatches: 'Установить исправления на пул',\n\n  // Original text: 'This will automatically restart the toolstack on every host. Running VMs will not be affected. Are you sure you want to continue and install all the patches on this pool?'\n  confirmPoolPatch: undefined,\n\n  // Original text: 'Rolling pool update'\n  rollingPoolUpdate: undefined,\n\n  // Original text: 'Are you sure you want to start a rolling pool update? Running VMs will be migrated back and forth and this can take a while. Scheduled backups that may concern this pool will be disabled.'\n  rollingPoolUpdateMessage: undefined,\n\n  // Original text: 'High Availability is enabled. This will automatically disable it during the update.'\n  rollingPoolUpdateHaWarning: undefined,\n\n  // Original text: 'Load Balancer plugin is running. This will automatically pause it during the update.'\n  rollingPoolUpdateLoadBalancerWarning: undefined,\n\n  // Original text: 'The pool needs a default SR to install the patches.'\n  poolNeedsDefaultSr: undefined,\n\n  // Original text: '{nVms, number} VM{nVms, plural, one {} other {s}} {nVms, plural, one {has} other {have}} CDs'\n  vmsHaveCds: undefined,\n\n  // Original text: 'Eject CDs'\n  ejectCds: undefined,\n\n  // Original text: 'High Availability must be disabled'\n  highAvailabilityNotDisabledTooltip: undefined,\n\n  // Original text: 'In order to install XenServer updates, you first need to configure your XenServer Client ID. See {link}.'\n  xsCredentialsMissing: undefined,\n\n  // Original text: 'Missing XenServer Client ID'\n  xsCredentialsMissingShort: undefined,\n\n  // Original text: \"Default SR\"\n  defaultSr: 'SR по умолчанию',\n\n  // Original text: \"Set as default SR\"\n  setAsDefaultSr: 'Выбрать SR по умолчанию',\n\n  // Original text: 'Set default SR:'\n  setDefaultSr: undefined,\n\n  // Original text: \"General\"\n  generalTabName: 'Общее',\n\n  // Original text: \"Stats\"\n  statsTabName: 'Статистика',\n\n  // Original text: \"Console\"\n  consoleTabName: 'Консоль',\n\n  // Original text: \"Container\"\n  containersTabName: 'Контейнер',\n\n  // Original text: \"Snapshots\"\n  snapshotsTabName: 'Снимки',\n\n  // Original text: \"Logs\"\n  logsTabName: 'Журналы',\n\n  // Original text: \"Advanced\"\n  advancedTabName: 'Расширенные',\n\n  // Original text: \"Network\"\n  networkTabName: 'Сеть',\n\n  // Original text: \"Disk{disks, plural, one {} other {s}}\"\n  disksTabName: 'Диск{disks, plural, one {} other {s}}',\n\n  // Original text: \"Halted\"\n  powerStateHalted: 'остановлен',\n\n  // Original text: \"Running\"\n  powerStateRunning: 'работает',\n\n  // Original text: \"Suspended\"\n  powerStateSuspended: 'приостановлен',\n\n  // Original text: 'Paused'\n  powerStatePaused: undefined,\n\n  // Original text: 'Disabled'\n  powerStateDisabled: undefined,\n\n  // Original text: 'Busy'\n  powerStateBusy: undefined,\n\n  // Original text: \"Current status:\"\n  vmCurrentStatus: 'Текущий статус',\n\n  // Original text: \"Not running\"\n  vmNotRunning: 'Не запущено',\n\n  // Original text: \"Halted {ago}\"\n  vmHaltedSince: 'Остановлено {ago}',\n\n  // Original text: \"No Xen tools detected\"\n  noToolsDetected: 'Утилиты XEN не обнаружены',\n\n  // Original text: 'Management agent {version} detected'\n  managementAgentDetected: undefined,\n\n  // Original text: 'Management agent {version} out of date'\n  managementAgentOutOfDate: undefined,\n\n  // Original text: 'Management agent not detected'\n  managementAgentNotDetected: undefined,\n\n  // Original text: \"No IPv4 record\"\n  noIpv4Record: 'Нет IPv4 записи',\n\n  // Original text: \"No IP record\"\n  noIpRecord: 'Нет IP записи',\n\n  // Original text: \"Started {ago}\"\n  started: 'Запущено {ago}',\n\n  // Original text: \"Paravirtualization (PV)\"\n  paraVirtualizedMode: 'Паравиртуализация (PV)',\n\n  // Original text: \"Hardware virtualization (HVM)\"\n  hardwareVirtualizedMode: 'Аппаратная паравиртуализация (HVM)',\n\n  // Original text: 'Hardware virtualization with paravirtualization drivers enabled (PVHVM)'\n  hvmModeWithPvDriversEnabled: undefined,\n\n  // Original text: 'PV inside a PVH container (PV in PVH)'\n  pvInPvhMode: undefined,\n\n  // Original text: 'Created by {user}\\non {date}\\nwith template {template}'\n  vmCreatedAdmin: undefined,\n\n  // Original text: 'Created on {date}\\nwith template {template}'\n  vmCreatedNonAdmin: undefined,\n\n  // Original text: 'Manage Citrix PV drivers via Windows Update'\n  windowsUpdateTools: undefined,\n\n  // Original text: 'Windows Update Tools'\n  windowsToolsModalTitle: undefined,\n\n  // Original text: 'Enabling this will allow the VM to automatically install Citrix PV drivers from Windows Update. This only includes drivers, the Citrix management agent must still be separately installed.'\n  windowsToolsModalMessage: undefined,\n\n  // Original text: 'If you have previously installed XCP-ng tools instead of Citrix tools, this option will break your VM.'\n  windowsToolsModalWarning: undefined,\n\n  // Original text: 'Edit VM notes'\n  editVmNotes: undefined,\n\n  // Original text: 'Supports Markdown syntax'\n  supportsMarkdown: undefined,\n\n  // Original text: 'VM notes cannot be longer than 2048 characters'\n  vmNotesTooLong: undefined,\n\n  // Original text: \"CPU usage\"\n  statsCpu: 'Использование CPU',\n\n  // Original text: \"Memory usage\"\n  statsMemory: 'Использование памяти',\n\n  // Original text: \"Network throughput\"\n  statsNetwork: 'Использование сети',\n\n  // Original text: \"Stacked values\"\n  useStackedValuesOnStats: 'Сложить значения',\n\n  // Original text: \"Disk throughput\"\n  statDisk: 'Пропускная способность диска',\n\n  // Original text: \"Last 10 minutes\"\n  statLastTenMinutes: 'Последние 10 минут',\n\n  // Original text: \"Last 2 hours\"\n  statLastTwoHours: 'Последние 2 часа',\n\n  // Original text: 'Last day'\n  statLastDay: undefined,\n\n  // Original text: \"Last week\"\n  statLastWeek: 'Последняя неделя',\n\n  // Original text: \"Last year\"\n  statLastYear: 'Последний год',\n\n  // Original text: \"Copy\"\n  copyToClipboardLabel: 'Копировать',\n\n  // Original text: 'Ctrl+Alt+Del'\n  ctrlAltDelButtonLabel: undefined,\n\n  // Original text: 'Send Ctrl+Alt+Del to VM?'\n  ctrlAltDelConfirmation: undefined,\n\n  // Original text: 'Console is disabled for this VM'\n  disabledConsole: undefined,\n\n  // Original text: 'Multiline copy'\n  multilineCopyToClipboard: undefined,\n\n  // Original text: \"Tip:\"\n  tipLabel: 'Совет:',\n\n  // Original text: \"Hide info\"\n  hideHeaderTooltip: 'Скрыть информацию',\n\n  // Original text: \"Show info\"\n  showHeaderTooltip: 'Показать информацию',\n\n  // Original text: 'Send to clipboard'\n  sendToClipboard: undefined,\n\n  // Original text: 'Connect using external SSH tool as root'\n  sshRootTooltip: undefined,\n\n  // Original text: 'SSH'\n  sshRootLabel: undefined,\n\n  // Original text: 'Connect using external SSH tool as user…'\n  sshUserTooltip: undefined,\n\n  // Original text: 'SSH as…'\n  sshUserLabel: undefined,\n\n  // Original text: 'SSH user name'\n  sshUsernameLabel: undefined,\n\n  // Original text: 'No IP address reported by client tools'\n  remoteNeedClientTools: undefined,\n\n  // Original text: 'RDP'\n  rdp: undefined,\n\n  // Original text: 'Connect using external RDP tool'\n  rdpRootTooltip: undefined,\n\n  // Original text: \"Name\"\n  containerName: 'Имя',\n\n  // Original text: \"Command\"\n  containerCommand: 'Команда',\n\n  // Original text: \"Creation date\"\n  containerCreated: 'Дата создания',\n\n  // Original text: \"Status\"\n  containerStatus: 'Статус',\n\n  // Original text: \"Action\"\n  containerAction: 'Действие',\n\n  // Original text: \"No existing containers\"\n  noContainers: 'Нет существующих контейнеров',\n\n  // Original text: \"Stop this container\"\n  containerStop: 'Остановить контейнер',\n\n  // Original text: \"Start this container\"\n  containerStart: 'Запустить контейнер',\n\n  // Original text: \"Pause this container\"\n  containerPause: 'Приостановить контейнер',\n\n  // Original text: \"Resume this container\"\n  containerResume: 'Возобновить контейнер',\n\n  // Original text: \"Restart this container\"\n  containerRestart: 'Перезапустить контейнер',\n\n  // Original text: 'Rescan all ISO SRs'\n  rescanIsoSrs: undefined,\n\n  // Original text: \"New disk\"\n  vbdCreateDeviceButton: 'Новый диск',\n\n  // Original text: \"Attach disk\"\n  vdiAttachDevice: 'Подключить диск',\n\n  // Original text: 'The selected VDI is already attached to this VM. Are you sure you want to continue?'\n  vdiAttachDeviceConfirm: undefined,\n\n  // Original text: \"Boot order\"\n  vdiBootOrder: 'Очередность загрузки',\n\n  // Original text: \"Name\"\n  vdiNameLabel: 'Имя',\n\n  // Original text: \"Description\"\n  vdiNameDescription: 'Описание',\n\n  // Original text: \"Pool\"\n  vdiPool: 'Пул',\n\n  // Original text: \"Tags\"\n  vdiTags: 'Тэги',\n\n  // Original text: 'VDI tasks'\n  vdiTasks: undefined,\n\n  // Original text: \"Size\"\n  vdiSize: 'Размер',\n\n  // Original text: 'SR'\n  vdiSr: undefined,\n\n  // Original text: 'VMs'\n  vdiVms: undefined,\n\n  // Original text: \"Migrate VDI\"\n  vdiMigrate: 'Мигрировать VDI',\n\n  // Original text: \"Destination SR:\"\n  vdiMigrateSelectSr: 'Целевая SR',\n\n  // Original text: \"No SR\"\n  vdiMigrateNoSr: 'Нет SR',\n\n  // Original text: \"A target SR is required to migrate a VDI\"\n  vdiMigrateNoSrMessage: 'Для переноса VDI требуется целевой SR',\n\n  // Original text: \"Forget\"\n  vdiForget: 'Забыть',\n\n  // Original text: \"No VDIs attached to control domain\"\n  noControlDomainVdis: 'Нет VDI подключенных к Управляющему Домену',\n\n  // Original text: \"Boot flag\"\n  vbdBootableStatus: 'Флаг загрузки',\n\n  // Original text: 'Device'\n  vbdDevice: undefined,\n\n  // Original text: 'CBT'\n  vbdCbt: undefined,\n\n  // Original text: \"Status\"\n  vbdStatus: 'Статус',\n\n  // Original text: \"Connected\"\n  vbdStatusConnected: 'Подключен',\n\n  // Original text: \"Disconnected\"\n  vbdStatusDisconnected: 'Отключен',\n\n  // Original text: \"Connect VBD\"\n  vbdConnect: 'Подключить VBD',\n\n  // Original text: \"Disconnect VBD\"\n  vbdDisconnect: 'Отключить VBD',\n\n  // Original text: 'Bootable'\n  vbdBootable: undefined,\n\n  // Original text: 'Readonly'\n  vbdReadonly: undefined,\n\n  // Original text: \"Create\"\n  vbdCreate: 'Создать',\n\n  // Original text: 'Attach'\n  vbdAttach: undefined,\n\n  // Original text: \"Disk name\"\n  vbdNamePlaceHolder: 'Имя диска',\n\n  // Original text: \"Size\"\n  vbdSizePlaceHolder: 'Размер',\n\n  // Original text: \"CD drive not completely installed\"\n  cdDriveNotInstalled: 'CD установлен не полностью',\n\n  // Original text: \"Stop and start the VM to install the CD drive\"\n  cdDriveInstallation: 'Остановить и запустить ВМ для установки CD',\n\n  // Original text: \"Save\"\n  saveBootOption: 'Сохранить',\n\n  // Original text: \"Reset\"\n  resetBootOption: 'Сбросить',\n\n  // Original text: 'Destroy selected VDIs'\n  destroySelectedVdis: undefined,\n\n  // Original text: 'Destroy VDI'\n  destroyVdi: undefined,\n\n  // Original text: 'Export VDI content'\n  exportVdi: undefined,\n\n  // Original text: 'Format'\n  format: undefined,\n\n  // Original text: 'Import VDI content'\n  importVdi: undefined,\n\n  // Original text: 'No file selected'\n  importVdiNoFile: undefined,\n\n  // Original text: 'Drop VHD file here'\n  selectVdiMessage: undefined,\n\n  // Original text: 'Creating this disk will use the disk space quota from the resource set {resourceSet} ({spaceLeft} left)'\n  useQuotaWarning: undefined,\n\n  // Original text: 'Not enough space in resource set {resourceSet} ({spaceLeft} left)'\n  notEnoughSpaceInResourceSet: undefined,\n\n  // Original text: \"The VDIs' SRs must either be shared or on the same host for the VM to be able to start.\"\n  warningVdiSr: undefined,\n\n  // Original text: 'Remove selected VDIs from this VM'\n  removeSelectedVdisFromVm: undefined,\n\n  // Original text: 'Remove VDI from this VM'\n  removeVdiFromVm: undefined,\n\n  // Original text: 'VHD'\n  vhd: undefined,\n\n  // Original text: 'VMDK'\n  vmdk: undefined,\n\n  // Original text: 'RAW'\n  raw: undefined,\n\n  // Original text: 'Edit locking mode'\n  editVifLockingMode: undefined,\n\n  // Original text: 'Allow the traffic'\n  aclRuleAllow: undefined,\n\n  // Original text: 'Select a protocol'\n  aclRuleProtocol: undefined,\n\n  // Original text: 'Select a port'\n  aclRulePort: undefined,\n\n  // Original text: 'Select an IP or an IP range (CIDR format)'\n  aclRuleIpRange: undefined,\n\n  // Original text: 'Select a direction'\n  aclRuleDirection: undefined,\n\n  // Original text: 'Traffic Enabled/Disabled'\n  aclRuleAllowField: undefined,\n\n  // Original text: 'Protocol'\n  aclRuleProtocolField: undefined,\n\n  // Original text: 'Port'\n  aclRulePortField: undefined,\n\n  // Original text: 'IP range (CIDR format)'\n  aclRuleIpRangeField: undefined,\n\n  // Original text: 'Direction'\n  aclRuleDirectionField: undefined,\n\n  // Original text: 'Add rule'\n  addRule: undefined,\n\n  // Original text: 'Delete rule'\n  deleteRule: undefined,\n\n  // Original text: 'Hide rules'\n  hideRules: undefined,\n\n  // Original text: 'SDN Controller must be loaded'\n  sdnControllerNotLoaded: undefined,\n\n  // Original text: 'Show rules'\n  showRules: undefined,\n\n  // Original text: 'Traffic rules'\n  vifAclRules: undefined,\n\n  // Original text: \"New device\"\n  vifCreateDeviceButton: 'Новое устройство',\n\n  // Original text: \"Device\"\n  vifDeviceLabel: 'Устройство',\n\n  // Original text: \"MAC address\"\n  vifMacLabel: 'MAC адрес',\n\n  // Original text: 'MTU'\n  vifMtuLabel: undefined,\n\n  // Original text: \"Network\"\n  vifNetworkLabel: 'Сеть',\n\n  // Original text: 'Rate limit (kB/s)'\n  vifRateLimitLabel: undefined,\n\n  // Original text: \"Status\"\n  vifStatusLabel: 'Статус',\n\n  // Original text: \"Connected\"\n  vifStatusConnected: 'Подключен',\n\n  // Original text: \"Disconnected\"\n  vifStatusDisconnected: 'Отключен',\n\n  // Original text: \"Connect\"\n  vifConnect: 'Подключить',\n\n  // Original text: \"Disconnect\"\n  vifDisconnect: 'Отключить',\n\n  // Original text: \"Remove\"\n  vifRemove: 'Удалить',\n\n  // Original text: 'Remove selected VIFs'\n  vifsRemove: undefined,\n\n  // Original text: \"IP addresses\"\n  vifIpAddresses: 'IP адреса',\n\n  // Original text: \"Auto-generated if empty\"\n  vifMacAutoGenerate: 'Создать если не указано',\n\n  // Original text: \"Allowed IPs\"\n  vifAllowedIps: 'Разрешенные IP',\n\n  // Original text: 'Select an IP'\n  selectIpFromIpPool: undefined,\n\n  // Original text: 'Enter an IP'\n  enterIp: undefined,\n\n  // Original text: 'Add allowed IP'\n  addAllowedIp: undefined,\n\n  // Original text: 'Error while adding allowed IP'\n  addIpError: undefined,\n\n  // Original text: 'Invalid IP'\n  invalidIp: undefined,\n\n  // Original text: \"No IPs\"\n  vifNoIps: 'Без IP',\n\n  // Original text: 'VIF locking mode is disabled'\n  vifLockingModeDisabled: undefined,\n\n  // Original text: 'VIF locking mode is unlocked'\n  vifLockingModeUnlocked: undefined,\n\n  // Original text: 'VIF locking mode is locked'\n  vifLockingModeLocked: undefined,\n\n  // Original text: 'Network default locking mode is disabled'\n  networkDefaultLockingModeDisabled: undefined,\n\n  // Original text: 'Network default locking mode is unlocked'\n  networkDefaultLockingModeUnlocked: undefined,\n\n  // Original text: \"Network locked and no IPs are allowed for this interface\"\n  vifLockedNetworkNoIps: 'Сеть заблокирована, и для этого интерфейса не разрешены IP-адреса',\n\n  // Original text: 'Some IPs are unnecessarily set as allowed for this interface'\n  vifUnlockedNetworkWithIps: undefined,\n\n  // Original text: \"Unknown network\"\n  vifUnknownNetwork: 'Неизвестная сеть',\n\n  // Original text: \"Create\"\n  vifCreate: 'Создать',\n\n  // Original text: 'NBD'\n  nbd: undefined,\n\n  // Original text: 'Network Block Device status'\n  nbdTootltip: undefined,\n\n  // Original text: 'Use of insecure NBD is not advised'\n  nbdInsecureTooltip: undefined,\n\n  // Original text: 'Nbd connection is secure and ready'\n  nbdSecureTooltip: undefined,\n\n  // Original text: \"No snapshots\"\n  noSnapshots: 'Нет снимков',\n\n  // Original text: 'New snapshot with memory'\n  newSnapshotWithMemory: undefined,\n\n  // Original text: 'Are you sure you want to create a snapshot with memory? This could take a while and the VM will be unusable during that time.'\n  newSnapshotWithMemoryConfirm: undefined,\n\n  // Original text: 'Memory saved'\n  snapshotMemorySaved: undefined,\n\n  // Original text: \"New snapshot\"\n  snapshotCreateButton: 'Новый снимок',\n\n  // Original text: \"Just click on the snapshot button to create one!\"\n  tipCreateSnapshotLabel: 'Нажмите на кнопку снимка, чтобы создать его!',\n\n  // Original text: \"Revert VM to this snapshot\"\n  revertSnapshot: 'Откатить ВМ на этот снимок',\n\n  // Original text: \"Remove this snapshot\"\n  deleteSnapshot: 'Удалить снимок',\n\n  // Original text: 'Remove selected snapshots'\n  deleteSnapshots: undefined,\n\n  // Original text: \"Create a VM from this snapshot\"\n  copySnapshot: 'Создать ВМ из снимка',\n\n  // Original text: \"Export this snapshot\"\n  exportSnapshot: 'Экспортировать снимок',\n\n  // Original text: 'Export snapshot memory'\n  exportSnapshotMemory: undefined,\n\n  // Original text: 'Secure boot'\n  secureBoot: undefined,\n\n  // Original text: \"Creation date\"\n  snapshotDate: 'Дата создания',\n\n  // Original text: 'Snapshot error'\n  snapshotError: undefined,\n\n  // Original text: \"Name\"\n  snapshotName: 'Имя',\n\n  // Original text: 'Description'\n  snapshotDescription: undefined,\n\n  // Original text: 'Quiesced snapshot'\n  snapshotQuiesce: undefined,\n\n  // Original text: 'Revert successful'\n  vmRevertSuccessfulTitle: undefined,\n\n  // Original text: 'VM successfully reverted'\n  vmRevertSuccessfulMessage: undefined,\n\n  // Original text: 'Current snapshot'\n  currentSnapshot: undefined,\n\n  // Original text: 'Go to the backup page.'\n  goToBackupPage: undefined,\n\n  // Original text: \"Remove all logs\"\n  logRemoveAll: 'Удалить все журналы',\n\n  // Original text: \"No logs so far\"\n  noLogs: 'Записей в журналах пока нет',\n\n  // Original text: \"Creation date\"\n  logDate: 'Дата создания',\n\n  // Original text: \"Name\"\n  logName: 'Имя',\n\n  // Original text: \"Content\"\n  logContent: 'Содержимое',\n\n  // Original text: \"Action\"\n  logAction: 'Действие',\n\n  // Original text: 'Attached PCIs'\n  attachedPcis: undefined,\n\n  // Original text: 'Attaching/detaching a PCI will be taken into consideration for the next VM boot.'\n  attachingDetachingPciNeedVmBoot: undefined,\n\n  // Original text: 'Attach PCIs'\n  attachPcis: undefined,\n\n  // Original text: 'Create a VTPM'\n  createVtpm: undefined,\n\n  // Original text: 'Delete the VTPM'\n  deleteVtpm: undefined,\n\n  // Original text: 'If the VTPM is in use, removing it will result in a dangerous data loss. Are you sure you want to remove the VTPM?'\n  deleteVtpmWarning: undefined,\n\n  // Original text: \"When a VM is offline, it's not attached to any host, and therefore, it's impossible to determine the associated PCI devices, as it depends on the hardware environment in which it would be deployed.\"\n  infoUnknownPciOnNonRunningVm: undefined,\n\n  // Original text: 'Auto power on is disabled at pool level, click to fix automatically.'\n  poolAutoPoweronDisabled: undefined,\n\n  // Original text: \"Remove\"\n  vmRemoveButton: 'Удаление',\n\n  // Original text: 'Convert to template'\n  vmConvertToTemplateButton: undefined,\n\n  // Original text: 'Convert to {mode}'\n  vmSwitchVirtualizationMode: undefined,\n\n  // Original text: 'Change virtualization mode'\n  vmVirtualizationModeModalTitle: undefined,\n\n  // Original text: \"You must know what you are doing, because it could break your setup (if you didn't install the bootloader in the MBR while switching from PV to HVM, or even worse, in HVM to PV, if you don't have the correct PV args)\"\n  vmVirtualizationModeModalBody: undefined,\n\n  // Original text: 'Share'\n  vmShareButton: undefined,\n\n  // Original text: \"Xen settings\"\n  xenSettingsLabel: 'Конфигурация Xen',\n\n  // Original text: \"Guest OS\"\n  guestOsLabel: 'Гостевая ОС',\n\n  // Original text: \"Misc\"\n  miscLabel: 'Разное',\n\n  // Original text: \"Virtualization mode\"\n  virtualizationMode: 'Режим виртуализации',\n\n  // Original text: 'Start delay (seconds)'\n  startDelayLabel: undefined,\n\n  // Original text: 'CPU mask'\n  cpuMaskLabel: undefined,\n\n  // Original text: 'Select core(s)…'\n  selectCpuMask: undefined,\n\n  // Original text: \"CPU weight\"\n  cpuWeightLabel: 'Приоритизация CPU',\n\n  // Original text: \"Default ({value, number})\"\n  defaultCpuWeight: 'По умолчанию ({value, number})',\n\n  // Original text: 'CPU cap'\n  cpuCapLabel: undefined,\n\n  // Original text: \"Default ({value, number})\"\n  defaultCpuCap: 'По умолчанию ({value, number})',\n\n  // Original text: 'PV args'\n  pvArgsLabel: undefined,\n\n  // Original text: 'Management agent version'\n  managementAgentVersion: undefined,\n\n  // Original text: \"OS name\"\n  osName: 'Имя ОС',\n\n  // Original text: \"OS kernel\"\n  osKernel: 'Ядро ОС',\n\n  // Original text: \"Auto power on\"\n  autoPowerOn: 'Автозапуск',\n\n  // Original text: 'Protect from accidental deletion'\n  protectFromDeletion: undefined,\n\n  // Original text: 'Protect from accidental shutdown'\n  protectFromShutdown: undefined,\n\n  // Original text: \"HA\"\n  ha: 'Высокая доступность',\n\n  // Original text: 'SR used for High Availability'\n  srHaTooltip: undefined,\n\n  // Original text: 'Nested virtualization'\n  nestedVirt: undefined,\n\n  // Original text: 'Affinity host'\n  vmAffinityHost: undefined,\n\n  // Original text: 'The VM needs to be halted'\n  vmNeedToBeHalted: undefined,\n\n  // Original text: 'VGA'\n  vmVga: undefined,\n\n  // Original text: 'Video RAM'\n  vmVideoram: undefined,\n\n  // Original text: 'NIC type'\n  vmNicType: undefined,\n\n  // Original text: 'VTPM'\n  vtpm: undefined,\n\n  // Original text: 'A UEFI boot firmware is necessary to use a VTPM'\n  vtpmRequireUefi: undefined,\n\n  // Original text: 'None'\n  noAffinityHost: undefined,\n\n  // Original text: \"Original template\"\n  originalTemplate: 'Оригинальный шаблон',\n\n  // Original text: \"Unknown\"\n  unknownOsName: 'Неизвестно',\n\n  // Original text: \"Unknown\"\n  unknownOsKernel: 'Неизвестно',\n\n  // Original text: \"Unknown\"\n  unknownOriginalTemplate: 'Неизвестно',\n\n  // Original text: \"VM limits\"\n  vmLimitsLabel: 'Ограничения ВМ',\n\n  // Original text: 'Resource set'\n  resourceSet: undefined,\n\n  // Original text: 'None'\n  resourceSetNone: undefined,\n\n  // Original text: 'Select user'\n  selectUser: undefined,\n\n  // Original text: 'Suspend SR'\n  suspendSr: undefined,\n\n  // Original text: 'Viridian'\n  viridian: undefined,\n\n  // Original text: \"CPU limits\"\n  vmCpuLimitsLabel: 'Ограничение CPU',\n\n  // Original text: \"Topology\"\n  vmCpuTopology: 'Топология',\n\n  // Original text: \"Default behavior\"\n  vmChooseCoresPerSocket: 'Поведение по умолчанию',\n\n  // Original text: '{nSockets, number} socket{nSockets, plural, one {} other {s}} with {nCores, number} core{nCores, plural, one {} other {s}} per socket'\n  vmSocketsWithCoresPerSocket: undefined,\n\n  // Original text: 'None'\n  vmCoresPerSocketNone: undefined,\n\n  // Original text: '{nCores, number} core{nCores, plural, one {} other {s}} per socket'\n  vmCoresPerSocket: undefined,\n\n  // Original text: \"Not a divisor of the VM's max CPUs\"\n  vmCoresPerSocketNotDivisor: undefined,\n\n  // Original text: 'The selected value exceeds the cores limit ({maxCores, number})'\n  vmCoresPerSocketExceedsCoresLimit: undefined,\n\n  // Original text: 'The selected value exceeds the sockets limit ({maxSockets, number})'\n  vmCoresPerSocketExceedsSocketsLimit: undefined,\n\n  // Original text: 'Disabled'\n  vmHaDisabled: undefined,\n\n  // Original text: \"Memory limits (min/max)\"\n  vmMemoryLimitsLabel: 'Ограничение памяти (min/max)',\n\n  // Original text: 'VM UUID'\n  vmUuid: undefined,\n\n  // Original text: 'vGPU'\n  vmVgpu: undefined,\n\n  // Original text: 'GPUs'\n  vmVgpus: undefined,\n\n  // Original text: 'None'\n  vmVgpuNone: undefined,\n\n  // Original text: 'Add vGPU'\n  vmAddVgpu: undefined,\n\n  // Original text: 'Select vGPU type'\n  vmSelectVgpuType: undefined,\n\n  // Original text: 'ACLs'\n  vmAcls: undefined,\n\n  // Original text: 'Add ACLs'\n  vmAddAcls: undefined,\n\n  // Original text: 'Failed to add ACL(s)'\n  addAclsErrorTitle: undefined,\n\n  // Original text: 'User(s)/group(s) and role are required.'\n  addAclsErrorMessage: undefined,\n\n  // Original text: 'Create VUSB'\n  createVusb: undefined,\n\n  // Original text: 'Delete'\n  removeAcl: undefined,\n\n  // Original text: '{nAcls, number} more…'\n  moreAcls: undefined,\n\n  // Original text: 'PUSB description'\n  pusbDescription: undefined,\n\n  // Original text: 'PUSB speed'\n  pusbSpeed: undefined,\n\n  // Original text: 'PUSB version'\n  pusbVersion: undefined,\n\n  // Original text: 'Select PUSB'\n  selectPusb: undefined,\n\n  // Original text: 'Boot firmware'\n  vmBootFirmware: undefined,\n\n  // Original text: 'VM creator'\n  vmCreator: undefined,\n\n  // Original text: 'default (bios)'\n  vmDefaultBootFirmwareLabel: undefined,\n\n  // Original text: \"You're about to change your boot firmware. This is still experimental in CH/XCP-ng 8.0. Are you sure you want to continue?\"\n  vmBootFirmwareWarningMessage: undefined,\n\n  // Original text: 'Error on restarting and setting the VM: {vm}'\n  setAndRestartVmFailed: undefined,\n\n  // Original text: 'VM is currently running'\n  vmEditAndRestartModalTitle: undefined,\n\n  // Original text: 'This VM is currently running, and needs to be stopped to modify this value. Restart VM and modify this value?'\n  vmEditAndRestartModalMessage: undefined,\n\n  // Original text: 'Firmware not supported'\n  firmwareNotSupported: undefined,\n\n  // Original text: 'VUSBs'\n  vusbs: undefined,\n\n  // Original text: 'The VUSB remain unplugged until the next shutdown/start'\n  vusbRemainUnplugged: undefined,\n\n  // Original text: 'Unplug until the next shutdown/start'\n  vusbUnplugTooltip: undefined,\n\n  // Original text: \"Long click to add a name\"\n  vmHomeNamePlaceholder: 'Длительное нажатие для добавления имени',\n\n  // Original text: \"Long click to add a description\"\n  vmHomeDescriptionPlaceholder: 'Длительное нажатие для добавления описания',\n\n  // Original text: 'Copy to template'\n  copyToTemplate: undefined,\n\n  // Original text: 'Are you sure you want to copy this snapshot to a template?'\n  copyToTemplateMessage: undefined,\n\n  // Original text: \"Click to add a name\"\n  templateHomeNamePlaceholder: 'Нажать для добавления имени',\n\n  // Original text: \"Click to add a description\"\n  templateHomeDescriptionPlaceholder: 'Нажать для добавления описания',\n\n  // Original text: \"Delete template\"\n  templateDelete: 'Удалить шаблон',\n\n  // Original text: \"Delete VM template{templates, plural, one {} other {s}}\"\n  templateDeleteModalTitle: 'Удалить шаблон VM {templates, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to delete {templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?\"\n  templateDeleteModalBody:\n    'Вы уверены, что хотите удалить{templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?',\n\n  // Original text: 'Delete template{nTemplates, plural, one {} other {s}} failed'\n  failedToDeleteTemplatesTitle: undefined,\n\n  // Original text: 'Failed to delete {nTemplates, number} template{nTemplates, plural, one {} other {s}}.'\n  failedToDeleteTemplatesMessage: undefined,\n\n  // Original text: 'Delete default template{nDefaultTemplates, plural, one {} other {s}}'\n  deleteDefaultTemplatesTitle: undefined,\n\n  // Original text: 'You are attempting to delete {nDefaultTemplates, number} default template{nDefaultTemplates, plural, one {} other {s}}. Do you want to continue?'\n  deleteDefaultTemplatesMessage: undefined,\n\n  // Original text: 'Delete protected template{nProtectedTemplates, plural, one {} other {s}}'\n  deleteProtectedTemplatesTitle: undefined,\n\n  // Original text: 'You are attempting to delete {nProtectedTemplates, plural, one {a} other {nProtectedTemplates}} template{nProtectedTemplates, plural, one {} other {s}} protected from accidental deletion. Do you want to continue?'\n  deleteProtectedTemplatesMessage: undefined,\n\n  // Original text: \"Pool{pools, plural, one {} other {s}}\"\n  poolPanel: 'Пул{pools, plural, one {} other {s}}',\n\n  // Original text: \"Host{hosts, plural, one {} other {s}}\"\n  hostPanel: 'Хост{hosts, plural, one {} other {s}}',\n\n  // Original text: \"VM{vms, plural, one {} other {s}}\"\n  vmPanel: 'ВМ{vms, plural, one {} other {s}}',\n\n  // Original text: \"RAM Usage:\"\n  memoryStatePanel: 'Использование памяти',\n\n  // Original text: 'Used Memory'\n  usedMemory: undefined,\n\n  // Original text: 'Total Memory'\n  totalMemory: undefined,\n\n  // Original text: 'CPUs Total'\n  totalCpus: undefined,\n\n  // Original text: 'Used vCPUs'\n  usedVCpus: undefined,\n\n  // Original text: 'Used Space'\n  usedSpace: undefined,\n\n  // Original text: 'Total Space'\n  totalSpace: undefined,\n\n  // Original text: \"CPUs Usage\"\n  cpuStatePanel: 'Использование CPU',\n\n  // Original text: \"VMs Power state\"\n  vmStatePanel: 'Состояние питания ВМ',\n\n  // Original text: 'Halted'\n  vmStateHalted: undefined,\n\n  // Original text: 'Other'\n  vmStateOther: undefined,\n\n  // Original text: 'Running'\n  vmStateRunning: undefined,\n\n  // Original text: 'All'\n  vmStateAll: undefined,\n\n  // Original text: \"Pending tasks\"\n  taskStatePanel: 'Отложенные задачи',\n\n  // Original text: \"Users\"\n  usersStatePanel: 'Пользователи',\n\n  // Original text: \"Storage state\"\n  srStatePanel: 'Состояние хранилища',\n\n  // Original text: '{usage} (of {total})'\n  ofUsage: undefined,\n\n  // Original text: '{nVcpus, number} vCPU{nVcpus, plural, one {} other {s}} (of {nCpus, number} CPU{nCpus, plural, one {} other {s}})'\n  ofCpusUsage: undefined,\n\n  // Original text: \"No storage\"\n  noSrs: 'Нет хранилища',\n\n  // Original text: \"Name\"\n  srName: 'Имя',\n\n  // Original text: \"Pool\"\n  srPool: 'Пул',\n\n  // Original text: \"Host\"\n  srHost: 'Хост',\n\n  // Original text: \"Type\"\n  srFormat: 'Тип',\n\n  // Original text: \"Size\"\n  srSize: 'Размер',\n\n  // Original text: \"Usage\"\n  srUsage: 'Используется',\n\n  // Original text: \"used\"\n  srUsed: 'используется',\n\n  // Original text: \"free\"\n  srFree: 'свободно',\n\n  // Original text: \"Storage Usage\"\n  srUsageStatePanel: 'Использование хранилища',\n\n  // Original text: \"Top 5 SR Usage (in %)\"\n  srTopUsageStatePanel: 'Топ 5 SR по использованию (в %)',\n\n  // Original text: 'Not enough permissions!'\n  notEnoughPermissionsError: undefined,\n\n  // Original text: '{running, number} running ({halted, number} halted)'\n  vmsStates: undefined,\n\n  // Original text: \"Clear selection\"\n  dashboardStatsButtonRemoveAll: 'Сбросить выделение',\n\n  // Original text: \"Add all hosts\"\n  dashboardStatsButtonAddAllHost: 'Добавить все хосты',\n\n  // Original text: \"Add all VMs\"\n  dashboardStatsButtonAddAllVM: 'Добавить все ВМ',\n\n  // Original text: 'Send report'\n  dashboardSendReport: undefined,\n\n  // Original text: 'Report'\n  dashboardReport: undefined,\n\n  // Original text: 'This will send a usage report to your configured emails.'\n  dashboardSendReportMessage: undefined,\n\n  // Original text: 'The usage report and transport email plugins need to be loaded!'\n  dashboardSendReportInfo: undefined,\n\n  // Original text: '{value} {date, date, medium}'\n  weekHeatmapData: undefined,\n\n  // Original text: \"No data.\"\n  weekHeatmapNoData: 'Нет данных.',\n\n  // Original text: \"Weekly Heatmap\"\n  weeklyHeatmap: 'Недельная тепловая карта',\n\n  // Original text: \"Weekly Charts\"\n  weeklyCharts: 'Недельные диаграммы',\n\n  // Original text: \"Synchronize scale:\"\n  weeklyChartsScaleInfo: 'Синхронизировать масштаб:',\n\n  // Original text: \"Stats error\"\n  statsDashboardGenericErrorTitle: 'Ошибка статистики',\n\n  // Original text: \"There is no stats available for:\"\n  statsDashboardGenericErrorMessage: 'Нет статистики для:',\n\n  // Original text: \"No selected metric\"\n  noSelectedMetric: 'Метрика не выбрана',\n\n  // Original text: \"Select\"\n  statsDashboardSelectObjects: 'Выбор',\n\n  // Original text: \"Loading…\"\n  metricsLoading: 'Загрузка…',\n\n  // Original text: 'Length: {length}'\n  length: undefined,\n\n  // Original text: 'Delete backup{nBackups, plural, one {} other {s}}'\n  deleteBackups: undefined,\n\n  // Original text: 'Are you sure you want to delete {nBackups, number} backup{nBackups, plural, one {} other {s}}?'\n  deleteBackupsMessage: undefined,\n\n  // Original text: 'Detached backups'\n  detachedBackups: undefined,\n\n  // Original text: 'Detached VM snapshots'\n  detachedVmSnapshots: undefined,\n\n  // Original text: 'Duplicated MAC addresses'\n  duplicatedMacAddresses: undefined,\n\n  // Original text: 'Local default SRs'\n  localDefaultSrs: undefined,\n\n  // Original text: \"It is usually recommended for a pool's default SR to be shared to avoid unexpected behaviors\"\n  localDefaultSrsStatusTip: undefined,\n\n  // Original text: 'Missing job'\n  missingJob: undefined,\n\n  // Original text: 'Missing VM'\n  missingVm: undefined,\n\n  // Original text: 'This VM does not belong to this job'\n  missingVmInJob: undefined,\n\n  // Original text: 'Missing schedule'\n  missingSchedule: undefined,\n\n  // Original text: 'No backups'\n  noDetachedBackups: undefined,\n\n  // Original text: 'No duplicated MAC addresses'\n  noDuplicatedMacAddresses: undefined,\n\n  // Original text: 'Reason'\n  reason: undefined,\n\n  // Original text: 'Orphan VDIs'\n  orphanedVdis: undefined,\n\n  // Original text: 'VDIs and VDI snapshots that are not attached to a VM'\n  orphanVdisTip: undefined,\n\n  // Original text: 'Orphaned VMs snapshot'\n  orphanedVms: undefined,\n\n  // Original text: 'No orphans'\n  noOrphanedObject: undefined,\n\n  // Original text: 'Pools with no default SR'\n  poolsWithNoDefaultSr: undefined,\n\n  // Original text: 'Too many snapshots'\n  tooManySnapshots: undefined,\n\n  // Original text: 'VMs with more than the recommended amount of snapshots'\n  tooManySnapshotsTip: undefined,\n\n  // Original text: 'No local default SRs'\n  noLocalDefaultSrs: undefined,\n\n  // Original text: 'No VMs with too many snapshots'\n  noTooManySnapshotsObject: undefined,\n\n  // Original text: 'Number of snapshots'\n  numberOfSnapshots: undefined,\n\n  // Original text: 'Guest Tools status'\n  guestToolStatus: undefined,\n\n  // Original text: 'VMs with missing or outdated guest tools'\n  guestToolStatusTip: undefined,\n\n  // Original text: 'All running VMs have up to date guest tools'\n  noGuestToolStatusObject: undefined,\n\n  // Original text: 'Status'\n  guestToolStatusColumn: undefined,\n\n  // Original text: 'Delete orphaned snapshot VDI'\n  deleteOrphanedVdi: undefined,\n\n  // Original text: 'Delete selected orphaned snapshot VDIs'\n  deleteSelectedOrphanedVdis: undefined,\n\n  // Original text: \"VDIs attached to Control Domain\"\n  vdisOnControlDomain: 'VDI подключенные к Управляющему Домену',\n\n  // Original text: 'VIF #{vifDevice, number} on {vm} ({network})'\n  vifOnVmWithNetwork: undefined,\n\n  // Original text: 'VIFs'\n  vifs: undefined,\n\n  // Original text: \"Name\"\n  vmNameLabel: 'Имя',\n\n  // Original text: \"Description\"\n  vmNameDescription: 'Описание',\n\n  // Original text: 'Resident on'\n  vmContainer: undefined,\n\n  // Original text: 'Snapshot of'\n  snapshotOf: undefined,\n\n  // Original text: 'Legacy backups snapshots'\n  legacySnapshots: undefined,\n\n  // Original text: \"Alarms\"\n  alarmMessage: 'Предупреждения',\n\n  // Original text: \"No alarms\"\n  noAlarms: 'Нет предупреждений',\n\n  // Original text: \"Date\"\n  alarmDate: 'Дата',\n\n  // Original text: 'Content'\n  alarmContent: undefined,\n\n  // Original text: 'Issue on'\n  alarmObject: undefined,\n\n  // Original text: \"Pool\"\n  alarmPool: 'Пул',\n\n  // Original text: '{used}% used ({free} left)'\n  spaceLeftTooltip: undefined,\n\n  // Original text: 'Unhealthy VDIs'\n  unhealthyVdis: undefined,\n\n  // Original text: 'VDIs to coalesce'\n  vdisToCoalesce: undefined,\n\n  // Original text: 'VDIs with invalid parent VHD'\n  vdisWithInvalidVhdParent: undefined,\n\n  // Original text: 'This SR has {nVdis, number} VDI{nVdis, plural, one {} other {s}} to coalesce'\n  srVdisToCoalesceWarning: undefined,\n\n  // Original text: 'Create VM'\n  createVmModalTitle: undefined,\n\n  // Original text: \"You're about to use a large amount of resources available on the resource set. Are you sure you want to continue?\"\n  createVmModalWarningMessage: undefined,\n\n  // Original text: 'Copy host BIOS strings to VM'\n  copyHostBiosStrings: undefined,\n\n  // Original text: 'Enable VTPM'\n  enableVtpm: undefined,\n\n  // Original text: \"Create a new VM on {select}\"\n  newVmCreateNewVmOn: 'Создать новую ВМ на {select}',\n\n  // Original text: \"You have no permission to create a VM\"\n  newVmCreateNewVmNoPermission: 'У вас нет разрешений для создания ВМ',\n\n  // Original text: \"Info\"\n  newVmInfoPanel: 'Информация',\n\n  // Original text: \"Name\"\n  newVmNameLabel: 'Имя',\n\n  // Original text: \"Template\"\n  newVmTemplateLabel: 'Шаблон',\n\n  // Original text: \"Description\"\n  newVmDescriptionLabel: 'Описание',\n\n  // Original text: \"Performance\"\n  newVmPerfPanel: 'Производительность',\n\n  // Original text: 'vCPUs'\n  newVmVcpusLabel: undefined,\n\n  // Original text: \"RAM\"\n  newVmRamLabel: 'Память',\n\n  // Original text: 'The memory is below the threshold ({threshold})'\n  newVmRamWarning: undefined,\n\n  // Original text: 'Static memory max'\n  newVmStaticMaxLabel: undefined,\n\n  // Original text: 'Dynamic memory min'\n  newVmDynamicMinLabel: undefined,\n\n  // Original text: 'Dynamic memory max'\n  newVmDynamicMaxLabel: undefined,\n\n  // Original text: \"Install settings\"\n  newVmInstallSettingsPanel: 'Варианты установки',\n\n  // Original text: 'ISO/DVD'\n  newVmIsoDvdLabel: undefined,\n\n  // Original text: \"Network\"\n  newVmNetworkLabel: 'Сеть',\n\n  // Original text: 'e.g: http://httpredir.debian.org/debian'\n  newVmInstallNetworkPlaceHolder: undefined,\n\n  // Original text: \"PV Args\"\n  newVmPvArgsLabel: 'Детали PV',\n\n  // Original text: 'PXE'\n  newVmPxeLabel: undefined,\n\n  // Original text: \"Interfaces\"\n  newVmInterfacesPanel: 'Интерфейсы',\n\n  // Original text: 'MAC'\n  newVmMacLabel: undefined,\n\n  // Original text: \"Add interface\"\n  newVmAddInterface: 'Добавить интерфейс',\n\n  // Original text: \"Disks\"\n  newVmDisksPanel: 'Диски',\n\n  // Original text: 'SR'\n  newVmSrLabel: undefined,\n\n  // Original text: \"Size\"\n  newVmSizeLabel: 'Размер',\n\n  // Original text: \"Add disk\"\n  newVmAddDisk: 'Добавить диск',\n\n  // Original text: 'Summary'\n  newVmSummaryPanel: undefined,\n\n  // Original text: \"Create\"\n  newVmCreate: 'Создать',\n\n  // Original text: \"Reset\"\n  newVmReset: 'Сбросить',\n\n  // Original text: \"Select template\"\n  newVmSelectTemplate: 'Выбрать шаблон',\n\n  // Original text: \"SSH key\"\n  newVmSshKey: 'SSH ключ',\n\n  // Original text: 'No config drive'\n  noConfigDrive: undefined,\n\n  // Original text: \"Custom config\"\n  newVmCustomConfig: 'Пользовательские настройки',\n\n  // Original text: 'Click here to see the available template variables'\n  availableTemplateVarsInfo: undefined,\n\n  // Original text: 'Available template variables'\n  availableTemplateVarsTitle: undefined,\n\n  // Original text: 'the VM\\'s name. It must not contain \"_\"'\n  templateNameInfo: undefined,\n\n  // Original text: \"the VM's index, it will take 0 in case of single VM\"\n  templateIndexInfo: undefined,\n\n  // Original text: 'Tip: escape any variable with a preceding backslash (\\\\)'\n  templateEscape: undefined,\n\n  // Original text: 'Error on getting the default coreOS cloud template'\n  coreOsDefaultTemplateError: undefined,\n\n  // Original text: \"Boot VM after creation\"\n  newVmBootAfterCreate: 'Запустить ВМ после создания',\n\n  // Original text: \"Auto-generated if empty\"\n  newVmMacPlaceholder: 'Создается автоматически, если оставить пустым',\n\n  // Original text: \"CPU weight\"\n  newVmCpuWeightLabel: 'Приоритизация CPU',\n\n  // Original text: 'Default: {value, number}'\n  newVmDefaultCpuWeight: undefined,\n\n  // Original text: 'CPU cap'\n  newVmCpuCapLabel: undefined,\n\n  // Original text: 'Default: {value, number}'\n  newVmDefaultCpuCap: undefined,\n\n  // Original text: \"Cloud config\"\n  newVmCloudConfig: 'Облачная конфигурация',\n\n  // Original text: \"Create VMs\"\n  newVmCreateVms: 'Создать виртуальные машины',\n\n  // Original text: \"Are you sure you want to create {nbVms, number} VMs?\"\n  newVmCreateVmsConfirm: 'Вы уверены, что хотите создать {nbVms, number} виртуальные машины?',\n\n  // Original text: \"Multiple VMs:\"\n  newVmMultipleVms: 'Несколько ВМ:',\n\n  // Original text: 'Name pattern:'\n  newVmMultipleVmsPattern: undefined,\n\n  // Original text: 'e.g.: \\\\{name\\\\}_%'\n  newVmMultipleVmsPatternPlaceholder: undefined,\n\n  // Original text: 'First index:'\n  newVmFirstIndex: undefined,\n\n  // Original text: 'Recalculate VMs number'\n  newVmNumberRecalculate: undefined,\n\n  // Original text: 'Refresh VMs name'\n  newVmNameRefresh: undefined,\n\n  // Original text: 'Affinity host'\n  newVmAffinityHost: undefined,\n\n  // Original text: 'Advanced'\n  newVmAdvancedPanel: undefined,\n\n  // Original text: 'Show advanced settings'\n  newVmShowAdvanced: undefined,\n\n  // Original text: 'Hide advanced settings'\n  newVmHideAdvanced: undefined,\n\n  // Original text: 'Share this VM'\n  newVmShare: undefined,\n\n  // Original text: 'The SRs must either be on the same host or shared'\n  newVmSrsNotOnSameHost: undefined,\n\n  // Original text: 'Network config'\n  newVmNetworkConfigLabel: undefined,\n\n  // Original text: 'Network configuration is only compatible with the {noCloudDatasourceLink}.'\n  newVmNetworkConfigInfo: undefined,\n\n  // Original text: 'See {networkConfigDocLink}.'\n  newVmNetworkConfigDocLink: undefined,\n\n  // Original text: 'Click here to get more information about network config'\n  newVmNetworkConfigTooltip: undefined,\n\n  // Original text: 'User config'\n  newVmUserConfigLabel: undefined,\n\n  // Original text: 'NoCloud datasource'\n  newVmNoCloudDatasource: undefined,\n\n  // Original text: 'Network config documentation'\n  newVmNetworkConfigDoc: undefined,\n\n  // Original text: 'The template already contains the BIOS strings'\n  templateHasBiosStrings: undefined,\n\n  // Original text: 'Click for more information about Guest UEFI Secure Boot.'\n  secureBootLinkToDocumentationMessage: undefined,\n\n  // Original text: 'This pool has not yet been setup for Guest UEFI Secure Boot. Click for more information.'\n  secureBootNotSetup: undefined,\n\n  // Original text: 'See VTPM documentation'\n  seeVtpmDocumentation: undefined,\n\n  // Original text: 'The boot firmware is UEFI'\n  vmBootFirmwareIsUefi: undefined,\n\n  // Original text: 'Destroy cloud config drive after first boot'\n  destroyCloudConfigVdiAfterBoot: undefined,\n\n  // Original text: 'VTPM is only supported on pools running XCP-ng/XS 8.3 or later.'\n  vtpmNotSupported: undefined,\n\n  // Original text: 'This template requires a VTPM, if you proceed, the VM will likely not be able to boot.'\n  warningVtpmRequired: undefined,\n\n  // Original text: \"Resource sets\"\n  resourceSets: 'Набор ресурсов',\n\n  // Original text: \"No resource sets.\"\n  noResourceSets: 'Набор ресурсов не определен',\n\n  // Original text: \"Resource set name\"\n  resourceSetName: 'Имя набора ресурсов',\n\n  // Original text: 'Users'\n  resourceSetUsers: undefined,\n\n  // Original text: 'Pools'\n  resourceSetPools: undefined,\n\n  // Original text: 'Templates'\n  resourceSetTemplates: undefined,\n\n  // Original text: 'SRs'\n  resourceSetSrs: undefined,\n\n  // Original text: 'Networks'\n  resourceSetNetworks: undefined,\n\n  // Original text: 'Recompute all limits'\n  recomputeResourceSets: undefined,\n\n  // Original text: \"Save\"\n  saveResourceSet: 'Сохранить',\n\n  // Original text: \"Reset\"\n  resetResourceSet: 'Сбросить',\n\n  // Original text: \"Edit\"\n  editResourceSet: 'Изменить',\n\n  // Original text: 'Default tags'\n  defaultTags: undefined,\n\n  // Original text: \"Delete\"\n  deleteResourceSet: 'Удалить',\n\n  // Original text: \"Delete resource set\"\n  deleteResourceSetWarning: 'Удалить набор ресурсов',\n\n  // Original text: \"Are you sure you want to delete this resource set?\"\n  deleteResourceSetQuestion: 'Вы уверены, что хотите удалить этот набор ресурсов?',\n\n  // Original text: \"Missing objects:\"\n  resourceSetMissingObjects: 'Объект не найден:',\n\n  // Original text: \"Unknown\"\n  unknownResourceSetValue: 'Неизвестно',\n\n  // Original text: \"Available hosts\"\n  availableHosts: 'Доступные хосты',\n\n  // Original text: \"Excluded hosts\"\n  excludedHosts: 'Исключенные хосты',\n\n  // Original text: \"No hosts available.\"\n  noHostsAvailable: 'Нет доступных хостов',\n\n  // Original text: \"VMs created from this resource set shall run on the following hosts.\"\n  availableHostsDescription:\n    'Виртуальные машины, созданные из этого набора ресурсов, должны работать на следующих хостах.',\n\n  // Original text: \"Maximum CPUs\"\n  maxCpus: 'Максимум CPUs',\n\n  // Original text: \"Maximum RAM\"\n  maxRam: 'Максимум памяти (GiB)',\n\n  // Original text: \"Maximum disk space\"\n  maxDiskSpace: 'Максимум дискового пространства',\n\n  // Original text: 'IP pool'\n  ipPool: undefined,\n\n  // Original text: 'Quantity'\n  quantity: undefined,\n\n  // Original text: 'Used'\n  usedResourceLabel: undefined,\n\n  // Original text: 'Available'\n  availableResourceLabel: undefined,\n\n  // Original text: 'Used: {usage} (Total: {total})'\n  resourceSetQuota: undefined,\n\n  // Original text: 'New'\n  resourceSetNew: undefined,\n\n  // Original text: 'Share VMs by default'\n  shareVmsByDefault: undefined,\n\n  // Original text: '{nVms, number} VM{nVms, plural, one {} other {s}} belong{nVms, plural, one {s} other {}} to this Resource Set'\n  nVmsInResourceSet: undefined,\n\n  // Original text: 'Used: {usage}'\n  unlimitedResourceSetUsage: undefined,\n\n  // Original text: 'File type:'\n  fileType: undefined,\n\n  // Original text: 'Firmware'\n  firmware: undefined,\n\n  // Original text: 'From URL'\n  fromUrl: undefined,\n\n  // Original text: 'URL import is only compatible with ISO SRs'\n  UrlImportSrsCompatible: undefined,\n\n  // Original text: 'From VMware'\n  fromVmware: undefined,\n\n  // Original text: \"Drop OVA or XVA files here to import Virtual Machines.\"\n  importVmsList:\n    'Перетащите сюда несколько файлов виртуальных машин или нажмите, чтобы выбрать виртуальные машины для загрузки. Работает только с файлами .xva/.ova.',\n\n  // Original text: \"No selected VMs.\"\n  noSelectedVms: 'Нет выбранных ВМ',\n\n  // Original text: 'No tools installed'\n  noToolsInstalled: undefined,\n\n  // Original text: 'URL:'\n  url: undefined,\n\n  // Original text: \"To Pool:\"\n  vmImportToPool: 'В пул:',\n\n  // Original text: \"To SR:\"\n  vmImportToSr: 'В SR:',\n\n  // Original text: \"VM{nVms, plural, one {} other {s}} to import\"\n  vmsToImport: 'ВМ для импорта',\n\n  // Original text: 'Remote used to store temporary disk files(VSAN migration)'\n  workDirLabel: undefined,\n\n  // Original text: \"Reset\"\n  importVmsCleanList: 'Сбросить',\n\n  // Original text: \"VM import success\"\n  vmImportSuccess: 'Импорт ВМ выполнен успешно',\n\n  // Original text: \"VM import failed\"\n  vmImportFailed: 'Ошибка импорта ВМ',\n\n  // Original text: 'VDI import success'\n  vdiImportSuccess: undefined,\n\n  // Original text: 'VDI import failed'\n  vdiImportFailed: undefined,\n\n  // Original text: 'Error on setting the VM: {vm}'\n  setVmFailed: undefined,\n\n  // Original text: \"Import starting…\"\n  startVmImport: 'Импорт начался…',\n\n  // Original text: 'VDI import starting…'\n  startVdiImport: undefined,\n\n  // Original text: \"Export starting…\"\n  startVmExport: 'Экспорт начался…',\n\n  // Original text: 'VDI export starting…'\n  startVdiExport: undefined,\n\n  // Original text: \"Number of CPUs\"\n  nCpus: 'Количество CPUs',\n\n  // Original text: \"Memory\"\n  vmMemory: 'Память',\n\n  // Original text: 'Disk {position} ({capacity})'\n  diskInfo: undefined,\n\n  // Original text: \"Disk description\"\n  diskDescription: 'Описание диска',\n\n  // Original text: \"No disks.\"\n  noDisks: 'Нет дисков',\n\n  // Original text: \"No networks.\"\n  noNetworks: 'Нет сетей',\n\n  // Original text: \"Network {name}\"\n  networkInfo: 'Сеть {name}',\n\n  // Original text: \"No description available\"\n  noVmImportErrorDescription: 'Описание недоступно',\n\n  // Original text: \"Error:\"\n  vmImportError: 'Ошибка',\n\n  // Original text: \"{type} file:\"\n  vmImportFileType: '{type} файл:',\n\n  // Original text: \"Please check and/or modify the VM configuration.\"\n  vmImportConfigAlert: 'Пожалуйста, проверьте и/или измените конфигурацию виртуальной машины.',\n\n  // Original text: 'The tools are installed'\n  toolsInstalled: undefined,\n\n  // Original text: 'Disk import failed'\n  diskImportFailed: undefined,\n\n  // Original text: 'Disk import success'\n  diskImportSuccess: undefined,\n\n  // Original text: 'Drop {types} files here to import disks.'\n  dropDisksFiles: undefined,\n\n  // Original text: 'To SR'\n  importToSr: undefined,\n\n  // Original text: 'To import ISO files, an ISO repository is required'\n  isoImportRequirement: undefined,\n\n  // Original text: 'Pool tasks'\n  poolTasks: undefined,\n\n  // Original text: 'XO tasks'\n  xoTasks: undefined,\n\n  // Original text: 'Cancel'\n  cancelTask: undefined,\n\n  // Original text: 'Destroy'\n  destroyTask: undefined,\n\n  // Original text: 'Cancel selected tasks'\n  cancelTasks: undefined,\n\n  // Original text: 'Destroy selected tasks'\n  destroyTasks: undefined,\n\n  // Original text: 'Object'\n  object: undefined,\n\n  // Original text: 'Objects'\n  objects: undefined,\n\n  // Original text: 'Pool'\n  pool: undefined,\n\n  // Original text: 'Task'\n  task: undefined,\n\n  // Original text: 'Progress'\n  progress: undefined,\n\n  // Original text: 'Previous tasks'\n  previousTasks: undefined,\n\n  // Original text: 'Last seen'\n  taskLastSeen: undefined,\n\n  // Original text: 'Schedules'\n  backupSchedules: undefined,\n\n  // Original text: '{nLoneSnapshots} lone snapshot{nLoneSnapshots, plural, one {} other {s}} to delete!'\n  loneSnapshotsMessages: undefined,\n\n  // Original text: 'Cron pattern'\n  scheduleCron: undefined,\n\n  // Original text: 'Click to display last run details'\n  scheduleLastRun: undefined,\n\n  // Original text: 'Name'\n  scheduleName: undefined,\n\n  // Original text: 'Copy ID {id}'\n  scheduleCopyId: undefined,\n\n  // Original text: 'Timezone'\n  scheduleTimezone: undefined,\n\n  // Original text: 'Backup retention'\n  scheduleExportRetention: undefined,\n\n  // Original text: 'Replication retention'\n  scheduleCopyRetention: undefined,\n\n  // Original text: 'Snapshot retention'\n  scheduleSnapshotRetention: undefined,\n\n  // Original text: 'Pool retention'\n  poolMetadataRetention: undefined,\n\n  // Original text: 'XO retention'\n  xoMetadataRetention: undefined,\n\n  // Original text: 'Get remote'\n  getRemote: undefined,\n\n  // Original text: 'There are no backups!'\n  noBackups: undefined,\n\n  // Original text: 'Click on a VM to display restore options'\n  restoreBackupsInfo: undefined,\n\n  // Original text: \"Enabled\"\n  remoteEnabled: 'Подключено',\n\n  // Original text: 'Disabled'\n  remoteDisabled: undefined,\n\n  // Original text: 'Enable'\n  enableRemote: undefined,\n\n  // Original text: 'Disable'\n  disableRemote: undefined,\n\n  // Original text: 'The URL ({url}) is invalid (colon in path). Click this button to change the URL to {newUrl}.'\n  remoteErrorMessage: undefined,\n\n  // Original text: \"VM Name\"\n  backupVmNameColumn: 'Имя ВМ',\n\n  // Original text: 'VM Description'\n  backupVmDescriptionColumn: undefined,\n\n  // Original text: 'Oldest backup'\n  firstBackupColumn: undefined,\n\n  // Original text: \"Latest backup\"\n  lastBackupColumn: 'Последняя резервная копия',\n\n  // Original text: \"Available Backups\"\n  availableBackupsColumn: 'Доступные резервные копии',\n\n  // Original text: 'Missing parameters'\n  backupRestoreErrorTitle: undefined,\n\n  // Original text: 'Choose a SR and a backup'\n  backupRestoreErrorMessage: undefined,\n\n  // Original text: 'key'\n  backupisKey: undefined,\n\n  // Original text: 'incremental'\n  backupIsIncremental: undefined,\n\n  // Original text: 'differencing'\n  backupIsDifferencing: undefined,\n\n  // Original text: 'VMs to backup'\n  vmsToBackup: undefined,\n\n  // Original text: 'Refresh backup list'\n  refreshBackupList: undefined,\n\n  // Original text: 'Restore'\n  restoreVmBackups: undefined,\n\n  // Original text: 'Restore {vm}'\n  restoreVmBackupsTitle: undefined,\n\n  // Original text: 'Restore health check {vm}'\n  checkVmBackupsTitle: undefined,\n\n  // Original text: 'Restore {nVms, number} VM{nVms, plural, one {} other {s}}'\n  restoreVmBackupsBulkTitle: undefined,\n\n  // Original text: 'Restore {nVms, number} VM{nVms, plural, one {} other {s}} from {nVms, plural, one {its} other {their}} {oldestOrLatest} backup.'\n  restoreVmBackupsBulkMessage: undefined,\n\n  // Original text: 'This operation will overwrite the host metadata. Only perform a metadata restore if it is a new server with nothing running on it.'\n  restoreMetadataBackupWarning: undefined,\n\n  // Original text: 'oldest'\n  oldest: undefined,\n\n  // Original text: 'latest'\n  latest: undefined,\n\n  // Original text: 'Start VM{nVms, plural, one {} other {s}} after restore'\n  restoreVmBackupsStart: undefined,\n\n  // Original text: 'Multi-restore error'\n  restoreVmBackupsBulkErrorTitle: undefined,\n\n  // Original text: 'Use differential restore'\n  restoreVmUseDifferentialRestore: undefined,\n\n  // Original text: 'Restore {item}'\n  restoreMetadataBackupTitle: undefined,\n\n  // Original text: 'Restore {nMetadataBackups, number} metadata backup{nMetadataBackups, plural, one {} other {s}}'\n  bulkRestoreMetadataBackupTitle: undefined,\n\n  // Original text: 'Restore {nMetadataBackups, number} metadata backup{nMetadataBackups, plural, one {} other {s}} from {nMetadataBackups, plural, one {its} other {their}} {oldestOrLatest} backup'\n  bulkRestoreMetadataBackupMessage: undefined,\n\n  // Original text: 'Delete {item} backup'\n  deleteMetadataBackupTitle: undefined,\n\n  // Original text: 'You need to select a destination SR'\n  restoreVmBackupsBulkErrorMessage: undefined,\n\n  // Original text: 'Delete backups…'\n  deleteVmBackups: undefined,\n\n  // Original text: 'Delete {vm} backups'\n  deleteVmBackupsTitle: undefined,\n\n  // Original text: 'Select backups to delete:'\n  deleteBackupsSelect: undefined,\n\n  // Original text: 'All'\n  deleteVmBackupsSelectAll: undefined,\n\n  // Original text: 'Delete backups'\n  deleteVmBackupsBulkTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete all the backups from {nVms, number} VM{nVms, plural, one {} other {s}}?'\n  deleteVmBackupsBulkMessage: undefined,\n\n  // Original text: 'delete {nBackups} backup{nBackups, plural, one {} other {s}}'\n  deleteVmBackupsBulkConfirmText: undefined,\n\n  // Original text: 'Delete metadata backups'\n  bulkDeleteMetadataBackupsTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete all the backups from {nMetadataBackups, number} metadata backup{nMetadataBackups, plural, one {} other {s}}?'\n  bulkDeleteMetadataBackupsMessage: undefined,\n\n  // Original text: 'delete {nMetadataBackups} metadata backup{nMetadataBackups, plural, one {} other {s}}'\n  bulkDeleteMetadataBackupsConfirmText: undefined,\n\n  // Original text: 'Health check'\n  healthCheck: undefined,\n\n  // Original text: 'Choose SR used for VMs restoration'\n  healthCheckChooseSr: undefined,\n\n  // Original text: 'If no tags are specified, all VMs in the backup will be tested.'\n  healthCheckTagsInfo: undefined,\n\n  // Original text: 'Only available to enterprise users'\n  healthCheckAvailableEnterpriseUser: undefined,\n\n  // Original text: \"The backup will not be run on this remote because it's not compatible with the selected proxy\"\n  remoteNotCompatibleWithSelectedProxy: undefined,\n\n  // Original text: 'Loading backups failed'\n  remoteLoadBackupsFailure: undefined,\n\n  // Original text: 'Failed to load backups from {name}.'\n  remoteLoadBackupsFailureMessage: undefined,\n\n  // Original text: 'VMs tags'\n  vmsTags: undefined,\n\n  // Original text: 'VMs with this tag will not be backed up {reason, select, null {} other {({reason})}}'\n  tagNoBak: undefined,\n\n  // Original text: 'An email will be sent when a VM with this tag is snapshotted'\n  tagNotifyOnSnapshot: undefined,\n\n  // Original text: 'Restore backup files'\n  restoreFiles: undefined,\n\n  // Original text: 'Invalid options'\n  restoreFilesError: undefined,\n\n  // Original text: 'Export format:'\n  restoreFilesExportFormat: undefined,\n\n  // Original text: 'Restore file from {name}'\n  restoreFilesFromBackup: undefined,\n\n  // Original text: 'Select a backup…'\n  restoreFilesSelectBackup: undefined,\n\n  // Original text: 'Select a disk…'\n  restoreFilesSelectDisk: undefined,\n\n  // Original text: 'Select a partition…'\n  restoreFilesSelectPartition: undefined,\n\n  // Original text: 'Select a file…'\n  restoreFilesSelectFiles: undefined,\n\n  // Original text: 'No files selected'\n  restoreFilesNoFilesSelected: undefined,\n\n  // Original text: 'Selected files/folders ({files}):'\n  restoreFilesSelectedFilesAndFolders: undefined,\n\n  // Original text: 'Error while scanning disk'\n  restoreFilesDiskError: undefined,\n\n  // Original text: \"Select all this folder's files\"\n  restoreFilesSelectAllFiles: undefined,\n\n  // Original text: 'Select this folder'\n  restoreFilesSelectFolder: undefined,\n\n  // Original text: 'tar+gzip (.tgz)'\n  restoreFilesTgz: undefined,\n\n  // Original text: 'Unselect all files'\n  restoreFilesUnselectAll: undefined,\n\n  // Original text: 'ZIP (slow)'\n  restoreFilesZip: undefined,\n\n  // Original text: 'There may be ongoing backups on the host. Are you sure you want to continue?'\n  bypassBackupHostModalMessage: undefined,\n\n  // Original text: 'There may be ongoing backups on the pool. Are you sure you want to continue?'\n  bypassBackupPoolModalMessage: undefined,\n\n  // Original text: 'Emergency shutdown Host'\n  emergencyShutdownHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to shutdown {host}?'\n  emergencyShutdownHostModalMessage: undefined,\n\n  // Original text: 'Emergency shutdown Host{nHosts, plural, one {} other {s}}'\n  emergencyShutdownHostsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to shutdown {nHosts, number} Host{nHosts, plural, one {} other {s}}?'\n  emergencyShutdownHostsModalMessage: undefined,\n\n  // Original text: 'Shutdown host'\n  stopHostModalTitle: undefined,\n\n  // Original text: \"This will shutdown your host. Do you want to continue? If it's the pool master, your connection to the pool will be lost\"\n  stopHostModalMessage: undefined,\n\n  // Original text: 'Force shutdown host'\n  forceStopHost: undefined,\n\n  // Original text: 'This will shutdown your host without evacuating its VMs. Do you want to continue?'\n  forceStopHostMessage: undefined,\n\n  // Original text: 'Add host'\n  addHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to add {host} to {pool}?'\n  addHostModalMessage: undefined,\n\n  // Original text: 'Restart host'\n  restartHostModalTitle: undefined,\n\n  // Original text: 'This will restart your host. Do you want to continue?'\n  restartHostModalMessage: undefined,\n\n  // Original text: 'Restart Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}'\n  restartHostsAgentsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?'\n  restartHostsAgentsModalMessage: undefined,\n\n  // Original text: 'Restart Host{nHosts, plural, one {} other {s}}'\n  restartHostsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}}?'\n  restartHostsModalMessage: undefined,\n\n  // Original text: 'Start VM{vms, plural, one {} other {s}}'\n  startVmsModalTitle: undefined,\n\n  // Original text: 'Start a copy'\n  cloneAndStartVM: undefined,\n\n  // Original text: 'Force start'\n  forceStartVm: undefined,\n\n  // Original text: 'Forbidden operation'\n  forceStartVmModalTitle: undefined,\n\n  // Original text: 'Start operation for this vm is blocked.'\n  blockedStartVmModalMessage: undefined,\n\n  // Original text: 'Forbidden operation start for {nVms, number} vm{nVms, plural, one {} other {s}}.'\n  blockedStartVmsModalMessage: undefined,\n\n  // Original text: \"Are you sure you want to start {vms, number} VM{vms, plural, one {} other {s}}?\"\n  startVmsModalMessage: 'Вы уверены, что хотите запустить {vms, number} ВМ{vms, plural, one {} other {s}}?',\n\n  // Original text: '{nVms, number} VM{nVms, plural, one {} other {s}} failed. Please check logs for more information'\n  failedVmsErrorMessage: undefined,\n\n  // Original text: 'Start failed'\n  failedVmsErrorTitle: undefined,\n\n  // Original text: 'Delete failed'\n  failedDeleteErrorTitle: undefined,\n\n  // Original text: 'Stop Host{nHosts, plural, one {} other {s}}'\n  stopHostsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to stop {nHosts, number} Host{nHosts, plural, one {} other {s}}?'\n  stopHostsModalMessage: undefined,\n\n  // Original text: \"Stop VM{vms, plural, one {} other {s}}\"\n  stopVmsModalTitle: 'Остановить ВМ{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to stop {vms, number} VM{vms, plural, one {} other {s}}?\"\n  stopVmsModalMessage: 'Вы уверены, что хотите остановить {vms, number} ВМ{vms, plural, one {} other {s}}?',\n\n  // Original text: 'Restart VM'\n  restartVmModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to restart {name}?'\n  restartVmModalMessage: undefined,\n\n  // Original text: 'Stop VM'\n  stopVmModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to stop {name}?'\n  stopVmModalMessage: undefined,\n\n  // Original text: 'Blocked operation'\n  blockedOperation: undefined,\n\n  // Original text: 'Stop operation for this VM is blocked. Would you like to stop it anyway?'\n  stopVmBlockedModalMessage: undefined,\n\n  // Original text: 'No guest tools'\n  vmHasNoTools: undefined,\n\n  // Original text: \"The VM doesn't have Xen tools installed, which are required to properly stop or reboot it.\"\n  vmHasNoToolsMessage: undefined,\n\n  // Original text: 'Would you like to force shutdown the VM?'\n  confirmForceShutdown: undefined,\n\n  // Original text: 'Would you like to force reboot the VM?'\n  confirmForceReboot: undefined,\n\n  // Original text: 'Suspend VM{vms, plural, one {} other {s}}'\n  suspendVmsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to suspend {vms, number} VM{vms, plural, one {} other {s}}?'\n  suspendVmsModalMessage: undefined,\n\n  // Original text: 'Pause VM{vms, plural, one {} other {s}}'\n  pauseVmsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to pause {vms, number} VM{vms, plural, one {} other {s}}?'\n  pauseVmsModalMessage: undefined,\n\n  // Original text: \"Restart VM{vms, plural, one {} other {s}}\"\n  restartVmsModalTitle: 'Перезапустить ВМ{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to restart {vms, number} VM{vms, plural, one {} other {s}}?\"\n  restartVmsModalMessage: 'Вы уверены, что хотите перезапустить {vms, number} ВМ{vms, plural, one {} other {s}}?',\n\n  // Original text: 'Restart operation for this VM is blocked. Would you like to restart it anyway?'\n  restartVmBlockedModalMessage: undefined,\n\n  // Original text: 'save memory'\n  snapshotSaveMemory: undefined,\n\n  // Original text: \"Snapshot VM{vms, plural, one {} other {s}}\"\n  snapshotVmsModalTitle: 'Снимок ВМ{vms, plural, one {} other {s}}',\n\n  // Original text: \"Delete VM{vms, plural, one {} other {s}}\"\n  deleteVmsModalTitle: 'Удалить ВМ{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to delete {vms, number} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmsModalMessage:\n    'Вы уверены, что хотите удалить {vms, number} ВМ{vms, plural, one {} other {s}}? ВСЕ ДИСКИ ВИРТУАЛЬНЫХ МАШИН БУДУТ УДАЛЕНЫ!',\n\n  // Original text: 'delete {nVms, number} vm{nVms, plural, one {} other {s}}'\n  deleteVmsConfirmText: undefined,\n\n  // Original text: \"Delete VM\"\n  deleteVmModalTitle: 'Удалить ВМ',\n\n  // Original text: \"Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmModalMessage:\n    'Вы уверены, что хотите удалить эту виртуальную машину? ВСЕ ДИСКИ ВИРТУАЛЬНОЙ МАШИНЫ БУДУТ УДАЛЕНЫ!',\n\n  // Original text: 'Blocked operation'\n  deleteVmBlockedModalTitle: undefined,\n\n  // Original text: 'Removing the VM is a blocked operation. Would you like to remove it anyway?'\n  deleteVmBlockedModalMessage: undefined,\n\n  // Original text: 'Force migration'\n  forceVmMigrateModalTitle: undefined,\n\n  // Original text: 'The VM is incompatible with the CPU features of the destination host. Would you like to force it anyway?'\n  forceVmMigrateModalMessage: undefined,\n\n  // Original text: \"Migrate VM\"\n  migrateVmModalTitle: 'Переместить ВМ',\n\n  // Original text: 'Select a destination host:'\n  migrateVmSelectHost: undefined,\n\n  // Original text: 'Select a migration network:'\n  migrateVmSelectMigrationNetwork: undefined,\n\n  // Original text: 'For each VIF, select a network:'\n  migrateVmSelectNetworks: undefined,\n\n  // Original text: 'Select a destination SR:'\n  migrateVmsSelectSr: undefined,\n\n  // Original text: 'Select a destination SR for local disks:'\n  migrateVmsSelectSrIntraPool: undefined,\n\n  // Original text: 'Select a network on which to connect each VIF:'\n  migrateVmsSelectNetwork: undefined,\n\n  // Original text: 'Smart mapping'\n  migrateVmsSmartMapping: undefined,\n\n  // Original text: 'VIF'\n  migrateVmVif: undefined,\n\n  // Original text: 'Network'\n  migrateVmNetwork: undefined,\n\n  // Original text: 'No target host'\n  migrateVmNoTargetHost: undefined,\n\n  // Original text: 'A target host is required to migrate a VM'\n  migrateVmNoTargetHostMessage: undefined,\n\n  // Original text: 'SR required'\n  migrateVmNoSr: undefined,\n\n  // Original text: 'A destination SR is required'\n  migrateVmNoSrMessage: undefined,\n\n  // Original text: 'No default SR'\n  migrateVmNoDefaultSrError: undefined,\n\n  // Original text: 'Default SR not connected to host'\n  migrateVmNotConnectedDefaultSrError: undefined,\n\n  // Original text: 'For each VDI, select an SR (optional)'\n  chooseSrForEachVdisModalSelectSr: undefined,\n\n  // Original text: 'Select main SR…'\n  chooseSrForEachVdisModalMainSr: undefined,\n\n  // Original text: 'VDI'\n  chooseSrForEachVdisModalVdiLabel: undefined,\n\n  // Original text: 'SR*'\n  chooseSrForEachVdisModalSrLabel: undefined,\n\n  // Original text: 'Delete job{nJobs, plural, one {} other {s}}'\n  deleteJobsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nJobs, number} job{nJobs, plural, one {} other {s}}?'\n  deleteJobsModalMessage: undefined,\n\n  // Original text: 'Delete VBD{nVbds, plural, one {} other {s}}'\n  deleteVbdsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nVbds, number} VBD{nVbds, plural, one {} other {s}}?'\n  deleteVbdsModalMessage: undefined,\n\n  // Original text: 'Delete VDI'\n  deleteVdiModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete this disk? ALL DATA ON THIS DISK WILL BE LOST'\n  deleteVdiModalMessage: undefined,\n\n  // Original text: 'Delete VDI{nVdis, plural, one {} other {s}}'\n  deleteVdisModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nVdis, number} disk{nVdis, plural, one {} other {s}}? ALL DATA ON THESE DISKS WILL BE LOST'\n  deleteVdisModalMessage: undefined,\n\n  // Original text: 'Delete schedule{nSchedules, plural, one {} other {s}}'\n  deleteSchedulesModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nSchedules, number} schedule{nSchedules, plural, one {} other {s}}?'\n  deleteSchedulesModalMessage: undefined,\n\n  // Original text: 'Delete remote{nRemotes, plural, one {} other {s}}'\n  deleteRemotesModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nRemotes, number} remote{nRemotes, plural, one {} other {s}}?'\n  deleteRemotesModalMessage: undefined,\n\n  // Original text: 'Revert your VM'\n  revertVmModalTitle: undefined,\n\n  // Original text: 'Share your VM'\n  shareVmInResourceSetModalTitle: undefined,\n\n  // Original text: 'This VM will be shared with all the members of the self-service {self}. Are you sure?'\n  shareVmInResourceSetModalMessage: undefined,\n\n  // Original text: 'Delete VIF{nVifs, plural, one {} other {s}}'\n  deleteVifsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nVifs, number} VIF{nVifs, plural, one {} other {s}}?'\n  deleteVifsModalMessage: undefined,\n\n  // Original text: 'Delete snapshot'\n  deleteSnapshotModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete this snapshot?'\n  deleteSnapshotModalMessage: undefined,\n\n  // Original text: 'Delete snapshot{nVms, plural, one {} other {s}}'\n  deleteSnapshotsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nVms, number} snapshot{nVms, plural, one {} other {s}}?'\n  deleteSnapshotsModalMessage: undefined,\n\n  // Original text: 'Disconnect VBD{nVbds, plural, one {} other {s}}'\n  disconnectVbdsModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to disconnect {nVbds, number} VBD{nVbds, plural, one {} other {s}}?'\n  disconnectVbdsModalMessage: undefined,\n\n  // Original text: 'Disable host'\n  disableHost: undefined,\n\n  // Original text: 'Are you sure you want to disable {host}? This will prevent new VMs from starting.'\n  disableHostModalMessage: undefined,\n\n  // Original text: 'Are you sure you want to revert this VM to the snapshot state? This operation is irreversible.'\n  revertVmModalMessage: undefined,\n\n  // Original text: 'Snapshot before'\n  revertVmModalSnapshotBefore: undefined,\n\n  // Original text: \"Select your backup…\"\n  importBackupModalSelectBackup: 'Выберите резервную копию…',\n\n  // Original text: 'Select a destination SR…'\n  importBackupModalSelectSr: undefined,\n\n  // Original text: 'Delete orphaned snapshot VDIs'\n  deleteOrphanedVdisModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nVdis, number} orphaned snapshot VDI{nVdis, plural, one {} other {s}}?'\n  deleteOrphanedVdisModalMessage: undefined,\n\n  // Original text: \"This operation is definitive.\"\n  definitiveMessageModal: 'Эта операция является окончательной',\n\n  // Original text: \"Previous LUN Usage\"\n  existingLunModalTitle: 'Предыдущее использование LUN',\n\n  // Original text: \"This LUN has been previously used as storage by a XenServer host. All data will be lost if you choose to continue with the SR creation.\"\n  existingLunModalText:\n    'Этот LUN ранее использовался хостом XenServer в качестве хранилища. Все существующие данные будут потеряны, если вы продолжите создание SR.',\n\n  // Original text: \"Replace current registration?\"\n  alreadyRegisteredModal: 'Заменить текущую регистрацию?',\n\n  // Original text: \"Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?\"\n  alreadyRegisteredModalText: 'Ваш XO уже зарегистрирован в {email}, вы хотите сменить регистрацию?',\n\n  // Original text: \"Ready for trial?\"\n  trialReadyModal: 'Готовы к пробному периоду?',\n\n  // Original text: \"During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!\"\n  trialReadyModalText:\n    'В течение пробного периода для XOA требуется подключение к Интернету. Это ограничение не распространяется на тарифные планы',\n\n  // Original text: 'Cancel task{nTasks, plural, one {} other {s}}'\n  cancelTasksModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to cancel {nTasks, number} task{nTasks, plural, one {} other {s}}?'\n  cancelTasksModalMessage: undefined,\n\n  // Original text: 'Destroy task{nTasks, plural, one {} other {s}}'\n  destroyTasksModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to destroy {nTasks, number} task{nTasks, plural, one {} other {s}}?'\n  destroyTasksModalMessage: undefined,\n\n  // Original text: 'Forget host'\n  forgetHostFromSrModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to forget this host? This will disconnect the SR from the host by removing the link between them (PBD).'\n  forgetHostFromSrModalMessage: undefined,\n\n  // Original text: 'Forget host{nPbds, plural, one {} other {s}}'\n  forgetHostsFromSrModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to forget {nPbds, number} host{nPbds, plural, one {} other {s}}? This will disconnect the SR from these hosts by removing the links between the SR and the hosts (PBDs).'\n  forgetHostsFromSrModalMessage: undefined,\n\n  // Original text: 'Forget SR'\n  forgetSrFromHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to forget this SR? This will disconnect the SR from the host by removing the link between them (PBD).'\n  forgetSrFromHostModalMessage: undefined,\n\n  // Original text: 'Forget SR{nPbds, plural, one {} other {s}}'\n  forgetSrsFromHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to forget {nPbds, number} SR{nPbds, plural, one {} other {s}}? This will disconnect the SRs from the host by removing the links between the host and the SRs (PBDs).'\n  forgetSrsFromHostModalMessage: undefined,\n\n  // Original text: '* optional'\n  optionalEntry: undefined,\n\n  // Original text: 'This VM contains a duplicate MAC address or has the same MAC address as another running VM. Do you want to continue?'\n  vmWithDuplicatedMacAddressesMessage: undefined,\n\n  // Original text: '{nVms, number} VM{nVms, plural, one {} other {s}} contain{nVms, plural, one {s} other {}} duplicate MAC addresses or {nVms, plural, one {has} other {have}} the same MAC addresses as other running VMs. Do you want to continue?'\n  vmsWithDuplicatedMacAddressesMessage: undefined,\n\n  // Original text: 'Ignore this VDI'\n  ignoreVdi: undefined,\n\n  // Original text: 'Select a destination SR'\n  selectDestinationSr: undefined,\n\n  // Original text: 'Enable server'\n  enableServerErrorTitle: undefined,\n\n  // Original text: 'Unexpected response. Please check your server address.'\n  enableServerErrorMessage: undefined,\n\n  // Original text: 'Label'\n  serverLabel: undefined,\n\n  // Original text: \"Host\"\n  serverHost: 'Хост',\n\n  // Original text: \"Username\"\n  serverUsername: 'Имя пользователя',\n\n  // Original text: \"Password\"\n  serverPassword: 'Пароль',\n\n  // Original text: \"Read Only\"\n  serverReadOnly: 'Только для чтения',\n\n  // Original text: 'Unauthorized Certificates'\n  serverUnauthorizedCertificates: undefined,\n\n  // Original text: 'Allow Unauthorized Certificates'\n  serverAllowUnauthorizedCertificates: undefined,\n\n  // Original text: \"Enable it if your certificate is rejected, but it's not recommended because your connection will not be secured.\"\n  serverUnauthorizedCertificatesInfo: undefined,\n\n  // Original text: 'username'\n  serverPlaceHolderUser: undefined,\n\n  // Original text: 'password'\n  serverPlaceHolderPassword: undefined,\n\n  // Original text: 'address[:port]'\n  serverPlaceHolderAddress: undefined,\n\n  // Original text: 'label'\n  serverPlaceHolderLabel: undefined,\n\n  // Original text: 'Connect'\n  serverConnect: undefined,\n\n  // Original text: 'Error'\n  serverError: undefined,\n\n  // Original text: 'Adding server failed'\n  serverAddFailed: undefined,\n\n  // Original text: 'Status'\n  serverStatus: undefined,\n\n  // Original text: 'Connection failed. Click for more information.'\n  serverConnectionFailed: undefined,\n\n  // Original text: 'Authentication error'\n  serverAuthFailed: undefined,\n\n  // Original text: 'Unknown error'\n  serverUnknownError: undefined,\n\n  // Original text: 'Invalid self-signed certificate'\n  serverSelfSignedCertError: undefined,\n\n  // Original text: 'Do you want to accept self-signed certificate for this server even though it would decrease security?'\n  serverSelfSignedCertQuestion: undefined,\n\n  // Original text: 'Enable'\n  serverEnable: undefined,\n\n  // Original text: 'Enabled'\n  serverEnabled: undefined,\n\n  // Original text: 'Disabled'\n  serverDisabled: undefined,\n\n  // Original text: 'Disable server'\n  serverDisable: undefined,\n\n  // Original text: ' HTTP proxy URL'\n  serverHttpProxy: undefined,\n\n  // Original text: ' HTTP proxy URL'\n  serverHttpProxyPlaceHolder: undefined,\n\n  // Original text: \"Copy VM\"\n  copyVm: 'Копировать ВМ',\n\n  // Original text: \"Name\"\n  copyVmName: 'Имя',\n\n  // Original text: 'e.g.: \"\\\\{name\\\\}_COPY\"'\n  copyVmNamePatternPlaceholder: undefined,\n\n  // Original text: \"Select SR\"\n  copyVmSelectSr: 'Выберите SR',\n\n  // Original text: 'No target SR'\n  copyVmsNoTargetSr: undefined,\n\n  // Original text: 'A target SR is required to copy a VM'\n  copyVmsNoTargetSrMessage: undefined,\n\n  // Original text: 'Zstd is not supported on {nVms, number} VM{nVms, plural, one {} other {s}}'\n  notSupportedZstdWarning: undefined,\n\n  // Original text: 'Click to see the concerned VMs'\n  notSupportedZstdTooltip: undefined,\n\n  // Original text: 'Fast clone'\n  fastCloneMode: undefined,\n\n  // Original text: 'Full copy'\n  fullCopyMode: undefined,\n\n  // Original text: 'Copy template'\n  copyTemplate: undefined,\n\n  // Original text: 'Detach host'\n  detachHostModalTitle: undefined,\n\n  // Original text: 'Are you sure you want to detach {host} from its pool? THIS WILL REMOVE ALL VMs ON ITS LOCAL STORAGE AND REBOOT THE HOST.'\n  detachHostModalMessage: undefined,\n\n  // Original text: 'Detach'\n  detachHost: undefined,\n\n  // Original text: 'Advanced Live Telemetry'\n  advancedLiveTelemetry: undefined,\n\n  // Original text: 'Netdata plugin is necessary'\n  pluginNetDataIsNecessary: undefined,\n\n  // Original text: 'Enable Advanced Live Telemetry'\n  enableAdvancedLiveTelemetry: undefined,\n\n  // Original text: 'Advanced Live Telemetry successfully enabled'\n  enableAdvancedLiveTelemetrySuccess: undefined,\n\n  // Original text: 'This feature is only XCP-ng compatible'\n  xcpOnlyFeature: undefined,\n\n  // Original text: 'Forget host'\n  forgetHostModalTitle: undefined,\n\n  // Original text: \"Are you sure you want to forget {host} from its pool? Be sure this host can't be back online, or use detach instead.\"\n  forgetHostModalMessage: undefined,\n\n  // Original text: 'Forget'\n  forgetHost: undefined,\n\n  // Original text: 'Designate a new master'\n  setPoolMasterModalTitle: undefined,\n\n  // Original text: 'This operation may take several minutes. Do you want to continue?'\n  setPoolMasterModalMessage: undefined,\n\n  // Original text: 'Management'\n  networkManagement: undefined,\n\n  // Original text: \"Create network\"\n  newNetworkCreate: 'Создать сеть',\n\n  // Original text: \"Interface\"\n  newNetworkInterface: 'Интерфейс',\n\n  // Original text: \"Name\"\n  newNetworkName: 'Имя',\n\n  // Original text: \"Description\"\n  newNetworkDescription: 'Описание',\n\n  // Original text: \"VLAN\"\n  newNetworkVlan: 'VLAN',\n\n  // Original text: \"No VLAN if empty\"\n  newNetworkDefaultVlan: 'VLAN не определён',\n\n  // Original text: 'MTU'\n  newNetworkMtu: undefined,\n\n  // Original text: \"Default: 1500\"\n  newNetworkDefaultMtu: 'По умолчанию: 1500',\n\n  // Original text: 'Bond mode'\n  newNetworkBondMode: undefined,\n\n  // Original text: 'Info'\n  newNetworkInfo: undefined,\n\n  // Original text: 'Type'\n  newNetworkType: undefined,\n\n  // Original text: 'Preferred center (optional)'\n  newNetworkPreferredCenter: undefined,\n\n  // Original text: 'Encapsulation'\n  newNetworkEncapsulation: undefined,\n\n  // Original text: 'Encrypted'\n  newNetworkEncrypted: undefined,\n\n  // Original text: 'A pool can have 1 encrypted GRE network and 1 encrypted VxLAN network max'\n  encryptionWarning: undefined,\n\n  // Original text: 'The host to try first to elect as center of the network'\n  preferredCenterTip: undefined,\n\n  // Original text: 'Please see the requirements'\n  newNetworkSdnControllerTip: undefined,\n\n  // Original text: \"Delete network\"\n  deleteNetwork: 'Удалить сеть',\n\n  // Original text: \"Are you sure you want to delete this network?\"\n  deleteNetworkConfirm: 'Вы уверены что хотите удалить эту сеть?',\n\n  // Original text: 'This network is currently in use'\n  networkInUse: undefined,\n\n  // Original text: 'Bonded'\n  pillBonded: undefined,\n\n  // Original text: 'Bonded network'\n  bondedNetwork: undefined,\n\n  // Original text: 'Private network'\n  privateNetwork: undefined,\n\n  // Original text: 'Add pool'\n  addPool: undefined,\n\n  // Original text: 'Hosts'\n  hosts: undefined,\n\n  // Original text: 'No host'\n  addHostNoHost: undefined,\n\n  // Original text: 'No host selected to be added'\n  addHostNoHostMessage: undefined,\n\n  // Original text: 'Failed to fetch latest master commit'\n  failedToFetchLatestMasterCommit: undefined,\n\n  // Original text: \"Professional support missing!\"\n  noProSupport: '\"PRO\" поддержка не предоставляется!',\n\n  // Original text: \"Want to use in production?\"\n  productionUse: 'Хотите использовать в производстве',\n\n  // Original text: 'Get pro support with the Xen Orchestra Appliance at {website}'\n  getSupport: undefined,\n\n  // Original text: \"Bug Tracker\"\n  bugTracker: 'Bug Tracker',\n\n  // Original text: \"Issues? Report it!\"\n  bugTrackerText: 'Проблема? Сообщи!',\n\n  // Original text: \"Community\"\n  community: 'Сообщество',\n\n  // Original text: \"Join our community forum!\"\n  communityText: 'Присоединяйся к форуму нашего сообщества!',\n\n  // Original text: \"Free Trial for Premium Edition!\"\n  freeTrial: 'Бесплатная пробная версия \"Premium Edition\"!',\n\n  // Original text: \"Request your trial now!\"\n  freeTrialNow: 'Запросите пробную версию прямо сейчас!',\n\n  // Original text: \"Any issue?\"\n  issues: 'Есть проблема?',\n\n  // Original text: \"Problem? Contact us!\"\n  issuesText: 'Проблема? Свяжись с нами!',\n\n  // Original text: \"Documentation\"\n  documentation: 'Документация',\n\n  // Original text: \"Read our official doc\"\n  documentationText: 'Прочтите нашу официальную документацию',\n\n  // Original text: \"Pro support included\"\n  proSupportIncluded: 'Профессиональная поддержка включена',\n\n  // Original text: \"Access your XO Account\"\n  xoAccount: 'Доступ к вашей учетной записи XO',\n\n  // Original text: \"Report a problem\"\n  openTicket: 'Сообщить о проблеме',\n\n  // Original text: \"Problem? Open a ticket!\"\n  openTicketText: 'Проблема? Открой заявку!',\n\n  // Original text: 'Your Xen Orchestra is up to date'\n  xoUpToDate: undefined,\n\n  // Original text: 'You are not up to date with master. {nBehind} commit{nBehind, plural, one {} other {s}} behind {nAhead, plural, =0 {} other {and {nAhead, number} commit{nAhead, plural, one {} other {s}} ahead}}'\n  xoFromSourceNotUpToDate: undefined,\n\n  // Original text: \"Upgrade needed\"\n  upgradeNeeded: 'Требуется обновление',\n\n  // Original text: \"Upgrade now!\"\n  upgradeNow: 'Обнови сейчас!',\n\n  // Original text: \"Or\"\n  or: 'Или',\n\n  // Original text: \"Try it for free!\"\n  tryIt: 'Попробуй бесплатно!',\n\n  // Original text: \"This feature is available starting from {plan} Edition\"\n  availableIn: 'Эта функция доступна только в {plan} Edition',\n\n  // Original text: \"This feature is not available in your version, contact your administrator to know more.\"\n  notAvailable: 'Эта функция недоступна в вашей версии, обратитесь к своему администратору, чтобы узнать больше.',\n\n  // Original text: \"Registration\"\n  registration: 'Регистрация',\n\n  // Original text: \"Settings\"\n  settings: 'Настройки',\n\n  // Original text: 'Proxy settings'\n  proxySettings: undefined,\n\n  // Original text: 'Host (myproxy.example.org)'\n  proxySettingsHostPlaceHolder: undefined,\n\n  // Original text: 'Port (eg: 3128)'\n  proxySettingsPortPlaceHolder: undefined,\n\n  // Original text: 'Username'\n  proxySettingsUsernamePlaceHolder: undefined,\n\n  // Original text: 'Password'\n  proxySettingsPasswordPlaceHolder: undefined,\n\n  // Original text: 'Your email account'\n  updateRegistrationEmailPlaceHolder: undefined,\n\n  // Original text: 'Your password'\n  updateRegistrationPasswordPlaceHolder: undefined,\n\n  // Original text: 'Troubleshooting documentation'\n  updaterTroubleshootingLink: undefined,\n\n  // Original text: \"Update\"\n  update: 'Обновить',\n\n  // Original text: 'Refresh'\n  refresh: undefined,\n\n  // Original text: \"Upgrade\"\n  upgrade: 'Обновить',\n\n  // Original text: 'Downgrade'\n  downgrade: undefined,\n\n  // Original text: \"Please consider subscribing and trying it with all the features for free during 30 days on {link}.\"\n  considerSubscribe:\n    'Пожалуйста, рассмотрите возможность подписки и попробуйте все функции бесплатно в течение 30 дней на {link}.',\n\n  // Original text: \"Current version:\"\n  currentVersion: 'Текущая версия:',\n\n  // Original text: \"Register\"\n  register: 'Регистрация',\n\n  // Original text: \"Edit registration\"\n  editRegistration: 'Изменить регистрацию',\n\n  // Original text: \"Please, take time to register in order to enjoy your trial.\"\n  trialRegistration: 'Пожалуйста, зарегистрируйтесь, чтобы испытать пробный период',\n\n  // Original text: \"Start trial\"\n  trialStartButton: 'Активировать пробный период',\n\n  // Original text: \"You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.\"\n  trialAvailableUntil:\n    'Вы можете использовать пробную версию до {date, date, medium}. Обновите свою установку Xen Orchestra, чтобы продолжить использовать все преимущества.',\n\n  // Original text: \"Your trial has been ended. Contact us or downgrade to Free version\"\n  trialConsumed: 'Ваш пробный период закончился. Свяжитесь с нами или вернитесь к бесплатной версии',\n\n  // Original text: \"Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.\"\n  trialLocked:\n    'Ваша служба xoa-updater, похоже, не работает. XOA не может работать должным образом без обращения к этой службе',\n\n  // Original text: \"No update information available\"\n  noUpdateInfo: 'Нет информации об обновлении',\n\n  // Original text: \"Update information may be available\"\n  waitingUpdateInfo: 'Информация об обновлении может быть доступна',\n\n  // Original text: \"Your XOA is up-to-date\"\n  upToDate: 'Ваш XOA обновлен до последней версии',\n\n  // Original text: \"You need to update your XOA (new version is available)\"\n  mustUpgrade: 'Вам необходимо обновить XOA (доступна новая версия)',\n\n  // Original text: \"Your XOA is not registered for updates\"\n  registerNeeded: 'Ваш XOA не зарегистрирован для получения обновлений',\n\n  // Original text: \"Can't fetch update information\"\n  updaterError: 'Не удалось получить информацию об обновлении',\n\n  // Original text: 'Upgrade successful'\n  promptUpgradeReloadTitle: undefined,\n\n  // Original text: 'Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?'\n  promptUpgradeReloadMessage: undefined,\n\n  // Original text: 'Upgrade warning'\n  upgradeWarningTitle: undefined,\n\n  // Original text: 'You have some backup jobs in progress. If you upgrade now, these jobs will be interrupted! Are you sure you want to continue?'\n  upgradeWarningMessage: undefined,\n\n  // Original text: 'Release channels'\n  releaseChannels: undefined,\n\n  // Original text: 'unlisted channel'\n  unlistedChannel: undefined,\n\n  // Original text: 'Unlisted channel name'\n  unlistedChannelName: undefined,\n\n  // Original text: 'Select channel'\n  selectChannel: undefined,\n\n  // Original text: 'Change channel'\n  changeChannel: undefined,\n\n  // Original text: 'The Web updater, the release channels and the proxy settings are available in XOA.'\n  updaterCommunity: undefined,\n\n  // Original text: 'XOA build:'\n  xoaBuild: undefined,\n\n  // Original text: \"Xen Orchestra from the sources\"\n  disclaimerTitle: 'Xen Orchestra из исходного кода',\n\n  // Original text: \"You are using XO from the sources! That's great for a personal/non-profit usage.\"\n  disclaimerText1: 'Вы используете XO из исходного кода! Отлично подходит для личного/некоммерческого использования',\n\n  // Original text: \"If you are a company, it's better to use it with our appliance + pro support included:\"\n  disclaimerText2: undefined,\n\n  // Original text: \"This version is not bundled with any support nor updates. Use it with caution.\"\n  disclaimerText3: 'Эта версия без поддержки и обновлений. Используйте с осторожностью при выполнении важных задач.',\n\n  // Original text: 'Why do I see this message?'\n  disclaimerText4: undefined,\n\n  // Original text: 'You are not registered. Your XOA may not be up to date.'\n  notRegisteredDisclaimerInfo: undefined,\n\n  // Original text: 'Click here to create an account.'\n  notRegisteredDisclaimerCreateAccount: undefined,\n\n  // Original text: 'Click here to register and update your XOA.'\n  notRegisteredDisclaimerRegister: undefined,\n\n  // Original text: \"Connect PIF\"\n  connectPif: 'Подключить PIF',\n\n  // Original text: \"Are you sure you want to connect this PIF?\"\n  connectPifConfirm: 'Вы уверены, что хотите подключить этот PIF?',\n\n  // Original text: \"Disconnect PIF\"\n  disconnectPif: 'Отключить PIF',\n\n  // Original text: \"Are you sure you want to disconnect this PIF?\"\n  disconnectPifConfirm: 'Вы уверены, что хотите отключить этот PIF?',\n\n  // Original text: \"Delete PIF\"\n  deletePif: 'Удалить PIF',\n\n  // Original text: \"Are you sure you want to delete this PIF?\"\n  deletePifConfirm: 'Вы уверены, что хотите удалить этот PIF?',\n\n  // Original text: 'Delete PIFs'\n  deletePifs: undefined,\n\n  // Original text: 'Are you sure you want to delete {nPifs, number} PIF{nPifs, plural, one {} other {s}}?'\n  deletePifsConfirm: undefined,\n\n  // Original text: 'Connected'\n  pifConnected: undefined,\n\n  // Original text: \"Disconnected\"\n  pifDisconnected: 'Отключен',\n\n  // Original text: 'Physically connected'\n  pifPhysicallyConnected: undefined,\n\n  // Original text: 'Physically disconnected'\n  pifPhysicallyDisconnected: undefined,\n\n  // Original text: 'Token'\n  authToken: undefined,\n\n  // Original text: 'Authentication tokens'\n  authTokens: undefined,\n\n  // Original text: 'Last use'\n  authTokenLastUse: undefined,\n\n  // Original text: 'Username'\n  username: undefined,\n\n  // Original text: 'Password'\n  password: undefined,\n\n  // Original text: 'Language'\n  language: undefined,\n\n  // Original text: 'Old password'\n  oldPasswordPlaceholder: undefined,\n\n  // Original text: 'New password'\n  newPasswordPlaceholder: undefined,\n\n  // Original text: 'Confirm new password'\n  confirmPasswordPlaceholder: undefined,\n\n  // Original text: 'Confirmation password incorrect'\n  confirmationPasswordError: undefined,\n\n  // Original text: 'Password does not match the confirm password.'\n  confirmationPasswordErrorBody: undefined,\n\n  // Original text: 'Password changed'\n  pwdChangeSuccess: undefined,\n\n  // Original text: 'Your password has been successfully changed.'\n  pwdChangeSuccessBody: undefined,\n\n  // Original text: 'Incorrect password'\n  pwdChangeError: undefined,\n\n  // Original text: 'The old password provided is incorrect. Your password has not been changed.'\n  pwdChangeErrorBody: undefined,\n\n  // Original text: 'OK'\n  changePasswordOk: undefined,\n\n  // Original text: 'Forget all authentication tokens'\n  forgetTokens: undefined,\n\n  // Original text: 'This prevents authenticating with existing tokens but the one used by the current session'\n  forgetTokensExplained: undefined,\n\n  // Original text: 'Successfully forgot authentication tokens'\n  forgetTokensSuccess: undefined,\n\n  // Original text: 'Error while forgetting authentication tokens'\n  forgetTokensError: undefined,\n\n  // Original text: 'SSH keys'\n  sshKeys: undefined,\n\n  // Original text: 'New token'\n  newAuthToken: undefined,\n\n  // Original text: 'New SSH key'\n  newSshKey: undefined,\n\n  // Original text: 'Delete selected authentication tokens'\n  deleteAuthTokens: undefined,\n\n  // Original text: 'Delete'\n  deleteSshKey: undefined,\n\n  // Original text: 'Delete selected SSH keys'\n  deleteSshKeys: undefined,\n\n  // Original text: 'New authentication token'\n  newAuthTokenModalTitle: undefined,\n\n  // Original text: \"New SSH key\"\n  newSshKeyModalTitle: 'Новый SSH ключ',\n\n  // Original text: 'SSH key already exists!'\n  sshKeyAlreadyExists: undefined,\n\n  // Original text: \"Invalid key\"\n  sshKeyErrorTitle: 'Недействительный ключ',\n\n  // Original text: \"An SSH key requires both a title and a key.\"\n  sshKeyErrorMessage: 'Для SSH-ключа требуется как заголовок, так и ключ.',\n\n  // Original text: \"Title\"\n  title: 'Заголовок',\n\n  // Original text: \"Key\"\n  key: 'Ключ',\n\n  // Original text: 'Delete authentication token'\n  deleteAuthTokenConfirm: undefined,\n\n  // Original text: 'Are you sure you want to delete the authentication token: {id}?'\n  deleteAuthTokenConfirmMessage: undefined,\n\n  // Original text: 'Delete authentication token{nTokens, plural, one {} other {s}}'\n  deleteAuthTokensConfirm: undefined,\n\n  // Original text: 'Are you sure you want to delete {nTokens, number} autentication token{nTokens, plural, one {} other {s}}?'\n  deleteAuthTokensConfirmMessage: undefined,\n\n  // Original text: \"Delete SSH key\"\n  deleteSshKeyConfirm: 'Удалить SSH ключ',\n\n  // Original text: \"Are you sure you want to delete the SSH key {title}?\"\n  deleteSshKeyConfirmMessage: 'Вы уверены, что хотите удалить SSH ключ {title}?',\n\n  // Original text: 'Delete SSH key{nKeys, plural, one {} other {s}}'\n  deleteSshKeysConfirm: undefined,\n\n  // Original text: 'Are you sure you want to delete {nKeys, number} SSH key{nKeys, plural, one {} other {s}}?'\n  deleteSshKeysConfirmMessage: undefined,\n\n  // Original text: 'Add OTP authentication'\n  addOtpConfirm: undefined,\n\n  // Original text: 'To enable OTP authentication, add it to your application and then enter the current password to validate.'\n  addOtpConfirmMessage: undefined,\n\n  // Original text: 'Password is invalid'\n  addOtpInvalidPassword: undefined,\n\n  // Original text: 'Remove OTP authentication'\n  removeOtpConfirm: undefined,\n\n  // Original text: 'Are you sure you want to remove OTP authentication?'\n  removeOtpConfirmMessage: undefined,\n\n  // Original text: 'OTP authentication'\n  OtpAuthentication: undefined,\n\n  // Original text: '{nOthers, number} other{nOthers, plural, one {} other {s}}'\n  others: undefined,\n\n  // Original text: 'User'\n  logUser: undefined,\n\n  // Original text: 'Message'\n  logMessage: undefined,\n\n  // Original text: 'Use XCP-ng to get rid of restrictions'\n  logSuggestXcpNg: undefined,\n\n  // Original text: 'This is a XenServer/XCP-ng error'\n  logXapiError: undefined,\n\n  // Original text: \"Error\"\n  logError: 'Ошибка',\n\n  // Original text: 'Logs'\n  logTitle: undefined,\n\n  // Original text: \"Display details\"\n  logDisplayDetails: 'Показать детали',\n\n  // Original text: 'Download log'\n  logDownload: undefined,\n\n  // Original text: \"Date\"\n  logTime: 'Дата',\n\n  // Original text: \"Delete log\"\n  logDelete: 'Удалить журнал',\n\n  // Original text: 'Delete logs'\n  logsDelete: undefined,\n\n  // Original text: 'Job ID'\n  logsJobId: undefined,\n\n  // Original text: 'Job name'\n  logsJobName: undefined,\n\n  // Original text: 'Backup time'\n  logsBackupTime: undefined,\n\n  // Original text: 'Restore time'\n  logsRestoreTime: undefined,\n\n  // Original text: 'Copy log to clipboard'\n  copyLogToClipboard: undefined,\n\n  // Original text: 'VM not found!'\n  logsVmNotFound: undefined,\n\n  // Original text: 'Click to show error'\n  logsFailedRestoreError: undefined,\n\n  // Original text: 'Restore error'\n  logsFailedRestoreTitle: undefined,\n\n  // Original text: 'Delete log{nLogs, plural, one {} other {s}}'\n  logDeleteMultiple: undefined,\n\n  // Original text: 'Are you sure you want to delete {nLogs, number} log{nLogs, plural, one {} other {s}}?'\n  logDeleteMultipleMessage: undefined,\n\n  // Original text: \"Click to enable\"\n  logIndicationToEnable: 'Нажмите для включения',\n\n  // Original text: \"Click to disable\"\n  logIndicationToDisable: 'Нажмите для отключения',\n\n  // Original text: \"Report a bug\"\n  reportBug: 'Сообщить об ошибке',\n\n  // Original text: 'Job canceled to protect the VDI chain'\n  unhealthyVdiChainError: undefined,\n\n  // Original text: \"Restart VM's backup\"\n  backupRestartVm: undefined,\n\n  // Original text: \"Force restart VM's backup\"\n  backupForceRestartVm: undefined,\n\n  // Original text: \"Restart failed VMs' backup\"\n  backupRestartFailedVms: undefined,\n\n  // Original text: \"Force restart failed VMs' backup\"\n  backupForceRestartFailedVms: undefined,\n\n  // Original text: 'Click for more information'\n  clickForMoreInformation: undefined,\n\n  // Original text: 'Click to go to this job'\n  goToThisJob: undefined,\n\n  // Original text: 'Click to see corresponding logs'\n  goToCorrespondingLogs: undefined,\n\n  // Original text: \"Name\"\n  ipPoolName: 'Имя',\n\n  // Original text: \"IPs\"\n  ipPoolIps: 'IPs',\n\n  // Original text: \"Networks\"\n  ipPoolNetworks: 'Сети',\n\n  // Original text: 'No IP pools'\n  ipsNoIpPool: undefined,\n\n  // Original text: \"Create\"\n  ipsCreate: 'Создать',\n\n  // Original text: 'VIFs'\n  ipsVifs: undefined,\n\n  // Original text: 'Not used'\n  ipsNotUsed: undefined,\n\n  // Original text: 'unknown VIF'\n  ipPoolUnknownVif: undefined,\n\n  // Original text: 'Name already exists'\n  ipPoolNameAlreadyExists: undefined,\n\n  // Original text: 'Keyboard shortcuts'\n  shortcutModalTitle: undefined,\n\n  // Original text: 'Global'\n  shortcut_XoApp: undefined,\n\n  // Original text: 'Go to hosts list'\n  shortcut_XoApp_GO_TO_HOSTS: undefined,\n\n  // Original text: 'Go to pools list'\n  shortcut_XoApp_GO_TO_POOLS: undefined,\n\n  // Original text: 'Go to VMs list'\n  shortcut_XoApp_GO_TO_VMS: undefined,\n\n  // Original text: 'Go to SRs list'\n  shortcut_XoApp_GO_TO_SRS: undefined,\n\n  // Original text: 'Create a new VM'\n  shortcut_XoApp_CREATE_VM: undefined,\n\n  // Original text: 'Unfocus field'\n  shortcut_XoApp_UNFOCUS: undefined,\n\n  // Original text: 'Show shortcuts key bindings'\n  shortcut_XoApp_HELP: undefined,\n\n  // Original text: 'Home'\n  shortcut_Home: undefined,\n\n  // Original text: 'Focus search bar'\n  shortcut_Home_SEARCH: undefined,\n\n  // Original text: 'Next item'\n  shortcut_Home_NAV_DOWN: undefined,\n\n  // Original text: 'Previous item'\n  shortcut_Home_NAV_UP: undefined,\n\n  // Original text: 'Select item'\n  shortcut_Home_SELECT: undefined,\n\n  // Original text: 'Open'\n  shortcut_Home_JUMP_INTO: undefined,\n\n  // Original text: 'Supported tables'\n  shortcut_SortedTable: undefined,\n\n  // Original text: 'Focus the table search bar'\n  shortcut_SortedTable_SEARCH: undefined,\n\n  // Original text: 'Next item'\n  shortcut_SortedTable_NAV_DOWN: undefined,\n\n  // Original text: 'Previous item'\n  shortcut_SortedTable_NAV_UP: undefined,\n\n  // Original text: 'Select item'\n  shortcut_SortedTable_SELECT: undefined,\n\n  // Original text: 'Action'\n  shortcut_SortedTable_ROW_ACTION: undefined,\n\n  // Original text: \"VM\"\n  settingsAclsButtonTooltipVM: 'ВМ',\n\n  // Original text: \"Hosts\"\n  settingsAclsButtonTooltiphost: 'Хосты',\n\n  // Original text: \"Pool\"\n  settingsAclsButtonTooltippool: 'Пул',\n\n  // Original text: 'SR'\n  settingsAclsButtonTooltipSR: undefined,\n\n  // Original text: \"Network\"\n  settingsAclsButtonTooltipnetwork: 'Сеть',\n\n  // Original text: 'Template'\n  settingsCloudConfigTemplate: undefined,\n\n  // Original text: 'Delete cloud config{nCloudConfigs, plural, one {} other {s}}'\n  confirmDeleteCloudConfigsTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nCloudConfigs, number} cloud config{nCloudConfigs, plural, one {} other {s}}?'\n  confirmDeleteCloudConfigsBody: undefined,\n\n  // Original text: 'Delete network config{nNetworkConfigs, plural, one {} other {s}}'\n  confirmDeleteNetworkConfigsTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nNetworkConfigs, number} network config{nNetworkConfigs, plural, one {} other {s}}?'\n  confirmDeleteNetworkConfigsBody: undefined,\n\n  // Original text: 'Delete cloud config'\n  deleteCloudConfig: undefined,\n\n  // Original text: 'Edit cloud config'\n  editCloudConfig: undefined,\n\n  // Original text: 'Delete selected cloud configs'\n  deleteSelectedCloudConfigs: undefined,\n\n  // Original text: 'Network config'\n  networkConfig: undefined,\n\n  // Original text: 'Cloud config'\n  cloudConfig: undefined,\n\n  // Original text: \"No config file selected\"\n  noConfigFile: 'Файл настроек не выбран',\n\n  // Original text: \"Try dropping a config file here or click to select a config file to upload.\"\n  importTip: 'Перетащите файл настроек сюда, или выберите файл для загрузки',\n\n  // Original text: 'Config'\n  config: undefined,\n\n  // Original text: \"Import\"\n  importConfig: 'Импорт',\n\n  // Original text: 'If the config is encrypted, please enter the passphrase:'\n  importConfigEnterPassphrase: undefined,\n\n  // Original text: \"Config file successfully imported\"\n  importConfigSuccess: 'Файл настроек успешно импортирован',\n\n  // Original text: \"Error while importing config file\"\n  importConfigError: 'Ошибка при импорте файла настроек',\n\n  // Original text: \"Export\"\n  exportConfig: 'Экспорт',\n\n  // Original text: 'If you want to encrypt the exported config, please enter a passphrase:'\n  exportConfigEnterPassphrase: undefined,\n\n  // Original text: \"Download current config\"\n  downloadConfig: 'Скачать текущие настройки',\n\n  // Original text: 'and {n} more'\n  andNMore: undefined,\n\n  // Original text: \"Snapshots and base copies can't be migrated individually\"\n  disabledVdiMigrateTooltip: undefined,\n\n  // Original text: \"Reconnect all hosts\"\n  srReconnectAllModalTitle: 'Переподключить все хосты',\n\n  // Original text: \"This will reconnect this SR to all its hosts.\"\n  srReconnectAllModalMessage: 'Переподключить этот SR ко всем его хостам',\n\n  // Original text: \"Disconnect all hosts\"\n  srDisconnectAllModalTitle: 'Отключить все хосты',\n\n  // Original text: \"This will disconnect this SR from all its hosts.\"\n  srDisconnectAllModalMessage: 'Отключить этот SR от всех хостов.',\n\n  // Original text: \"This will disconnect each selected SR from its host (local SR) or from every hosts of its pool (shared SR).\"\n  srsDisconnectAllModalMessage:\n    'Отключить выбранный SR от его хоста (локальный SR) или от всех хостов в его пуле (общий SR).',\n\n  // Original text: 'Are you sure you want to forget {nSrs, number} SR{nSrs, plural, one {} other{s}}?'\n  forgetNSrsModalMessage: undefined,\n\n  // Original text: 'You will lose all the metadata, meaning all the links between the VDIs (disks) and their respective VMs. This operation cannot be undone.'\n  srForgetModalWarning: undefined,\n\n  // Original text: \"Disconnected\"\n  srAllDisconnected: 'Отключено',\n\n  // Original text: 'Partially connected'\n  srSomeConnected: undefined,\n\n  // Original text: \"Connected\"\n  srAllConnected: 'Подключено',\n\n  // Original text: 'In order to put this SR in maintenance mode, the following VM{n, plural, one {} other {s}} will be shut down. Are you sure you want to continue?'\n  maintenanceSrModalBody: undefined,\n\n  // Original text: 'Maintenance mode'\n  maintenanceMode: undefined,\n\n  // Original text: 'Migrate selected VDIs'\n  migrateSelectedVdis: undefined,\n\n  // Original text: 'All the VDIs attached to a VM must either be on a shared SR or on the same host (local SR) for the VM to be able to start.'\n  migrateVdiMessage: undefined,\n\n  // Original text: 'Backed up XO Configs'\n  backedUpXoConfigs: undefined,\n\n  // Original text: 'Manage XO Config Cloud Backup'\n  manageXoConfigCloudBackup: undefined,\n\n  // Original text: 'Select XO config'\n  selectXoConfig: undefined,\n\n  // Original text: 'XO Config Cloud Backup'\n  xoConfigCloudBackup: undefined,\n\n  // Original text: 'Your encrypted configuration is securely stored inside your Vates account and backed up once a day'\n  xoConfigCloudBackupTips: undefined,\n\n  // Original text: 'Passphrase is required to encrypt backups'\n  xoCloudConfigEnterPassphrase: undefined,\n\n  // Original text: 'Enter the passphrase:'\n  xoCloudConfigRestoreEnterPassphrase: undefined,\n\n  // Original text: 'XOSAN'\n  xosanTitle: undefined,\n\n  // Original text: 'Suggestions'\n  xosanSuggestions: undefined,\n\n  // Original text: 'Warning: using disperse layout is not recommended right now. Please read {link}.'\n  xosanDisperseWarning: undefined,\n\n  // Original text: \"Name\"\n  xosanName: 'Имя',\n\n  // Original text: \"Host\"\n  xosanHost: 'Хост',\n\n  // Original text: \"Connected Hosts\"\n  xosanHosts: 'Хосты',\n\n  // Original text: 'Pool'\n  xosanPool: undefined,\n\n  // Original text: \"Size\"\n  xosanSize: 'Размер',\n\n  // Original text: 'Used space'\n  xosanUsedSpace: undefined,\n\n  // Original text: 'License'\n  license: undefined,\n\n  // Original text: 'This XOSAN has more than 1 license!'\n  xosanMultipleLicenses: undefined,\n\n  // Original text: 'XOSAN pack needs to be installed and up to date on each host of the pool.'\n  xosanNeedPack: undefined,\n\n  // Original text: 'Install it now!'\n  xosanInstallIt: undefined,\n\n  // Original text: 'Some hosts need their toolstack to be restarted before you can create an XOSAN'\n  xosanNeedRestart: undefined,\n\n  // Original text: 'Restart toolstacks'\n  xosanRestartAgents: undefined,\n\n  // Original text: 'Select no more than 1 SR per host'\n  xosanSrOnSameHostMessage: undefined,\n\n  // Original text: 'Layout'\n  xosanLayout: undefined,\n\n  // Original text: 'Redundancy'\n  xosanRedundancy: undefined,\n\n  // Original text: 'Capacity'\n  xosanCapacity: undefined,\n\n  // Original text: 'Available space'\n  xosanAvailableSpace: undefined,\n\n  // Original text: '* Can fail without data loss'\n  xosanDiskLossLegend: undefined,\n\n  // Original text: 'Create'\n  xosanCreate: undefined,\n\n  // Original text: 'XOSAN is available in XOA'\n  xosanCommunity: undefined,\n\n  // Original text: 'New'\n  xosanNew: undefined,\n\n  // Original text: 'Advanced'\n  xosanAdvanced: undefined,\n\n  // Original text: 'Remove subvolumes'\n  xosanRemoveSubvolumes: undefined,\n\n  // Original text: 'Add subvolume…'\n  xosanAddSubvolume: undefined,\n\n  // Original text: \"This version of XOSAN SR is from the first beta phase. You can keep using it, but to modify it you'll have to save your disks and re-create it.\"\n  xosanWarning: undefined,\n\n  // Original text: 'VLAN'\n  xosanVlan: undefined,\n\n  // Original text: 'No XOSAN found'\n  xosanNoSrs: undefined,\n\n  // Original text: 'Some SRs are detached from the XOSAN'\n  xosanPbdsDetached: undefined,\n\n  // Original text: 'Something is wrong with: {badStatuses}'\n  xosanBadStatus: undefined,\n\n  // Original text: 'Running'\n  xosanRunning: undefined,\n\n  // Original text: 'Update packs'\n  xosanUpdatePacks: undefined,\n\n  // Original text: 'Checking for updates'\n  xosanPackUpdateChecking: undefined,\n\n  // Original text: 'Error while checking XOSAN packs. Please make sure that the Cloud plugin is installed and loaded, and that the updater is reachable.'\n  xosanPackUpdateError: undefined,\n\n  // Original text: 'XOSAN resources are unavailable'\n  xosanPackUpdateUnavailable: undefined,\n\n  // Original text: 'Not registered for XOSAN resources'\n  xosanPackUpdateUnregistered: undefined,\n\n  // Original text: \"✓ This pool's XOSAN packs are up to date!\"\n  xosanPackUpdateUpToDate: undefined,\n\n  // Original text: 'Update pool with latest pack v{version}'\n  xosanPackUpdateVersion: undefined,\n\n  // Original text: 'Delete XOSAN'\n  xosanDelete: undefined,\n\n  // Original text: 'Fix'\n  xosanFixIssue: undefined,\n\n  // Original text: 'Creating XOSAN on {pool}'\n  xosanCreatingOn: undefined,\n\n  // Original text: 'Configuring network…'\n  xosanState_configuringNetwork: undefined,\n\n  // Original text: 'Importing VM…'\n  xosanState_importingVm: undefined,\n\n  // Original text: 'Copying VMs…'\n  xosanState_copyingVms: undefined,\n\n  // Original text: 'Configuring VMs…'\n  xosanState_configuringVms: undefined,\n\n  // Original text: 'Configuring gluster…'\n  xosanState_configuringGluster: undefined,\n\n  // Original text: 'Creating SR…'\n  xosanState_creatingSr: undefined,\n\n  // Original text: 'Scanning SR…'\n  xosanState_scanningSr: undefined,\n\n  // Original text: 'XOSAN cannot be installed on XCP-ng yet. Incoming XOSANv2 will be compatible with XCP-ng: {link}.'\n  xosanXcpngWarning: undefined,\n\n  // Original text: 'Install XOA plugin first'\n  xosanInstallCloudPlugin: undefined,\n\n  // Original text: 'Load XOA plugin first'\n  xosanLoadCloudPlugin: undefined,\n\n  // Original text: 'No compatible XOSAN pack found for your XenServer versions.'\n  xosanNoPackFound: undefined,\n\n  // Original text: 'Some XOSAN Virtual Machines are not running'\n  xosanVmsNotRunning: undefined,\n\n  // Original text: 'Some XOSAN Virtual Machines could not be found'\n  xosanVmsNotFound: undefined,\n\n  // Original text: 'Files needing healing'\n  xosanFilesNeedingHealing: undefined,\n\n  // Original text: 'Some XOSAN Virtual Machines have files needing healing'\n  xosanFilesNeedHealing: undefined,\n\n  // Original text: 'Host {hostName} is not in XOSAN network'\n  xosanHostNotInNetwork: undefined,\n\n  // Original text: 'VM controller'\n  xosanVm: undefined,\n\n  // Original text: 'SR'\n  xosanUnderlyingStorage: undefined,\n\n  // Original text: 'Replace…'\n  xosanReplace: undefined,\n\n  // Original text: 'On same VM'\n  xosanOnSameVm: undefined,\n\n  // Original text: 'Brick name'\n  xosanBrickName: undefined,\n\n  // Original text: 'Brick UUID'\n  xosanBrickUuid: undefined,\n\n  // Original text: 'Brick size'\n  xosanBrickSize: undefined,\n\n  // Original text: 'Memory size'\n  xosanMemorySize: undefined,\n\n  // Original text: 'Status'\n  xosanStatus: undefined,\n\n  // Original text: 'Arbiter'\n  xosanArbiter: undefined,\n\n  // Original text: 'Used Inodes'\n  xosanUsedInodes: undefined,\n\n  // Original text: 'Block size'\n  xosanBlockSize: undefined,\n\n  // Original text: 'Device'\n  xosanDevice: undefined,\n\n  // Original text: 'FS name'\n  xosanFsName: undefined,\n\n  // Original text: 'Mount options'\n  xosanMountOptions: undefined,\n\n  // Original text: 'Path'\n  xosanPath: undefined,\n\n  // Original text: 'Job'\n  xosanJob: undefined,\n\n  // Original text: 'PID'\n  xosanPid: undefined,\n\n  // Original text: 'Port'\n  xosanPort: undefined,\n\n  // Original text: 'Missing values'\n  xosanReplaceBrickErrorTitle: undefined,\n\n  // Original text: 'You need to select a SR and a size'\n  xosanReplaceBrickErrorMessage: undefined,\n\n  // Original text: 'Bad values'\n  xosanAddSubvolumeErrorTitle: undefined,\n\n  // Original text: 'You need to select {nSrs, number} and a size'\n  xosanAddSubvolumeErrorMessage: undefined,\n\n  // Original text: 'Select {nSrs, number} SRs'\n  xosanSelectNSrs: undefined,\n\n  // Original text: 'Run'\n  xosanRun: undefined,\n\n  // Original text: 'Remove'\n  xosanRemove: undefined,\n\n  // Original text: 'Volume'\n  xosanVolume: undefined,\n\n  // Original text: 'Volume options'\n  xosanVolumeOptions: undefined,\n\n  // Original text: 'Could not find VM'\n  xosanCouldNotFindVm: undefined,\n\n  // Original text: 'Using {usage}'\n  xosanUnderlyingStorageUsage: undefined,\n\n  // Original text: 'Custom IP network (/24)'\n  xosanCustomIpNetwork: undefined,\n\n  // Original text: 'Will configure the host xosan network device with a static IP address and plug it in.'\n  xosanIssueHostNotInNetwork: undefined,\n\n  // Original text: 'Approximate SR capacity'\n  approximateSrCapacity: undefined,\n\n  // Original text: 'By default, the management network will be used'\n  byDefaultManagementNetworkUsed: undefined,\n\n  // Original text: 'Unable to fetch physical disks from non-XCP-ng host'\n  cantFetchDisksFromNonXcpngHost: undefined,\n\n  // Original text: 'Create interface'\n  createInterface: undefined,\n\n  // Original text: 'If packages need to be installed, the toolstack on those hosts will restart. Do you want to continue?'\n  createXostoreConfirm: undefined,\n\n  // Original text: 'The disk is mounted on: {mountpoint}'\n  diskAlreadyMounted: undefined,\n\n  // Original text: 'Diskful'\n  diskful: undefined,\n\n  // Original text: 'The disk has existing partition'\n  diskHasExistingPartition: undefined,\n\n  // Original text: 'Disk incompatible with XOSTOR'\n  diskIncompatibleXostor: undefined,\n\n  // Original text: 'The disk is Read-Only'\n  diskIsReadOnly: undefined,\n\n  // Original text: 'Diskless'\n  diskless: undefined,\n\n  // Original text: 'Disks'\n  disks: undefined,\n\n  // Original text: '{field} is required'\n  fieldRequired: undefined,\n\n  // Original text: 'Some fields are missing'\n  fieldsMissing: undefined,\n\n  // Original text: 'More than 1 XOSTOR license on {host}'\n  hostBoundToMultipleXostorLicenses: undefined,\n\n  // Original text: 'No XOSTOR license on {host}'\n  hostHasNoXostorLicense: undefined,\n\n  // Original text: 'Hosts do not have the same number of disks'\n  hostsNotSameNumberOfDisks: undefined,\n\n  // Original text: 'Ignore file systems'\n  ignoreFileSystems: undefined,\n\n  // Original text: 'Force LINSTOR group creation on existing filesystem'\n  ignoreFileSystemsInfo: undefined,\n\n  // Original text: 'Interface name'\n  interfaceName: undefined,\n\n  // Original text: 'Interface name is required if a network is provided'\n  interfaceNameRequired: undefined,\n\n  // Original text: 'This interface name is reserved'\n  interfaceNameReserved: undefined,\n\n  // Original text: 'This is \"tapdev\" disk'\n  isTapdevDisk: undefined,\n\n  // Original text: 'License attached to an unknown XOSTOR'\n  licenseBoundUnknownXostor: undefined,\n\n  // Original text: 'No XOSTOR attached'\n  licenseNotBoundXostor: undefined,\n\n  // Original text: 'License{nLicenseIds, plural, one {} other {s}} {licenseIds} ha{nLicenseIds, plural, one {s} other {ve}} expired on {host}'\n  licenseExpiredXostorWarning: undefined,\n\n  // Original text: 'To manage this XOSTOR storage, you must resolve the following issues:'\n  manageXostorWarning: undefined,\n\n  // Original text: 'The network does not have PIFs'\n  networkNoPifs: undefined,\n\n  // Original text: 'Networks'\n  networks: undefined,\n\n  // Original text: 'Not an XCP-ng pool'\n  notXcpPool: undefined,\n\n  // Original text: 'No XOSTOR found'\n  noXostorFound: undefined,\n\n  // Original text: 'Number of hosts'\n  numberOfHosts: undefined,\n\n  // Original text: '{object} does not meet XOSTOR requirements. Refer to the documentation.'\n  objectDoesNotMeetXostorRequirements: undefined,\n\n  // Original text: 'Only show {type} that meet XOSTOR requirements'\n  onlyShowXostorRequirements: undefined,\n\n  // Original text: 'Pool already has a XOSTOR'\n  poolAlreadyHasXostor: undefined,\n\n  // Original text: 'Not recent enough. Current version: {version}'\n  poolNotRecentEnough: undefined,\n\n  // Original text: 'Not all PIFs have an IP'\n  pifsNoIp: undefined,\n\n  // Original text: 'Not all PIFs are attached'\n  pifsNotAttached: undefined,\n\n  // Original text: 'Not all PIFs are static'\n  pifsNotStatic: undefined,\n\n  // Original text: 'Replication'\n  replication: undefined,\n\n  // Original text: 'Replication count is higher than number of hosts with disks'\n  replicationCountHigherThanHostsWithDisks: undefined,\n\n  // Original text: 'Resource list'\n  resourceList: undefined,\n\n  // Original text: 'Select disk(s)…'\n  selectDisks: undefined,\n\n  // Original text: 'Only disks of type \"Disk\" and \"Raid\" are accepted. Selected disk type: {type}.'\n  selectedDiskTypeIncompatibleXostor: undefined,\n\n  // Original text: 'Set as preferred'\n  setAsPreferred: undefined,\n\n  // Original text: 'Storage'\n  storage: undefined,\n\n  // Original text: 'Summary'\n  summary: undefined,\n\n  // Original text: 'Tie breaker'\n  tieBreaker: undefined,\n\n  // Original text: 'White space not allowed'\n  whiteSpaceNotAllowed: undefined,\n\n  // Original text: 'Wrong number of hosts'\n  wrongNumberOfHosts: undefined,\n\n  // Original text: 'XOSTOR'\n  xostor: undefined,\n\n  // Original text: 'XOSTOR is available in XOA'\n  xostorAvailableInXoa: undefined,\n\n  // Original text: 'XOSTOR creation'\n  xostorCreation: undefined,\n\n  // Original text: 'At least one disk is required'\n  xostorDiskRequired: undefined,\n\n  // Original text: '({nDisks, number} disk{nDisks, plural, one {} other {s}}) {hostname}'\n  xostorDisksDropdownLabel: undefined,\n\n  // Original text: '\"xcp-ng-release-linstor\" and \"xcp-ng-linstor\" will be installed on each host'\n  xostorPackagesWillBeInstalled: undefined,\n\n  // Original text: 'If a disk dies, you will lose data'\n  xostorReplicationWarning: undefined,\n\n  // Original text: 'Hub'\n  hubPage: undefined,\n\n  // Original text: 'Hub is available in XOA'\n  hubCommunity: undefined,\n\n  // Original text: 'The selected pool has no default SR'\n  noDefaultSr: undefined,\n\n  // Original text: 'VM installed successfully'\n  successfulInstall: undefined,\n\n  // Original text: 'No VMs available '\n  vmNoAvailable: undefined,\n\n  // Original text: 'Create'\n  create: undefined,\n\n  // Original text: 'Resource alert'\n  hubResourceAlert: undefined,\n\n  // Original text: 'OS'\n  os: undefined,\n\n  // Original text: 'Version'\n  version: undefined,\n\n  // Original text: 'Size'\n  size: undefined,\n\n  // Original text: 'Total disk size'\n  totalDiskSize: undefined,\n\n  // Original text: 'Already installed templates are hidden'\n  hideInstalledPool: undefined,\n\n  // Original text: 'XVA import'\n  hubImportNotificationTitle: undefined,\n\n  // Original text: 'No description available for this template'\n  hubTemplateDescriptionNotAvailable: undefined,\n\n  // Original text: 'Recipe created successfully'\n  recipeCreatedSuccessfully: undefined,\n\n  // Original text: 'View created VMs'\n  recipeViewCreatedVms: undefined,\n\n  // Original text: 'Templates'\n  templatesLabel: undefined,\n\n  // Original text: 'Recipes'\n  recipesLabel: undefined,\n\n  // Original text: 'Network'\n  network: undefined,\n\n  // Original text: 'Select Kubernetes version'\n  recipeSelectK8sVersion: undefined,\n\n  // Original text: 'Cluster name'\n  recipeClusterNameLabel: undefined,\n\n  // Original text: 'Number of worker nodes'\n  recipeNumberOfNodesLabel: undefined,\n\n  // Original text: 'SSH key'\n  recipeSshKeyLabel: undefined,\n\n  // Original text: 'Static IP addresses'\n  recipeStaticIpAddresses: undefined,\n\n  // Original text: 'Control plane fault tolerance'\n  recipeFaultTolerance: undefined,\n\n  // Original text: 'No fault tolerance (one control plane)'\n  recipeNoneFaultTolerance: undefined,\n\n  // Original text: 'One fault tolerance (three control planes)'\n  recipeOneFaultTolerance: undefined,\n\n  // Original text: 'Two fault tolerances (five control planes)'\n  recipeTwoFaultTolerance: undefined,\n\n  // Original text: 'Three fault tolerances (seven control planes)'\n  recipeThreeFaultTolerance: undefined,\n\n  // Original text: 'Control plane { i, number } node IP address/subnet mask'\n  recipeHaControPlaneIpAddress: undefined,\n\n  // Original text: 'VIP address'\n  recipeVip: undefined,\n\n  // Original text: 'Control plane node IP address/subnet mask'\n  recipeControlPlaneIpAddress: undefined,\n\n  // Original text: 'Worker node { i, number } IP address/subnet mask'\n  recipeWorkerIpAddress: undefined,\n\n  // Original text: 'Gateway IP address'\n  recipeGatewayIpAddress: undefined,\n\n  // Original text: 'Nameserver IP addresses'\n  recipeNameserverAddresses: undefined,\n\n  // Original text: '192.168.1.0,172.16.1.0'\n  recipeNameserverAddressesExample: undefined,\n\n  // Original text: 'Search domains'\n  recipeSearches: undefined,\n\n  // Original text: 'domain.com,search.org'\n  recipeSearchesExample: undefined,\n\n  // Original text: 'Action/Event'\n  auditActionEvent: undefined,\n\n  // Original text: 'The record ({ id }) was altered ({ n, number } valid records)'\n  auditAlteredRecord: undefined,\n\n  // Original text: 'Check integrity'\n  auditCheckIntegrity: undefined,\n\n  // Original text: 'Copy fingerprint to clipboard'\n  auditCopyFingerprintToClipboard: undefined,\n\n  // Original text: 'Generate a new fingerprint'\n  auditGenerateNewFingerprint: undefined,\n\n  // Original text: 'The record ({ id }) is missing ({ n, number } valid records)'\n  auditMissingRecord: undefined,\n\n  // Original text: 'Fingerprint'\n  auditEnterFingerprint: undefined,\n\n  // Original text: \"Enter the saved fingerprint to check the previous logs' integrity. If you don't have any, click OK.\"\n  auditEnterFingerprintInfo: undefined,\n\n  // Original text: 'Audit record'\n  auditRecord: undefined,\n\n  // Original text: 'Integrity verified'\n  auditIntegrityVerified: undefined,\n\n  // Original text: 'Keep this fingerprint to be able to check the integrity of the current records later.'\n  auditSaveFingerprintInfo: undefined,\n\n  // Original text: 'However, if you trust the current state of the records, keep this fingerprint to be able to check their integrity later.'\n  auditSaveFingerprintInErrorInfo: undefined,\n\n  // Original text: 'New fingerprint'\n  auditNewFingerprint: undefined,\n\n  // Original text: 'Download records'\n  downloadAuditRecords: undefined,\n\n  // Original text: 'Display record'\n  displayAuditRecord: undefined,\n\n  // Original text: 'No audit record available'\n  noAuditRecordAvailable: undefined,\n\n  // Original text: 'Refresh records list'\n  refreshAuditRecordsList: undefined,\n\n  // Original text: 'User actions recording is currently inactive'\n  auditInactiveUserActionsRecord: undefined,\n\n  // Original text: 'All hosts must be bound to a license'\n  allHostsMustBeBound: undefined,\n\n  // Original text: 'Bound (Plan (ID), expiration date, host - pool)'\n  boundSelectLicense: undefined,\n\n  // Original text: 'Bind XCP-ng licenses'\n  bindXcpngLicenses: undefined,\n\n  // Original text: 'You are about to bind {nLicenses, number} professional support license{nLicenses, plural, one {} other {s}} on older and unsupported XCP-ng version{nLicenses, plural, one {} other {s}}. Are you sure you want to continue?'\n  confirmBindingOnUnsupportedHost: undefined,\n\n  // Original text: 'The following pools will no longer be fully supported'\n  confirmRebindLicenseFromFullySupportedPool: undefined,\n\n  // Original text: 'Licenses'\n  licenses: undefined,\n\n  // Original text: 'Licenses binding'\n  licensesBinding: undefined,\n\n  // Original text: 'Not enough XCP-ng licenses'\n  notEnoughXcpngLicenses: undefined,\n\n  // Original text: 'Not bound (Plan (ID), expiration date)'\n  notBoundSelectLicense: undefined,\n\n  // Original text: \"To bind an XCP-ng license, go to the pool's Advanced tab.\"\n  xcpngLicensesBindingAvancedView: undefined,\n\n  // Original text: 'You are not registered and therefore will not be able to create or manage your XOSAN SRs. {link}'\n  xosanUnregisteredDisclaimer: undefined,\n\n  // Original text: 'In order to create a XOSAN SR, you need to use the Xen Orchestra Appliance and buy a XOSAN license on {link}.'\n  xosanSourcesDisclaimer: undefined,\n\n  // Original text: 'Register now!'\n  registerNow: undefined,\n\n  // Original text: 'You need to register your appliance to manage your licenses.'\n  licensesUnregisteredDisclaimer: undefined,\n\n  // Original text: 'Product'\n  licenseProduct: undefined,\n\n  // Original text: 'Purchaser'\n  licensePurchaser: undefined,\n\n  // Original text: 'Expires'\n  licenseExpires: undefined,\n\n  // Original text: 'You'\n  licensePurchaserYou: undefined,\n\n  // Original text: 'Support'\n  productSupport: undefined,\n\n  // Original text: 'No XOSAN attached'\n  licenseNotBoundXosan: undefined,\n\n  // Original text: 'No proxy attached'\n  licenseNotBoundProxy: undefined,\n\n  // Original text: 'License attached to an unknown XOSAN'\n  licenseBoundUnknownXosan: undefined,\n\n  // Original text: 'License attached to an unknown proxy'\n  licenseBoundUnknownProxy: undefined,\n\n  // Original text: 'Manage the licenses'\n  licensesManage: undefined,\n\n  // Original text: 'New license'\n  newLicense: undefined,\n\n  // Original text: 'Refresh'\n  refreshLicenses: undefined,\n\n  // Original text: 'Limited size because XOSAN is in trial'\n  xosanLicenseRestricted: undefined,\n\n  // Original text: 'You need a license on this SR to manage the XOSAN.'\n  xosanAdminNoLicenseDisclaimer: undefined,\n\n  // Original text: 'Your XOSAN license has expired. You can still use the SR but cannot administrate it anymore.'\n  xosanAdminExpiredLicenseDisclaimer: undefined,\n\n  // Original text: 'Could not check the license on this XOSAN SR'\n  xosanCheckLicenseError: undefined,\n\n  // Original text: 'Could not fetch licenses'\n  getLicensesError: undefined,\n\n  // Original text: 'License has expired.'\n  licenseHasExpired: undefined,\n\n  // Original text: 'License bound to another XOA'\n  licenseBoundToOtherXoa: undefined,\n\n  // Original text: 'This license is active on this XOA'\n  licenseBoundToThisXoa: undefined,\n\n  // Original text: 'License expires on {date}.'\n  licenseExpiresDate: undefined,\n\n  // Original text: 'Update the license now!'\n  updateLicenseMessage: undefined,\n\n  // Original text: 'Unknown XOSAN SR.'\n  xosanUnknownSr: undefined,\n\n  // Original text: 'Contact us!'\n  contactUs: undefined,\n\n  // Original text: 'No license.'\n  xosanNoLicense: undefined,\n\n  // Original text: 'Unlock now!'\n  unlockNow: undefined,\n\n  // Original text: 'Select a license'\n  selectLicense: undefined,\n\n  // Original text: 'Bind license'\n  bindLicense: undefined,\n\n  // Original text: 'Bind licenses'\n  bindLicenses: undefined,\n\n  // Original text: 'expires on {date}'\n  expiresOn: undefined,\n\n  // Original text: 'Install XOA plugin first'\n  xosanInstallXoaPlugin: undefined,\n\n  // Original text: 'Load XOA plugin first'\n  xosanLoadXoaPlugin: undefined,\n\n  // Original text: 'Activate license'\n  bindXoaLicense: undefined,\n\n  // Original text: 'Move license to this XOA'\n  rebindXoaLicense: undefined,\n\n  // Original text: 'Are you sure you want to activate this license on your XOA? This action is not reversible!'\n  bindXoaLicenseConfirm: undefined,\n\n  // Original text: 'activate {licenseType} license'\n  bindXoaLicenseConfirmText: undefined,\n\n  // Original text: 'Update needed'\n  updateNeeded: undefined,\n\n  // Original text: 'Starter license'\n  starterLicense: undefined,\n\n  // Original text: 'Enterprise license'\n  enterpriseLicense: undefined,\n\n  // Original text: 'Premium license'\n  premiumLicense: undefined,\n\n  // Original text: 'You are currently in a {edition} trial period that will end on {date, date, medium}'\n  trialLicenseInfo: undefined,\n\n  // Original text: 'This proxy has more than 1 license!'\n  proxyMultipleLicenses: undefined,\n\n  // Original text: 'Unknown proxy VM.'\n  proxyUnknownVm: undefined,\n\n  // Original text: 'XOSTOR Pro Support enabled'\n  xostorProSupportEnabled: undefined,\n\n  // Original text: 'Only available to Enterprise users'\n  onlyAvailableToEnterprise: undefined,\n\n  // Original text: 'Forget prox{n, plural, one {y} other {ies}}'\n  forgetProxyApplianceTitle: undefined,\n\n  // Original text: 'Are you sure you want to forget {n, number} prox{n, plural, one {y} other {ies}}?'\n  forgetProxyApplianceMessage: undefined,\n\n  // Original text: 'Forget proxy(ies)'\n  forgetProxies: undefined,\n\n  // Original text: 'Destroy prox{n, plural, one {y} other {ies}}'\n  destroyProxyApplianceTitle: undefined,\n\n  // Original text: 'Are you sure you want to destroy {n, number} prox{n, plural, one {y} other {ies}}?'\n  destroyProxyApplianceMessage: undefined,\n\n  // Original text: 'Destroy proxy(ies)'\n  destroyProxies: undefined,\n\n  // Original text: 'Deploy a proxy'\n  deployProxy: undefined,\n\n  // Original text: 'Redeploy proxy'\n  redeployProxy: undefined,\n\n  // Original text: 'Redeploy this proxy'\n  redeployProxyAction: undefined,\n\n  // Original text: 'This action will destroy the old proxy VM'\n  redeployProxyWarning: undefined,\n\n  // Original text: 'Register a proxy'\n  registerProxy: undefined,\n\n  // Original text: 'No proxies available'\n  noProxiesAvailable: undefined,\n\n  // Original text: 'Test your proxy'\n  checkProxyHealth: undefined,\n\n  // Original text: 'Update appliance settings'\n  updateProxyApplianceSettings: undefined,\n\n  // Original text: 'URL not found'\n  urlNotFound: undefined,\n\n  // Original text: 'Authentication token'\n  proxyAuthToken: undefined,\n\n  // Original text: 'Unable to connect to this proxy. Do you want to forget it?'\n  proxyConnectionFailedAfterRegistrationMessage: undefined,\n\n  // Original text: 'Copy proxy URL'\n  proxyCopyUrl: undefined,\n\n  // Original text: 'Proxy error'\n  proxyError: undefined,\n\n  // Original text: 'VM UUID is optional but recommended.'\n  proxyOptionalVmUuid: undefined,\n\n  // Original text: 'Test passed for {name}'\n  proxyTestSuccess: undefined,\n\n  // Original text: 'The proxy appears to work correctly'\n  proxyTestSuccessMessage: undefined,\n\n  // Original text: 'Test failed for {name}'\n  proxyTestFailed: undefined,\n\n  // Original text: 'Unable to connect to this proxy'\n  proxyTestFailedConnectionIssueMessage: undefined,\n\n  // Original text: 'Click to see linked remotes'\n  proxyLinkedRemotes: undefined,\n\n  // Original text: 'Click to see linked backups'\n  proxyLinkedBackups: undefined,\n\n  // Original text: 'Default to: {dns}'\n  proxyNetworkDnsPlaceHolder: undefined,\n\n  // Original text: 'Default to: {netmask}'\n  proxyNetworkNetmaskPlaceHolder: undefined,\n\n  // Original text: 'The select only contains SRs connected to at least one HVM-capable host'\n  proxySrPredicateInfo: undefined,\n\n  // Original text: 'HTTP proxy'\n  httpProxy: undefined,\n\n  // Original text: 'protocol://username:password@address:port'\n  httpProxyPlaceholder: undefined,\n\n  // Original text: 'Unable to check upgrades availability'\n  proxyUpgradesError: undefined,\n\n  // Original text: 'Leave the field empty and click on OK to remove the existing configuration'\n  proxyApplianceSettingsInfo: undefined,\n\n  // Original text: 'Your proxy is up-to-date'\n  proxyUpToDate: undefined,\n\n  // Original text: 'The upgrade will interrupt {nJobs, number} running backup job{nJobs, plural, one {} other {s}}. Do you want to continue?'\n  proxyRunningBackupsMessage: undefined,\n\n  // Original text: 'Some proxies need to be upgraded.'\n  proxiesNeedUpgrade: undefined,\n\n  // Original text: 'Some proxies need to be upgraded. Click here to get more information.'\n  upgradeNeededForProxies: undefined,\n\n  // Original text: 'XO Proxy: a concrete guide'\n  xoProxyConcreteGuide: undefined,\n\n  // Original text: '{n, number} prox{n, plural, one {y} other {ies}} ha{n, plural, one {s} other {ve}} error{n, plural, one {} other {s}}'\n  someProxiesHaveErrors: undefined,\n\n  // Original text: '{seconds, plural, one {# second} other {# seconds}}'\n  secondsFormat: undefined,\n\n  // Original text: '{days, plural, =0 {} one {# day } other {# days }}{hours, plural, =0 {} one {# hour } other {# hours }}{minutes, plural, =0 {} one {# minute } other {# minutes }}{seconds, plural, =0 {} one {# second} other {# seconds}}'\n  durationFormat: undefined,\n}\n","// See http://momentjs.com/docs/#/use-it/browserify/\nimport 'moment/locale/sv'\n\nimport reactIntlData from 'react-intl/locale-data/sv'\nimport { addLocaleData } from 'react-intl'\naddLocaleData(reactIntlData)\n\n// ===================================================================\n\nexport default {\n  // Original text: 'Connecting'\n  statusConnecting: 'Ansluter',\n\n  // Original text: 'Disconnected'\n  statusDisconnected: 'Bortkopplad',\n\n  // Original text: 'Loading…'\n  statusLoading: 'Laddar…',\n\n  // Original text: 'Page not found'\n  errorPageNotFound: 'Sida hittas ej',\n\n  // Original text: 'no such item'\n  errorNoSuchItem: 'Inget sådant objekt',\n\n  // Original text: \"Long click to edit\"\n  editableLongClickPlaceholder: 'Långklicka för att redigera',\n\n  // Original text: \"Click to edit\"\n  editableClickPlaceholder: 'Klicka för att redigera',\n\n  // Original text: 'Browse files'\n  browseFiles: 'Utforska filer',\n\n  // Original text: \"OK\"\n  alertOk: 'OK',\n\n  // Original text: \"OK\"\n  confirmOk: 'OK',\n\n  // Original text: \"Cancel\"\n  genericCancel: 'Avbryt',\n\n  // Original text: 'On error'\n  onError: 'På error',\n\n  // Original text: 'Successful'\n  successful: 'Lyckades',\n\n  // Original text: 'Managed disks'\n  filterOnlyManaged: 'Hanterade diskar',\n\n  // Original text: 'Orphaned disks'\n  filterOnlyOrphaned: 'Föräldralösa diskar',\n\n  // Original text: 'Normal disks'\n  filterOnlyRegular: 'Normala diskar',\n\n  // Original text: 'Snapshot disks'\n  filterOnlySnapshots: 'Snapshotdiskar',\n\n  // Original text: 'Unmanaged disks'\n  filterOnlyUnmanaged: 'Ohanterade diskar',\n\n  // Original text: 'Copy to clipboard'\n  copyToClipboard: 'Kopiera till urklipp',\n\n  // Original text: 'Master'\n  pillMaster: 'Master',\n\n  // Original text: \"Home\"\n  homePage: 'Hem',\n\n  // Original text: 'VMs'\n  homeVmPage: undefined,\n\n  // Original text: 'Hosts'\n  homeHostPage: 'Värdar',\n\n  // Original text: 'Pools'\n  homePoolPage: 'Pooler',\n\n  // Original text: 'Templates'\n  homeTemplatePage: 'Mallar',\n\n  // Original text: 'Storages'\n  homeSrPage: 'Lagringar',\n\n  // Original text: \"Dashboard\"\n  dashboardPage: undefined,\n\n  // Original text: \"Overview\"\n  overviewDashboardPage: 'Överblick',\n\n  // Original text: \"Visualizations\"\n  overviewVisualizationDashboardPage: 'Visualisera',\n\n  // Original text: \"Statistics\"\n  overviewStatsDashboardPage: 'Statistik',\n\n  // Original text: \"Health\"\n  overviewHealthDashboardPage: 'Hälsa',\n\n  // Original text: \"Self service\"\n  selfServicePage: 'Självservice',\n\n  // Original text: \"Backup\"\n  backupPage: 'Backup',\n\n  // Original text: \"Jobs\"\n  jobsPage: 'Jobb',\n\n  // Original text: \"Updates\"\n  updatePage: 'Uppdateringar',\n\n  // Original text: \"Settings\"\n  settingsPage: 'Inställningar',\n\n  // Original text: \"Servers\"\n  settingsServersPage: 'Servers',\n\n  // Original text: \"Users\"\n  settingsUsersPage: 'Användare',\n\n  // Original text: \"Groups\"\n  settingsGroupsPage: 'Grupper',\n\n  // Original text: \"ACLs\"\n  settingsAclsPage: undefined,\n\n  // Original text: \"Plugins\"\n  settingsPluginsPage: 'Plugin',\n\n  // Original text: 'Logs'\n  settingsLogsPage: 'Loggar',\n\n  // Original text: 'IPs'\n  settingsIpsPage: undefined,\n\n  // Original text: \"About\"\n  aboutPage: 'Om',\n\n  // Original text: 'About XO {xoaPlan}'\n  aboutXoaPlan: undefined,\n\n  // Original text: \"New\"\n  newMenu: 'Ny',\n\n  // Original text: \"Tasks\"\n  taskMenu: 'Uppgifter',\n\n  // Original text: 'Tasks'\n  taskPage: 'Uppgifter',\n\n  // Original text: \"VM\"\n  newVmPage: 'VM',\n\n  // Original text: \"Storage\"\n  newSrPage: 'Lagring',\n\n  // Original text: \"Server\"\n  newServerPage: 'Server',\n\n  // Original text: \"Import\"\n  newImport: 'Import',\n\n  // Original text: 'XOSAN'\n  xosan: undefined,\n\n  // Original text: \"Overview\"\n  backupOverviewPage: 'Överblick',\n\n  // Original text: \"New\"\n  backupNewPage: 'Ny',\n\n  // Original text: \"Remotes\"\n  backupRemotesPage: undefined,\n\n  // Original text: \"Restore\"\n  backupRestorePage: 'Återställ',\n\n  // Original text: 'File restore'\n  backupFileRestorePage: 'Filåterställning',\n\n  // Original text: \"Schedule\"\n  schedule: 'Schema',\n\n  // Original text: \"New VM backup\"\n  newVmBackup: 'Ny VM-backup',\n\n  // Original text: \"Edit VM backup\"\n  editVmBackup: 'Redigera VM-backup',\n\n  // Original text: \"Backup\"\n  backup: 'Backup',\n\n  // Original text: \"Rolling Snapshot\"\n  rollingSnapshot: 'Rullande Snapshots',\n\n  // Original text: \"Delta Backup\"\n  deltaBackup: undefined,\n\n  // Original text: \"Disaster Recovery\"\n  disasterRecovery: undefined,\n\n  // Original text: \"Continuous Replication\"\n  continuousReplication: 'Pågående replikering',\n\n  // Original text: \"Overview\"\n  jobsOverviewPage: 'Överblick',\n\n  // Original text: \"New\"\n  jobsNewPage: 'Ny',\n\n  // Original text: \"Scheduling\"\n  jobsSchedulingPage: 'Schemaläggnig',\n\n  // Original text: \"Custom Job\"\n  customJob: 'Anpassad uppgift',\n\n  // Original text: 'User'\n  userPage: undefined,\n\n  // Original text: 'No support'\n  noSupport: 'Ingen support',\n\n  // Original text: 'Free upgrade!'\n  freeUpgrade: 'Gratis uppgradering',\n\n  // Original text: \"Sign out\"\n  signOut: 'Logga ut',\n\n  // Original text: 'Edit my settings {username}'\n  editUserProfile: 'Ändra mina inställningar {username}',\n\n  // Original text: \"Fetching data…\"\n  homeFetchingData: 'Hämtar data…',\n\n  // Original text: \"Welcome on Xen Orchestra!\"\n  homeWelcome: 'Välkommen till Xen Orchestra!',\n\n  // Original text: \"Add your XCP-ng hosts or pools\"\n  homeWelcomeText: 'Lägg till dina XCP-ng värdar eller pooler',\n\n  // Original text: 'Some XCP-ng hosts have been registered but are not connected'\n  homeConnectServerText: 'Några XCP-ng värdar har registrerats men är inte anslutna',\n\n  // Original text: \"Want some help?\"\n  homeHelp: 'Önskas hjälp?',\n\n  // Original text: \"Add server\"\n  homeAddServer: 'Lägg till server',\n\n  // Original text: 'Connect servers'\n  homeConnectServer: 'Anslut servrar',\n\n  // Original text: \"Online Doc\"\n  homeOnlineDoc: 'Online dokumentation',\n\n  // Original text: \"Pro Support\"\n  homeProSupport: undefined,\n\n  // Original text: \"There are no VMs!\"\n  homeNoVms: 'Det finns inga VMs!',\n\n  // Original text: \"Or…\"\n  homeNoVmsOr: 'Eller…',\n\n  // Original text: \"Import VM\"\n  homeImportVm: 'Importera VM',\n\n  // Original text: \"Import an existing VM in xva format\"\n  homeImportVmMessage: 'Importera en existerande VM i xva-format',\n\n  // Original text: \"Restore a backup\"\n  homeRestoreBackup: 'Återställ en backup',\n\n  // Original text: \"Restore a backup from a remote store\"\n  homeRestoreBackupMessage: 'Återställ en backup från en fjärrlagring',\n\n  // Original text: \"This will create a new VM\"\n  homeNewVmMessage: 'Detta kommer skapa en ny VM',\n\n  // Original text: \"Filters\"\n  homeFilters: 'Filter',\n\n  // Original text: 'No results! Click here to reset your filters'\n  homeNoMatches: 'Inga resultat! Klicka här för att återställa dina filter',\n\n  // Original text: \"Pool\"\n  homeTypePool: 'Pool',\n\n  // Original text: \"Host\"\n  homeTypeHost: 'Värd',\n\n  // Original text: \"VM\"\n  homeTypeVm: 'VM',\n\n  // Original text: \"SR\"\n  homeTypeSr: 'SR',\n\n  // Original text: 'Template'\n  homeTypeVmTemplate: 'Mall',\n\n  // Original text: \"Sort\"\n  homeSort: 'Sortera',\n\n  // Original text: \"Pools\"\n  homeAllPools: 'Pooler',\n\n  // Original text: \"Hosts\"\n  homeAllHosts: 'Värdar',\n\n  // Original text: \"Tags\"\n  homeAllTags: 'Etiketter',\n\n  // Original text: \"New VM\"\n  homeNewVm: 'Ny VM',\n\n  // Original text: 'None'\n  homeFilterNone: 'Inga',\n\n  // Original text: \"Running hosts\"\n  homeFilterRunningHosts: 'Aktiva värdar',\n\n  // Original text: \"Disabled hosts\"\n  homeFilterDisabledHosts: 'Inaktiverade värdar',\n\n  // Original text: \"Running VMs\"\n  homeFilterRunningVms: 'Körande VMs',\n\n  // Original text: \"Non running VMs\"\n  homeFilterNonRunningVms: 'Icke-körande VMs',\n\n  // Original text: \"Pending VMs\"\n  homeFilterPendingVms: 'Väntande VMs',\n\n  // Original text: \"HVM guests\"\n  homeFilterHvmGuests: undefined,\n\n  // Original text: \"Tags\"\n  homeFilterTags: 'Etiketter',\n\n  // Original text: \"Sort by\"\n  homeSortBy: 'Sortera enligt',\n\n  // Original text: \"Name\"\n  homeSortByName: 'Namn',\n\n  // Original text: \"Power state\"\n  homeSortByPowerstate: 'Körande status',\n\n  // Original text: \"RAM\"\n  homeSortByRAM: undefined,\n\n  // Original text: \"vCPUs\"\n  homeSortByvCPUs: undefined,\n\n  // Original text: 'CPUs'\n  homeSortByCpus: undefined,\n\n  // Original text: 'Shared/Not shared'\n  homeSortByShared: 'Delat/Icke delat',\n\n  // Original text: 'Size'\n  homeSortBySize: 'Storlek',\n\n  // Original text: 'Usage'\n  homeSortByUsage: 'Användning',\n\n  // Original text: 'Type'\n  homeSortByType: 'Typ',\n\n  // Original text: \"{displayed, number}x {icon} (on {total, number})\"\n  homeDisplayedItems: '{displayed, number}x {icon} (av {total, number})',\n\n  // Original text: \"{selected, number}x {icon} selected (on {total, number})\"\n  homeSelectedItems: '{selected, number}x {icon} valda (av {total, number})',\n\n  // Original text: \"More\"\n  homeMore: 'Mer',\n\n  // Original text: \"Migrate to…\"\n  homeMigrateTo: 'Migrera till…',\n\n  // Original text: 'Missing patches'\n  homeMissingPatches: 'Saknar uppdateringar',\n\n  // Original text: 'Master:'\n  homePoolMaster: undefined,\n\n  // Original text: 'Resource set: {resourceSet}'\n  homeResourceSet: undefined,\n\n  // Original text: 'High Availability'\n  highAvailability: undefined,\n\n  // Original text: 'Shared {type}'\n  srSharedType: 'Delad',\n\n  // Original text: 'Not shared {type}'\n  srNotSharedType: 'Ej delad',\n\n  // Original text: \"Add\"\n  add: 'Lägg till',\n\n  // Original text: 'Select all'\n  selectAll: 'Välj allt',\n\n  // Original text: \"Remove\"\n  remove: 'Ta bort',\n\n  // Original text: \"Preview\"\n  preview: 'Förandsvisa',\n\n  // Original text: \"Item\"\n  item: 'Föremål',\n\n  // Original text: \"No selected value\"\n  noSelectedValue: 'Inget valt värde',\n\n  // Original text: \"Choose user(s) and/or group(s)\"\n  selectSubjects: 'Välj användare och/eller grupp(er)',\n\n  // Original text: \"Select Object(s)…\"\n  selectObjects: 'Välj object…',\n\n  // Original text: \"Choose a role\"\n  selectRole: 'Välj en roll',\n\n  // Original text: \"Select Host(s)…\"\n  selectHosts: 'Välj värd(ar)…',\n\n  // Original text: \"Select object(s)…\"\n  selectHostsVms: 'Välj object…',\n\n  // Original text: \"Select Network(s)…\"\n  selectNetworks: 'Välj nätverk…',\n\n  // Original text: \"Select PIF(s)…\"\n  selectPifs: 'Välj PIF(s)…',\n\n  // Original text: \"Select Pool(s)…\"\n  selectPools: 'Välj Pool(er)…',\n\n  // Original text: \"Select Remote(s)…\"\n  selectRemotes: 'Välj fjärrlagring(ar)…',\n\n  // Original text: 'Select resource set(s)…'\n  selectResourceSets: undefined,\n\n  // Original text: 'Select template(s)…'\n  selectResourceSetsVmTemplate: undefined,\n\n  // Original text: 'Select SR(s)…'\n  selectResourceSetsSr: undefined,\n\n  // Original text: 'Select network(s)…'\n  selectResourceSetsNetwork: undefined,\n\n  // Original text: 'Select disk(s)…'\n  selectResourceSetsVdi: undefined,\n\n  // Original text: 'Select SSH key(s)…'\n  selectSshKey: 'Välj SSH nycklar',\n\n  // Original text: \"Select SR(s)…\"\n  selectSrs: 'Välj SR(s)…',\n\n  // Original text: \"Select VM(s)…\"\n  selectVms: 'Välj VM(s)…',\n\n  // Original text: \"Select VM template(s)…\"\n  selectVmTemplates: 'Välj VM mall(ar)…',\n\n  // Original text: \"Select tag(s)…\"\n  selectTags: 'Välj etikett(er)…',\n\n  // Original text: \"Select disk(s)…\"\n  selectVdis: 'Välj disk(ar)…',\n\n  // Original text: 'Select timezone…'\n  selectTimezone: 'Välj tidzon',\n\n  // Original text: 'Select IP(s)…'\n  selectIp: 'Välj IP-adress(er)',\n\n  // Original text: 'Select IP pool(s)…'\n  selectIpPool: undefined,\n\n  // Original text: \"Fill required informations.\"\n  fillRequiredInformations: 'Fyll i den behövda informationen',\n\n  // Original text: \"Fill informations (optional)\"\n  fillOptionalInformations: 'Fyll i informationen (valfritt)',\n\n  // Original text: \"Reset\"\n  selectTableReset: undefined,\n\n  // Original text: \"Month\"\n  schedulingMonth: 'Månad',\n\n  // Original text: 'Every N month'\n  schedulingEveryNMonth: 'Varje N månad',\n\n  // Original text: \"Each selected month\"\n  schedulingEachSelectedMonth: 'Varje vald månad',\n\n  // Original text: 'Day'\n  schedulingDay: 'Dag',\n\n  // Original text: 'Every N day'\n  schedulingEveryNDay: 'Varje N dag',\n\n  // Original text: \"Each selected day\"\n  schedulingEachSelectedDay: 'Varje vald dag',\n\n  // Original text: 'Switch to week days'\n  schedulingSetWeekDayMode: 'Byt till veckodagar',\n\n  // Original text: 'Switch to month days'\n  schedulingSetMonthDayMode: 'Byt till månadsdagar',\n\n  // Original text: \"Hour\"\n  schedulingHour: 'Timme',\n\n  // Original text: \"Each selected hour\"\n  schedulingEachSelectedHour: 'Varje vald timme',\n\n  // Original text: \"Every N hour\"\n  schedulingEveryNHour: 'Varje N timme',\n\n  // Original text: \"Minute\"\n  schedulingMinute: 'Minut',\n\n  // Original text: \"Each selected minute\"\n  schedulingEachSelectedMinute: 'Varje vald minut',\n\n  // Original text: \"Every N minute\"\n  schedulingEveryNMinute: 'Varje N minut',\n\n  // Original text: 'Every month'\n  selectTableAllMonth: 'Varje månad',\n\n  // Original text: 'Every day'\n  selectTableAllDay: 'Varje dag',\n\n  // Original text: 'Every hour'\n  selectTableAllHour: 'Varje timme',\n\n  // Original text: 'Every minute'\n  selectTableAllMinute: 'Varje minut',\n\n  // Original text: \"Reset\"\n  schedulingReset: undefined,\n\n  // Original text: \"Unknown\"\n  unknownSchedule: 'Okänt',\n\n  // Original text: 'Web browser timezone'\n  timezonePickerUseLocalTime: 'Webbläsar-tidzon',\n\n  // Original text: 'Server timezone ({value})'\n  serverTimezoneOption: 'Server tidzon ({värde})',\n\n  // Original text: 'Cron Pattern:'\n  cronPattern: 'Cron mönster',\n\n  // Original text: \"Cannot edit backup\"\n  backupEditNotFoundTitle: 'Kan inte redigera backup',\n\n  // Original text: \"Missing required info for edition\"\n  backupEditNotFoundMessage: 'Nödvändig information saknas',\n\n  // Original text: 'Successful'\n  successfulJobCall: 'Lyckat',\n\n  // Original text: 'Failed'\n  failedJobCall: 'Misslyckat',\n\n  // Original text: 'In progress'\n  jobCallInProgess: 'Pågående',\n\n  // Original text: 'size:'\n  jobTransferredDataSize: 'Storlek',\n\n  // Original text: 'speed:'\n  jobTransferredDataSpeed: 'Hastighet',\n\n  // Original text: \"Job\"\n  job: 'Arbete',\n\n  // Original text: 'Job {job}'\n  jobModalTitle: 'Arbete {job}',\n\n  // Original text: \"ID\"\n  jobId: 'ID',\n\n  // Original text: 'Type'\n  jobType: 'Typ',\n\n  // Original text: \"Name\"\n  jobName: 'Namn',\n\n  // Original text: 'Name of your job (forbidden: \"_\")'\n  jobNamePlaceholder: undefined,\n\n  // Original text: \"Start\"\n  jobStart: 'Start',\n\n  // Original text: \"End\"\n  jobEnd: 'Slut',\n\n  // Original text: \"Duration\"\n  jobDuration: 'Varaktighet',\n\n  // Original text: \"Status\"\n  jobStatus: undefined,\n\n  // Original text: \"Action\"\n  jobAction: 'Åtgärd',\n\n  // Original text: \"Tag\"\n  jobTag: 'Etikett',\n\n  // Original text: \"Scheduling\"\n  jobScheduling: 'Schemaläggning',\n\n  // Original text: \"State\"\n  jobState: 'Status',\n\n  // Original text: 'Enabled'\n  jobStateEnabled: 'Aktiverad',\n\n  // Original text: 'Disabled'\n  jobStateDisabled: 'Inaktiverad',\n\n  // Original text: 'Timezone'\n  jobTimezone: 'Tidzon',\n\n  // Original text: 'Server'\n  jobServerTimezone: undefined,\n\n  // Original text: \"Run job\"\n  runJob: 'Kör arbete',\n\n  // Original text: \"One shot running started. See overview for logs.\"\n  runJobVerbose: undefined,\n\n  // Original text: \"Started\"\n  jobStarted: 'Startad',\n\n  // Original text: \"Finished\"\n  jobFinished: 'Färdig',\n\n  // Original text: \"Save\"\n  saveBackupJob: 'Sparad',\n\n  // Original text: \"Remove backup job\"\n  deleteBackupSchedule: 'Radera backup-uppgift',\n\n  // Original text: \"Are you sure you want to delete this backup job?\"\n  deleteBackupScheduleQuestion: 'Är du säker att du vill radera denna backup-uppgift?',\n\n  // Original text: \"Enable immediately after creation\"\n  scheduleEnableAfterCreation: 'Aktivera omedelbart efter skapande',\n\n  // Original text: \"You are editing Schedule {name} ({id}). Saving will override previous schedule state.\"\n  scheduleEditMessage: 'Du redigerar Schema {name} ({id}). Sparande kommer skriva över föregående schema-status',\n\n  // Original text: \"You are editing job {name} ({id}). Saving will override previous job state.\"\n  jobEditMessage: 'Du redigerar Uppgift {name} ({id}). Sparande kommer skriva över föregående uppgift-status',\n\n  // Original text: \"No scheduled jobs.\"\n  noScheduledJobs: 'Inga schemalagda uppgifter',\n\n  // Original text: \"No jobs found.\"\n  noJobs: 'Inga uppgifter funna',\n\n  // Original text: \"No schedules found\"\n  noSchedules: 'Inga scheman funna',\n\n  // Original text: \"Select a xo-server API command\"\n  jobActionPlaceHolder: 'Välj ett xo-server API-kommando',\n\n  // Original text: ' Timeout (number of seconds after which a VM is considered failed)'\n  jobTimeoutPlaceHolder: undefined,\n\n  // Original text: 'Schedules'\n  jobSchedules: 'Scheman',\n\n  // Original text: 'Name of your schedule'\n  jobScheduleNamePlaceHolder: 'Schemanamn',\n\n  // Original text: 'Select a Job'\n  jobScheduleJobPlaceHolder: 'Välj en uppgift',\n\n  // Original text: 'Job owner'\n  jobOwnerPlaceholder: 'Uppgiftsägare',\n\n  // Original text: \"This job's creator no longer exists\"\n  jobUserNotFound: 'Denna uppgiftens skapare existerar inte längre',\n\n  // Original text: \"This backup's creator no longer exists\"\n  backupUserNotFound: 'Denna backupens skapare existerar inte längre',\n\n  // Original text: 'Backup owner'\n  backupOwner: 'Backupägare',\n\n  // Original text: \"Select your backup type:\"\n  newBackupSelection: 'Välj din backup-typ',\n\n  // Original text: 'Select backup mode:'\n  smartBackupModeSelection: 'Välj backupvariant',\n\n  // Original text: 'Normal backup'\n  normalBackup: undefined,\n\n  // Original text: 'Smart backup'\n  smartBackup: undefined,\n\n  // Original text: 'Local remote selected'\n  localRemoteWarningTitle: undefined,\n\n  // Original text: 'Warning: local remotes will use limited XOA disk space. Only for advanced users.'\n  localRemoteWarningMessage: undefined,\n\n  // Original text: 'Warning: this feature works only with XenServer 6.5 or newer.'\n  backupVersionWarning: 'Varning: Denna funktion fungerar endast med XenServer 6.5 eller nyare.',\n\n  // Original text: 'VMs'\n  editBackupVmsTitle: 'VMs',\n\n  // Original text: 'VMs statuses'\n  editBackupSmartStatusTitle: 'VMs statusar',\n\n  // Original text: 'Resident on'\n  editBackupSmartResidentOn: 'Befinner sig på',\n\n  // Original text: 'Pools'\n  editBackupSmartPools: 'Pooler',\n\n  // Original text: 'Tags'\n  editBackupSmartTags: 'Etiketter',\n\n  // Original text: 'VMs Tags'\n  editBackupSmartTagsTitle: 'VMs etiketter',\n\n  // Original text: 'Reverse'\n  editBackupNot: 'Ångra',\n\n  // Original text: 'Tag'\n  editBackupTagTitle: 'Etikett',\n\n  // Original text: 'Report'\n  editBackupReportTitle: 'Rapport',\n\n  // Original text: 'Automatically run as scheduled'\n  editBackupScheduleEnabled: 'Automatiskt kör enligt schema',\n\n  // Original text: 'Depth'\n  editBackupDepthTitle: 'Djup',\n\n  // Original text: 'Remote'\n  editBackupRemoteTitle: 'Fjärr',\n\n  // Original text: 'Delete the old backups first'\n  deleteOldBackupsFirst: 'Radera dom gamla backuperna först',\n\n  // Original text: \"Remote stores for backup\"\n  remoteList: 'Fjärrlagring för backup',\n\n  // Original text: \"New File System Remote\"\n  newRemote: 'Ny fjärrlagning',\n\n  // Original text: \"Local\"\n  remoteTypeLocal: 'Lokalt',\n\n  // Original text: \"NFS\"\n  remoteTypeNfs: 'NFS',\n\n  // Original text: \"SMB\"\n  remoteTypeSmb: 'Samba',\n\n  // Original text: \"Type\"\n  remoteType: 'Typ',\n\n  // Original text: 'Test your remote'\n  remoteTestTip: 'Testa din fjärrlagring',\n\n  // Original text: 'Test Remote'\n  testRemote: 'Testa fjärrlagring',\n\n  // Original text: 'Test failed for {name}'\n  remoteTestFailure: 'Test misslyckades för {name}',\n\n  // Original text: 'Test passed for {name}'\n  remoteTestSuccess: 'Test lyckades för {name}',\n\n  // Original text: 'Error'\n  remoteTestError: undefined,\n\n  // Original text: 'Test Step'\n  remoteTestStep: undefined,\n\n  // Original text: 'Test file'\n  remoteTestFile: undefined,\n\n  // Original text: 'Test name'\n  remoteTestName: undefined,\n\n  // Original text: 'Remote name already exists!'\n  remoteTestNameFailure: 'Fjärrlagrinsnamn existerar redan',\n\n  // Original text: 'The remote appears to work correctly'\n  remoteTestSuccessMessage: 'Fjärrlagringen verkar fungera korrekt',\n\n  // Original text: 'Connection failed'\n  remoteConnectionFailed: 'Anslutning misslyckades',\n\n  // Original text: 'Name'\n  remoteName: 'Namn',\n\n  // Original text: 'Path'\n  remotePath: 'Sökväg',\n\n  // Original text: 'State'\n  remoteState: 'Status',\n\n  // Original text: 'Device'\n  remoteDevice: 'Enhet',\n\n  // Original text: 'Share'\n  remoteShare: 'Dela',\n\n  // Original text: 'Action'\n  remoteAction: 'Åtgärd',\n\n  // Original text: 'Auth'\n  remoteAuth: undefined,\n\n  // Original text: 'Mounted'\n  remoteMounted: 'Monterad',\n\n  // Original text: 'Unmounted'\n  remoteUnmounted: 'Avmonterad',\n\n  // Original text: 'Connect'\n  remoteConnectTip: 'Anslut',\n\n  // Original text: 'Disconnect'\n  remoteDisconnectTip: 'Koppla ifrån',\n\n  // Original text: 'Connected'\n  remoteConnected: 'Ansluten',\n\n  // Original text: 'Disconnected'\n  remoteDisconnected: 'Bortkopplad',\n\n  // Original text: 'Delete'\n  remoteDeleteTip: 'Radera',\n\n  // Original text: 'remote name *'\n  remoteNamePlaceHolder: 'fjärrlagringsnamn *',\n\n  // Original text: 'Name *'\n  remoteMyNamePlaceHolder: 'Namn *',\n\n  // Original text: '/path/to/backup'\n  remoteLocalPlaceHolderPath: undefined,\n\n  // Original text: 'host *'\n  remoteNfsPlaceHolderHost: 'värd *',\n\n  // Original text: 'path/to/backup'\n  remoteNfsPlaceHolderPath: undefined,\n\n  // Original text: 'subfolder [path\\\\to\\\\backup]'\n  remoteSmbPlaceHolderRemotePath: 'undermapp [path\\\\to\\\\backup]',\n\n  // Original text: 'Username'\n  remoteSmbPlaceHolderUsername: 'Användarnamn',\n\n  // Original text: 'Password'\n  remoteSmbPlaceHolderPassword: 'Lösenord',\n\n  // Original text: 'Domain'\n  remoteSmbPlaceHolderDomain: 'Domän',\n\n  // Original text: '<address>\\\\<share> *'\n  remoteSmbPlaceHolderAddressShare: undefined,\n\n  // Original text: 'password(fill to edit)'\n  remotePlaceHolderPassword: 'lösenord(fill to edit)',\n\n  // Original text: 'Create a new SR'\n  newSrTitle: 'Skapa ny SR',\n\n  // Original text: \"General\"\n  newSrGeneral: 'Generell',\n\n  // Original text: \"Select Storage Type:\"\n  newSrTypeSelection: 'Välj lagringstyp',\n\n  // Original text: \"Settings\"\n  newSrSettings: 'Inställningar',\n\n  // Original text: \"Storage Usage\"\n  newSrUsage: 'Lagringsanvändning',\n\n  // Original text: \"Summary\"\n  newSrSummary: 'Sammanfattning',\n\n  // Original text: \"Host\"\n  newSrHost: 'Värd',\n\n  // Original text: \"Type\"\n  newSrType: 'Typ',\n\n  // Original text: \"Name\"\n  newSrName: 'Namn',\n\n  // Original text: \"Description\"\n  newSrDescription: 'Beskrivning',\n\n  // Original text: \"Server\"\n  newSrServer: 'Server',\n\n  // Original text: \"Path\"\n  newSrPath: 'Sökväg',\n\n  // Original text: \"IQN\"\n  newSrIqn: 'IQN',\n\n  // Original text: \"LUN\"\n  newSrLun: 'LUN',\n\n  // Original text: \"with auth.\"\n  newSrAuth: 'med autentisering',\n\n  // Original text: \"User Name\"\n  newSrUsername: 'Användarnamn',\n\n  // Original text: \"Password\"\n  newSrPassword: 'Lösenord',\n\n  // Original text: \"Device\"\n  newSrDevice: 'Enhet',\n\n  // Original text: \"in use\"\n  newSrInUse: 'används',\n\n  // Original text: \"Size\"\n  newSrSize: 'Storlek',\n\n  // Original text: \"Create\"\n  newSrCreate: 'Skapa',\n\n  // Original text: 'Storage name'\n  newSrNamePlaceHolder: 'Lagringsnamn',\n\n  // Original text: 'Storage description'\n  newSrDescPlaceHolder: 'Lagringsbeskrivning',\n\n  // Original text: 'Address'\n  newSrAddressPlaceHolder: 'Adress',\n\n  // Original text: '[port]'\n  newSrPortPlaceHolder: undefined,\n\n  // Original text: 'Username'\n  newSrUsernamePlaceHolder: 'Användarnamn',\n\n  // Original text: 'Password'\n  newSrPasswordPlaceHolder: 'Lösenord',\n\n  // Original text: 'Device, e.g /dev/sda…'\n  newSrLvmDevicePlaceHolder: 'Enhet, t.ex. /dev/sda…',\n\n  // Original text: '/path/to/directory'\n  newSrLocalPathPlaceHolder: undefined,\n\n  // Original text: \"Users/Groups\"\n  subjectName: 'Användare/Gruppoer',\n\n  // Original text: \"Object\"\n  objectName: 'Objekt',\n\n  // Original text: 'No acls found'\n  aclNoneFound: 'Inga acls funna',\n\n  // Original text: \"Role\"\n  roleName: 'Roll',\n\n  // Original text: 'Create'\n  aclCreate: 'Skapa',\n\n  // Original text: \"New Group Name\"\n  newGroupName: 'Nytt gruppnamn',\n\n  // Original text: \"Create Group\"\n  createGroup: 'Skapa grupp',\n\n  // Original text: \"Create\"\n  createGroupButton: 'Skapa',\n\n  // Original text: \"Delete Group\"\n  deleteGroup: 'Radera grupp',\n\n  // Original text: \"Are you sure you want to delete this group?\"\n  deleteGroupConfirm: 'Är du säker att du vill radera denna gruppen?',\n\n  // Original text: \"Remove user from Group\"\n  removeUserFromGroup: 'Ta bort användare från grupp',\n\n  // Original text: \"Are you sure you want to delete this user?\"\n  deleteUserConfirm: 'Är du säker du vill radera denna användaren?',\n\n  // Original text: \"Delete User\"\n  deleteUser: 'Radera användare',\n\n  // Original text: 'no user'\n  noUser: 'ingen användare',\n\n  // Original text: \"unknown user\"\n  unknownUser: 'okänd användare',\n\n  // Original text: \"No group found\"\n  noGroupFound: 'Ingen grupp funnen',\n\n  // Original text: \"Name\"\n  groupNameColumn: 'Namn',\n\n  // Original text: \"Users\"\n  groupUsersColumn: 'Användare',\n\n  // Original text: \"Add User\"\n  addUserToGroupColumn: 'Lägg till användare',\n\n  // Original text: \"Email\"\n  userNameColumn: 'E-post',\n\n  // Original text: \"Permissions\"\n  userPermissionColumn: 'Rättigheter',\n\n  // Original text: \"Password\"\n  userPasswordColumn: 'Lösenord',\n\n  // Original text: \"Email\"\n  userName: 'E-post',\n\n  // Original text: \"Password\"\n  userPassword: 'Lösenord',\n\n  // Original text: \"Create\"\n  createUserButton: 'Skapa',\n\n  // Original text: \"No user found\"\n  noUserFound: 'Ingen användare funnen',\n\n  // Original text: \"User\"\n  userLabel: 'Användare',\n\n  // Original text: \"Admin\"\n  adminLabel: 'Admin',\n\n  // Original text: \"No user in group\"\n  noUserInGroup: 'Ingen användare i gruppen',\n\n  // Original text: \"{users, number} user{users, plural, one {} other {s}}\"\n  countUsers: '{users, number} user{users, plural, one {} other {s}}',\n\n  // Original text: \"Select Permission\"\n  selectPermission: 'Välj rättighet',\n\n  // Original text: 'No plugins found'\n  noPlugins: 'Inga plugins funna',\n\n  // Original text: \"Auto-load at server start\"\n  autoloadPlugin: 'Ladda in automatiskt vid serverstart',\n\n  // Original text: \"Save configuration\"\n  savePluginConfiguration: 'Spara konfiguration',\n\n  // Original text: \"Delete configuration\"\n  deletePluginConfiguration: 'Radera konfiguration',\n\n  // Original text: \"Plugin error\"\n  pluginError: undefined,\n\n  // Original text: \"Unknown error\"\n  unknownPluginError: 'Okänt fel',\n\n  // Original text: \"Purge plugin configuration\"\n  purgePluginConfiguration: 'Nollställ pluginkonfiguration',\n\n  // Original text: \"Are you sure you want to purge this configuration ?\"\n  purgePluginConfigurationQuestion: 'Är du säker du vill nollställa denn konfigurationen?',\n\n  // Original text: \"Edit\"\n  editPluginConfiguration: 'Redigera',\n\n  // Original text: \"Cancel\"\n  cancelPluginEdition: 'Avbryt',\n\n  // Original text: \"Plugin configuration\"\n  pluginConfigurationSuccess: 'Pluginkonfiguration',\n\n  // Original text: \"Plugin configuration successfully saved!\"\n  pluginConfigurationChanges: 'Pluginkonfiguration sparades framgångsrikt',\n\n  // Original text: 'Predefined configuration'\n  pluginConfigurationPresetTitle: 'Förinställnd konfiguration',\n\n  // Original text: 'Choose a predefined configuration.'\n  pluginConfigurationChoosePreset: 'Välj en förinställd konfiguration',\n\n  // Original text: 'Apply'\n  applyPluginPreset: 'Applicera',\n\n  // Original text: 'Save filter error'\n  saveNewUserFilterErrorTitle: 'Spara filterfel',\n\n  // Original text: 'Bad parameter: name must be given.'\n  saveNewUserFilterErrorBody: 'Felaktig parameter: namne måste anges',\n\n  // Original text: 'Name:'\n  filterName: 'Namn',\n\n  // Original text: 'Value:'\n  filterValue: 'Värde',\n\n  // Original text: 'Save new filter'\n  saveNewFilterTitle: 'Spara mitt filter',\n\n  // Original text: 'Set custom filters'\n  setUserFiltersTitle: 'Sätt anpassat filter',\n\n  // Original text: 'Are you sure you want to set custom filters?'\n  setUserFiltersBody: 'Är du säker att du vill sätta ett anpassat filter?',\n\n  // Original text: 'Remove custom filter'\n  removeUserFilterTitle: 'Ta bort anpassat filter',\n\n  // Original text: 'Are you sure you want to remove custom filter?'\n  removeUserFilterBody: 'Är du säker du vill ta bort ett anpassat filter?',\n\n  // Original text: 'Default filter'\n  defaultFilter: 'Standardfilter',\n\n  // Original text: 'Default filters'\n  defaultFilters: 'Standardfilter',\n\n  // Original text: 'Custom filters'\n  customFilters: 'Anpassade filter',\n\n  // Original text: 'Customize filters'\n  customizeFilters: 'Anpassa filter',\n\n  // Original text: 'Save custom filters'\n  saveCustomFilters: 'Spara anpassade filter',\n\n  // Original text: \"Start\"\n  startVmLabel: 'Starta',\n\n  // Original text: \"Recovery start\"\n  recoveryModeLabel: 'Återhämtningsstart',\n\n  // Original text: \"Suspend\"\n  suspendVmLabel: 'Pausad',\n\n  // Original text: \"Stop\"\n  stopVmLabel: 'Stopp',\n\n  // Original text: \"Force shutdown\"\n  forceShutdownVmLabel: 'Tvinga avstängning',\n\n  // Original text: \"Reboot\"\n  rebootVmLabel: 'Starta om',\n\n  // Original text: \"Force reboot\"\n  forceRebootVmLabel: 'Tvinga omstart',\n\n  // Original text: \"Delete\"\n  deleteVmLabel: 'Radera',\n\n  // Original text: \"Migrate\"\n  migrateVmLabel: 'Migrera',\n\n  // Original text: \"Snapshot\"\n  snapshotVmLabel: 'Snapshot',\n\n  // Original text: \"Export\"\n  exportVmLabel: 'Exportera',\n\n  // Original text: \"Resume\"\n  resumeVmLabel: 'Återuppta',\n\n  // Original text: \"Copy\"\n  copyVmLabel: 'Kopiera',\n\n  // Original text: \"Clone\"\n  cloneVmLabel: 'Klona',\n\n  // Original text: \"Fast clone\"\n  fastCloneVmLabel: 'Snabbklona',\n\n  // Original text: \"Convert to template\"\n  convertVmToTemplateLabel: 'Konvertera till en mall',\n\n  // Original text: \"Console\"\n  vmConsoleLabel: 'Konsol',\n\n  // Original text: \"Rescan all disks\"\n  srRescan: 'Återscanna alla diskar',\n\n  // Original text: \"Connect to all hosts\"\n  srReconnectAll: 'Anslut till alla värdar',\n\n  // Original text: \"Disconnect from all hosts\"\n  srDisconnectAll: 'Koppla bort från alla värdar',\n\n  // Original text: \"Forget this SR\"\n  srForget: 'Glöm denna SR',\n\n  // Original text: 'Forget SRs'\n  srsForget: 'Glöm SRs',\n\n  // Original text: \"Remove this SR\"\n  srRemoveButton: 'Radera denna SR',\n\n  // Original text: \"No VDIs in this storage\"\n  srNoVdis: 'Denna lagringen saknar VDIs',\n\n  // Original text: 'Pool RAM usage:'\n  poolTitleRamUsage: 'Användning Pool RAM',\n\n  // Original text: '{used} used on {total}'\n  poolRamUsage: undefined,\n\n  // Original text: 'Master:'\n  poolMaster: undefined,\n\n  // Original text: 'Display all hosts of this pool'\n  displayAllHosts: 'Visa alla värdar i denna pool',\n\n  // Original text: 'Display all storages of this pool'\n  displayAllStorages: 'Visa alla lagringar i denna pool',\n\n  // Original text: 'Display all VMs of this pool'\n  displayAllVMs: 'Visa alla VMs i denna pool',\n\n  // Original text: \"Hosts\"\n  hostsTabName: 'Värdar',\n\n  // Original text: 'Vms'\n  vmsTabName: undefined,\n\n  // Original text: 'Srs'\n  srsTabName: undefined,\n\n  // Original text: \"High Availability\"\n  poolHaStatus: undefined,\n\n  // Original text: \"Enabled\"\n  poolHaEnabled: 'Aktiverad',\n\n  // Original text: \"Disabled\"\n  poolHaDisabled: 'Inaktiverad',\n\n  // Original text: \"Name\"\n  hostNameLabel: 'Namn',\n\n  // Original text: \"Description\"\n  hostDescription: 'Beskrivning',\n\n  // Original text: \"Memory\"\n  hostMemory: 'Minne',\n\n  // Original text: \"No hosts\"\n  noHost: 'Inga värdar',\n\n  // Original text: '{used}% used ({free} free)'\n  memoryLeftTooltip: undefined,\n\n  // Original text: 'PIF'\n  pif: undefined,\n\n  // Original text: \"Name\"\n  poolNetworkNameLabel: 'Namn',\n\n  // Original text: \"Description\"\n  poolNetworkDescription: 'Beskrivning',\n\n  // Original text: \"PIFs\"\n  poolNetworkPif: 'PIFs',\n\n  // Original text: \"No networks\"\n  poolNoNetwork: 'Inga nätverk',\n\n  // Original text: \"MTU\"\n  poolNetworkMTU: 'MTU',\n\n  // Original text: \"Connected\"\n  poolNetworkPifAttached: 'Ansluten',\n\n  // Original text: \"Disconnected\"\n  poolNetworkPifDetached: 'Bortkopplad',\n\n  // Original text: 'Show PIFs'\n  showPifs: undefined,\n\n  // Original text: 'Hide PIFs'\n  hidePifs: undefined,\n\n  // Original text: 'Show details'\n  showDetails: undefined,\n\n  // Original text: 'Hide details'\n  hideDetails: undefined,\n\n  // Original text: 'No stats'\n  poolNoStats: undefined,\n\n  // Original text: 'All hosts'\n  poolAllHosts: undefined,\n\n  // Original text: \"Add SR\"\n  addSrLabel: 'Lägg till SR',\n\n  // Original text: \"Add VM\"\n  addVmLabel: 'Lägg till VM',\n\n  // Original text: \"Add Host\"\n  addHostLabel: 'Lägg till host',\n\n  // Original text: 'This host needs to install {patches, number} patch{patches, plural, one {} other {es}} before it can be added to the pool. This operation may be long.'\n  hostNeedsPatchUpdate: undefined,\n\n  // Original text: \"This host cannot be added to the pool because it's missing some patches.\"\n  hostNeedsPatchUpdateNoInstall: undefined,\n\n  // Original text: 'Adding host failed'\n  addHostErrorTitle: 'Lägga till värd misslyckades',\n\n  // Original text: 'Host patches could not be homogenized.'\n  addHostNotHomogeneousErrorMessage: undefined,\n\n  // Original text: \"Disconnect\"\n  disconnectServer: 'Koppla bort',\n\n  // Original text: \"Start\"\n  startHostLabel: 'Start',\n\n  // Original text: \"Stop\"\n  stopHostLabel: 'Stop',\n\n  // Original text: \"Enable\"\n  enableHostLabel: 'Aktivera',\n\n  // Original text: \"Disable\"\n  disableHostLabel: 'Inaktivera',\n\n  // Original text: \"Restart toolstack\"\n  restartHostAgent: undefined,\n\n  // Original text: \"Force reboot\"\n  forceRebootHostLabel: 'Tvinga omstart',\n\n  // Original text: \"Reboot\"\n  rebootHostLabel: 'Starta om',\n\n  // Original text: 'Error while restarting host'\n  noHostsAvailableErrorTitle: undefined,\n\n  // Original text: 'Some VMs cannot be migrated before restarting this host. Please try force reboot.'\n  noHostsAvailableErrorMessage: undefined,\n\n  // Original text: 'Error while restarting hosts'\n  failHostBulkRestartTitle: undefined,\n\n  // Original text: '{failedHosts, number}/{totalHosts, number} host{failedHosts, plural, one {} other {s}} could not be restarted.'\n  failHostBulkRestartMessage: undefined,\n\n  // Original text: 'Reboot to apply updates'\n  rebootUpdateHostLabel: undefined,\n\n  // Original text: \"Emergency mode\"\n  emergencyModeLabel: 'Nödläge',\n\n  // Original text: \"Storage\"\n  storageTabName: 'Lagring',\n\n  // Original text: \"Patches\"\n  patchesTabName: 'patchar',\n\n  // Original text: \"Load average\"\n  statLoad: 'Belastningsmedelvärde',\n\n  // Original text: 'RAM Usage: {memoryUsed}'\n  memoryHostState: undefined,\n\n  // Original text: \"Hardware\"\n  hardwareHostSettingsLabel: 'Hårdvara',\n\n  // Original text: \"Address\"\n  hostAddress: 'Adress',\n\n  // Original text: \"Status\"\n  hostStatus: 'Status',\n\n  // Original text: \"Build number\"\n  hostBuildNumber: 'Número de compilación',\n\n  // Original text: \"iSCSI name\"\n  hostIscsiName: 'iSCSI namn',\n\n  // Original text: \"Version\"\n  hostXenServerVersion: 'Version',\n\n  // Original text: \"Enabled\"\n  hostStatusEnabled: 'Aktiverad',\n\n  // Original text: \"Disabled\"\n  hostStatusDisabled: 'Inaktiverad',\n\n  // Original text: \"Power on mode\"\n  hostPowerOnMode: undefined,\n\n  // Original text: \"Host uptime\"\n  hostStartedSince: 'Värd upptid',\n\n  // Original text: \"Toolstack uptime\"\n  hostStackStartedSince: undefined,\n\n  // Original text: \"CPU model\"\n  hostCpusModel: 'CPU-modell',\n\n  // Original text: \"Core (socket)\"\n  hostCpusNumber: 'Core (socket)',\n\n  // Original text: \"Manufacturer info\"\n  hostManufacturerinfo: 'Tillverkarens information',\n\n  // Original text: \"BIOS info\"\n  hostBiosinfo: 'BIOS-information',\n\n  // Original text: \"Licence\"\n  licenseHostSettingsLabel: 'Licens',\n\n  // Original text: \"Type\"\n  hostLicenseType: 'Typ',\n\n  // Original text: \"Socket\"\n  hostLicenseSocket: 'Socket',\n\n  // Original text: \"Expiry\"\n  hostLicenseExpiry: 'Utgångsdatum',\n\n  // Original text: 'Installed supplemental packs'\n  supplementalPacks: undefined,\n\n  // Original text: 'Install new supplemental pack'\n  supplementalPackNew: undefined,\n\n  // Original text: 'Install supplemental pack on every host'\n  supplementalPackPoolNew: undefined,\n\n  // Original text: '{name} (by {author})'\n  supplementalPackTitle: undefined,\n\n  // Original text: 'Installation started'\n  supplementalPackInstallStartedTitle: undefined,\n\n  // Original text: 'Installing new supplemental pack…'\n  supplementalPackInstallStartedMessage: undefined,\n\n  // Original text: 'Installation error'\n  supplementalPackInstallErrorTitle: undefined,\n\n  // Original text: 'The installation of the supplemental pack failed.'\n  supplementalPackInstallErrorMessage: undefined,\n\n  // Original text: 'Installation success'\n  supplementalPackInstallSuccessTitle: undefined,\n\n  // Original text: 'Supplemental pack successfully installed.'\n  supplementalPackInstallSuccessMessage: undefined,\n\n  // Original text: \"Add a network\"\n  networkCreateButton: 'Lägg till ett nätverk',\n\n  // Original text: 'Add a bonded network'\n  networkCreateBondedButton: undefined,\n  //FORTSÄTT\n  // Original text: \"Device\"\n  pifDeviceLabel: 'Enhet',\n\n  // Original text: \"Network\"\n  pifNetworkLabel: 'Nätverk',\n\n  // Original text: \"VLAN\"\n  pifVlanLabel: 'VLAN',\n\n  // Original text: \"Address\"\n  pifAddressLabel: 'adress',\n\n  // Original text: 'Mode'\n  pifModeLabel: undefined,\n\n  // Original text: \"MAC\"\n  pifMacLabel: 'MAC',\n\n  // Original text: \"MTU\"\n  pifMtuLabel: 'MTU',\n\n  // Original text: \"Status\"\n  pifStatusLabel: 'Status',\n\n  // Original text: \"Connected\"\n  pifStatusConnected: 'Ansluten',\n\n  // Original text: \"Disconnected\"\n  pifStatusDisconnected: 'Bortkopplad',\n\n  // Original text: \"No physical interface detected\"\n  pifNoInterface: 'Inga fysiska interface funna',\n\n  // Original text: 'This interface is currently in use'\n  pifInUse: 'Detta interface används',\n\n  // Original text: 'Action'\n  pifAction: 'Åtgärd',\n\n  // Original text: 'Default locking mode'\n  defaultLockingMode: 'Standard låsningläge',\n\n  // Original text: 'Configure IP address'\n  pifConfigureIp: 'Konfigurera IP-adress',\n\n  // Original text: 'Invalid parameters'\n  configIpErrorTitle: 'Ogiltiga parametrar',\n\n  // Original text: 'Static IP address'\n  staticIp: 'Statisk IP-Adress',\n\n  // Original text: 'Netmask'\n  netmask: 'Nätmask',\n\n  // Original text: 'DNS'\n  dns: undefined,\n\n  // Original text: 'Gateway'\n  gateway: undefined,\n\n  // Original text: \"Add a storage\"\n  addSrDeviceButton: 'Lägg till lagring',\n\n  // Original text: \"Name\"\n  srNameLabel: 'Namn',\n\n  // Original text: \"Type\"\n  srType: 'Typ',\n\n  // Original text: 'Action'\n  pbdAction: undefined,\n\n  // Original text: \"Status\"\n  pbdStatus: 'Status',\n\n  // Original text: \"Connected\"\n  pbdStatusConnected: 'Ansluten',\n\n  // Original text: \"Disconnected\"\n  pbdStatusDisconnected: 'Bortkopplad',\n\n  // Original text: 'Connect'\n  pbdConnect: undefined,\n\n  // Original text: 'Disconnect'\n  pbdDisconnect: undefined,\n\n  // Original text: 'Forget'\n  pbdForget: undefined,\n\n  // Original text: \"Shared\"\n  srShared: 'Delad',\n\n  // Original text: \"Not shared\"\n  srNotShared: 'Ej delad',\n\n  // Original text: \"No storage detected\"\n  pbdNoSr: 'Ingen lagring funnen',\n\n  // Original text: \"Name\"\n  patchNameLabel: 'Namn',\n\n  // Original text: \"Install all patches\"\n  patchUpdateButton: 'Installera alla uppdateringar',\n\n  // Original text: \"Description\"\n  patchDescription: 'Beskrivning',\n\n  // Original text: \"Applied date\"\n  patchApplied: 'Appliceringsdatum',\n\n  // Original text: \"Size\"\n  patchSize: 'Storlek',\n\n  // Original text: \"Status\"\n  patchStatus: 'Status',\n\n  // Original text: \"Applied\"\n  patchStatusApplied: 'Applicerades',\n\n  // Original text: \"Missing patches\"\n  patchStatusNotApplied: 'Uppdateringar saknas',\n\n  // Original text: \"No patch detected\"\n  patchNothing: 'Ingen uppdatering funnen',\n\n  // Original text: \"Release date\"\n  patchReleaseDate: 'Publiceringsdatum',\n\n  // Original text: \"Guidance\"\n  patchGuidance: 'Guidning',\n\n  // Original text: \"Action\"\n  patchAction: 'Åtgärd',\n\n  // Original text: 'Applied patches'\n  hostAppliedPatches: undefined,\n\n  // Original text: \"Missing patches\"\n  hostMissingPatches: 'Uppdateringar saknas',\n\n  // Original text: \"Host up-to-date!\"\n  hostUpToDate: 'Värd är uppdaterad',\n\n  // Original text: 'Non-recommended patch install'\n  installPatchWarningTitle: undefined,\n\n  // Original text: 'This will install a patch only on this host. This is NOT the recommended way: please go into the Pool patch view and follow instructions there. If you are sure about this, you can continue anyway'\n  installPatchWarningContent: undefined,\n\n  // Original text: 'Go to pool'\n  installPatchWarningReject: undefined,\n\n  // Original text: 'Install'\n  installPatchWarningResolve: 'Installera',\n\n  // Original text: 'Refresh patches'\n  refreshPatches: 'Förnya uppdateringar',\n\n  // Original text: 'Install pool patches'\n  installPoolPatches: 'Installera pooluppdateringar',\n\n  // Original text: 'Default SR'\n  defaultSr: 'Standard-SR',\n\n  // Original text: 'Set as default SR'\n  setAsDefaultSr: 'Sätt som standard-SR',\n\n  // Original text: \"General\"\n  generalTabName: 'Generell',\n\n  // Original text: \"Stats\"\n  statsTabName: 'Statistik',\n\n  // Original text: \"Console\"\n  consoleTabName: 'Konsol',\n\n  // Original text: 'Container'\n  containersTabName: undefined,\n\n  // Original text: \"Snapshots\"\n  snapshotsTabName: 'Snapshots',\n\n  // Original text: \"Logs\"\n  logsTabName: 'Logs',\n\n  // Original text: \"Advanced\"\n  advancedTabName: 'Avancerat',\n\n  // Original text: \"Network\"\n  networkTabName: 'Nätverk',\n\n  // Original text: \"Disk{disks, plural, one {} other {s}}\"\n  disksTabName: 'Disk{disks, plural, one {} other {s}}',\n\n  // Original text: \"halted\"\n  powerStateHalted: 'stannad',\n\n  // Original text: \"running\"\n  powerStateRunning: 'körande',\n\n  // Original text: \"suspended\"\n  powerStateSuspended: 'pausad',\n\n  // Original text: \"No Xen tools detected\"\n  vmStatus: 'Inga Xen Tools funna',\n\n  // Original text: \"No IPv4 record\"\n  vmName: undefined,\n\n  // Original text: \"No IP record\"\n  vmDescription: undefined,\n\n  // Original text: \"Started {ago}\"\n  vmSettings: 'Startades {ago}',\n\n  // Original text: \"Current status:\"\n  vmCurrentStatus: 'Aktuell status',\n\n  // Original text: \"Not running\"\n  vmNotRunning: 'Körs inte',\n\n  // Original text: 'Halted {ago}'\n  vmHaltedSince: undefined,\n\n  // Original text: \"No Xen tools detected\"\n  noToolsDetected: 'Inga Xen Tools funna',\n\n  // Original text: \"No IPv4 record\"\n  noIpv4Record: undefined,\n\n  // Original text: \"No IP record\"\n  noIpRecord: undefined,\n\n  // Original text: \"Started {ago}\"\n  started: 'Startades {ago}',\n\n  // Original text: \"Paravirtualization (PV)\"\n  paraVirtualizedMode: undefined,\n\n  // Original text: \"Hardware virtualization (HVM)\"\n  hardwareVirtualizedMode: undefined,\n\n  // Original text: \"CPU usage\"\n  statsCpu: 'CPU-användning',\n\n  // Original text: \"Memory usage\"\n  statsMemory: 'Minnesanvändning',\n\n  // Original text: \"Network throughput\"\n  statsNetwork: 'Nätverks genomströmning',\n\n  // Original text: 'Stacked values'\n  useStackedValuesOnStats: undefined,\n\n  // Original text: \"Disk throughput\"\n  statDisk: 'Disk genomströmning',\n\n  // Original text: \"Last 10 minutes\"\n  statLastTenMinutes: 'Senaste 10 minuterna',\n\n  // Original text: \"Last 2 hours\"\n  statLastTwoHours: 'Senaste 2 timmarna',\n\n  // Original text: \"Last week\"\n  statLastWeek: 'Senaste veckan',\n\n  // Original text: \"Last year\"\n  statLastYear: 'Senaste året',\n\n  // Original text: \"Copy\"\n  copyToClipboardLabel: 'Kopiera',\n\n  // Original text: \"Ctrl+Alt+Del\"\n  ctrlAltDelButtonLabel: 'Ctrl+Alt+Del',\n\n  // Original text: \"Tip:\"\n  tipLabel: 'Tips:',\n\n  // Original text: 'Hide infos'\n  hideHeaderTooltip: 'Dölj info',\n\n  // Original text: 'Show infos'\n  showHeaderTooltip: 'Visa info',\n\n  // Original text: 'Name'\n  containerName: 'Namn',\n\n  // Original text: 'Command'\n  containerCommand: 'Kommando',\n\n  // Original text: 'Creation date'\n  containerCreated: 'Skapandedatum',\n\n  // Original text: 'Status'\n  containerStatus: undefined,\n\n  // Original text: 'Action'\n  containerAction: 'Åtgärd',\n\n  // Original text: 'No existing containers'\n  noContainers: 'Inga existerande containrar',\n\n  // Original text: 'Stop this container'\n  containerStop: 'Stanna denna container',\n\n  // Original text: 'Start this container'\n  containerStart: 'Starta denna container',\n\n  // Original text: 'Pause this container'\n  containerPause: 'Pausa denna container',\n\n  // Original text: 'Resume this container'\n  containerResume: 'Återuppta denna container',\n\n  // Original text: 'Restart this container'\n  containerRestart: 'Starta om denna container',\n\n  // Original text: \"Action\"\n  vdiAction: 'Åtgärd',\n\n  // Original text: \"Attach disk\"\n  vdiAttachDevice: 'Anslut disk',\n\n  // Original text: \"New disk\"\n  vbdCreateDeviceButton: 'Ny disk',\n\n  // Original text: \"Boot order\"\n  vdiBootOrder: 'Boot-ordning',\n\n  // Original text: \"Name\"\n  vdiNameLabel: 'Namn',\n\n  // Original text: \"Description\"\n  vdiNameDescription: 'Beskrivning',\n\n  // Original text: 'Pool'\n  vdiPool: undefined,\n\n  // Original text: 'Disconnect'\n  vdiDisconnect: 'Koppla bort',\n\n  // Original text: \"Tags\"\n  vdiTags: 'Etiketter',\n\n  // Original text: \"Size\"\n  vdiSize: 'Storlek',\n\n  // Original text: \"SR\"\n  vdiSr: 'SR',\n\n  // Original text: 'VM'\n  vdiVm: undefined,\n\n  // Original text: 'Migrate VDI'\n  vdiMigrate: 'Migrera VDI',\n\n  // Original text: 'Destination SR:'\n  vdiMigrateSelectSr: 'Destinations-SR',\n\n  // Original text: 'No SR'\n  vdiMigrateNoSr: 'Ingen SR',\n\n  // Original text: 'A target SR is required to migrate a VDI'\n  vdiMigrateNoSrMessage: 'Ett mål-SR krävs för att migrera en VDI',\n\n  // Original text: 'Forget'\n  vdiForget: 'Glöm',\n\n  // Original text: 'Remove VDI'\n  vdiRemove: 'Ta bort VDI',\n\n  // Original text: 'No VDIs attached to Control Domain'\n  noControlDomainVdis: 'Inga VDIs anslutna till Control Domain',\n\n  // Original text: \"Boot flag\"\n  vbdBootableStatus: 'Boot flagga',\n\n  // Original text: \"Status\"\n  vbdStatus: 'Status',\n\n  // Original text: \"Connected\"\n  vbdStatusConnected: 'Ansluten',\n\n  // Original text: \"Disconnected\"\n  vbdStatusDisconnected: 'Bortkopplad',\n\n  // Original text: \"No disks\"\n  vbdNoVbd: 'Inga diskar',\n\n  // Original text: 'Connect VBD'\n  vbdConnect: 'Anslut VBD',\n\n  // Original text: 'Disconnect VBD'\n  vbdDisconnect: 'Koppla bort VBD',\n\n  // Original text: 'Bootable'\n  vbdBootable: 'Bootbar',\n\n  // Original text: 'Readonly'\n  vbdReadonly: 'Endast läsa',\n\n  // Original text: 'Action'\n  vbdAction: 'Åtgärd',\n\n  // Original text: 'Create'\n  vbdCreate: 'Skapa',\n\n  // Original text: 'Disk name'\n  vbdNamePlaceHolder: 'Disknamn',\n\n  // Original text: 'Size'\n  vbdSizePlaceHolder: 'Storlek',\n\n  // Original text: 'CD drive not completely installed'\n  cdDriveNotInstalled: 'CD-enheten är inte fullständigt installerad',\n\n  // Original text: 'Stop and start the VM to install the CD drive'\n  cdDriveInstallation: 'Stoppa och starta VM för att installera CD-enhet',\n\n  // Original text: 'Save'\n  saveBootOption: 'Spara',\n\n  // Original text: 'Reset'\n  resetBootOption: 'Reset',\n\n  // Original text: \"New device\"\n  vifCreateDeviceButton: 'Ny enhet',\n\n  // Original text: \"No interface\"\n  vifNoInterface: 'Inget interface',\n\n  // Original text: \"Device\"\n  vifDeviceLabel: 'Enhet',\n\n  // Original text: \"MAC address\"\n  vifMacLabel: 'MAC-adress',\n\n  // Original text: \"MTU\"\n  vifMtuLabel: 'MTU',\n\n  // Original text: \"Network\"\n  vifNetworkLabel: 'Nätverk',\n\n  // Original text: \"Status\"\n  vifStatusLabel: 'Status',\n\n  // Original text: \"Connected\"\n  vifStatusConnected: 'Ansluten',\n\n  // Original text: \"Disconnected\"\n  vifStatusDisconnected: 'Bortkopplad',\n\n  // Original text: 'Connect'\n  vifConnect: 'Anslut',\n\n  // Original text: 'Disconnect'\n  vifDisconnect: 'Koppla bort',\n\n  // Original text: 'Remove'\n  vifRemove: 'Ta bort',\n\n  // Original text: \"IP addresses\"\n  vifIpAddresses: 'IP-adress',\n\n  // Original text: 'Auto-generated if empty'\n  vifMacAutoGenerate: 'Auto-genererad om tom',\n\n  // Original text: 'Allowed IPs'\n  vifAllowedIps: 'Tillåtna IPs',\n\n  // Original text: 'No IPs'\n  vifNoIps: 'Inga IPS',\n\n  // Original text: 'Network locked'\n  vifLockedNetwork: 'Nätverk låst',\n\n  // Original text: 'Network locked and no IPs are allowed for this interface'\n  vifLockedNetworkNoIps: 'Nätverk låst och inga IPs tillåtna på detta interface',\n\n  // Original text: 'Network not locked'\n  vifUnLockedNetwork: 'Nätverk olåst',\n\n  // Original text: 'Unknown network'\n  vifUnknownNetwork: 'Okänt nätverk',\n\n  // Original text: 'Action'\n  vifAction: 'Åtgärd',\n\n  // Original text: 'Create'\n  vifCreate: 'Skapa',\n\n  // Original text: \"No snapshots\"\n  noSnapshots: 'Inga snapshots',\n\n  // Original text: \"New snapshot\"\n  snapshotCreateButton: 'Ny snapshot',\n\n  // Original text: \"Just click on the snapshot button to create one!\"\n  tipCreateSnapshotLabel: 'Klicka bara på snapshot-knappen för att skapa en',\n\n  // Original text: 'Revert VM to this snapshot'\n  revertSnapshot: 'Återställ VM till denna snapshot',\n\n  // Original text: 'Remove this snapshot'\n  deleteSnapshot: 'Ta bort denna snapshot',\n\n  // Original text: 'Create a VM from this snapshot'\n  copySnapshot: 'Skapa en VM från denna snapshot',\n\n  // Original text: 'Export this snapshot'\n  exportSnapshot: 'Exportera denna snapshot',\n\n  // Original text: \"Creation date\"\n  snapshotDate: 'Skapandedatum',\n\n  // Original text: \"Name\"\n  snapshotName: 'Namn',\n\n  // Original text: \"Action\"\n  snapshotAction: 'Åtgärd',\n\n  // Original text: 'Quiesced snapshot'\n  snapshotQuiesce: undefined,\n\n  // Original text: \"Remove all logs\"\n  logRemoveAll: 'Radera alla loggar',\n\n  // Original text: \"No logs so far\"\n  noLogs: 'Inga loggar hittills',\n\n  // Original text: \"Creation date\"\n  logDate: 'Datum de creación',\n\n  // Original text: \"Name\"\n  logName: 'Namn',\n\n  // Original text: \"Content\"\n  logContent: 'Innehåll',\n\n  // Original text: \"Action\"\n  logAction: 'Åtgärd',\n\n  // Original text: \"Remove\"\n  vmRemoveButton: 'Ta bort',\n\n  // Original text: \"Convert\"\n  vmConvertButton: 'Konvertera',\n\n  // Original text: \"Xen settings\"\n  xenSettingsLabel: 'Xen-inställningar',\n\n  // Original text: \"Guest OS\"\n  guestOsLabel: 'Gäst-OS',\n\n  // Original text: \"Misc\"\n  miscLabel: 'Diverse',\n\n  // Original text: \"UUID\"\n  uuid: 'UUID',\n\n  // Original text: \"Virtualization mode\"\n  virtualizationMode: 'Virtualiseringsläge',\n\n  // Original text: \"CPU weight\"\n  cpuWeightLabel: 'CPU-vikt',\n\n  // Original text: \"Default ({value, number})\"\n  defaultCpuWeight: 'Standard ({value, number})',\n\n  // Original text: 'CPU cap'\n  cpuCapLabel: 'CPU-tak',\n\n  // Original text: 'Default ({value, number})'\n  defaultCpuCap: 'Standard ({value, number})',\n\n  // Original text: \"PV args\"\n  pvArgsLabel: 'PV args',\n\n  // Original text: \"Xen tools status\"\n  xenToolsStatus: 'Xen tools status',\n\n  // Original text: \"{status}\"\n  xenToolsStatusValue: '{status}',\n\n  // Original text: \"OS name\"\n  osName: 'OS-namn',\n\n  // Original text: \"OS kernel\"\n  osKernel: 'OS-kernel',\n\n  // Original text: \"Auto power on\"\n  autoPowerOn: undefined,\n\n  // Original text: \"HA\"\n  ha: 'HA',\n\n  // Original text: 'Affinity host'\n  vmAffinityHost: undefined,\n\n  // Original text: 'VGA'\n  vmVga: undefined,\n\n  // Original text: 'Video RAM'\n  vmVideoram: undefined,\n\n  // Original text: 'None'\n  noAffinityHost: 'Ingen',\n\n  // Original text: \"Original template\"\n  originalTemplate: 'Original mall',\n\n  // Original text: \"Unknown\"\n  unknownOsName: 'Okänd',\n\n  // Original text: \"Unknown\"\n  unknownOsKernel: 'Okänd',\n\n  // Original text: \"Unknown\"\n  unknownOriginalTemplate: 'Okänd',\n\n  // Original text: \"VM limits\"\n  vmLimitsLabel: 'VM-begränsningar',\n\n  // Original text: \"CPU limits\"\n  vmCpuLimitsLabel: 'CPU-begränsningar',\n\n  // Original text: 'Topology'\n  vmCpuTopology: 'Topologi',\n\n  // Original text: 'Default behavior'\n  vmChooseCoresPerSocket: 'Standardbeteende',\n\n  // Original text: '{nSockets, number} socket{nSockets, plural, one {} other {s}} with {nCores, number} core{nCores, plural, one {} other {s}} per socket'\n  vmSocketsWithCoresPerSocket: undefined,\n\n  // Original text: 'Incorrect cores per socket value'\n  vmCoresPerSocketIncorrectValue: undefined,\n\n  // Original text: 'Please change the selected value to fix it.'\n  vmCoresPerSocketIncorrectValueSolution: undefined,\n\n  // Original text: \"Memory limits (min/max)\"\n  vmMemoryLimitsLabel: 'Minnesbegränsningar (min/max)',\n\n  // Original text: \"vCPUs max:\"\n  vmMaxVcpus: 'Max vCPUs:',\n\n  // Original text: \"Memory max:\"\n  vmMaxRam: 'Max minne:',\n\n  // Original text: \"Long click to add a name\"\n  vmHomeNamePlaceholder: 'Långklicka för att lägga till ett namn',\n\n  // Original text: \"Long click to add a description\"\n  vmHomeDescriptionPlaceholder: 'Långklicka för att lägga till en beskrivning',\n\n  // Original text: \"Click to add a name\"\n  vmViewNamePlaceholder: 'Klicka för att lägga till ett namn',\n\n  // Original text: \"Click to add a description\"\n  vmViewDescriptionPlaceholder: 'Klicka för att lägga till en beskrivning',\n\n  // Original text: 'Click to add a name'\n  templateHomeNamePlaceholder: 'Klicka för att lägga till ett namn',\n\n  // Original text: 'Click to add a description'\n  templateHomeDescriptionPlaceholder: 'Klicka för att lägga till en beskrivning',\n\n  // Original text: 'Delete template'\n  templateDelete: 'Radera mall',\n\n  // Original text: 'Delete VM template{templates, plural, one {} other {s}}'\n  templateDeleteModalTitle: 'Radera VM-mall{templates, plural, one {} other {s}}',\n\n  // Original text: 'Are you sure you want to delete {templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?'\n  templateDeleteModalBody:\n    'Är du säker du vill radera {templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?',\n\n  // Original text: \"Pool{pools, plural, one {} other {s}}\"\n  poolPanel: 'Pool{pools, plural, one {} other {s}}',\n\n  // Original text: \"Host{hosts, plural, one {} other {s}}\"\n  hostPanel: 'Värd{hosts, plural, one {} other {s}}',\n\n  // Original text: \"VM{vms, plural, one {} other {s}}\"\n  vmPanel: 'VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"RAM Usage:\"\n  memoryStatePanel: 'RAM-användning',\n\n  // Original text: \"CPUs Usage\"\n  cpuStatePanel: 'CPU-användning',\n\n  // Original text: \"VMs Power state\"\n  vmStatePanel: 'Power-status',\n\n  // Original text: \"Pending tasks\"\n  taskStatePanel: 'Väntande uppgifter',\n\n  // Original text: \"Users\"\n  usersStatePanel: 'Användare',\n\n  // Original text: \"Storage state\"\n  srStatePanel: 'Lagringstatus',\n\n  // Original text: \"{usage} (of {total})\"\n  ofUsage: undefined,\n\n  // Original text: \"No storage\"\n  noSrs: 'Ingen lagring',\n\n  // Original text: \"Name\"\n  srName: 'Namn',\n\n  // Original text: \"Pool\"\n  srPool: 'Pool',\n\n  // Original text: \"Host\"\n  srHost: 'Värd',\n\n  // Original text: \"Type\"\n  srFormat: 'Typ',\n\n  // Original text: \"Size\"\n  srSize: 'Storlek',\n\n  // Original text: \"Usage\"\n  srUsage: 'Användning',\n\n  // Original text: \"used\"\n  srUsed: 'Använt',\n\n  // Original text: \"free\"\n  srFree: 'fri',\n\n  // Original text: \"Storage Usage\"\n  srUsageStatePanel: 'Lagringsanvändning',\n\n  // Original text: \"Top 5 SR Usage (in %)\"\n  srTopUsageStatePanel: 'Top 5 SR-användning (%)',\n\n  // Original text: '{running, number} running ({halted, number} halted)'\n  vmsStates: undefined,\n\n  // Original text: 'Clear selection'\n  dashboardStatsButtonRemoveAll: 'Rensa urval',\n\n  // Original text: 'Add all hosts'\n  dashboardStatsButtonAddAllHost: 'Lägg till alla värdar',\n\n  // Original text: 'Add all VMs'\n  dashboardStatsButtonAddAllVM: 'Lägg till alla VMs',\n\n  // Original text: \"{value} {date, date, medium}\"\n  weekHeatmapData: '{value} {date, date, medium}',\n\n  // Original text: \"No data.\"\n  weekHeatmapNoData: 'Inget datum.',\n\n  // Original text: \"Weekly Heatmap\"\n  weeklyHeatmap: undefined,\n\n  // Original text: \"Weekly Charts\"\n  weeklyCharts: undefined,\n\n  // Original text: \"Synchronize scale:\"\n  weeklyChartsScaleInfo: undefined,\n\n  // Original text: \"Stats error\"\n  statsDashboardGenericErrorTitle: 'Error statistik',\n\n  // Original text: \"There is no stats available for:\"\n  statsDashboardGenericErrorMessage: 'Det finns ingen statistik tillgänglig för:',\n\n  // Original text: \"No selected metric\"\n  noSelectedMetric: 'Ingen metrik vald',\n\n  // Original text: \"Select\"\n  statsDashboardSelectObjects: 'Välj',\n\n  // Original text: \"Loading…\"\n  metricsLoading: 'Laddar…',\n\n  // Original text: \"Coming soon!\"\n  comingSoon: 'Kommer snart!',\n\n  // Original text: \"Orphaned snapshot VDIs\"\n  orphanedVdis: 'Föräldralösa snapshot VDIs',\n\n  // Original text: \"Orphaned VMs snapshot\"\n  orphanedVms: 'Föräldralösa VMs snapshot',\n\n  // Original text: \"No orphans\"\n  noOrphanedObject: 'Inga föräldralösa',\n\n  // Original text: \"Remove all orphaned snapshot VDIs\"\n  removeAllOrphanedObject: 'Eliminera alla föräldralösa snapshot VDIs',\n\n  // Original text: 'VDIs attached to Control Domain'\n  vdisOnControlDomain: undefined,\n\n  // Original text: \"Name\"\n  vmNameLabel: 'Namn',\n\n  // Original text: \"Description\"\n  vmNameDescription: 'Beskrivning',\n\n  // Original text: \"Resident on\"\n  vmContainer: 'Befinner sig på',\n\n  // Original text: \"Alarms\"\n  alarmMessage: 'Larm',\n\n  // Original text: \"No alarms\"\n  noAlarms: 'Inga larm',\n\n  // Original text: \"Date\"\n  alarmDate: 'Datum',\n\n  // Original text: \"Content\"\n  alarmContent: 'Innehåll',\n\n  // Original text: \"Issue on\"\n  alarmObject: 'Utgivet på',\n\n  // Original text: \"Pool\"\n  alarmPool: 'Pool',\n\n  // Original text: \"Remove all alarms\"\n  alarmRemoveAll: 'Ta bort alla larm',\n\n  // Original text: '{used}% used ({free} left)'\n  spaceLeftTooltip: undefined,\n\n  // Original text: \"Create a new VM on {select}\"\n  newVmCreateNewVmOn: 'Skapa en ny VM på {select}',\n\n  // Original text: 'Create a new VM on {select1} or {select2}'\n  newVmCreateNewVmOn2: undefined,\n\n  // Original text: 'You have no permission to create a VM'\n  newVmCreateNewVmNoPermission: 'Du saknar rättigheter för att skapa en VM',\n\n  // Original text: \"Infos\"\n  newVmInfoPanel: 'Information',\n\n  // Original text: \"Name\"\n  newVmNameLabel: 'Namn',\n\n  // Original text: \"Template\"\n  newVmTemplateLabel: 'Mall',\n\n  // Original text: \"Description\"\n  newVmDescriptionLabel: 'Beskrivning',\n\n  // Original text: \"Performances\"\n  newVmPerfPanel: 'Prestanda',\n\n  // Original text: \"vCPUs\"\n  newVmVcpusLabel: 'vCPUs',\n\n  // Original text: \"RAM\"\n  newVmRamLabel: 'RAM',\n\n  // Original text: 'Static memory max'\n  newVmStaticMaxLabel: undefined,\n\n  // Original text: 'Dynamic memory min'\n  newVmDynamicMinLabel: undefined,\n\n  // Original text: 'Dynamic memory max'\n  newVmDynamicMaxLabel: undefined,\n\n  // Original text: \"Install settings\"\n  newVmInstallSettingsPanel: 'Installationsinställnigar',\n\n  // Original text: \"ISO/DVD\"\n  newVmIsoDvdLabel: 'ISO/DVD',\n\n  // Original text: \"Network\"\n  newVmNetworkLabel: 'Nätverk',\n\n  // Original text: 'e.g: http://httpredir.debian.org/debian'\n  newVmInstallNetworkPlaceHolder: undefined,\n\n  // Original text: \"PV Args\"\n  newVmPvArgsLabel: undefined,\n\n  // Original text: \"PXE\"\n  newVmPxeLabel: undefined,\n\n  // Original text: \"Interfaces\"\n  newVmInterfacesPanel: undefined,\n\n  // Original text: \"MAC\"\n  newVmMacLabel: undefined,\n\n  // Original text: \"Add interface\"\n  newVmAddInterface: 'Lägg till interface',\n\n  // Original text: \"Disks\"\n  newVmDisksPanel: 'Diskar',\n\n  // Original text: \"SR\"\n  newVmSrLabel: undefined,\n\n  // Original text: \"Size\"\n  newVmSizeLabel: 'Storlek',\n\n  // Original text: \"Add disk\"\n  newVmAddDisk: 'Lägg till disk',\n\n  // Original text: \"Summary\"\n  newVmSummaryPanel: 'Summering',\n\n  // Original text: \"Create\"\n  newVmCreate: 'Skapa',\n\n  // Original text: \"Reset\"\n  newVmReset: 'Starta om',\n\n  // Original text: \"Select template\"\n  newVmSelectTemplate: 'Välj mall',\n\n  // Original text: \"SSH key\"\n  newVmSshKey: 'SSH-nyckel',\n\n  // Original text: \"Config drive\"\n  newVmConfigDrive: 'Konfigurera drive',\n\n  // Original text: \"Custom config\"\n  newVmCustomConfig: 'Anpassad konfiguration',\n\n  // Original text: \"Boot VM after creation\"\n  newVmBootAfterCreate: 'Starta VM efter den har skapats',\n\n  // Original text: \"Auto-generated if empty\"\n  newVmMacPlaceholder: 'Autogenereras om tom',\n\n  // Original text: \"CPU weight\"\n  newVmCpuWeightLabel: undefined,\n\n  // Original text: 'Default: {value, number}'\n  newVmDefaultCpuWeight: undefined,\n\n  // Original text: 'CPU cap'\n  newVmCpuCapLabel: undefined,\n\n  // Original text: 'Default: {value, number}'\n  newVmDefaultCpuCap: undefined,\n\n  // Original text: \"Cloud config\"\n  newVmCloudConfig: undefined,\n\n  // Original text: \"Create VMs\"\n  newVmCreateVms: 'Skapa VMs',\n\n  // Original text: \"Are you sure you want to create {nbVms, number} VMs?\"\n  newVmCreateVmsConfirm: 'Är du säker du vill skapa {nbVms, number} VMs?',\n\n  // Original text: \"Multiple VMs:\"\n  newVmMultipleVms: 'Multipla VMs:',\n\n  // Original text: 'Select a resource set:'\n  newVmSelectResourceSet: undefined,\n\n  // Original text: 'Name pattern:'\n  newVmMultipleVmsPattern: 'Namnmönster',\n\n  // Original text: 'e.g.: \\\\{name\\\\}_%'\n  newVmMultipleVmsPatternPlaceholder: undefined,\n\n  // Original text: 'First index:'\n  newVmFirstIndex: undefined,\n\n  // Original text: 'Recalculate VMs number'\n  newVmNumberRecalculate: 'Räkna om VMs nummer',\n\n  // Original text: 'Refresh VMs name'\n  newVmNameRefresh: undefined,\n\n  // Original text: 'Affinity host'\n  newVmAffinityHost: undefined,\n\n  // Original text: 'Advanced'\n  newVmAdvancedPanel: 'Avancerat',\n\n  // Original text: 'Show advanced settings'\n  newVmShowAdvanced: 'Visa avancerade inställningar',\n\n  // Original text: 'Hide advanced settings'\n  newVmHideAdvanced: 'Dölj avancerade inställningar',\n\n  // Original text: 'Share this VM'\n  newVmShare: 'Dela denna VM',\n\n  // Original text: \"Resource sets\"\n  resourceSets: 'Resursset',\n\n  // Original text: \"No resource sets.\"\n  noResourceSets: 'Inga resursset',\n\n  // Original text: 'Loading resource sets'\n  loadingResourceSets: 'Laddar resursset',\n\n  // Original text: \"Resource set name\"\n  resourceSetName: 'Resursset namn',\n\n  // Original text: 'Recompute all limits'\n  recomputeResourceSets: undefined,\n\n  // Original text: \"Save\"\n  saveResourceSet: 'Spara',\n\n  // Original text: \"Reset\"\n  resetResourceSet: undefined,\n\n  // Original text: \"Edit\"\n  editResourceSet: 'Redigera',\n\n  // Original text: \"Delete\"\n  deleteResourceSet: 'Radera',\n\n  // Original text: \"Delete resource set\"\n  deleteResourceSetWarning: 'Radera resursset',\n\n  // Original text: \"Are you sure you want to delete this resource set?\"\n  deleteResourceSetQuestion: 'Är du säker du vill radera detta resursset?',\n\n  // Original text: \"Missing objects:\"\n  resourceSetMissingObjects: 'Objekt saknas',\n\n  // Original text: \"vCPUs\"\n  resourceSetVcpus: 'vCPUs',\n\n  // Original text: \"Memory\"\n  resourceSetMemory: 'Minne',\n\n  // Original text: \"Storage\"\n  resourceSetStorage: 'Lagring',\n\n  // Original text: \"Unknown\"\n  unknownResourceSetValue: 'Okänd',\n\n  // Original text: \"Available hosts\"\n  availableHosts: 'Tillgängliga värdar',\n\n  // Original text: \"Excluded hosts\"\n  excludedHosts: 'Exkluderade värdar',\n\n  // Original text: \"No hosts available.\"\n  noHostsAvailable: 'Inga värdar tillgängliga',\n\n  // Original text: \"VMs created from this resource set shall run on the following hosts.\"\n  availableHostsDescription: 'VMs skapade från detta resurssettet ska köras på följande värdar',\n\n  // Original text: \"Maximum CPUs\"\n  maxCpus: 'Maximala CPUs',\n\n  // Original text: \"Maximum RAM (GiB)\"\n  maxRam: 'Maximalt RAM (GiB)',\n\n  // Original text: \"Maximum disk space\"\n  maxDiskSpace: 'Maximal diskstorlek',\n\n  // Original text: 'IP pool'\n  ipPool: undefined,\n\n  // Original text: 'Quantity'\n  quantity: 'Mängd',\n\n  // Original text: \"No limits.\"\n  noResourceSetLimits: 'Inga begränsningar',\n\n  // Original text: \"Total:\"\n  totalResource: 'Total:',\n\n  // Original text: \"Remaining:\"\n  remainingResource: 'Återstående:',\n\n  // Original text: \"Used:\"\n  usedResource: 'Använt:',\n\n  // Original text: 'New'\n  resourceSetNew: 'Ny',\n  //fortsätt\n  // Original text: \"Try dropping some VMs files here, or click to select VMs to upload. Accept only .xva/.ova files.\"\n  importVmsList:\n    'Försök drag-o-släpp några VM-filer här. Eller klicka på Välj VMs för att ladda upp. Endast .xva/ .ova filer godkänns.',\n\n  // Original text: \"No selected VMs.\"\n  noSelectedVms: 'Inga valda VMs',\n\n  // Original text: \"To Pool:\"\n  vmImportToPool: 'Till Pool:',\n\n  // Original text: \"To SR:\"\n  vmImportToSr: 'Till SR:',\n\n  // Original text: \"VM{nVms, plural, one {} other {s}} to import\"\n  vmsToImport: 'VM{nVms, plural, one {} other {s}} att importera',\n\n  // Original text: \"Reset\"\n  importVmsCleanList: undefined,\n\n  // Original text: \"VM import success\"\n  vmImportSuccess: 'VM-import lyckades',\n\n  // Original text: \"VM import failed\"\n  vmImportFailed: 'VM-import misslyckades',\n\n  // Original text: \"Import starting…\"\n  startVmImport: 'Import påbörjad…',\n\n  // Original text: \"Export starting…\"\n  startVmExport: 'Export påbörjad…',\n\n  // Original text: 'Number of CPUs'\n  nCpus: undefined,\n\n  // Original text: 'Memory'\n  vmMemory: undefined,\n\n  // Original text: 'Disk {position} ({capacity})'\n  diskInfo: undefined,\n\n  // Original text: 'Disk description'\n  diskDescription: 'Diskbeskrivning',\n\n  // Original text: 'No disks.'\n  noDisks: 'Inga diskar',\n\n  // Original text: 'No networks.'\n  noNetworks: 'Inga nätverk',\n\n  // Original text: 'Network {name}'\n  networkInfo: 'Nätverk {name}',\n\n  // Original text: 'No description available'\n  noVmImportErrorDescription: 'Ingen beskrivning tillgänglig',\n\n  // Original text: 'Error:'\n  vmImportError: undefined,\n\n  // Original text: '{type} file:'\n  vmImportFileType: undefined,\n\n  // Original text: 'Please to check and/or modify the VM configuration.'\n  vmImportConfigAlert: 'Vänligen kolla och/eller modifiera VM konfigurationen',\n\n  // Original text: \"No pending tasks\"\n  noTasks: 'Inga väntande uppgifter',\n\n  // Original text: \"Currently, there are not any pending XenServer tasks\"\n  xsTasks: 'Det finns inga väntande XenServer uppgifter för närvarande',\n\n  // Original text: 'Schedules'\n  backupSchedules: 'Scheman',\n\n  // Original text: 'Get remote'\n  getRemote: 'Hämta fjärrlagring',\n\n  // Original text: \"List Remote\"\n  listRemote: 'Visa fjärrlagring',\n\n  // Original text: \"simple\"\n  simpleBackup: 'enkel',\n\n  // Original text: \"delta\"\n  delta: undefined,\n\n  // Original text: \"Restore Backups\"\n  restoreBackups: 'Återställ backuper',\n\n  // Original text: 'Click on a VM to display restore options'\n  restoreBackupsInfo: 'Klicka på en VM för att visa återställnings möjligheter',\n\n  // Original text: \"Enabled\"\n  remoteEnabled: 'Aktiverad',\n\n  // Original text: \"Error\"\n  remoteError: undefined,\n\n  // Original text: \"No backup available\"\n  noBackup: 'Inga backuper tillgängliga',\n\n  // Original text: \"VM Name\"\n  backupVmNameColumn: 'VM-namn',\n\n  // Original text: 'Tags'\n  backupTags: 'Etiketter',\n\n  // Original text: \"Last Backup\"\n  lastBackupColumn: 'Senaste Backup',\n\n  // Original text: \"Available Backups\"\n  availableBackupsColumn: 'Tillgängliga Backuper',\n\n  // Original text: 'Missing parameters'\n  backupRestoreErrorTitle: 'Parametrar saknas',\n\n  // Original text: 'Choose a SR and a backup'\n  backupRestoreErrorMessage: 'Välj en SR och en backup',\n\n  // Original text: 'Select default SR…'\n  backupRestoreSelectDefaultSr: 'Völj standard SR',\n\n  // Original text: 'Choose a SR for each VDI'\n  backupRestoreChooseSrForEachVdis: 'Välj en SR för varje VDI',\n\n  // Original text: 'VDI'\n  backupRestoreVdiLabel: undefined,\n\n  // Original text: 'SR'\n  backupRestoreSrLabel: undefined,\n\n  // Original text: 'Display backups'\n  displayBackup: 'Visa backuper',\n\n  // Original text: \"Import VM\"\n  importBackupTitle: 'Importera VM',\n\n  // Original text: \"Starting your backup import\"\n  importBackupMessage: 'Startar din backupimport',\n\n  // Original text: 'VMs to backup'\n  vmsToBackup: 'VMs för backup',\n\n  // Original text: 'List remote backups'\n  listRemoteBackups: 'Visa fjärr backuper',\n\n  // Original text: 'Restore backup files'\n  restoreFiles: 'Återställ backupfiler',\n\n  // Original text: 'Invalid options'\n  restoreFilesError: 'Ogiltiga val',\n\n  // Original text: 'Restore file from {name}'\n  restoreFilesFromBackup: 'Återställ fil från {name}',\n\n  // Original text: 'Select a backup…'\n  restoreFilesSelectBackup: 'Välj en backup',\n\n  // Original text: 'Select a disk…'\n  restoreFilesSelectDisk: 'Välj en disk',\n\n  // Original text: 'Select a partition…'\n  restoreFilesSelectPartition: 'Välj en partition',\n\n  // Original text: 'Folder path'\n  restoreFilesSelectFolderPath: 'Mappsökväg',\n\n  // Original text: 'Select a file…'\n  restoreFilesSelectFiles: 'Välj en fil',\n\n  // Original text: 'Content not found'\n  restoreFileContentNotFound: 'Inget innehåll funnet',\n\n  // Original text: 'No files selected'\n  restoreFilesNoFilesSelected: 'Inga filer valda',\n\n  // Original text: 'Selected files ({files}):'\n  restoreFilesSelectedFiles: 'Valda filer ({files}):',\n\n  // Original text: 'Error while scanning disk'\n  restoreFilesDiskError: 'Error medans diskscanning',\n\n  // Original text: \"Select all this folder's files\"\n  restoreFilesSelectAllFiles: 'Markera alla filder i denna mappen',\n\n  // Original text: 'Unselect all files'\n  restoreFilesUnselectAll: 'Avmarkera alla filer',\n\n  // Original text: 'Emergency shutdown Host{nHosts, plural, one {} other {s}}'\n  emergencyShutdownHostsModalTitle: 'Nödavstängning värd{nHosts, plural, one {} other {s}}',\n\n  // Original text: 'Are you sure you want to shutdown {nHosts, number} Host{nHosts, plural, one {} other {s}}?'\n  emergencyShutdownHostsModalMessage:\n    'Är du säker att du vill stänga ner {nHosts, number} Host{nHosts, plural, one {} other {s}}?',\n\n  // Original text: 'Shutdown host'\n  stopHostModalTitle: 'Stäng av värd',\n\n  // Original text: \"This will shutdown your host. Do you want to continue? If it's the pool master, your connection to the pool will be lost\"\n  stopHostModalMessage:\n    'Detta kommer stänga ner din värd. Vill du fortsätta? Om det är poolens master, kommer din anslutning till poolen att förloras',\n\n  // Original text: 'Add host'\n  addHostModalTitle: 'Lägg till värd',\n\n  // Original text: 'Are you sure you want to add {host} to {pool}?'\n  addHostModalMessage: 'Är du säker du vill lägga till {host} to {pool}?',\n\n  // Original text: 'Restart host'\n  restartHostModalTitle: 'Starta om värd',\n\n  // Original text: 'This will restart your host. Do you want to continue?'\n  restartHostModalMessage: 'Detta kommer starta om din värd. Vill du fortsätta?',\n\n  // Original text: 'Restart Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}'\n  restartHostsAgentsModalTitle:\n    'Starta om Värd{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}',\n\n  // Original text: 'Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?'\n  restartHostsAgentsModalMessage:\n    'Är du säker du vill starta om {nHosts, number} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?',\n\n  // Original text: 'Restart Host{nHosts, plural, one {} other {s}}'\n  restartHostsModalTitle: 'Starta om Värd{nHosts, plural, one {} other {s}}',\n\n  // Original text: 'Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}}?'\n  restartHostsModalMessage: 'Är du säker du vill starta om {nHosts, number} Host{nHosts, plural, one {} other {s}}?',\n\n  // Original text: \"Start VM{vms, plural, one {} other {s}}\"\n  startVmsModalTitle: 'Starta VM{vms, plural, one {} other {s}}',\n\n  // Original text: 'Start a copy'\n  cloneAndStartVM: 'Starta en kopia',\n\n  // Original text: 'Force start'\n  forceStartVm: 'Tvinga start',\n\n  // Original text: 'Forbidden operation'\n  forceStartVmModalTitle: 'Förbjuden åtgärd',\n\n  // Original text: 'Start operation for this vm is blocked.'\n  blockedStartVmModalMessage: 'Startåtgärd för denna vm är blockerad',\n\n  // Original text: 'Forbidden operation start for {nVms, number} vm{nVms, plural, one {} other {s}}.'\n  blockedStartVmsModalMessage: 'Förbjuden startåtgärd för {nVms, number} vm{nVms, plural, one {} other {s}}.',\n\n  // Original text: \"Are you sure you want to start {vms, number} VM{vms, plural, one {} other {s}}?\"\n  startVmsModalMessage: 'Är du säker du vill starta {vms} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: '{nVms, number} vm{nVms, plural, one {} other {s}} are failed. Please see your logs to get more information'\n  failedVmsErrorMessage: undefined,\n\n  // Original text: 'Start failed'\n  failedVmsErrorTitle: 'Start misslyckades',\n\n  // Original text: 'Stop Host{nHosts, plural, one {} other {s}}'\n  stopHostsModalTitle: 'Stoppa Värd{nHosts, plural, one {} other {s}}',\n\n  // Original text: 'Are you sure you want to stop {nHosts, number} Host{nHosts, plural, one {} other {s}}?'\n  stopHostsModalMessage: 'Är du säker du vill stoppa {nHosts, number} Host{nHosts, plural, one {} other {s}}?',\n\n  // Original text: \"Stop VM{vms, plural, one {} other {s}}\"\n  stopVmsModalTitle: 'Stoppa VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to stop {vms, number} VM{vms, plural, one {} other {s}}?\"\n  stopVmsModalMessage: 'Är du säker du vill stoppa {vms, number} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: 'Restart VM'\n  restartVmModalTitle: 'Starta om VM',\n\n  // Original text: 'Are you sure you want to restart {name}?'\n  restartVmModalMessage: 'Är du säker du vill starta om {name}?',\n\n  // Original text: 'Stop VM'\n  stopVmModalTitle: 'Stoppa VM',\n\n  // Original text: 'Are you sure you want to stop {name}?'\n  stopVmModalMessage: 'Är du säker du vill stoppa {name}?',\n\n  // Original text: \"Restart VM{vms, plural, one {} other {s}}\"\n  restartVmsModalTitle: 'Starta om VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to restart {vms, number} VM{vms, plural, one {} other {s}}?\"\n  restartVmsModalMessage: 'Är du säker du vill starta om {vms, number} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: \"Snapshot VM{vms, plural, one {} other {s}}\"\n  snapshotVmsModalTitle: 'Snapshot VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to snapshot {vms, number} VM{vms, plural, one {} other {s}}?\"\n  snapshotVmsModalMessage: 'Är du säker du vill ta en snapshot på {vms, number} VM{vms, plural, one {} other {s}}?',\n\n  // Original text: \"Delete VM{vms, plural, one {} other {s}}\"\n  deleteVmsModalTitle: 'Radera VM{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to delete {vms, number} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmsModalMessage:\n    'Är du säker du vill radera {vms, number} VM{vms, plural, one {} other {s}}? ALLA VM DISKAR KOMMER TAS BORT',\n\n  // Original text: \"Delete VM\"\n  deleteVmModalTitle: 'Radera VM',\n\n  // Original text: \"Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmModalMessage: 'Är du säker du vill radera denn VM? ALLA VM DISKAR KOMMER TAS BORT',\n\n  // Original text: \"Migrate VM\"\n  migrateVmModalTitle: 'Migrera VM',\n\n  // Original text: 'Select a destination host:'\n  migrateVmSelectHost: 'Välj en destinationsvärd',\n\n  // Original text: 'Select a migration network:'\n  migrateVmSelectMigrationNetwork: 'Välj ett migrationsnätverk',\n\n  // Original text: 'For each VIF, select a network:'\n  migrateVmSelectNetworks: 'För varje VIF, välj ett nätverk',\n\n  // Original text: 'Select a destination SR:'\n  migrateVmsSelectSr: 'Välj ett destinations SR',\n\n  // Original text: 'Select a destination SR for local disks:'\n  migrateVmsSelectSrIntraPool: 'Välj ett destinations SR för lokala diskar',\n\n  // Original text: 'Select a network on which to connect each VIF:'\n  migrateVmsSelectNetwork: 'Välj ett nätverk att ansluta varje VIF',\n\n  // Original text: 'Smart mapping'\n  migrateVmsSmartMapping: undefined,\n\n  // Original text: 'VIF'\n  migrateVmVif: undefined,\n\n  // Original text: 'Network'\n  migrateVmNetwork: 'Nätverk',\n\n  // Original text: 'No target host'\n  migrateVmNoTargetHost: 'Ingen målvärd',\n\n  // Original text: 'A target host is required to migrate a VM'\n  migrateVmNoTargetHostMessage: 'En målvärd krävs för att migrera en VM',\n\n  // Original text: 'No default SR'\n  migrateVmNoDefaultSrError: 'Ingen standard SR',\n\n  // Original text: 'Default SR not connected to host'\n  migrateVmNotConnectedDefaultSrError: 'Standard SR är inte ansluten till värd',\n\n  // Original text: 'For each VDI, select an SR:'\n  chooseSrForEachVdisModalSelectSr: 'För varje VDI, välj en SR',\n\n  // Original text: 'Select main SR…'\n  chooseSrForEachVdisModalMainSr: 'Välj huvudsakliga SR',\n\n  // Original text: 'VDI'\n  chooseSrForEachVdisModalVdiLabel: undefined,\n\n  // Original text: 'SR*'\n  chooseSrForEachVdisModalSrLabel: undefined,\n\n  // Original text: '* optional'\n  optionalEntry: '* valfritt',\n\n  // Original text: 'Delete VDI'\n  deleteVdiModalTitle: 'Radera VDI',\n\n  // Original text: 'Are you sure you want to delete this disk? ALL DATA ON THIS DISK WILL BE LOST'\n  deleteVdiModalMessage: 'Är du säker du vill radera disken? ALL DATA PÅ DENNA DISKEN KOMMER FÖRSTÖRAS',\n\n  // Original text: 'Revert your VM'\n  revertVmModalTitle: 'Återställ din VM',\n\n  // Original text: 'Delete snapshot'\n  deleteSnapshotModalTitle: 'Radera snapshot',\n\n  // Original text: 'Are you sure you want to delete this snapshot?'\n  deleteSnapshotModalMessage: 'Är du säker du vill radera denna snapshot?',\n\n  // Original text: 'Are you sure you want to revert this VM to the snapshot state? This operation is irreversible.'\n  revertVmModalMessage: 'Är du säker du vill återställa denna VM från denna snapshot? Denna åtgärd går inte att ångra.',\n\n  // Original text: 'Snapshot before'\n  revertVmModalSnapshotBefore: 'Ta en snapshot före',\n\n  // Original text: \"Import a {name} Backup\"\n  importBackupModalTitle: 'Importera en {name} backup',\n\n  // Original text: \"Start VM after restore\"\n  importBackupModalStart: 'Starta VM efter återställning',\n\n  // Original text: \"Select your backup…\"\n  importBackupModalSelectBackup: 'Välj din backup…',\n\n  // Original text: \"Are you sure you want to remove all orphaned snapshot VDIs?\"\n  removeAllOrphanedModalWarning: 'Är du säker du vill ta bort alla föräldralösa snapshot VDIs?',\n\n  // Original text: \"Remove all logs\"\n  removeAllLogsModalTitle: 'Radera alla loggar',\n\n  // Original text: \"Are you sure you want to remove all logs?\"\n  removeAllLogsModalWarning: 'Är du säker du vill radera alla loggar?',\n\n  // Original text: \"This operation is definitive.\"\n  definitiveMessageModal: 'Denna åtgärd är slutgiltig',\n\n  // Original text: \"Previous SR Usage\"\n  existingSrModalTitle: 'Tdigare SR-använding',\n\n  // Original text: \"This path has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingSrModalText:\n    'Denna sökväg har tidigare varit använt som lagring av en XenServer värd. All data kommer att försvinna om du fortsätter med SR-skapandet',\n\n  // Original text: \"Previous LUN Usage\"\n  existingLunModalTitle: 'Tidigare LUN-användning',\n\n  // Original text: \"This LUN has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingLunModalText:\n    'Esta LUN ya ha sido utilizada anteriormente como Lagring por un host XenServer. Todos los datos existentes se perderán si continuas con la creación del SR.',\n\n  // Original text: \"Replace current registration?\"\n  alreadyRegisteredModal: 'Ersätt nuvarande registrering',\n\n  // Original text: \"Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?\"\n  alreadyRegisteredModalText:\n    'Din XO appliance är redan registrerad till {email}. Vill du ersätta denna regitreringen?',\n\n  // Original text: \"Ready for trial?\"\n  trialReadyModal: 'Redo för testperiod?',\n\n  // Original text: \"During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!\"\n  trialReadyModalText:\n    'Under testperioden behöver XOA en fungerande internetanslutning. Denna begränsning gäller ej för betalda prenumerationer!',\n\n  // Original text: 'Label'\n  serverLabel: undefined,\n\n  // Original text: \"Host\"\n  serverHost: 'Värd',\n\n  // Original text: \"Username\"\n  serverUsername: 'Användarnamn',\n\n  // Original text: \"Password\"\n  serverPassword: 'Lösenord',\n\n  // Original text: \"Action\"\n  serverAction: 'Åtgärd',\n\n  // Original text: \"Read Only\"\n  serverReadOnly: 'Enbart läsa',\n\n  // Original text: 'Unauthorized Certificates'\n  serverUnauthorizedCertificates: 'Oautentiserade certifikat',\n\n  // Original text: 'Allow Unauthorized Certificates'\n  serverAllowUnauthorizedCertificates: 'Tillåt oautentiserade certifikat',\n\n  // Original text: \"Enable it if your certificate is rejected, but it's not recommended because your connection will not be secured.\"\n  serverUnauthorizedCertificatesInfo:\n    'Aktivera det om ditt certifikat är avvisat, men det är inte rekomenderat eftersom anslutningen kommer inte vara säkrad',\n\n  // Original text: 'username'\n  serverPlaceHolderUser: 'användarnamn',\n\n  // Original text: 'password'\n  serverPlaceHolderPassword: 'lösenord',\n\n  // Original text: 'address[:port]'\n  serverPlaceHolderAddress: undefined,\n\n  // Original text: 'label'\n  serverPlaceHolderLabel: 'Etikett',\n\n  // Original text: 'Connect'\n  serverConnect: 'Anslut',\n\n  // Original text: 'Error'\n  serverError: undefined,\n\n  // Original text: 'Adding server failed'\n  serverAddFailed: 'Lägga till server misslyckades',\n\n  // Original text: 'Status'\n  serverStatus: undefined,\n\n  // Original text: 'Connection failed. Click for more information.'\n  serverConnectionFailed: 'Anslutning misslyckades. Klicka för mer information',\n\n  // Original text: 'Connecting…'\n  serverConnecting: 'Ansluter',\n\n  // Original text: 'Authentication error'\n  serverAuthFailed: 'Autentiseringsfel',\n\n  // Original text: 'Unknown error'\n  serverUnknownError: 'Okänt fel',\n\n  // Original text: 'Invalid self-signed certificate'\n  serverSelfSignedCertError: 'Ogiltigt självsignerat certifikat',\n\n  // Original text: 'Do you want to accept self-signed certificate for this server even though it would decrease security?'\n  serverSelfSignedCertQuestion:\n    'Vill du acceptera självsignerat certifikat för denna servern, även om det minskar säkerheten?',\n\n  // Original text: \"Copy VM\"\n  copyVm: 'Kopiera VM',\n\n  // Original text: \"Are you sure you want to copy this VM to {SR}?\"\n  copyVmConfirm: 'Är du säker du vill kopiera denna VM till {SR}?',\n\n  // Original text: \"Name\"\n  copyVmName: 'Namn',\n\n  // Original text: 'Name pattern'\n  copyVmNamePattern: 'Namnmönster',\n\n  // Original text: \"If empty: name of the copied VM\"\n  copyVmNamePlaceholder: 'Om tomt: namn på den kopierade VM',\n\n  // Original text: 'e.g.: \"\\\\{name\\\\}_COPY\"'\n  copyVmNamePatternPlaceholder: undefined,\n\n  // Original text: \"Select SR\"\n  copyVmSelectSr: 'Välj SR',\n\n  // Original text: \"Use compression\"\n  copyVmCompress: 'Använd komprimering',\n\n  // Original text: 'No target SR'\n  copyVmsNoTargetSr: 'Ingen mål-SR',\n\n  // Original text: 'A target SR is required to copy a VM'\n  copyVmsNoTargetSrMessage: 'En mål-SR krävs för att kopiera VM',\n\n  // Original text: 'Detach host'\n  detachHostModalTitle: 'Koppla bort värd',\n\n  // Original text: 'Are you sure you want to detach {host} from its pool? THIS WILL REMOVE ALL VMs ON ITS LOCAL STORAGE AND REBOOT THE HOST.'\n  detachHostModalMessage:\n    'Är du säker du vill koppla bort {host} från poolen? DETTA KOMMER TA BORT ALLA VMs PÅ DESS LOKALA LAGRING OCH STARTA OM VÄRDEN.',\n\n  // Original text: 'Detach'\n  detachHost: 'Koppla bort',\n\n  // Original text: 'Forget host'\n  forgetHostModalTitle: 'Glöm värd',\n\n  // Original text: \"Are you sure you want to forget {host} from its pool? Be sure this host can't be back online, or use detach instead.\"\n  forgetHostModalMessage:\n    'Är du säker du vill glömma {host} från poolen? Var säker denna inte kan komma tillbaka online, eller använd koppla bort istället',\n\n  // Original text: 'Forget'\n  forgetHost: 'Glöm',\n\n  // Original text: \"Create network\"\n  newNetworkCreate: 'Skapa nätverk',\n\n  // Original text: 'Create bonded network'\n  newBondedNetworkCreate: undefined,\n\n  // Original text: \"Interface\"\n  newNetworkInterface: 'Interface',\n\n  // Original text: \"Name\"\n  newNetworkName: 'Namn',\n\n  // Original text: \"Description\"\n  newNetworkDescription: 'Beskrivning',\n\n  // Original text: \"VLAN\"\n  newNetworkVlan: 'VLAN',\n\n  // Original text: \"No VLAN if empty\"\n  newNetworkDefaultVlan: 'Inget VLAN om tomt',\n\n  // Original text: \"MTU\"\n  newNetworkMtu: 'MTU',\n\n  // Original text: \"Default: 1500\"\n  newNetworkDefaultMtu: 'Standard: 1500',\n\n  // Original text: 'Name required'\n  newNetworkNoNameErrorTitle: 'Namn krävs',\n\n  // Original text: 'A name is required to create a network'\n  newNetworkNoNameErrorMessage: 'Ett namn krävs för att skapa ett nätverk',\n\n  // Original text: 'Bond mode'\n  newNetworkBondMode: undefined,\n\n  // Original text: \"Delete network\"\n  deleteNetwork: 'Radera nätverk',\n\n  // Original text: \"Are you sure you want to delete this network?\"\n  deleteNetworkConfirm: 'Är du säker du vill radera detta nätverket?',\n\n  // Original text: 'This network is currently in use'\n  networkInUse: 'Detta nätverket används redan',\n\n  // Original text: 'Bonded'\n  pillBonded: undefined,\n\n  // Original text: 'Host'\n  addHostSelectHost: 'Värd',\n\n  // Original text: 'No host'\n  addHostNoHost: 'Ingen värd',\n\n  // Original text: 'No host selected to be added'\n  addHostNoHostMessage: 'Ingen värd vald för att läggas till',\n\n  // Original text: \"Xen Orchestra\"\n  xenOrchestra: 'Xen Orchestra',\n\n  // Original text: \"No pro support provided!\"\n  noProSupport: 'Ingen pro support tillhandahållen!',\n\n  // Original text: \"Use in production at your own risks\"\n  noProductionUse: 'Använd i produktion på egen risk',\n\n  // Original text: \"You can download our turnkey appliance at {website}\"\"\n  downloadXoaFromWebsite: 'Du kan ladda ner vår turnkey appliance på {website}',\n\n  // Original text: \"Bug Tracker\"\n  bugTracker: 'Bug Tracker',\n\n  // Original text: \"Issues? Report it!\"\n  bugTrackerText: 'Problem? Rapportera det!',\n\n  // Original text: \"Community\"\n  community: undefined,\n\n  // Original text: \"Join our community forum!\"\n  communityText: 'Gå med vårat medlemsforum',\n\n  // Original text: \"Free Trial for Premium Edition!\"\n  freeTrial: 'Gratis testperiod för Premium Edition!',\n\n  // Original text: \"Request your trial now!\"\n  freeTrialNow: 'Fråga efter din testperiod nu!',\n\n  // Original text: \"Any issue?\"\n  issues: 'Några problem?',\n\n  // Original text: \"Problem? Contact us!\"\n  issuesText: 'Problem? Kontakta oss!',\n\n  // Original text: \"Documentation\"\n  documentation: 'Dokumentation',\n\n  // Original text: \"Read our official doc\"\n  documentationText: 'Läs vår officiella documentation',\n\n  // Original text: \"Pro support included\"\n  proSupportIncluded: 'Pro support inkluderad',\n\n  // Original text: \"Access your XO Account\"\n  xoAccount: 'Använd ditt XO-konto',\n\n  // Original text: \"Report a problem\"\n  openTicket: 'Rapportera ett problem',\n\n  // Original text: \"Problem? Open a ticket!\"\n  openTicketText: 'Problem? Öppna en ticket!',\n\n  // Original text: \"Upgrade needed\"\n  upgradeNeeded: 'Uppgradering behövs',\n\n  // Original text: \"Upgrade now!\"\n  upgradeNow: 'Uppgradera nu!',\n\n  // Original text: \"Or\"\n  or: 'Eller',\n\n  // Original text: \"Try it for free!\"\n  tryIt: 'Prova nu utan kostnad!',\n\n  // Original text: \"This feature is available starting from {plan} Edition\"\n  availableIn: 'Denna funktionen är tillgänglig från {plan}',\n\n  // Original text: 'This feature is not available in your version, contact your administrator to know more.'\n  notAvailable: 'Denna funktionen är inte tillgänlig i din version. Kontakta din administratör för att veta mer.',\n\n  // Original text: 'Updates'\n  updateTitle: 'Uppdateringar',\n\n  // Original text: \"Registration\"\n  registration: 'Registrering',\n\n  // Original text: \"Trial\"\n  trial: 'Testperiod',\n\n  // Original text: \"Settings\"\n  settings: 'Inställningar',\n\n  // Original text: 'Proxy settings'\n  proxySettings: 'Proxyinställningar',\n\n  // Original text: 'Host (myproxy.example.org)'\n  proxySettingsHostPlaceHolder: 'Värd (myproxy.example.org)',\n\n  // Original text: 'Port (eg: 3128)'\n  proxySettingsPortPlaceHolder: undefined,\n\n  // Original text: 'Username'\n  proxySettingsUsernamePlaceHolder: 'Användarnamn',\n\n  // Original text: 'Password'\n  proxySettingsPasswordPlaceHolder: 'Lösenord',\n\n  // Original text: 'Your email account'\n  updateRegistrationEmailPlaceHolder: 'Ditt e-postkonto',\n\n  // Original text: 'Your password'\n  updateRegistrationPasswordPlaceHolder: 'Ditt lösenord',\n\n  // Original text: \"Update\"\n  update: 'Uppdatera',\n\n  // Original text: 'Refresh'\n  refresh: 'Ladda om',\n\n  // Original text: \"Upgrade\"\n  upgrade: 'Uppgradera',\n\n  // Original text: \"No updater available for Community Edition\"\n  noUpdaterCommunity: 'Ingen uppgraderare tillgänglig för Community Edition',\n\n  // Original text: \"Please consider subscribe and try it with all features for free during 30 days on {link}.\"\"\n  considerSubscribe: 'Vänligen överväg att prenumera och testa gratis med alla funktioner på {link}',\n\n  // Original text: \"Manual update could break your current installation due to dependencies issues, do it with caution\"\n  noUpdaterWarning: 'Manuell uppdatering kan förstöra din nuvarande installation. Använd med försiktighet',\n\n  // Original text: \"Current version:\"\n  currentVersion: 'Aktuell version',\n\n  // Original text: \"Register\"\n  register: 'Registrera',\n\n  // Original text: 'Edit registration'\n  editRegistration: 'Redigera registrering',\n\n  // Original text: \"Please, take time to register in order to enjoy your trial.\"\n  trialRegistration: 'Vänligen registrera för att åtnjuta din gratis testperiod',\n\n  // Original text: \"Start trial\"\n  trialStartButton: 'Starta testperiod',\n\n  // Original text: \"You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.\"\n  trialAvailableUntil:\n    'Du kan användar testversionen tills {date, date, medium}. Uppgradera din XO appliance för att få den.',\n\n  // Original text: \"Your trial has been ended. Contact us or downgrade to Free version\"\n  trialConsumed: 'Din testperiod har löpt ut. Kontakta oss eller nedgradera till gratisversionen',\n\n  // Original text: \"Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.\"\n  trialLocked: 'Din xoa-uppdaterare verkar vara nere. Din XOA kan inte köra fullt ut utan att nå denna tjänst.',\n\n  // Original text: \"No update information available\"\n  noUpdateInfo: 'Ingen uppdateringsinformation tillgänglig',\n\n  // Original text: \"Update information may be available\"\n  waitingUpdateInfo: 'Uppdateringsinformation kan finnas tillgängligt',\n\n  // Original text: \"Your XOA is up-to-date\"\n  upToDate: 'Din XOA är uppdaterad',\n\n  // Original text: \"You need to update your XOA (new version is available)\"\n  mustUpgrade: 'Du behöver uppdatera din XOA (ny version är tillgänglig)',\n\n  // Original text: \"Your XOA is not registered for updates\"\n  registerNeeded: 'Din XOA är inte registrerad för uppdateringar',\n\n  // Original text: \"Can't fetch update information\"\n  updaterError: 'Kan inte hämta uppdateringsinformation',\n\n  // Original text: 'Upgrade successful'\n  promptUpgradeReloadTitle: 'Uppgradering lyckades',\n\n  // Original text: 'Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?'\n  promptUpgradeReloadMessage:\n    'Din XOA uppgradering lyckades. Din webbläsare behöver ladda om applikationen. Vill du ladda om nu?',\n\n  // Original text: \"Xen Orchestra from the sources\"\n  disclaimerTitle: 'Xen Orchestra från källkod',\n\n  // Original text: \"You are using XO from the sources! That's great for a personal/non-profit usage.\"\n  disclaimerText1: 'Du använder XO från källkod! Det är fantastiskt för personligt/ideelt användande.',\n\n  // Original text: \"If you are a company, it's better to use it with our appliance + pro support included:\"\n  disclaimerText2: 'Om ni är ett företag är det bättre att använda vår XO Appliance + Pro support inkluderad:',\n\n  // Original text: \"This version is not bundled with any support nor updates. Use it with caution for critical tasks.\"\n  disclaimerText3:\n    'Denna version inkluderar inte någon support eller uppdateringar. Använd med försiktighet för kritiska uppgifter',\n\n  // Original text: \"Connect PIF\"\n  connectPif: 'Anslut PIF',\n\n  // Original text: \"Are you sure you want to connect this PIF?\"\n  connectPifConfirm: 'Är du säker du vill ansluta denna PIF?',\n\n  // Original text: \"Disconnect PIF\"\n  disconnectPif: 'Koppla bort PIF',\n\n  // Original text: \"Are you sure you want to disconnect this PIF?\"\n  disconnectPifConfirm: 'Är du säker du vill koppla bort denna PIF?',\n\n  // Original text: \"Delete PIF\"\n  deletePif: 'Radera PIF',\n\n  // Original text: \"Are you sure you want to delete this PIF?\"\n  deletePifConfirm: 'Är du säker du vill radera denna PIF?',\n\n  // Original text: 'Connected'\n  pifConnected: 'Ansluten',\n\n  // Original text: 'Disconnected'\n  pifDisconnected: 'Bortkopplad',\n\n  // Original text: 'Physically connected'\n  pifPhysicallyConnected: 'Fysiskt ansluten',\n\n  // Original text: 'Physically disconnected'\n  pifPhysicallyDisconnected: 'Fysiskt bortkopplad',\n\n  // Original text: 'Username'\n  username: 'Användarnamn',\n\n  // Original text: 'Password'\n  password: 'Lösenord',\n\n  // Original text: 'Language'\n  language: 'Språk',\n\n  // Original text: 'Old password'\n  oldPasswordPlaceholder: 'Gammalt lösenord',\n\n  // Original text: 'New password'\n  newPasswordPlaceholder: 'Nytt lösenord',\n\n  // Original text: 'Confirm new password'\n  confirmPasswordPlaceholder: 'Bekräfta nytt lösenord',\n\n  // Original text: 'Confirmation password incorrect'\n  confirmationPasswordError: 'Lösenordsbekräftelse felaktigt',\n\n  // Original text: 'Password does not match the confirm password.'\n  confirmationPasswordErrorBody: 'Lösenordet matchar inte bekräftelselösenordet',\n\n  // Original text: 'Password changed'\n  pwdChangeSuccess: 'Lösenord bytt',\n\n  // Original text: 'Your password has been successfully changed.'\n  pwdChangeSuccessBody: 'Lösenordet har bytts med lyckat resultat',\n\n  // Original text: 'Incorrect password'\n  pwdChangeError: 'Felaktigt lösenord',\n\n  // Original text: 'The old password provided is incorrect. Your password has not been changed.'\n  pwdChangeErrorBody: 'Det angivna gamla lösenordet är felaktigt. Ditt lösenord har inte bytts.',\n\n  // Original text: 'OK'\n  changePasswordOk: undefined,\n\n  // Original text: 'SSH keys'\n  sshKeys: 'SSH-nycklar',\n\n  // Original text: 'New SSH key'\n  newSshKey: 'Ny SSH-nyckel',\n\n  // Original text: 'Delete'\n  deleteSshKey: 'Radera',\n\n  // Original text: 'No SSH keys'\n  noSshKeys: 'Inga SSH-nycklar',\n\n  // Original text: 'New SSH key'\n  newSshKeyModalTitle: 'Ny SSH-nyckel',\n\n  // Original text: 'Invalid key'\n  sshKeyErrorTitle: 'Ogiltig nyckel',\n\n  // Original text: 'An SSH key requires both a title and a key.'\n  sshKeyErrorMessage: 'En SSH-nyckel kräver både titel och nyckel',\n\n  // Original text: 'Title'\n  title: 'Titel',\n\n  // Original text: 'Key'\n  key: 'Nyckel',\n\n  // Original text: 'Delete SSH key'\n  deleteSshKeyConfirm: 'Radera SSH-nyckel',\n\n  // Original text: 'Are you sure you want to delete the SSH key {title}?'\n  deleteSshKeyConfirmMessage: 'Är du säker du vill radera SSH-nyckeln {title}',\n\n  // Original text: 'Others'\n  others: 'Andra',\n\n  // Original text: 'Loading logs…'\n  loadingLogs: 'Laddar loggar',\n\n  // Original text: 'User'\n  logUser: 'Användare',\n\n  // Original text: 'Method'\n  logMethod: 'Metod',\n\n  // Original text: 'Params'\n  logParams: undefined,\n\n  // Original text: 'Message'\n  logMessage: 'Meddelande',\n\n  // Original text: 'Error'\n  logError: undefined,\n\n  // Original text: 'Display details'\n  logDisplayDetails: 'Visa detaljer',\n\n  // Original text: 'Date'\n  logTime: 'Datum',\n\n  // Original text: 'No stack trace'\n  logNoStackTrace: undefined,\n\n  // Original text: 'No params'\n  logNoParams: undefined,\n\n  // Original text: 'Delete log'\n  logDelete: 'Radera log',\n\n  // Original text: 'Delete all logs'\n  logDeleteAll: 'Radera alla loggar',\n\n  // Original text: 'Delete all logs'\n  logDeleteAllTitle: 'Radera alla loggar',\n\n  // Original text: 'Are you sure you want to delete all the logs?'\n  logDeleteAllMessage: 'Är du säker du vill radera alla loggar?',\n\n  // Original text: 'Click to enable'\n  logIndicationToEnable: 'Klicka för att aktivera',\n\n  // Original text: 'Click to disable'\n  logIndicationToDisable: 'Klicka för att inaktivera',\n\n  // Original text: 'Report a bug'\n  reportBug: 'Rapportera en bugg',\n\n  // Original text: 'Name'\n  ipPoolName: 'Namn',\n\n  // Original text: 'IPs'\n  ipPoolIps: undefined,\n\n  // Original text: 'IPs (e.g.: 1.0.0.12-1.0.0.17;1.0.0.23)'\n  ipPoolIpsPlaceholder: undefined,\n\n  // Original text: 'Networks'\n  ipPoolNetworks: 'Nätverk',\n\n  // Original text: 'No IP pools'\n  ipsNoIpPool: 'Inga IP pooler',\n\n  // Original text: 'Create'\n  ipsCreate: 'Skapa',\n\n  // Original text: 'Delete all IP pools'\n  ipsDeleteAllTitle: 'Radera alla IP pooler',\n\n  // Original text: 'Are you sure you want to delete all the IP pools?'\n  ipsDeleteAllMessage: 'Är du säker du vill radera alla IP pooler?',\n\n  // Original text: 'VIFs'\n  ipsVifs: undefined,\n\n  // Original text: 'Not used'\n  ipsNotUsed: 'Används ej',\n\n  // Original text: 'unknown VIF'\n  ipPoolUnknownVif: 'okänd VIF',\n\n  // Original text: 'Name already exists'\n  ipPoolNameAlreadyExists: 'Namnet existerar redan',\n\n  // Original text: 'Keyboard shortcuts'\n  shortcutModalTitle: 'Tangentbordsgenvägar',\n\n  // Original text: 'Global'\n  shortcut_XoApp: undefined,\n\n  // Original text: 'Go to hosts list'\n  shortcut_GO_TO_HOSTS: 'Gå till värd-listan',\n\n  // Original text: 'Go to pools list'\n  shortcut_GO_TO_POOLS: 'Gå till pool-listan',\n\n  // Original text: 'Go to VMs list'\n  shortcut_GO_TO_VMS: 'Gå till VMs-listan',\n\n  // Original text: 'Go to SRs list'\n  shortcut_GO_TO_SRS: 'Gå till SRs-listan',\n\n  // Original text: 'Create a new VM'\n  shortcut_CREATE_VM: 'Skapa ny VM',\n\n  // Original text: 'Unfocus field'\n  shortcut_UNFOCUS: undefined,\n\n  // Original text: 'Show shortcuts key bindings'\n  shortcut_HELP: 'Visa genvägarns knappkombinationer',\n\n  // Original text: 'Home'\n  shortcut_Home: 'Hem',\n\n  // Original text: 'Focus search bar'\n  shortcut_SEARCH: 'Fokusera sökrutan',\n\n  // Original text: 'Next item'\n  shortcut_NAV_DOWN: 'Nästa föremål',\n\n  // Original text: 'Previous item'\n  shortcut_NAV_UP: 'Föregående föremål',\n\n  // Original text: 'Select item'\n  shortcut_SELECT: 'Välj föremål',\n\n  // Original text: 'Open'\n  shortcut_JUMP_INTO: 'Öppna',\n\n  // Original text: 'VM'\n  settingsAclsButtonTooltipVM: 'VM',\n\n  // Original text: 'Hosts'\n  settingsAclsButtonTooltiphost: 'Värdar',\n\n  // Original text: 'Pool'\n  settingsAclsButtonTooltippool: 'Pool',\n\n  // Original text: 'SR'\n  settingsAclsButtonTooltipSR: undefined,\n\n  // Original text: 'Network'\n  settingsAclsButtonTooltipnetwork: 'Nätverk',\n\n  // Original text: 'No config file selected'\n  noConfigFile: 'Ingen konfigurationsfil vald',\n\n  // Original text: 'Try dropping a config file here, or click to select a config file to upload.'\n  importTip: 'Prova släpp en konfigurationsfil här, eller klicka för att välja en att ladda upp.',\n\n  // Original text: 'Config'\n  config: 'Konfiguration',\n\n  // Original text: 'Import'\n  importConfig: 'Importera',\n\n  // Original text: 'Config file successfully imported'\n  importConfigSuccess: 'Importen av konfigurationsfilen lyckades',\n\n  // Original text: 'Error while importing config file'\n  importConfigError: 'Import av konfigurationsfilen misslyckades',\n\n  // Original text: 'Export'\n  exportConfig: 'Exportera',\n\n  // Original text: 'Download current config'\n  downloadConfig: 'Ladda ner den aktuella konfigurationen',\n\n  // Original text: 'No config import available for Community Edition'\n  noConfigImportCommunity: 'Import av konfigurering är inte tillgänglig för Community Edition',\n\n  // Original text: 'Reconnect all hosts'\n  srReconnectAllModalTitle: 'Återanslut alla värdar',\n\n  // Original text: 'This will reconnect this SR to all its hosts.'\n  srReconnectAllModalMessage: 'Detta kommer återansluta denna SR till alla dess värdar',\n\n  // Original text: 'This will reconnect each selected SR to its host (local SR) or to every hosts of its pool (shared SR).'\n  srsReconnectAllModalMessage:\n    'Detta kommer återansluta varje vald SR till dess värd (lokal SR) eller till varje värd i dess pool (delad SR)',\n\n  // Original text: 'Disconnect all hosts'\n  srDisconnectAllModalTitle: 'Koppla bort alla värdar',\n\n  // Original text: 'This will disconnect this SR from all its hosts.'\n  srDisconnectAllModalMessage: 'Detta kommer koppla bort denna SR från alla dess värdar',\n\n  // Original text: 'This will disconnect each selected SR from its host (local SR) or from every hosts of its pool (shared SR).'\n  srsDisconnectAllModalMessage:\n    'Detta kommer koppla bort varje vald SR från dess värd (lokal SR) eller från varje värd i dess pool (shared SR)',\n\n  // Original text: 'Forget SR'\n  srForgetModalTitle: 'Glöm SR',\n\n  // Original text: 'Forget selected SRs'\n  srsForgetModalTitle: 'Glöm markerade SRs',\n\n  // Original text: \"Are you sure you want to forget this SR? VDIs on this storage won't be removed.\"\n  srForgetModalMessage: 'Är du säker du vill glömma denna SR? VDIs på denna lagringen kommer inte tas bort.',\n\n  // Original text: \"Are you sure you want to forget all the selected SRs? VDIs on these storages won't be removed.\"\n  srsForgetModalMessage: 'Är du säker du vill glömma alla valda SRs? VDIs på dessa lagringarna kommer inte tas bort.',\n\n  // Original text: 'Disconnected'\n  srAllDisconnected: 'Bortkopplad',\n\n  // Original text: 'Partially connected'\n  srSomeConnected: 'Delvis ansluten',\n\n  // Original text: 'Connected'\n  srAllConnected: 'Ansluten',\n\n  // Original text: 'XOSAN'\n  xosanTitle: undefined,\n\n  // Original text: 'Xen Orchestra SAN SR'\n  xosanSrTitle: undefined,\n\n  // Original text: 'Select local SRs (lvm)'\n  xosanAvailableSrsTitle: 'Välj lokal SRs (lvm)',\n\n  // Original text: 'Suggestions'\n  xosanSuggestions: 'Förslag',\n\n  // Original text: 'Name'\n  xosanName: 'Namn',\n\n  // Original text: 'Host'\n  xosanHost: 'Värd',\n\n  // Original text: 'Hosts'\n  xosanHosts: 'Värdar',\n\n  // Original text: 'Volume ID'\n  xosanVolumeId: undefined,\n\n  // Original text: 'Size'\n  xosanSize: 'Storlek',\n\n  // Original text: 'Used space'\n  xosanUsedSpace: 'Använt utrymme',\n\n  // Original text: 'XOSAN pack needs to be installed on each host of the pool.'\n  xosanNeedPack: 'XOSAN paket behöver vara installerad på varje värd i poolen',\n\n  // Original text: 'Install it now!'\n  xosanInstallIt: 'Installera det nu!',\n\n  // Original text: 'Some hosts need their toolstack to be restarted before you can create an XOSAN'\n  xosanNeedRestart: 'Några värdar behöver starta om sina toolstacks före du kan skapa XOSAN',\n\n  // Original text: 'Restart toolstacks'\n  xosanRestartAgents: 'Starta om toolstakcs',\n\n  // Original text: 'Pool master is not running'\n  xosanMasterOffline: 'Pool master körs inte',\n\n  // Original text: 'Install XOSAN pack on {pool}'\n  xosanInstallPackTitle: 'Installera XOSAN paket på {pool}',\n\n  // Original text: 'Select at least 2 SRs'\n  xosanSelect2Srs: 'Välj åtminstone 2 SRs',\n\n  // Original text: 'Layout'\n  xosanLayout: undefined,\n\n  // Original text: 'Redundancy'\n  xosanRedundancy: 'Redundans',\n\n  // Original text: 'Capacity'\n  xosanCapacity: 'Kapacitet',\n\n  // Original text: 'Available space'\n  xosanAvailableSpace: 'Tillgängligt utrymme',\n\n  // Original text: '* Can fail without data loss'\n  xosanDiskLossLegend: 'Kan fallera utan att data försvinner',\n\n  // Original text: 'Create'\n  xosanCreate: 'Skapa',\n\n  // Original text: 'Installing XOSAN. Please wait…'\n  xosanInstalling: 'Installerar XOSAN. Vänligen vänta',\n\n  // Original text: 'No XOSAN available for Community Edition'\n  xosanCommunity: 'Ingen XOSAN tillgänglig för Community Edition',\n\n  // Original text: 'Install cloud plugin first'\n  xosanInstallCloudPlugin: 'Installera cloud plugin först',\n\n  // Original text: 'Load cloud plugin first'\n  xosanLoadCloudPlugin: 'Ladda cloud plugin först',\n\n  // Original text: 'Loading…'\n  xosanLoading: 'Laddar',\n\n  // Original text: 'XOSAN is not available at the moment'\n  xosanNotAvailable: 'XOSAN är inte tillgängligt just nu',\n\n  // Original text: 'Register for the XOSAN beta'\n  xosanRegisterBeta: 'Registrera för XOSAN beta',\n\n  // Original text: 'You have successfully registered for the XOSAN beta. Please wait until your request has been approved.'\n  xosanSuccessfullyRegistered: 'Regitreringen för XOSAN betan lyckades. Vänligen vänta på att din ansökan blir godkänd',\n\n  // Original text: 'Install XOSAN pack on these hosts:'\n  xosanInstallPackOnHosts: 'Installera XOSAN paket på dessa värdar:',\n\n  // Original text: 'Install {pack} v{version}?'\n  xosanInstallPack: 'Installera {pack} v{version}?',\n\n  // Original text: 'No compatible XOSAN pack found for your XenServer versions.'\n  xosanNoPackFound: 'Inget kompatibelt XOSAN paket hittat för din XenServer version',\n\n  // Original text: 'At least one of these version requirements must be satisfied by all the hosts in this pool:'\n  xosanPackRequirements: 'Åtminstone en av dessa versionskrav måste uppfyllas av alla värdar i denna poolen:',\n}\n","// See http://momentjs.com/docs/#/use-it/browserify/\nimport 'moment/locale/tr'\n\nimport reactIntlData from 'react-intl/locale-data/tr'\nimport { addLocaleData } from 'react-intl'\naddLocaleData(reactIntlData)\n\n// ===================================================================\n\nexport default {\n  // Original text: \"{key}: {value}\"\n  keyValue: '{key}: {value}',\n\n  // Original text: \"Connecting\"\n  statusConnecting: 'Bağlanıyor',\n\n  // Original text: \"Disconnected\"\n  statusDisconnected: 'Bağlantı kesildi',\n\n  // Original text: \"Loading…\"\n  statusLoading: 'Yükleniyor...',\n\n  // Original text: \"Page not found\"\n  errorPageNotFound: 'Sayfa bulunamadı',\n\n  // Original text: \"no such item\"\n  errorNoSuchItem: 'Böyle bir öğe yok',\n\n  // Original text: 'unknown item'\n  errorUnknownItem: undefined,\n\n  // Original text: \"Long click to edit\"\n  editableLongClickPlaceholder: 'Düzenlemek için uzun tıklayın',\n\n  // Original text: \"Click to edit\"\n  editableClickPlaceholder: 'Düzenlemek için tıklayın',\n\n  // Original text: \"Browse files\"\n  browseFiles: 'Dosyaları tara',\n\n  // Original text: \"Show logs\"\n  showLogs: 'Günlüğü göster',\n\n  // Original text: \"OK\"\n  alertOk: 'Tamam',\n\n  // Original text: \"OK\"\n  confirmOk: 'Tamam',\n\n  // Original text: \"Cancel\"\n  genericCancel: 'İptal',\n\n  // Original text: \"Enter the following text to confirm:\"\n  enterConfirmText: 'Onaylamak için aşağıdaki metni girin:',\n\n  // Original text: \"On error\"\n  onError: 'Hata durumunda',\n\n  // Original text: \"Successful\"\n  successful: 'Başarılı',\n\n  // Original text: \"Managed disks\"\n  filterOnlyManaged: 'Yönetilen diskler',\n\n  // Original text: \"Orphaned disks\"\n  filterOnlyOrphaned: 'Yetim diskler',\n\n  // Original text: \"Normal disks\"\n  filterOnlyRegular: 'Normal diskler',\n\n  // Original text: \"Snapshot disks\"\n  filterOnlySnapshots: 'Snapshot diskleri',\n\n  // Original text: \"Unmanaged disks\"\n  filterOnlyUnmanaged: 'Yönetilmeyen diskler',\n\n  // Original text: \"Save…\"\n  filterSaveAs: 'Kaydet...',\n\n  // Original text: \"Explore the search syntax in the documentation\"\n  filterSyntaxLinkTooltip: 'Dokümanlarda arama sözdizimini keşfedin',\n\n  // Original text: \"Connected VIFs\"\n  filterVifsOnlyConnected: \"Bağlı VIF'ler\",\n\n  // Original text: \"Disconnected VIFs\"\n  filterVifsOnlyDisconnected: \"Bağlı olmayan VIF'ler\",\n\n  // Original text: \"Connected remotes\"\n  filterRemotesOnlyConnected: 'Bağlı hedefler',\n\n  // Original text: \"Disconnected remotes\"\n  filterRemotesOnlyDisconnected: 'Bağlı olmayan hedefler',\n\n  // Original text: \"Copy to clipboard\"\n  copyToClipboard: 'Panoya kopyala',\n\n  // Original text: 'Copy {uuid}'\n  copyUuid: undefined,\n\n  // Original text: \"Master\"\n  pillMaster: 'Master',\n\n  // Original text: \"Home\"\n  homePage: 'Ana sayfa',\n\n  // Original text: \"VMs\"\n  homeVmPage: \"VM'ler\",\n\n  // Original text: \"Hosts\"\n  homeHostPage: 'Sunucular',\n\n  // Original text: \"Pools\"\n  homePoolPage: 'Havuzlar',\n\n  // Original text: \"Templates\"\n  homeTemplatePage: 'Kalıplar',\n\n  // Original text: \"Storages\"\n  homeSrPage: 'Depolama birimleri',\n\n  // Original text: \"Dashboard\"\n  dashboardPage: 'Gösterge paneli ',\n\n  // Original text: \"Overview\"\n  overviewDashboardPage: 'Genel görünüm',\n\n  // Original text: \"Visualizations\"\n  overviewVisualizationDashboardPage: 'Görselleştirmeler',\n\n  // Original text: \"Statistics\"\n  overviewStatsDashboardPage: 'İstatistikler',\n\n  // Original text: \"Health\"\n  overviewHealthDashboardPage: 'Sağlık',\n\n  // Original text: \"Self service\"\n  selfServicePage: 'Self servis',\n\n  // Original text: \"Backup\"\n  backupPage: 'Yedekleme',\n\n  // Original text: \"Jobs\"\n  jobsPage: 'İşler',\n\n  // Original text: \"XOA\"\n  xoaPage: 'XOA',\n\n  // Original text: \"Updates\"\n  updatePage: 'Güncellemeler',\n\n  // Original text: \"Licenses\"\n  licensesPage: 'Lisanslar',\n\n  // Original text: \"Settings\"\n  settingsPage: 'Ayarlar',\n\n  // Original text: \"Servers\"\n  settingsServersPage: 'Sunucular',\n\n  // Original text: \"Users\"\n  settingsUsersPage: 'Kullanıcılar',\n\n  // Original text: \"Groups\"\n  settingsGroupsPage: 'Gruplar',\n\n  // Original text: \"ACLs\"\n  settingsAclsPage: \"ACL'ler\",\n\n  // Original text: \"Plugins\"\n  settingsPluginsPage: 'Eklentiler',\n\n  // Original text: \"Logs\"\n  settingsLogsPage: 'Günlükler',\n\n  // Original text: 'Cloud configs'\n  settingsCloudConfigsPage: undefined,\n\n  // Original text: \"IPs\"\n  settingsIpsPage: \"IP'ler\",\n\n  // Original text: \"About\"\n  aboutPage: 'Hakkında',\n\n  // Original text: \"About XO {xoaPlan}\"\n  aboutXoaPlan: 'XO {xoaPlan} hakkında',\n\n  // Original text: \"New\"\n  newMenu: 'Yeni',\n\n  // Original text: \"Tasks\"\n  taskMenu: 'Görevler',\n\n  // Original text: \"Tasks\"\n  taskPage: 'Görevler',\n\n  // Original text: \"VM\"\n  newVmPage: 'VM',\n\n  // Original text: \"Storage\"\n  newSrPage: 'Depolama birimi',\n\n  // Original text: \"Server\"\n  newServerPage: 'Sunucu',\n\n  // Original text: \"Import\"\n  newImport: 'İçe aktar',\n\n  // Original text: \"XOSAN\"\n  xosan: 'XOSAN',\n\n  // Original text: 'Warning: Backup is deprecated, use Backup NG instead.'\n  backupDeprecatedMessage: undefined,\n\n  // Original text: 'How to migrate to Backup NG'\n  backupMigrationLink: undefined,\n\n  // Original text: 'Create a new backup with Backup NG'\n  backupNgNewPage: undefined,\n\n  // Original text: \"Overview\"\n  backupOverviewPage: 'Genel bakış',\n\n  // Original text: \"New\"\n  backupNewPage: 'Yeni',\n\n  // Original text: \"Remotes\"\n  backupRemotesPage: 'Hedefler',\n\n  // Original text: \"Restore\"\n  backupRestorePage: 'Geri yükle',\n\n  // Original text: \"File restore\"\n  backupFileRestorePage: 'Dosya geri yükle',\n\n  // Original text: \"Schedule\"\n  schedule: 'Zamanlama',\n\n  // Original text: \"New VM backup\"\n  newVmBackup: 'Yeni VM yedekleme',\n\n  // Original text: \"Edit VM backup\"\n  editVmBackup: 'VM yedekleme düzenle',\n\n  // Original text: \"Backup\"\n  backup: 'Yedekleme',\n\n  // Original text: \"Rolling Snapshot\"\n  rollingSnapshot: 'Snapshot döngüsü',\n\n  // Original text: \"Delta Backup\"\n  deltaBackup: 'Fark yedekleme',\n\n  // Original text: \"Disaster Recovery\"\n  disasterRecovery: 'Felaket kurtarma',\n\n  // Original text: \"Continuous Replication\"\n  continuousReplication: 'Sürekli replikasyon',\n\n  // Original text: \"Overview\"\n  jobsOverviewPage: 'Genel bakış',\n\n  // Original text: \"New\"\n  jobsNewPage: 'Yeni',\n\n  // Original text: \"Scheduling\"\n  jobsSchedulingPage: 'Zamanlama',\n\n  // Original text: \"Custom Job\"\n  customJob: 'Özel iş',\n\n  // Original text: \"User\"\n  userPage: 'Kullanıcı',\n\n  // Original text: \"XOA\"\n  xoa: 'XOA',\n\n  // Original text: \"No support\"\n  noSupport: 'Destek yok',\n\n  // Original text: \"Free upgrade!\"\n  freeUpgrade: 'Bedava yükseltme!',\n\n  // Original text: \"Sign out\"\n  signOut: 'Oturumu kapat',\n\n  // Original text: \"Edit my settings {username}\"\n  editUserProfile: 'Ayarlarımı düzenle {username}',\n\n  // Original text: \"Fetching data…\"\n  homeFetchingData: 'Veri getiriliyor...',\n\n  // Original text: \"Welcome to Xen Orchestra!\"\n  homeWelcome: \"Xen Orchestra'ya Hoşgeldiniz!\",\n\n  // Original text: \"Add your XCP-ng hosts or pools\"\n  homeWelcomeText: 'XenServer sunucu veya havuzunu ekle',\n\n  // Original text: \"Some XCP-ng hosts have been registered but are not connected\"\n  homeConnectServerText: \"Bazı XenServer'lar kayıtlı ama bağlı değil\",\n\n  // Original text: \"Want some help?\"\n  homeHelp: 'Yardım ister misin?',\n\n  // Original text: \"Add server\"\n  homeAddServer: 'Sunucu ekle',\n\n  // Original text: \"Connect servers\"\n  homeConnectServer: 'Bağlı sunucular',\n\n  // Original text: \"Online Doc\"\n  homeOnlineDoc: 'Çevrimiçi Doküman',\n\n  // Original text: \"Pro Support\"\n  homeProSupport: 'Profesyonel Destek',\n\n  // Original text: \"There are no VMs!\"\n  homeNoVms: 'Hiç VM yok',\n\n  // Original text: \"Or…\"\n  homeNoVmsOr: 'Veya...',\n\n  // Original text: \"Import VM\"\n  homeImportVm: 'VM içe aktar',\n\n  // Original text: \"Import an existing VM in xva format\"\n  homeImportVmMessage: \"Varolan bir VM'i xva formatından içe aktar\",\n\n  // Original text: \"Restore a backup\"\n  homeRestoreBackup: 'Bir yedeği geri yükle',\n\n  // Original text: \"Restore a backup from a remote store\"\n  homeRestoreBackupMessage: 'Bir yedeği uzak depodan geri yükle',\n\n  // Original text: \"This will create a new VM\"\n  homeNewVmMessage: 'Bu yeni bir VM oluşturacak',\n\n  // Original text: \"Filters\"\n  homeFilters: 'Filtreler',\n\n  // Original text: \"No results! Click here to reset your filters\"\n  homeNoMatches: 'Sonuç yok! Filtreyi sıfırlamak için buraya tıklayın',\n\n  // Original text: \"Pool\"\n  homeTypePool: 'Havuz',\n\n  // Original text: \"Host\"\n  homeTypeHost: 'Sunucu',\n\n  // Original text: \"VM\"\n  homeTypeVm: 'VM',\n\n  // Original text: \"SR\"\n  homeTypeSr: 'SR',\n\n  // Original text: \"Template\"\n  homeTypeVmTemplate: 'Kalıp',\n\n  // Original text: \"Sort\"\n  homeSort: 'Sırala',\n\n  // Original text: \"Pools\"\n  homeAllPools: 'Havuzlar',\n\n  // Original text: \"Hosts\"\n  homeAllHosts: 'Sunucular',\n\n  // Original text: \"Tags\"\n  homeAllTags: 'Etiketler',\n\n  // Original text: \"Resource sets\"\n  homeAllResourceSets: 'Kaynak setleri',\n\n  // Original text: \"New VM\"\n  homeNewVm: 'Yeni VM',\n\n  // Original text: \"None\"\n  homeFilterNone: 'Yok',\n\n  // Original text: \"Running hosts\"\n  homeFilterRunningHosts: 'Çalışan sunucular',\n\n  // Original text: \"Disabled hosts\"\n  homeFilterDisabledHosts: 'Devre dışı sunucular',\n\n  // Original text: \"Running VMs\"\n  homeFilterRunningVms: \"Çalışan VM'ler\",\n\n  // Original text: \"Non running VMs\"\n  homeFilterNonRunningVms: \"Çalışmayan VM'ler\",\n\n  // Original text: \"Pending VMs\"\n  homeFilterPendingVms: \"Askıdaki VM'ler\",\n\n  // Original text: \"HVM guests\"\n  homeFilterHvmGuests: 'HVM konuklar',\n\n  // Original text: \"Tags\"\n  homeFilterTags: 'Etiketler',\n\n  // Original text: \"Sort by\"\n  homeSortBy: 'Sırala',\n\n  // Original text: \"CPUs\"\n  homeSortByCpus: \"CPU'lar\",\n\n  // Original text: \"Name\"\n  homeSortByName: 'İsim',\n\n  // Original text: \"Power state\"\n  homeSortByPowerstate: 'Güç durumu',\n\n  // Original text: \"RAM\"\n  homeSortByRAM: 'RAM',\n\n  // Original text: \"Shared/Not shared\"\n  homeSortByShared: 'Paylaşımlı/Paylaşımsız',\n\n  // Original text: \"Size\"\n  homeSortBySize: 'Boyut',\n\n  // Original text: \"Type\"\n  homeSortByType: 'Tip',\n\n  // Original text: \"Usage\"\n  homeSortByUsage: 'Kullanım',\n\n  // Original text: \"vCPUs\"\n  homeSortByvCPUs: \"vCPU'lar\",\n\n  // Original text: \"Snapshots\"\n  homeSortVmsBySnapshots: \"Snapshot'lar\",\n\n  // Original text: 'Container'\n  homeSortByContainer: undefined,\n\n  // Original text: 'Pool'\n  homeSortByPool: undefined,\n\n  // Original text: \"{displayed, number}x {icon} (on {total, number})\"\n  homeDisplayedItems: '{displayed, number}x {icon} (on {total, number})',\n\n  // Original text: \"{selected, number}x {icon} selected (on {total, number})\"\n  homeSelectedItems: '{selected, number}x {icon} selected (on {total, number})',\n\n  // Original text: \"More\"\n  homeMore: 'Daha fazla',\n\n  // Original text: \"Migrate to…\"\n  homeMigrateTo: 'Taşı...',\n\n  // Original text: \"Missing patches\"\n  homeMissingPatches: 'Eksik yamalar',\n\n  // Original text: \"Master:\"\n  homePoolMaster: 'Master:',\n\n  // Original text: \"Resource set: {resourceSet}\"\n  homeResourceSet: 'Kaynak seti: {resourceSet}',\n\n  // Original text: \"High Availability\"\n  highAvailability: 'Yüksek kullanılabilirlik',\n\n  // Original text: \"Shared {type}\"\n  srSharedType: 'Paylaşımlı {type}',\n\n  // Original text: \"Not shared {type}\"\n  srNotSharedType: 'Paylaşımsız {type}',\n\n  // Original text: \"All of them are selected\"\n  sortedTableAllItemsSelected: 'Hepsi seçildi ({nItems, number})',\n\n  // Original text: \"No items found\"\n  sortedTableNoItems: 'Hiç öğe bulunamadı',\n\n  // Original text: \"{nFiltered, number} of {nTotal, number} items\"\n  sortedTableNumberOfFilteredItems: '{nTotal, number} öğeden {nFiltered, number}',\n\n  // Original text: \"{nTotal, number} items\"\n  sortedTableNumberOfItems: '{nTotal, number} öğe',\n\n  // Original text: \"{nSelected, number} selected\"\n  sortedTableNumberOfSelectedItems: '{nSelected, number} seçildi',\n\n  // Original text: \"Click here to select all items\"\n  sortedTableSelectAllItems: 'Bütün öğeleri seçmek için buraya tıklayın',\n\n  // Original text: 'State'\n  state: undefined,\n\n  // Original text: 'Disabled'\n  stateDisabled: undefined,\n\n  // Original text: 'Enabled'\n  stateEnabled: undefined,\n\n  // Original text: 'Cancel'\n  formCancel: undefined,\n\n  // Original text: 'Create'\n  formCreate: undefined,\n\n  // Original text: 'Edit'\n  formEdit: undefined,\n\n  // Original text: 'ID'\n  formId: undefined,\n\n  // Original text: 'Name'\n  formName: undefined,\n\n  // Original text: 'Reset'\n  formReset: undefined,\n\n  // Original text: 'Save'\n  formSave: undefined,\n\n  // Original text: 'Notes'\n  formNotes: undefined,\n\n  // Original text: \"Add\"\n  add: 'Ekle',\n\n  // Original text: \"Select all\"\n  selectAll: 'Hepsini seç',\n\n  // Original text: \"Remove\"\n  remove: 'Kaldır',\n\n  // Original text: \"Preview\"\n  preview: 'Örnek',\n\n  // Original text: \"Action\"\n  action: 'Aksiyon',\n\n  // Original text: \"Item\"\n  item: 'Öğe',\n\n  // Original text: \"No selected value\"\n  noSelectedValue: 'Seçilmiş değer yok',\n\n  // Original text: \"Choose user(s) and/or group(s)\"\n  selectSubjects: 'Kullanıcı(ları) ve/veya grub(ları) seç',\n\n  // Original text: \"Select Object(s)…\"\n  selectObjects: 'Nesne(leri) seç...',\n\n  // Original text: \"Choose a role\"\n  selectRole: 'Bir rol seç',\n\n  // Original text: \"Select Host(s)…\"\n  selectHosts: 'Sunucu(ları) seç...',\n\n  // Original text: \"Select object(s)…\"\n  selectHostsVms: 'Nesne(leri) seç...',\n\n  // Original text: \"Select Network(s)…\"\n  selectNetworks: 'Ağ(ları) seç...',\n\n  // Original text: \"Select PIF(s)…\"\n  selectPifs: 'PIF(leri) seç...',\n\n  // Original text: \"Select Pool(s)…\"\n  selectPools: 'Havuz(ları) seç...',\n\n  // Original text: \"Select Remote(s)…\"\n  selectRemotes: 'Hedef(leri) seç...',\n\n  // Original text: \"Select resource set(s)…\"\n  selectResourceSets: 'Kaynak seti(lerini) seç...',\n\n  // Original text: \"Select template(s)…\"\n  selectResourceSetsVmTemplate: 'Kalıp(ları) seç...',\n\n  // Original text: \"Select SR(s)…\"\n  selectResourceSetsSr: 'SR(leri) seç...',\n\n  // Original text: \"Select network(s)…\"\n  selectResourceSetsNetwork: 'Ağ(ları) seç...',\n\n  // Original text: \"Select disk(s)…\"\n  selectResourceSetsVdi: 'Disk(leri) seç...',\n\n  // Original text: \"Select SSH key(s)…\"\n  selectSshKey: 'SSH anahtarı(larını) seç...',\n\n  // Original text: \"Select SR(s)…\"\n  selectSrs: 'SR(leri) seç...',\n\n  // Original text: \"Select VM(s)…\"\n  selectVms: 'VM(leri) seç...',\n\n  // Original text: \"Select snapshot(s)…\"\n  selectVmSnapshots: 'Snapshot(ları) seç...',\n\n  // Original text: \"Select VM template(s)…\"\n  selectVmTemplates: 'VM kalıbı(ları) seç...',\n\n  // Original text: \"Select tag(s)…\"\n  selectTags: 'Etiket(leri) seç...',\n\n  // Original text: \"Select disk(s)…\"\n  selectVdis: 'Disk(leri) seç...',\n\n  // Original text: \"Select timezone…\"\n  selectTimezone: 'Saat dilimini seç...',\n\n  // Original text: \"Select IP(s)…\"\n  selectIp: 'IP(leri) seç...',\n\n  // Original text: \"Select IP pool(s)…\"\n  selectIpPool: 'IP havuzu(larını) seç...',\n\n  // Original text: \"Select VGPU type(s)…\"\n  selectVgpuType: 'VGPU tipi(lerini)seç...',\n\n  // Original text: \"Fill required information.\"\n  fillRequiredInformations: 'Gerekli bilgileri doldur.',\n\n  // Original text: \"Fill information (optional)\"\n  fillOptionalInformations: 'Bilgileri doldur (opsiyonel)',\n\n  // Original text: \"Reset\"\n  selectTableReset: 'Sıfırla',\n\n  // Original text: 'Select Cloud Config(s)…'\n  selectCloudConfigs: undefined,\n\n  // Original text: \"Month\"\n  schedulingMonth: 'Ay',\n\n  // Original text: \"Every N month\"\n  schedulingEveryNMonth: 'N ayda bir',\n\n  // Original text: \"Each selected month\"\n  schedulingEachSelectedMonth: 'Seçilen aylarda',\n\n  // Original text: \"Day\"\n  schedulingDay: 'Gün',\n\n  // Original text: \"Every N day\"\n  schedulingEveryNDay: 'N günde bir',\n\n  // Original text: \"Each selected day\"\n  schedulingEachSelectedDay: 'Seçilen günlerde',\n\n  // Original text: \"Switch to week days\"\n  schedulingSetWeekDayMode: 'Haftanın günlerine çevir',\n\n  // Original text: \"Switch to month days\"\n  schedulingSetMonthDayMode: 'Ayın günlerine çevir',\n\n  // Original text: \"Hour\"\n  schedulingHour: 'Saat',\n\n  // Original text: \"Each selected hour\"\n  schedulingEachSelectedHour: 'Seçilen saatlerde',\n\n  // Original text: \"Every N hour\"\n  schedulingEveryNHour: 'N saatte bir',\n\n  // Original text: \"Minute\"\n  schedulingMinute: 'Dakika',\n\n  // Original text: \"Each selected minute\"\n  schedulingEachSelectedMinute: 'Seçilen dakikalarda',\n\n  // Original text: \"Every N minute\"\n  schedulingEveryNMinute: 'N dakikada bir',\n\n  // Original text: \"Every month\"\n  selectTableAllMonth: 'Her ay',\n\n  // Original text: \"Every day\"\n  selectTableAllDay: 'Her gün',\n\n  // Original text: \"Every hour\"\n  selectTableAllHour: 'Her saat',\n\n  // Original text: \"Every minute\"\n  selectTableAllMinute: 'Her dakika',\n\n  // Original text: \"Reset\"\n  schedulingReset: 'Sıfırla',\n\n  // Original text: \"Unknown\"\n  unknownSchedule: 'Bilinmeyen',\n\n  // Original text: \"Web browser timezone\"\n  timezonePickerUseLocalTime: 'Tarayıcı kaynaklı saat dilimi',\n\n  // Original text: \"Server timezone ({value})\"\n  serverTimezoneOption: 'Sunucu saat dilimi ({value})',\n\n  // Original text: \"Cron Pattern:\"\n  cronPattern: 'Cron kalıbı:',\n\n  // Original text: \"Cannot edit backup\"\n  backupEditNotFoundTitle: 'Yedekleme düzenlenemiyor',\n\n  // Original text: \"Missing required info for edition\"\n  backupEditNotFoundMessage: 'Sürüm için gerekli bilgi eksik',\n\n  // Original text: \"Successful\"\n  successfulJobCall: 'Başarılı',\n\n  // Original text: \"Failed\"\n  failedJobCall: 'Başarısız',\n\n  // Original text: \"Skipped\"\n  jobCallSkipped: 'Atlandı',\n\n  // Original text: \"In progress\"\n  jobCallInProgess: 'Devam ediyor',\n\n  // Original text: \"Transfer size:\"\n  jobTransferredDataSize: 'Transfer boyutu',\n\n  // Original text: \"Transfer speed:\"\n  jobTransferredDataSpeed: 'Transfer hızı',\n\n  // Original text: 'Size'\n  operationSize: undefined,\n\n  // Original text: 'Speed'\n  operationSpeed: undefined,\n\n  // Original text: 'Type'\n  exportType: undefined,\n\n  // Original text: \"Merge size:\"\n  jobMergedDataSize: 'Birleştirme boyutu',\n\n  // Original text: \"Merge speed:\"\n  jobMergedDataSpeed: 'Birleştrime hızı',\n\n  // Original text: \"All\"\n  allJobCalls: 'Hepsi',\n\n  // Original text: \"Job\"\n  job: 'İş',\n\n  // Original text: \"Job {job}\"\n  jobModalTitle: 'İş {job}',\n\n  // Original text: \"ID\"\n  jobId: 'ID',\n\n  // Original text: \"Type\"\n  jobType: 'Tip',\n\n  // Original text: \"Name\"\n  jobName: 'İsim',\n\n  // Original text: \"Mode\"\n  jobMode: 'Mod',\n\n  // Original text: \"Name of your job (forbidden: \\\"_\\\")\"\n  jobNamePlaceholder: 'İşin adı (yasak: \"_\")',\n\n  // Original text: \"Start\"\n  jobStart: 'Başla',\n\n  // Original text: \"End\"\n  jobEnd: 'Son',\n\n  // Original text: \"Duration\"\n  jobDuration: 'Süre',\n\n  // Original text: \"Status\"\n  jobStatus: 'Durum',\n\n  // Original text: \"Action\"\n  jobAction: 'Aksiyon',\n\n  // Original text: \"Tag\"\n  jobTag: 'Etiket',\n\n  // Original text: \"Scheduling\"\n  jobScheduling: 'Zamanlama',\n\n  // Original text: \"Timezone\"\n  jobTimezone: 'Saat dilimi',\n\n  // Original text: \"Server\"\n  jobServerTimezone: 'Sunucu',\n\n  // Original text: \"Run job\"\n  runJob: 'İşi çalıştır',\n\n  // Original text: 'Cancel job'\n  cancelJob: undefined,\n\n  // Original text: \"Are you sure you want to run {backupType} {id} ({tag})?\"\n  runJobConfirm: '{backupType} {id} ({tag} işini çalıştırmak istediğinize emin misiniz?',\n\n  // Original text: \"One shot running started. See overview for logs.\"\n  runJobVerbose: 'Tek seferlik çalıştırma başladı. Günlükler için genel görünüme bakın',\n\n  // Original text: \"Edit job\"\n  jobEdit: 'İşi düzenle',\n\n  // Original text: \"Delete\"\n  jobDelete: 'Sil',\n\n  // Original text: \"Finished\"\n  jobFinished: 'Tamamlandı',\n\n  // Original text: \"Interrupted\"\n  jobInterrupted: 'Kesintiye uğradı',\n\n  // Original text: \"Started\"\n  jobStarted: 'Başladı',\n\n  // Original text: 'Failed'\n  jobFailed: undefined,\n\n  // Original text: 'Skipped'\n  jobSkipped: undefined,\n\n  // Original text: 'Successful'\n  jobSuccess: undefined,\n\n  // Original text: 'All'\n  allTasks: undefined,\n\n  // Original text: 'Start'\n  taskStart: undefined,\n\n  // Original text: 'End'\n  taskEnd: undefined,\n\n  // Original text: 'Duration'\n  taskDuration: undefined,\n\n  // Original text: 'Successful'\n  taskSuccess: undefined,\n\n  // Original text: 'Failed'\n  taskFailed: undefined,\n\n  // Original text: 'Skipped'\n  taskSkipped: undefined,\n\n  // Original text: 'Started'\n  taskStarted: undefined,\n\n  // Original text: 'Interrupted'\n  taskInterrupted: undefined,\n\n  // Original text: 'Transfer size'\n  taskTransferredDataSize: undefined,\n\n  // Original text: 'Transfer speed'\n  taskTransferredDataSpeed: undefined,\n\n  // Original text: 'Merge size'\n  taskMergedDataSize: undefined,\n\n  // Original text: 'Merge speed'\n  taskMergedDataSpeed: undefined,\n\n  // Original text: 'Error'\n  taskError: undefined,\n\n  // Original text: 'Reason'\n  taskReason: undefined,\n\n  // Original text: \"Save\"\n  saveBackupJob: 'Kaydet',\n\n  // Original text: \"Remove backup job\"\n  deleteBackupSchedule: 'Yedekleme işini kaldır',\n\n  // Original text: \"Are you sure you want to delete this backup job?\"\n  deleteBackupScheduleQuestion: 'Bu yedekleme işini silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete selected jobs\"\n  deleteSelectedJobs: 'Seçilen işleri sil',\n\n  // Original text: \"Enable immediately after creation\"\n  scheduleEnableAfterCreation: 'Oluşturmanın ardından hemen aktif et',\n\n  // Original text: \"You are editing Schedule {name} ({id}). Saving will override previous schedule state.\"\n  scheduleEditMessage:\n    '{name} ({id}) zamanlamasını düzenliyorsunuz. Kaydetme işlemi önceki zamanlamanın üzerine yazılacak.',\n\n  // Original text: \"You are editing job {name} ({id}). Saving will override previous job state.\"\n  jobEditMessage: '{name} ({id}) işini düzenliyorsunuz. Kaydetme işlemi önceki işin üzerine yazılacak',\n\n  // Original text: \"Edit schedule\"\n  scheduleEdit: 'Zamanlamayı düzenle',\n\n  // Original text: \"A name is required to create the backup's job!\"\n  missingBackupName: undefined,\n\n  // Original text: 'Missing VMs!'\n  missingVms: undefined,\n\n  // Original text: 'You need to choose a backup mode!'\n  missingBackupMode: undefined,\n\n  // Original text: 'Missing remotes!'\n  missingRemotes: undefined,\n\n  // Original text: 'Missing SRs!'\n  missingSrs: undefined,\n\n  // Original text: 'Missing schedules!'\n  missingSchedules: undefined,\n\n  // Original text: 'The Backup mode and The Delta Backup mode require export retention to be higher than 0!'\n  missingExportRetention: undefined,\n\n  // Original text: 'The CR mode and The DR mode require copy retention to be higher than 0!'\n  missingCopyRetention: undefined,\n\n  // Original text: 'The Rolling Snapshot mode requires snapshot retention to be higher than 0!'\n  missingSnapshotRetention: undefined,\n\n  // Original text: 'One of the retentions needs to be higher than 0!'\n  retentionNeeded: undefined,\n\n  // Original text: 'No remotes found, please click on the remotes settings button to create one!'\n  createRemoteMessage: undefined,\n\n  // Original text: 'Remotes settings'\n  remotesSettings: undefined,\n\n  // Original text: \"Add a schedule\"\n  scheduleAdd: 'Zamanlama ekle',\n\n  // Original text: \"Delete\"\n  scheduleDelete: 'Sil',\n\n  // Original text: \"Run schedule\"\n  scheduleRun: 'Zamanlanmış çalıştırma',\n\n  // Original text: \"Delete selected schedules\"\n  deleteSelectedSchedules: 'Seçili zamanlamayı sil',\n\n  // Original text: \"No scheduled jobs.\"\n  noScheduledJobs: 'Zamanlanmış iş yok.',\n\n  // Original text: 'You can delete all your legacy backup snapshots.'\n  legacySnapshotsLink: undefined,\n\n  // Original text: \"New schedule\"\n  newSchedule: 'Yeni zamanlama',\n\n  // Original text: \"No jobs found.\"\n  noJobs: 'İş bulunamadı',\n\n  // Original text: \"No schedules found\"\n  noSchedules: 'Zamanlama bulunamadı',\n\n  // Original text: \"Select a xo-server API command\"\n  jobActionPlaceHolder: 'Bir xo-server API komutu seç',\n\n  // Original text: \"Timeout (number of seconds after which a VM is considered failed)\"\n  jobTimeoutPlaceHolder: \"Zaman aşımı (Bir VM'nin değerlendirilmesinin başarısız olduğu saniye sayısı)\",\n\n  // Original text: \"Schedules\"\n  jobSchedules: 'Zamanlamalar',\n\n  // Original text: \"Name of your schedule\"\n  jobScheduleNamePlaceHolder: 'Zamanlamanın adı',\n\n  // Original text: \"Select a Job\"\n  jobScheduleJobPlaceHolder: 'Bir iş seç',\n\n  // Original text: \"Job owner\"\n  jobOwnerPlaceholder: 'işin sahibi',\n\n  // Original text: \"This job's creator no longer exists\"\n  jobUserNotFound: 'Bu işi oluşturan kullanıcı artık yok',\n\n  // Original text: \"This backup's creator no longer exists\"\n  backupUserNotFound: 'Bu yedeklemeyi oluşturan kullanıcı artık yok',\n\n  // Original text: \"Click here to see the matching VMs\"\n  redirectToMatchingVms: \"Eşleşen VM'leri görmek için tıklayın\",\n\n  // Original text: 'Migrate to backup NG'\n  migrateToBackupNg: undefined,\n\n  // Original text: \"There are no matching VMs!\"\n  noMatchingVms: 'Hiç eşleşen VM yok',\n\n  // Original text: \"{icon} See the matching VMs ({nMatchingVms, number})\"\n  allMatchingVms: \"{icon} Eşleşen VM'leri gör ({nMatchingVms, number})\",\n\n  // Original text: \"Backup owner\"\n  backupOwner: 'Yedeklemenin sahibi',\n\n  // Original text: \"Migrate to backup NG\"\n  migrateBackupSchedule: \"Backup NG'ye taşı\",\n\n  // Original text: \"This will migrate this backup to a backup NG. This operation is not reversible. Do you want to continue?\"\n  migrateBackupScheduleMessage:\n    \"Bu, yedeklemeyi Backup NG'ye taşıyacak. Bu işlem geri alınamaz. Devam etmek istiyor musunuz?\",\n\n  // Original text: \"Are you sure you want to run {name} ({id})?\"\n  runBackupNgJobConfirm: 'Çalıştırmak istediğinize emin misiniz {name} ({id})?',\n\n  // Original text: 'Are you sure you want to cancel {name} ({id})?'\n  cancelJobConfirm: undefined,\n\n  // Original text: 'Advanced settings'\n  newBackupAdvancedSettings: undefined,\n\n  // Original text: 'Always'\n  reportWhenAlways: undefined,\n\n  // Original text: 'Failure'\n  reportWhenFailure: undefined,\n\n  // Original text: 'Never'\n  reportWhenNever: undefined,\n\n  // Original text: 'Report when'\n  reportWhen: undefined,\n\n  // Original text: 'Concurrency'\n  concurrency: undefined,\n\n  // Original text: \"Select your backup type:\"\n  newBackupSelection: 'Yedekleme tipini seçin:',\n\n  // Original text: \"Select backup mode:\"\n  smartBackupModeSelection: 'Yedekleme modunu seçin:',\n\n  // Original text: \"Normal backup\"\n  normalBackup: 'Normal yedekleme',\n\n  // Original text: \"Smart backup\"\n  smartBackup: 'Akıllı yedekleme',\n\n  // Original text: \"Export retention\"\n  exportRetention: 'Saklanacak yedek sayısı',\n\n  // Original text: 'Copy retention'\n  copyRetention: undefined,\n\n  // Original text: \"Snapshot retention\"\n  snapshotRetention: 'Saklanacak snapshot sayısı',\n\n  // Original text: \"Name\"\n  backupName: 'Ad',\n\n  // Original text: \"Use delta\"\n  useDelta: 'Farkı kullan',\n\n  // Original text: \"Use compression\"\n  useCompression: 'Sıkıştırmayı kullan',\n\n  // Original text: 'Offline snapshot'\n  offlineSnapshot: undefined,\n\n  // Original text: 'Shutdown VMs before snapshotting them'\n  offlineSnapshotInfo: undefined,\n\n  // Original text: \"Delta Backup and DR require Entreprise plan\"\n  dbAndDrRequireEnterprisePlan: 'Fark Yedekleme ve DR Enterprise planı gerektirir',\n\n  // Original text: \"CR requires Premium plan\"\n  crRequiresPremiumPlan: 'CR Premium planı gerektirir',\n\n  // Original text: \"Smart mode\"\n  smartBackupModeTitle: 'Akıllı mod',\n\n  // Original text: \"Target remotes (for Export)\"\n  backupTargetRemotes: 'Hedefler (Yedekleme için)',\n\n  // Original text: \"Target SRs (for Replication)\"\n  backupTargetSrs: \"Hedef SR'ler (Replikasyon için)\",\n\n  // Original text: \"Local remote selected\"\n  localRemoteWarningTitle: 'Yerel hedef seçildi',\n\n  // Original text: \"Warning: local remotes will use limited XOA disk space. Only for advanced users.\"\n  localRemoteWarningMessage:\n    \"Uyarı: yerel hedef XOA'nın disk alını ile sınırlıdır. Sadece ileri seviye kullanıcılar içindir.\",\n\n  // Original text: \"Warning: this feature works only with XenServer 6.5 or newer.\"\n  backupVersionWarning: 'Uyarı: Bu özellik yalnızca Xenserver 6.5 ve daha yeni sürümlerinde çalışır.',\n\n  // Original text: \"VMs\"\n  editBackupVmsTitle: \"VM'ler\",\n\n  // Original text: \"VMs statuses\"\n  editBackupSmartStatusTitle: \"VM'lerin durumları\",\n\n  // Original text: \"Resident on\"\n  editBackupSmartResidentOn: 'Üzerinde olan',\n\n  // Original text: \"Not resident on\"\n  editBackupSmartNotResidentOn: 'Üzerinde olmayan',\n\n  // Original text: \"Pools\"\n  editBackupSmartPools: 'Havuzlar',\n\n  // Original text: \"Tags\"\n  editBackupSmartTags: 'Etiketler',\n\n  // Original text: \"Sample of matching Vms\"\n  sampleOfMatchingVms: \"Eşleşen VM'lerden bazıları\",\n\n  // Original text: \"VMs Tags\"\n  editBackupSmartTagsTitle: 'VM etiketleri',\n\n  // Original text: \"Excluded VMs tags\"\n  editBackupSmartExcludedTagsTitle: 'Hariç tutulan VM etiketleri',\n\n  // Original text: \"Reverse\"\n  editBackupNot: 'Ters',\n\n  // Original text: \"Tag\"\n  editBackupTagTitle: 'Etiket',\n\n  // Original text: \"Report\"\n  editBackupReportTitle: 'Rapor',\n\n  // Original text: \"Automatically run as scheduled\"\n  editBackupScheduleEnabled: 'Zamanlamaya göre otomatik çalıştır',\n\n  // Original text: \"Retention\"\n  editBackupRetentionTitle: 'Saklama',\n\n  // Original text: \"Remote\"\n  editBackupRemoteTitle: 'Hedef',\n\n  // Original text: \"Delete the old backups first\"\n  deleteOldBackupsFirst: 'Önce eski yedekleri sil',\n\n  // Original text: \"Remote stores for backup\"\n  remoteList: 'Yedekleme için uzak depolar',\n\n  // Original text: \"New File System Remote\"\n  newRemote: 'Yeni Dosya Sistemi Hedefi',\n\n  // Original text: \"Local\"\n  remoteTypeLocal: 'Yerel',\n\n  // Original text: \"NFS\"\n  remoteTypeNfs: 'NFS',\n\n  // Original text: \"SMB\"\n  remoteTypeSmb: 'SMB',\n\n  // Original text: \"Type\"\n  remoteType: 'Tip',\n\n  // Original text: \"SMB remotes are meant to work on Windows Server. For other systems (Linux Samba, which means almost all NAS), please use NFS.\"\n  remoteSmbWarningMessage:\n    'SMB hedefler Windows Server üzerinde çalışır. Diğer sistemler için (Linux samba, neredeyse bütün NAS cihazları anlamına gelir) lütfen NFS kullanın.',\n\n  // Original text: \"Test your remote\"\n  remoteTestTip: 'Hedefinizi test edin',\n\n  // Original text: \"Test Remote\"\n  testRemote: 'Hedefi test et',\n\n  // Original text: \"Test failed for {name}\"\n  remoteTestFailure: '{name} için test başarısız',\n\n  // Original text: \"Test passed for {name}\"\n  remoteTestSuccess: '{name} için test başarılı',\n\n  // Original text: \"Error\"\n  remoteTestError: 'Hata',\n\n  // Original text: \"Test Step\"\n  remoteTestStep: 'Test Adımı',\n\n  // Original text: \"Test file\"\n  remoteTestFile: 'Test dosyası',\n\n  // Original text: \"Test name\"\n  remoteTestName: 'Test adı',\n\n  // Original text: \"Remote name already exists!\"\n  remoteTestNameFailure: 'Hedef ismi zaten kullanılıyor!',\n\n  // Original text: \"The remote appears to work correctly\"\n  remoteTestSuccessMessage: 'Hedef düzgün çalışıyor',\n\n  // Original text: \"Connection failed\"\n  remoteConnectionFailed: 'Bağlantı başarısız',\n\n  // Original text: \"Delete backup job{nJobs, plural, one {} other {s}}\"\n  confirmDeleteBackupJobsTitle: 'Yedekleme işini(lerini) sil',\n\n  // Original text: \"Are you sure you want to delete {nJobs, number} backup job{nJobs, plural, one {} other {s}}?\"\n  confirmDeleteBackupJobsBody: '{nJobs, number} yedekleme işini(lerini) silmek istediğinize emin misiniz?',\n\n  // Original text: \"Name\"\n  remoteName: 'Ad',\n\n  // Original text: \"Path\"\n  remotePath: 'Yol',\n\n  // Original text: \"State\"\n  remoteState: 'Durum',\n\n  // Original text: \"Device\"\n  remoteDevice: 'Cihaz',\n\n  // Original text: \"Share\"\n  remoteShare: 'Paylaşım',\n\n  // Original text: \"Action\"\n  remoteAction: 'Aksiyon',\n\n  // Original text: \"Auth\"\n  remoteAuth: 'Kimlik doğrulama',\n\n  // Original text: \"Mounted\"\n  remoteMounted: 'Takıldı',\n\n  // Original text: \"Unmounted\"\n  remoteUnmounted: 'Çıkarıldı',\n\n  // Original text: \"Connect\"\n  remoteConnectTip: 'Bağlan',\n\n  // Original text: \"Disconnect\"\n  remoteDisconnectTip: 'Bağlatıyı kes',\n\n  // Original text: \"Connected\"\n  remoteConnected: 'Bağlandı',\n\n  // Original text: \"Disconnected\"\n  remoteDisconnected: 'Bağlantı kesildi',\n\n  // Original text: \"Delete\"\n  remoteDeleteTip: 'Sil',\n\n  // Original text: \"Delete selected remotes\"\n  remoteDeleteSelected: 'Seçilen hedefi sil',\n\n  // Original text: \"remote name *\"\n  remoteNamePlaceHolder: 'hedef adı *',\n\n  // Original text: \"Name *\"\n  remoteMyNamePlaceHolder: 'Ad',\n\n  // Original text: \"/path/to/backup\"\n  remoteLocalPlaceHolderPath: '/yedek/için/yol',\n\n  // Original text: \"host *\"\n  remoteNfsPlaceHolderHost: 'sunucu',\n\n  // Original text: 'Port'\n  remoteNfsPlaceHolderPort: undefined,\n\n  // Original text: \"path/to/backup\"\n  remoteNfsPlaceHolderPath: '/yedek/için/yol',\n\n  // Original text: \"subfolder [path\\\\\\\\to\\\\\\\\backup]\"\n  remoteSmbPlaceHolderRemotePath: 'altdizin [yedek\\\\\\\\için\\\\\\\\yol]',\n\n  // Original text: \"Username\"\n  remoteSmbPlaceHolderUsername: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  remoteSmbPlaceHolderPassword: 'Parola',\n\n  // Original text: \"Domain\"\n  remoteSmbPlaceHolderDomain: 'Domain',\n\n  // Original text: \"<address>\\\\\\\\<share> *\"\n  remoteSmbPlaceHolderAddressShare: '<paylaşım>\\\\\\\\<adresi>',\n\n  // Original text: \"password(fill to edit)\"\n  remotePlaceHolderPassword: 'parola(düzenlemek için doldurun)',\n\n  // Original text: \"Create a new SR\"\n  newSrTitle: 'Yeni SR oluştur',\n\n  // Original text: \"General\"\n  newSrGeneral: 'Genel',\n\n  // Original text: \"Select Storage Type:\"\n  newSrTypeSelection: 'Depolama Birimi Tipi:',\n\n  // Original text: \"Settings\"\n  newSrSettings: 'Ayarlar',\n\n  // Original text: \"Storage Usage\"\n  newSrUsage: 'Depolama birimi kullanımı',\n\n  // Original text: \"Summary\"\n  newSrSummary: 'Özet',\n\n  // Original text: \"Host\"\n  newSrHost: 'Sunucu',\n\n  // Original text: \"Type\"\n  newSrType: 'Tip',\n\n  // Original text: \"Name\"\n  newSrName: 'Ad',\n\n  // Original text: \"Description\"\n  newSrDescription: 'Açıklama',\n\n  // Original text: \"Server\"\n  newSrServer: 'Sunucu',\n\n  // Original text: \"Path\"\n  newSrPath: 'Yol',\n\n  // Original text: \"IQN\"\n  newSrIqn: 'IQN',\n\n  // Original text: \"LUN\"\n  newSrLun: 'LUN',\n\n  // Original text: \"No HBA devices\"\n  newSrNoHba: 'HBA olmayan cihaz',\n\n  // Original text: \"with auth.\"\n  newSrAuth: 'Kimlik doğrulama ile',\n\n  // Original text: \"User Name\"\n  newSrUsername: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  newSrPassword: 'Parola',\n\n  // Original text: \"Device\"\n  newSrDevice: 'Cihaz',\n\n  // Original text: \"in use\"\n  newSrInUse: 'kullanımda',\n\n  // Original text: \"Size\"\n  newSrSize: 'Boyut',\n\n  // Original text: \"Create\"\n  newSrCreate: 'Create',\n\n  // Original text: \"Storage name\"\n  newSrNamePlaceHolder: 'Depolama birimi adı',\n\n  // Original text: \"Storage description\"\n  newSrDescPlaceHolder: 'Depolama birimi açıklaması',\n\n  // Original text: \"Address\"\n  newSrAddressPlaceHolder: 'Adres',\n\n  // Original text: \"[port]\"\n  newSrPortPlaceHolder: '[port]',\n\n  // Original text: \"Username\"\n  newSrUsernamePlaceHolder: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  newSrPasswordPlaceHolder: 'Parola',\n\n  // Original text: \"Device, e.g /dev/sda…\"\n  newSrLvmDevicePlaceHolder: 'Cihaz, örn: /dev/sda...',\n\n  // Original text: \"/path/to/directory\"\n  newSrLocalPathPlaceHolder: '/dizin/için/yol',\n\n  // Original text: \"Use NFSv4\"\n  newSrUseNfs4: 'NFSv4 kullan',\n\n  // Original text: \"Comma delimited NFS options\"\n  newSrNfsOptions: 'Virgülle ayrılmış NFS seçenekleri',\n\n  // Original text: \"Users/Groups\"\n  subjectName: 'Kullanıcılar/Gruplar',\n\n  // Original text: \"Object\"\n  objectName: 'Nesne',\n\n  // Original text: \"No acls found\"\n  aclNoneFound: 'acl bulunamadı',\n\n  // Original text: \"Role\"\n  roleName: 'Rol',\n\n  // Original text: \"Create\"\n  aclCreate: 'Oluştur',\n\n  // Original text: \"New Group Name\"\n  newGroupName: 'Yeni grup adı',\n\n  // Original text: \"Create Group\"\n  createGroup: 'Grup oluştur',\n\n  // Original text: \"Create\"\n  createGroupButton: 'Oluştur',\n\n  // Original text: \"Delete Group\"\n  deleteGroup: 'Grubu sil',\n\n  // Original text: \"Are you sure you want to delete this group?\"\n  deleteGroupConfirm: 'Bu grubu silmek istediğinize emin misiniz?',\n\n  // Original text: \"Remove user from Group\"\n  removeUserFromGroup: 'Kullanıcıyı gruptan kaldır',\n\n  // Original text: \"Are you sure you want to delete this user?\"\n  deleteUserConfirm: 'Bu kullanıcıyı silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete User\"\n  deleteUser: 'Kullanıcıyı sil',\n\n  // Original text: \"no user\"\n  noUser: 'kullanıcı yok',\n\n  // Original text: \"unknown user\"\n  unknownUser: 'bilinmeyen kullanıcı',\n\n  // Original text: \"No group found\"\n  noGroupFound: 'Grup bulunmadı',\n\n  // Original text: \"Name\"\n  groupNameColumn: 'Ad',\n\n  // Original text: \"Users\"\n  groupUsersColumn: 'Kullanıcılar',\n\n  // Original text: \"Add User\"\n  addUserToGroupColumn: 'Kullanıcı ekle',\n\n  // Original text: \"Username\"\n  userNameColumn: 'Kullanıcı adı',\n\n  // Original text: \"Permissions\"\n  userPermissionColumn: 'Yetkiler',\n\n  // Original text: \"Password\"\n  userPasswordColumn: 'Parola',\n\n  // Original text: \"Username\"\n  userName: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  userPassword: 'Parola',\n\n  // Original text: \"Create\"\n  createUserButton: 'Oluştur',\n\n  // Original text: \"No user found\"\n  noUserFound: 'Kullanıcı bulunamadı',\n\n  // Original text: \"User\"\n  userLabel: 'Kullanıcı',\n\n  // Original text: \"Admin\"\n  adminLabel: 'Yönetici',\n\n  // Original text: \"No user in group\"\n  noUserInGroup: 'Grupta kullanıcı yok',\n\n  // Original text: \"{users, number} user{users, plural, one {} other {s}}\"\n  countUsers: '{users, number} kullanıcı(lar)',\n\n  // Original text: \"Select Permission\"\n  selectPermission: 'Yetkileri seç',\n\n  // Original text: \"No plugins found\"\n  noPlugins: 'Eklenti bulunamadı',\n\n  // Original text: \"Auto-load at server start\"\n  autoloadPlugin: 'Sunucu açılışında otomatik yükle',\n\n  // Original text: \"Save configuration\"\n  savePluginConfiguration: 'Yapılandırmayı kaydet',\n\n  // Original text: \"Delete configuration\"\n  deletePluginConfiguration: 'Yapılandırma sil',\n\n  // Original text: \"Plugin error\"\n  pluginError: 'Eklenti hatası',\n\n  // Original text: \"Unknown error\"\n  unknownPluginError: 'Bilinmeyen hata',\n\n  // Original text: \"Purge plugin configuration\"\n  purgePluginConfiguration: 'Eklenti yapılandırmasını temizle',\n\n  // Original text: \"Are you sure you want to purge this configuration ?\"\n  purgePluginConfigurationQuestion: 'Bu yapılandırmayı temizlemek istediğinize emin misiniz?',\n\n  // Original text: \"Edit\"\n  editPluginConfiguration: 'Düzenle',\n\n  // Original text: \"Cancel\"\n  cancelPluginEdition: 'İptal',\n\n  // Original text: \"Plugin configuration\"\n  pluginConfigurationSuccess: 'Eklenti yapılandırması',\n\n  // Original text: \"Plugin configuration successfully saved!\"\n  pluginConfigurationChanges: 'Eklenti yapılandırması başarıyla kaydedildi',\n\n  // Original text: \"Predefined configuration\"\n  pluginConfigurationPresetTitle: 'Öntanımlı yapılandırma',\n\n  // Original text: \"Choose a predefined configuration.\"\n  pluginConfigurationChoosePreset: 'Bir öntanımlı yapılandırma seç',\n\n  // Original text: \"Apply\"\n  applyPluginPreset: 'Uygula',\n\n  // Original text: \"Save filter error\"\n  saveNewUserFilterErrorTitle: 'Filtre hatasını kaydet',\n\n  // Original text: \"Bad parameter: name must be given.\"\n  saveNewUserFilterErrorBody: 'Kötü parametre: ad verilmeli',\n\n  // Original text: \"Name:\"\n  filterName: 'Ad:',\n\n  // Original text: \"Value:\"\n  filterValue: 'Değer:',\n\n  // Original text: \"Save new filter\"\n  saveNewFilterTitle: 'Yeni filtreyi kaydet',\n\n  // Original text: \"Set custom filters\"\n  setUserFiltersTitle: 'Özel filtreleri belirle',\n\n  // Original text: \"Are you sure you want to set custom filters?\"\n  setUserFiltersBody: 'Özel filtreleri belirlemek istediğinize emin misiniz?',\n\n  // Original text: \"Remove custom filter\"\n  removeUserFilterTitle: 'Özel filtreyi kaldır',\n\n  // Original text: \"Are you sure you want to remove custom filter?\"\n  removeUserFilterBody: 'Özel filtreyi kaldırmak istediğinize emin misiniz?',\n\n  // Original text: \"Default filter\"\n  defaultFilter: 'Varsayılan filtre',\n\n  // Original text: \"Default filters\"\n  defaultFilters: 'Varsayılan filtreler',\n\n  // Original text: \"Custom filters\"\n  customFilters: 'Özel filtreler',\n\n  // Original text: \"Customize filters\"\n  customizeFilters: 'Filtreleri özelleştir',\n\n  // Original text: \"Save custom filters\"\n  saveCustomFilters: 'Özel filtreleri kaydet',\n\n  // Original text: \"Start\"\n  startVmLabel: 'Çalıştır',\n\n  // Original text: \"Recovery start\"\n  recoveryModeLabel: 'Kurtarmayı başlat',\n\n  // Original text: \"Suspend\"\n  suspendVmLabel: 'Askıya al',\n\n  // Original text: \"Stop\"\n  stopVmLabel: 'Durdur',\n\n  // Original text: \"Force shutdown\"\n  forceShutdownVmLabel: 'Zorla kapat',\n\n  // Original text: \"Reboot\"\n  rebootVmLabel: 'Yeniden başlat',\n\n  // Original text: \"Force reboot\"\n  forceRebootVmLabel: 'Zorla yeniden başlat',\n\n  // Original text: \"Delete\"\n  deleteVmLabel: 'Sil',\n\n  // Original text: \"Migrate\"\n  migrateVmLabel: 'Taşı',\n\n  // Original text: \"Snapshot\"\n  snapshotVmLabel: 'Snapshot',\n\n  // Original text: \"Export\"\n  exportVmLabel: 'Dışa aktar',\n\n  // Original text: \"Resume\"\n  resumeVmLabel: 'Devam et',\n\n  // Original text: \"Copy\"\n  copyVmLabel: 'Kopyala',\n\n  // Original text: \"Clone\"\n  cloneVmLabel: 'Klonla',\n\n  // Original text: \"Fast clone\"\n  fastCloneVmLabel: 'Hızlı klonla',\n\n  // Original text: \"Convert to template\"\n  convertVmToTemplateLabel: 'Kalıba çevir',\n\n  // Original text: \"Console\"\n  vmConsoleLabel: 'Konsol',\n\n  // Original text: \"Depth\"\n  srUnhealthyVdiDepth: 'Derinlik',\n\n  // Original text: \"Name\"\n  srUnhealthyVdiNameLabel: 'Ad',\n\n  // Original text: \"Size\"\n  srUnhealthyVdiSize: 'Boyut',\n\n  // Original text: \"VDI to coalesce ({total, number})\"\n  srUnhealthyVdiTitle: 'Kaynaşma aşmasındaki VDI ({total, number})',\n\n  // Original text: 'UUID'\n  srUnhealthyVdiUuid: undefined,\n\n  // Original text: 'No stats'\n  srNoStats: undefined,\n\n  // Original text: 'IOPS'\n  statsIops: undefined,\n\n  // Original text: 'IO throughput'\n  statsIoThroughput: undefined,\n\n  // Original text: 'Latency'\n  statsLatency: undefined,\n\n  // Original text: 'IOwait'\n  statsIowait: undefined,\n\n  // Original text: \"Rescan all disks\"\n  srRescan: 'Bütün diskleri tekrar tara',\n\n  // Original text: \"Connect to all hosts\"\n  srReconnectAll: 'Bütün sunuculara bağla',\n\n  // Original text: \"Disconnect from all hosts\"\n  srDisconnectAll: 'Bütün sunuculardan bağlantıyı kes',\n\n  // Original text: \"Forget this SR\"\n  srForget: \"Bu SR'i unut\",\n\n  // Original text: \"Forget SRs\"\n  srsForget: \"SR'leri unut\",\n\n  // Original text: \"Remove this SR\"\n  srRemoveButton: \"Bu SR'i kaldır\",\n\n  // Original text: \"No VDIs in this storage\"\n  srNoVdis: 'Bu depolama biriminde VDI yok',\n\n  // Original text: \"Pool RAM usage:\"\n  poolTitleRamUsage: 'Havuz RAM kullanımı',\n\n  // Original text: \"{used} used on {total} ({free} free)\"\n  poolRamUsage: '{total} alanda {used} kullanılıyor ({free} boş)',\n\n  // Original text: \"Master:\"\n  poolMaster: 'Master:',\n\n  // Original text: \"Display all hosts of this pool\"\n  displayAllHosts: 'Bu havuzun tüm sunucularını göster',\n\n  // Original text: \"Display all storages of this pool\"\n  displayAllStorages: 'Bu havuzun tüm depolama birimlerini göster',\n\n  // Original text: \"Display all VMs of this pool\"\n  displayAllVMs: \"Bu havuzun tüm VM'lerini göster\",\n\n  // Original text: \"Hosts\"\n  hostsTabName: 'Sunucular',\n\n  // Original text: \"Vms\"\n  vmsTabName: \"VM'ler\",\n\n  // Original text: \"Srs\"\n  srsTabName: \"Sr'ler\",\n\n  // Original text: 'Edit all'\n  poolEditAll: undefined,\n\n  // Original text: 'Edit remote syslog for all hosts'\n  poolEditRemoteSyslog: undefined,\n\n  // Original text: \"High Availability\"\n  poolHaStatus: 'Yüksek kullanılabilirlik',\n\n  // Original text: \"Enabled\"\n  poolHaEnabled: 'Açık',\n\n  // Original text: \"Disabled\"\n  poolHaDisabled: 'Kapalı',\n\n  // Original text: \"GPU groups\"\n  poolGpuGroups: 'GPU grubu',\n\n  // Original text: 'Logging host'\n  poolRemoteSyslogPlaceHolder: undefined,\n\n  // Original text: \"Master\"\n  setpoolMaster: 'Master',\n\n  // Original text: 'Remote syslog host'\n  syslogRemoteHost: undefined,\n\n  // Original text: \"Name\"\n  hostNameLabel: 'Ad',\n\n  // Original text: \"Description\"\n  hostDescription: 'Açıklama',\n\n  // Original text: \"Memory\"\n  hostMemory: 'Bellek',\n\n  // Original text: \"No hosts\"\n  noHost: 'Sunucu yok',\n\n  // Original text: \"{used}% used ({free} free)\"\n  memoryLeftTooltip: '%{used} kullanılıyor ({free} boş)',\n\n  // Original text: \"PIF\"\n  pif: 'PIF',\n\n  // Original text: \"Name\"\n  poolNetworkNameLabel: 'Ad',\n\n  // Original text: \"Description\"\n  poolNetworkDescription: 'Açıklama',\n\n  // Original text: \"PIFs\"\n  poolNetworkPif: \"PIF'ler\",\n\n  // Original text: \"No networks\"\n  poolNoNetwork: 'Ağ yok',\n\n  // Original text: \"MTU\"\n  poolNetworkMTU: 'MTU',\n\n  // Original text: \"Connected\"\n  poolNetworkPifAttached: 'Bağlı',\n\n  // Original text: \"Disconnected\"\n  poolNetworkPifDetached: 'Bağlı değil',\n\n  // Original text: \"Show PIFs\"\n  showPifs: \"PIF'leri göster\",\n\n  // Original text: \"Hide PIFs\"\n  hidePifs: \"PIF'leri gizle\",\n\n  // Original text: \"Show details\"\n  showDetails: 'Ayrıntıları göster',\n\n  // Original text: \"Hide details\"\n  hideDetails: 'Ayrıntıları gizle',\n\n  // Original text: \"No stats\"\n  poolNoStats: 'Durum yok',\n\n  // Original text: \"All hosts\"\n  poolAllHosts: 'Tüm sunucular',\n\n  // Original text: \"Add SR\"\n  addSrLabel: 'SR ekle',\n\n  // Original text: \"Add VM\"\n  addVmLabel: 'VM ekle',\n\n  // Original text: \"Add Host\"\n  addHostLabel: 'Sunucu ekle',\n\n  // Original text: \"This host needs to install {patches, number} patch{patches, plural, one {} other {es}} before it can be added to the pool. This operation may be long.\"\n  hostNeedsPatchUpdate: 'Havuza eklemeden önce bu sunucuya {patches, number} yama yüklenmeli. Bu işlem uzun sürebilir.',\n\n  // Original text: \"This host cannot be added to the pool because it's missing some patches.\"\n  hostNeedsPatchUpdateNoInstall: 'Bu sunucu havuza eklenemez çünkü bazı yamaları eksik',\n\n  // Original text: \"Adding host failed\"\n  addHostErrorTitle: 'Sunucu ekleme başarısız',\n\n  // Original text: \"Host patches could not be homogenized.\"\n  addHostNotHomogeneousErrorMessage: 'Sunucu yamaları homojenleştirilemedi.',\n\n  // Original text: \"Disconnect\"\n  disconnectServer: 'Bağlantıyı kes',\n\n  // Original text: \"Start\"\n  startHostLabel: 'Çalıştır',\n\n  // Original text: \"Stop\"\n  stopHostLabel: 'Durdur',\n\n  // Original text: \"Enable\"\n  enableHostLabel: 'Aktif',\n\n  // Original text: \"Disable\"\n  disableHostLabel: 'Pasif',\n\n  // Original text: \"Restart toolstack\"\n  restartHostAgent: \"toolstack'ı yeniden başlat\",\n\n  // Original text: \"Force reboot\"\n  forceRebootHostLabel: 'Zorla yeniden başlat',\n\n  // Original text: \"Reboot\"\n  rebootHostLabel: 'Yeniden başlat',\n\n  // Original text: \"Error while restarting host\"\n  noHostsAvailableErrorTitle: 'Sunucu yeniden başlatılırken hata',\n\n  // Original text: \"Some VMs cannot be migrated before restarting this host. Please try force reboot.\"\n  noHostsAvailableErrorMessage:\n    \"Bazı VM'ler taşınamaz olduğu için sunucu yeniden başlatılamıyor. Zorla yeniden başlatmayı deneyin.\",\n\n  // Original text: \"Error while restarting hosts\"\n  failHostBulkRestartTitle: 'Sunucu yeniden başlatılırken hata',\n\n  // Original text: \"{failedHosts, number}/{totalHosts, number} host{failedHosts, plural, one {} other {s}} could not be restarted.\"\n  failHostBulkRestartMessage: '{failedHosts, number}/{totalHosts, number} sunucu yeniden başlatılamadı.',\n\n  // Original text: \"Reboot to apply updates\"\n  rebootUpdateHostLabel: 'Güncellemeleri uygulamak için yeniden başlat',\n\n  // Original text: \"Emergency mode\"\n  emergencyModeLabel: 'Acil durum modu',\n\n  // Original text: \"Storage\"\n  storageTabName: 'Depolama birimi',\n\n  // Original text: \"Patches\"\n  patchesTabName: 'Yamalar',\n\n  // Original text: \"Load average\"\n  statLoad: 'Ortalama yük',\n\n  // Original text: \"Host RAM usage:\"\n  hostTitleRamUsage: 'Sunucu RAM kullanımı:',\n\n  // Original text: \"RAM: {memoryUsed} used on {memoryTotal} ({memoryFree} free)\"\n  memoryHostState: 'RAM: {memoryTotal} alanda {memoryUsed} alan kullanılıyor ({memoryFree} boş)',\n\n  // Original text: \"Hardware\"\n  hardwareHostSettingsLabel: 'Donanım',\n\n  // Original text: \"Address\"\n  hostAddress: 'Adres',\n\n  // Original text: \"Status\"\n  hostStatus: 'Durum',\n\n  // Original text: \"Build number\"\n  hostBuildNumber: 'Yapım numarası',\n\n  // Original text: \"iSCSI name\"\n  hostIscsiName: 'iSCSI adı',\n\n  // Original text: \"Version\"\n  hostXenServerVersion: 'Sürüm',\n\n  // Original text: \"Enabled\"\n  hostStatusEnabled: 'Aktif',\n\n  // Original text: \"Disabled\"\n  hostStatusDisabled: 'Pasif',\n\n  // Original text: \"Power on mode\"\n  hostPowerOnMode: 'Power on modu',\n\n  // Original text: \"Host uptime\"\n  hostStartedSince: 'Sunucu çalışma süresi',\n\n  // Original text: \"Toolstack uptime\"\n  hostStackStartedSince: 'Toolstack çalışma süresi',\n\n  // Original text: \"CPU model\"\n  hostCpusModel: 'CPU modeli',\n\n  // Original text: \"GPUs\"\n  hostGpus: \"GPU'lar\",\n\n  // Original text: \"Core (socket)\"\n  hostCpusNumber: 'Core (soket)',\n\n  // Original text: \"Manufacturer info\"\n  hostManufacturerinfo: 'Üretici bilgisi',\n\n  // Original text: \"BIOS info\"\n  hostBiosinfo: 'BIOS bilgisi',\n\n  // Original text: \"License\"\n  licenseHostSettingsLabel: 'Lisans',\n\n  // Original text: \"Type\"\n  hostLicenseType: 'Tip',\n\n  // Original text: \"Socket\"\n  hostLicenseSocket: 'Soket',\n\n  // Original text: \"Expiry\"\n  hostLicenseExpiry: 'Zamanaşımı',\n\n  // Original text: 'Remote syslog'\n  hostRemoteSyslog: undefined,\n\n  // Original text: \"Installed supplemental packs\"\n  supplementalPacks: 'Yüklü ek paketler',\n\n  // Original text: \"Install new supplemental pack\"\n  supplementalPackNew: 'Yeni ek paket yükle',\n\n  // Original text: \"Install supplemental pack on every host\"\n  supplementalPackPoolNew: 'Ek paketi her sunucuya yükle',\n\n  // Original text: \"{name} (by {author})\"\n  supplementalPackTitle: '{name} (by {author})',\n\n  // Original text: \"Installation started\"\n  supplementalPackInstallStartedTitle: 'Kurulum başladı',\n\n  // Original text: \"Installing new supplemental pack…\"\n  supplementalPackInstallStartedMessage: 'Yeni ek paket kuruluyor...',\n\n  // Original text: \"Installation error\"\n  supplementalPackInstallErrorTitle: 'Kurulum hatası',\n\n  // Original text: \"The installation of the supplemental pack failed.\"\n  supplementalPackInstallErrorMessage: 'Ek paket kurulumu başarısız oldu.',\n\n  // Original text: \"Installation success\"\n  supplementalPackInstallSuccessTitle: 'Kurulum başarılı',\n\n  // Original text: \"Supplemental pack successfully installed.\"\n  supplementalPackInstallSuccessMessage: 'Ek paket başarıyla kuruldu',\n\n  // Original text: \"Add a network\"\n  networkCreateButton: 'Bir ağ ekle',\n\n  // Original text: \"Add a bonded network\"\n  networkCreateBondedButton: 'Bir bağlı ağ ekle',\n\n  // Original text: \"Device\"\n  pifDeviceLabel: 'Cihaz',\n\n  // Original text: \"Network\"\n  pifNetworkLabel: 'Ağ',\n\n  // Original text: \"VLAN\"\n  pifVlanLabel: 'VLAN',\n\n  // Original text: \"Address\"\n  pifAddressLabel: 'Adres',\n\n  // Original text: \"Mode\"\n  pifModeLabel: 'Mod',\n\n  // Original text: \"MAC\"\n  pifMacLabel: 'MAC',\n\n  // Original text: \"MTU\"\n  pifMtuLabel: 'MTU',\n\n  // Original text: \"Status\"\n  pifStatusLabel: 'Durum',\n\n  // Original text: \"Connected\"\n  pifStatusConnected: 'Bağlı',\n\n  // Original text: \"Disconnected\"\n  pifStatusDisconnected: 'Bağlı değil',\n\n  // Original text: \"No physical interface detected\"\n  pifNoInterface: 'Fizisel arayüz tespit edilmedi',\n\n  // Original text: \"This interface is currently in use\"\n  pifInUse: 'Bu arayüz kullanımda',\n\n  // Original text: \"Action\"\n  pifAction: 'Aksiyon',\n\n  // Original text: \"Default locking mode\"\n  defaultLockingMode: 'Varsayılan kilitleme modu',\n\n  // Original text: \"Configure IP address\"\n  pifConfigureIp: 'IP adresini ayarla',\n\n  // Original text: \"Invalid parameters\"\n  configIpErrorTitle: 'Geçersiz parametre',\n\n  // Original text: \"Static IP address\"\n  staticIp: 'Statik IP adresi',\n\n  // Original text: \"Netmask\"\n  netmask: 'Ağ maskesi',\n\n  // Original text: \"DNS\"\n  dns: 'DNS',\n\n  // Original text: \"Gateway\"\n  gateway: 'Ağ geçidi',\n\n  // Original text: \"Add a storage\"\n  addSrDeviceButton: 'Depolama ünitesi ekle',\n\n  // Original text: \"Name\"\n  srNameLabel: 'Ad',\n\n  // Original text: \"Type\"\n  srType: 'Tip',\n\n  // Original text: \"Action\"\n  pbdAction: 'Aksiyon',\n\n  // Original text: \"Status\"\n  pbdStatus: 'Durum',\n\n  // Original text: \"Connected\"\n  pbdStatusConnected: 'Bağlı',\n\n  // Original text: \"Disconnected\"\n  pbdStatusDisconnected: 'Bağlı değil',\n\n  // Original text: \"Connect\"\n  pbdConnect: 'Bağlan',\n\n  // Original text: \"Disconnect\"\n  pbdDisconnect: 'Bağlantıyı kes',\n\n  // Original text: \"Forget\"\n  pbdForget: 'Unut',\n\n  // Original text: \"Shared\"\n  srShared: 'Paylaşımlı',\n\n  // Original text: \"Not shared\"\n  srNotShared: 'Paylaşımsız',\n\n  // Original text: \"No storage detected\"\n  pbdNoSr: 'Depolama ünitesi tespit edilmedi',\n\n  // Original text: \"Name\"\n  patchNameLabel: 'Ad',\n\n  // Original text: \"Install all patches\"\n  patchUpdateButton: 'Tüm yamaları yükle',\n\n  // Original text: \"Description\"\n  patchDescription: 'Açıklama',\n\n  // Original text: 'Version'\n  patchVersion: undefined,\n\n  // Original text: \"Applied date\"\n  patchApplied: 'Uygulanan tarih',\n\n  // Original text: \"Size\"\n  patchSize: 'Boyut',\n\n  // Original text: \"Status\"\n  patchStatus: 'Durum',\n\n  // Original text: \"Applied\"\n  patchStatusApplied: 'Uygulandı',\n\n  // Original text: \"Missing patches\"\n  patchStatusNotApplied: 'Eksik yamalar',\n\n  // Original text: \"No patches detected\"\n  patchNothing: 'Yama tespit edilmedi',\n\n  // Original text: \"Release date\"\n  patchReleaseDate: 'Yayınlanma tarihi',\n\n  // Original text: \"Guidance\"\n  patchGuidance: 'Yönlendirme',\n\n  // Original text: \"Action\"\n  patchAction: 'Aksiyon',\n\n  // Original text: \"Applied patches\"\n  hostAppliedPatches: 'Uygulanan yamalar',\n\n  // Original text: \"Missing patches\"\n  hostMissingPatches: 'Eksik yamalar',\n\n  // Original text: \"Host up-to-date!\"\n  hostUpToDate: 'Sunucu güncel!',\n\n  // Original text: \"Non-recommended patch install\"\n  installPatchWarningTitle: 'Tavsiye edilmeyen yama yüklemesi',\n\n  // Original text: \"This will install a patch only on this host. This is NOT the recommended way: please go into the Pool patch view and follow instructions there. If you are sure about this, you can continue anyway\"\n  installPatchWarningContent:\n    'Yama yalnızca bu sunucuya yüklenecek. Bu tavsiye edilmez. Lütfen Havuz yama ekranına gidin ve oradaki talimatları takip edin. Ancak eminseniz devam edebilirsiniz',\n\n  // Original text: \"Go to pool\"\n  installPatchWarningReject: 'Havuza git',\n\n  // Original text: \"Install\"\n  installPatchWarningResolve: 'Yükle',\n\n  // Original text: 'Release'\n  patchRelease: undefined,\n\n  // Original text: 'Update plugin is not installed on this host. Please run `yum install xcp-ng-updater` first.'\n  updatePluginNotInstalled: undefined,\n\n  // Original text: 'Show changelog'\n  showChangelog: undefined,\n\n  // Original text: 'Changelog'\n  changelog: undefined,\n\n  // Original text: 'Patch'\n  changelogPatch: undefined,\n\n  // Original text: 'Author'\n  changelogAuthor: undefined,\n\n  // Original text: 'Date'\n  changelogDate: undefined,\n\n  // Original text: 'Description'\n  changelogDescription: undefined,\n\n  // Original text: \"Refresh patches\"\n  refreshPatches: 'Yamaları yenile',\n\n  // Original text: \"Install pool patches\"\n  installPoolPatches: 'Havuz yamalarını yükle',\n\n  // Original text: \"Default SR\"\n  defaultSr: 'Varsayılan depolama ünitesi',\n\n  // Original text: \"Set as default SR\"\n  setAsDefaultSr: 'Varsayılan depolama ünitesi olarak ayarla',\n\n  // Original text: \"General\"\n  generalTabName: 'Genel',\n\n  // Original text: \"Stats\"\n  statsTabName: 'Durum',\n\n  // Original text: \"Console\"\n  consoleTabName: 'Konsol',\n\n  // Original text: \"Container\"\n  containersTabName: 'Konteyner',\n\n  // Original text: \"Snapshots\"\n  snapshotsTabName: \"Snapshot'lar\",\n\n  // Original text: \"Logs\"\n  logsTabName: 'Günlükler',\n\n  // Original text: \"Advanced\"\n  advancedTabName: 'Gelişmiş',\n\n  // Original text: \"Network\"\n  networkTabName: 'Ağ',\n\n  // Original text: \"Disk{disks, plural, one {} other {s}}\"\n  disksTabName: 'Disk(ler)',\n\n  // Original text: \"halted\"\n  powerStateHalted: 'durduruldu',\n\n  // Original text: \"running\"\n  powerStateRunning: 'çalışıyor',\n\n  // Original text: \"suspended\"\n  powerStateSuspended: 'askıya alında',\n\n  // Original text: \"Current status:\"\n  vmCurrentStatus: 'Mevcut durum:',\n\n  // Original text: \"Not running\"\n  vmNotRunning: 'Çalışmıyor',\n\n  // Original text: \"Halted {ago}\"\n  vmHaltedSince: 'Durduruldu {ago}',\n\n  // Original text: \"No Xen tools detected\"\n  noToolsDetected: 'Xen tool tespit edilmedi',\n\n  // Original text: \"No IPv4 record\"\n  noIpv4Record: 'IPv4 kaydı yok',\n\n  // Original text: \"No IP record\"\n  noIpRecord: 'IP kaydı yok',\n\n  // Original text: \"Started {ago}\"\n  started: 'Başlatıldı {ago}',\n\n  // Original text: \"Paravirtualization (PV)\"\n  paraVirtualizedMode: 'Paravirtualization (PV)',\n\n  // Original text: \"Hardware virtualization (HVM)\"\n  hardwareVirtualizedMode: 'Hardware virtualization (HVM)',\n\n  // Original text: 'Windows Update tools'\n  windowsUpdateTools: undefined,\n\n  // Original text: \"CPU usage\"\n  statsCpu: 'CPU kullanımı',\n\n  // Original text: \"Memory usage\"\n  statsMemory: 'Bellek kullanımı',\n\n  // Original text: \"Network throughput\"\n  statsNetwork: 'Ağ veri akışı',\n\n  // Original text: \"Stacked values\"\n  useStackedValuesOnStats: 'Yığılmış değerler',\n\n  // Original text: \"Disk throughput\"\n  statDisk: 'Disk veri akışı',\n\n  // Original text: \"Last 10 minutes\"\n  statLastTenMinutes: 'Son 10 dakika',\n\n  // Original text: \"Last 2 hours\"\n  statLastTwoHours: 'Son 2 saat',\n\n  // Original text: \"Last week\"\n  statLastWeek: 'Son hafta',\n\n  // Original text: \"Last year\"\n  statLastYear: 'Son yıl',\n\n  // Original text: \"Copy\"\n  copyToClipboardLabel: 'Kopyala',\n\n  // Original text: \"Ctrl+Alt+Del\"\n  ctrlAltDelButtonLabel: 'Ctrl+Alt+Del',\n\n  // Original text: \"Tip:\"\n  tipLabel: 'İpucu:',\n\n  // Original text: \"Hide infos\"\n  hideHeaderTooltip: 'Bilgileri gizle',\n\n  // Original text: \"Show infos\"\n  showHeaderTooltip: 'Bilgileri göster',\n\n  // Original text: \"Name\"\n  containerName: 'Ad',\n\n  // Original text: \"Command\"\n  containerCommand: 'Komut',\n\n  // Original text: \"Creation date\"\n  containerCreated: 'Oluşturma tarihi',\n\n  // Original text: \"Status\"\n  containerStatus: 'Durum',\n\n  // Original text: \"Action\"\n  containerAction: 'Aksiyon',\n\n  // Original text: \"No existing containers\"\n  noContainers: 'Mevcutta konteyner yok',\n\n  // Original text: \"Stop this container\"\n  containerStop: \"Bu konteyner'i durdur\",\n\n  // Original text: \"Start this container\"\n  containerStart: \"Bu konteyner'i çalıştır\",\n\n  // Original text: \"Pause this container\"\n  containerPause: \"Bu konteyner'i duraklat\",\n\n  // Original text: \"Resume this container\"\n  containerResume: \"Bu konteyner'i devam ettir\",\n\n  // Original text: \"Restart this container\"\n  containerRestart: \"Bu konteyner'i yeniden başlat\",\n\n  // Original text: \"Action\"\n  vdiAction: 'Aksiyon',\n\n  // Original text: \"Attach disk\"\n  vdiAttachDevice: 'Disk tak',\n\n  // Original text: \"New disk\"\n  vbdCreateDeviceButton: 'Yeni disk',\n\n  // Original text: \"Boot order\"\n  vdiBootOrder: 'Önyükleme sıralaması',\n\n  // Original text: \"Name\"\n  vdiNameLabel: 'Ad',\n\n  // Original text: \"Description\"\n  vdiNameDescription: 'Açıklama',\n\n  // Original text: \"Pool\"\n  vdiPool: 'Havuz',\n\n  // Original text: \"Disconnect\"\n  vdiDisconnect: 'Bağlatıyı kes',\n\n  // Original text: \"Tags\"\n  vdiTags: 'Etiketler',\n\n  // Original text: \"Size\"\n  vdiSize: 'Boyut',\n\n  // Original text: \"SR\"\n  vdiSr: 'SR',\n\n  // Original text: \"VMs\"\n  vdiVms: \"VM'ler\",\n\n  // Original text: \"Migrate VDI\"\n  vdiMigrate: 'VDI taşı',\n\n  // Original text: \"Destination SR:\"\n  vdiMigrateSelectSr: 'Hedef SR:',\n\n  // Original text: \"No SR\"\n  vdiMigrateNoSr: 'SR yok',\n\n  // Original text: \"A target SR is required to migrate a VDI\"\n  vdiMigrateNoSrMessage: 'VDI taşımak için bir SR gereklidir',\n\n  // Original text: \"Forget\"\n  vdiForget: 'Unut',\n\n  // Original text: \"Remove VDI\"\n  vdiRemove: 'VDI kaldır',\n\n  // Original text: \"No VDIs attached to Control Domain\"\n  noControlDomainVdis: \"Kontrol Domain'e takılı VDI yok\",\n\n  // Original text: \"Boot flag\"\n  vbdBootableStatus: 'Önyükleme bayrağı',\n\n  // Original text: \"Status\"\n  vbdStatus: 'Durum',\n\n  // Original text: \"Connected\"\n  vbdStatusConnected: 'Bağlı',\n\n  // Original text: \"Disconnected\"\n  vbdStatusDisconnected: 'Bağlı değil',\n\n  // Original text: \"No disks\"\n  vbdNoVbd: 'Disk yok',\n\n  // Original text: \"Connect VBD\"\n  vbdConnect: \"VBD'i bağla\",\n\n  // Original text: \"Disconnect VBD\"\n  vbdDisconnect: \"VBD'nin bağlantısı kes\",\n\n  // Original text: \"Bootable\"\n  vbdBootable: 'Önyüklenebilir',\n\n  // Original text: \"Readonly\"\n  vbdReadonly: 'Yalnızca okunabilir',\n\n  // Original text: \"Action\"\n  vbdAction: 'Aksiyon',\n\n  // Original text: \"Create\"\n  vbdCreate: 'Oluştur',\n\n  // Original text: \"Attach\"\n  vbdAttach: 'Tak',\n\n  // Original text: \"Disk name\"\n  vbdNamePlaceHolder: 'Disk adı',\n\n  // Original text: \"Size\"\n  vbdSizePlaceHolder: 'Boyut',\n\n  // Original text: \"CD drive not completely installed\"\n  cdDriveNotInstalled: 'CD sürücü tamamen yüklenmedi',\n\n  // Original text: \"Stop and start the VM to install the CD drive\"\n  cdDriveInstallation: \"CD sürücüyü yüklemek için VM'i kapatıp açın\",\n\n  // Original text: \"Save\"\n  saveBootOption: 'Kaydet',\n\n  // Original text: \"Reset\"\n  resetBootOption: 'Sıfırla',\n\n  // Original text: \"Delete selected VDIs\"\n  deleteSelectedVdis: \"Seçilen VDI'ları sil\",\n\n  // Original text: \"Delete selected VDI\"\n  deleteSelectedVdi: \"Seçilen VDI'ı sil\",\n\n  // Original text: \"Creating this disk will use the disk space quota from the resource set {resourceSet} ({spaceLeft} left)\"\n  useQuotaWarning: 'Disk oluşturma, kaynak setindeki disk kotasını kullanacak {resourceSet} (kalan {spaceLeft})',\n\n  // Original text: \"Not enough space in resource set {resourceSet} ({spaceLeft} left)\"\n  notEnoughSpaceInResourceSet: 'Kaynak setinde yeterli disk alanı yok {resourceSet} (kalan {spaceLeft})',\n\n  // Original text: \"New device\"\n  vifCreateDeviceButton: 'Yeni cihaz',\n\n  // Original text: \"No interface\"\n  vifNoInterface: 'Arabirim yok',\n\n  // Original text: \"Device\"\n  vifDeviceLabel: 'Cihaz',\n\n  // Original text: \"MAC address\"\n  vifMacLabel: 'MAC adresi',\n\n  // Original text: \"MTU\"\n  vifMtuLabel: 'MTU',\n\n  // Original text: \"Network\"\n  vifNetworkLabel: 'Ağ',\n\n  // Original text: \"Status\"\n  vifStatusLabel: 'Status',\n\n  // Original text: \"Connected\"\n  vifStatusConnected: 'Bağlı',\n\n  // Original text: \"Disconnected\"\n  vifStatusDisconnected: 'Bağlı değil',\n\n  // Original text: \"Connect\"\n  vifConnect: 'Bağlan',\n\n  // Original text: \"Disconnect\"\n  vifDisconnect: 'Bağlantıyı kes',\n\n  // Original text: \"Remove\"\n  vifRemove: 'Kaldır',\n\n  // Original text: \"Remove selected VIFs\"\n  vifsRemove: \"Seçili VIF'ları kaldır\",\n\n  // Original text: \"IP addresses\"\n  vifIpAddresses: 'IP adresleri',\n\n  // Original text: \"Auto-generated if empty\"\n  vifMacAutoGenerate: 'Eğer boşsa otomatik oluştur',\n\n  // Original text: \"Allowed IPs\"\n  vifAllowedIps: \"İzin verilen IP'ler\",\n\n  // Original text: \"No IPs\"\n  vifNoIps: 'IP yok',\n\n  // Original text: \"Network locked\"\n  vifLockedNetwork: 'Ağ kilitli',\n\n  // Original text: \"Network locked and no IPs are allowed for this interface\"\n  vifLockedNetworkNoIps: 'Ağ kilitli ve bu arayüz için izin verilen IP yok',\n\n  // Original text: \"Network not locked\"\n  vifUnLockedNetwork: 'Ağ kiltli değil',\n\n  // Original text: \"Unknown network\"\n  vifUnknownNetwork: 'Bilinmeyen ağ',\n\n  // Original text: \"Action\"\n  vifAction: 'Aksiyon',\n\n  // Original text: \"Create\"\n  vifCreate: 'Oluştur',\n\n  // Original text: \"No snapshots\"\n  noSnapshots: 'Snapshot yok',\n\n  // Original text: \"New snapshot\"\n  snapshotCreateButton: 'Yeni snapshot',\n\n  // Original text: \"Just click on the snapshot button to create one!\"\n  tipCreateSnapshotLabel: 'Bir tane oluşturmak için snapshot butonuna tıklayın!',\n\n  // Original text: \"Revert VM to this snapshot\"\n  revertSnapshot: \"VM'i bu snapshot'a döndür\",\n\n  // Original text: \"Remove this snapshot\"\n  deleteSnapshot: \"Bu snapshot'ı kaldır\",\n\n  // Original text: \"Remove selected snapshots\"\n  deleteSnapshots: \"Seçili snapshot'ları kaldır\",\n\n  // Original text: \"Create a VM from this snapshot\"\n  copySnapshot: \"Bu snapshot'dan bir VM oluştur\",\n\n  // Original text: \"Export this snapshot\"\n  exportSnapshot: \"Bu snapshot'ı dışa aktar\",\n\n  // Original text: \"Creation date\"\n  snapshotDate: 'Oluşturma tarihi',\n\n  // Original text: \"Name\"\n  snapshotName: 'Ad',\n\n  // Original text: \"Description\"\n  snapshotDescription: 'Açıklama',\n\n  // Original text: \"Action\"\n  snapshotAction: 'Aksiyon',\n\n  // Original text: \"Quiesced snapshot\"\n  snapshotQuiesce: 'Quiesced snapshot',\n\n  // Original text: 'Revert successful'\n  vmRevertSuccessfulTitle: undefined,\n\n  // Original text: 'VM successfully reverted'\n  vmRevertSuccessfulMessage: undefined,\n\n  // Original text: \"Remove all logs\"\n  logRemoveAll: 'Tüm günlükleri kaldır',\n\n  // Original text: \"No logs so far\"\n  noLogs: 'Hiç günlük yok',\n\n  // Original text: \"Creation date\"\n  logDate: 'Oluşturma tarihi',\n\n  // Original text: \"Name\"\n  logName: 'Ad',\n\n  // Original text: \"Content\"\n  logContent: 'İçerik',\n\n  // Original text: \"Action\"\n  logAction: 'Aksiyon',\n\n  // Original text: \"Remove\"\n  vmRemoveButton: 'Kaldır',\n\n  // Original text: \"Convert\"\n  vmConvertButton: 'Dönüştür',\n\n  // Original text: \"Share\"\n  vmShareButton: 'Paylaş',\n\n  // Original text: \"Xen settings\"\n  xenSettingsLabel: 'Xen ayarları',\n\n  // Original text: \"Guest OS\"\n  guestOsLabel: 'Konuk OS',\n\n  // Original text: \"Misc\"\n  miscLabel: 'Çeşitli',\n\n  // Original text: \"UUID\"\n  uuid: 'UUID',\n\n  // Original text: \"Virtualization mode\"\n  virtualizationMode: 'Sanallaştırma modu',\n\n  // Original text: \"CPU weight\"\n  cpuWeightLabel: 'CPU ağırlığı',\n\n  // Original text: \"Default ({value, number})\"\n  defaultCpuWeight: 'Varsayılan ({value, number})',\n\n  // Original text: \"CPU cap\"\n  cpuCapLabel: 'CPU cap',\n\n  // Original text: \"Default ({value, number})\"\n  defaultCpuCap: 'Varsayılan ({value, number})',\n\n  // Original text: \"PV args\"\n  pvArgsLabel: 'PV argümanları',\n\n  // Original text: \"Xen tools version\"\n  xenToolsStatus: 'Xen tools sürümü',\n\n  // Original text: 'Not installed'\n  xenToolsNotInstalled: undefined,\n\n  // Original text: \"OS name\"\n  osName: 'OS adı',\n\n  // Original text: \"OS kernel\"\n  osKernel: 'OS çekirdeği',\n\n  // Original text: \"Auto power on\"\n  autoPowerOn: 'Otomatik açılma',\n\n  // Original text: \"HA\"\n  ha: 'HA',\n\n  // Original text: \"Affinity host\"\n  vmAffinityHost: 'Atanmış sunucu',\n\n  // Original text: \"VGA\"\n  vmVga: 'VGA',\n\n  // Original text: \"Video RAM\"\n  vmVideoram: 'Video RAM',\n\n  // Original text: \"None\"\n  noAffinityHost: 'Yok',\n\n  // Original text: 'Original template'\n  originalTemplate: undefined,\n\n  // Original text: \"Unknown\"\n  unknownOsName: 'Bilinmiyor',\n\n  // Original text: \"Unknown\"\n  unknownOsKernel: 'Bilinmiyor',\n\n  // Original text: \"Unknown\"\n  unknownOriginalTemplate: 'Bilinmiyor',\n\n  // Original text: \"VM limits\"\n  vmLimitsLabel: 'VM limitleri',\n\n  // Original text: \"Resource set\"\n  resourceSet: 'Kaynak seti',\n\n  // Original text: \"None\"\n  resourceSetNone: 'Yok',\n\n  // Original text: \"CPU limits\"\n  vmCpuLimitsLabel: 'CPU limitleri',\n\n  // Original text: \"Topology\"\n  vmCpuTopology: 'Topoloji',\n\n  // Original text: \"Default behavior\"\n  vmChooseCoresPerSocket: 'Varsayılan davranış',\n\n  // Original text: \"{nSockets, number} socket{nSockets, plural, one {} other {s}} with {nCores, number} core{nCores, plural, one {} other {s}} per socket\"\n  vmSocketsWithCoresPerSocket: '{nSockets, number} soket ve her sokette  {nCores, number} çekirdek',\n\n  // Original text: \"None\"\n  vmCoresPerSocketNone: 'Yok',\n\n  // Original text: \"Incorrect cores per socket value\"\n  vmCoresPerSocketIncorrectValue: 'Soket başına geçersiz çekirdek sayısı',\n\n  // Original text: \"Please change the selected value to fix it.\"\n  vmCoresPerSocketIncorrectValueSolution: 'Düzeltmek için lütfen seçili değeri değiştirin',\n\n  // Original text: 'disabled'\n  vmHaDisabled: undefined,\n\n  // Original text: \"Memory limits (min/max)\"\n  vmMemoryLimitsLabel: 'Bellek limiti (min/max)',\n\n  // Original text: \"vCPUs max:\"\n  vmMaxVcpus: 'vCPUs max',\n\n  // Original text: \"Memory max:\"\n  vmMaxRam: 'Bellek max',\n\n  // Original text: \"vGPU\"\n  vmVgpu: 'vGPU',\n\n  // Original text: \"GPUs\"\n  vmVgpus: \"GPU'lar\",\n\n  // Original text: \"None\"\n  vmVgpuNone: 'Yok',\n\n  // Original text: \"Add vGPU\"\n  vmAddVgpu: 'vGPU ekle',\n\n  // Original text: \"Select vGPU type\"\n  vmSelectVgpuType: 'vGPU tipini seçin',\n\n  // Original text: \"Long click to add a name\"\n  vmHomeNamePlaceholder: 'İsim eklemek için uzun tıklayın',\n\n  // Original text: \"Long click to add a description\"\n  vmHomeDescriptionPlaceholder: 'Açıklama eklemek için uzun tıklayın',\n\n  // Original text: \"Click to add a name\"\n  vmViewNamePlaceholder: 'Ad eklemek için tıklayın',\n\n  // Original text: \"Click to add a description\"\n  vmViewDescriptionPlaceholder: 'Açıklama eklemek için tıklayın',\n\n  // Original text: \"Click to add a name\"\n  templateHomeNamePlaceholder: 'Ad eklemek için tıklayın',\n\n  // Original text: \"Click to add a description\"\n  templateHomeDescriptionPlaceholder: 'Açıklama eklemek için tıklayın',\n\n  // Original text: \"Delete template\"\n  templateDelete: 'Kalıbı sil',\n\n  // Original text: \"Delete VM template{templates, plural, one {} other {s}}\"\n  templateDeleteModalTitle: 'VM kalıbını(larını) sil',\n\n  // Original text: \"Are you sure you want to delete {templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?\"\n  templateDeleteModalBody: 'Kalıbı(ları) silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete template{nTemplates, plural, one {} other {s}} failed\"\n  failedToDeleteTemplatesTitle: 'Kalıp silme başarısız',\n\n  // Original text: \"Failed to delete {nTemplates, number} template{nTemplates, plural, one {} other {s}}.\"\n  failedToDeleteTemplatesMessage: 'Silme başarısız',\n\n  // Original text: \"Delete default template{nDefaultTemplates, plural, one {} other {s}}\"\n  deleteDefaultTemplatesTitle: 'Varsayılan kalıbı(ları) sil',\n\n  // Original text: \"You are attempting to delete {nDefaultTemplates, number} default template{nDefaultTemplates, plural, one {} other {s}}. Do you want to continue?\"\n  deleteDefaultTemplatesMessage: 'Varsayılan kalıbı(ları) silmeye çalışıyorsunuz. Devam etmek istiyor musunuz?',\n\n  // Original text: \"Pool{pools, plural, one {} other {s}}\"\n  poolPanel: 'Havuz(lar)',\n\n  // Original text: \"Host{hosts, plural, one {} other {s}}\"\n  hostPanel: 'Sunucu(lar)',\n\n  // Original text: \"VM{vms, plural, one {} other {s}}\"\n  vmPanel: 'VM(ler)',\n\n  // Original text: \"RAM Usage:\"\n  memoryStatePanel: 'RAM Kullanımı',\n\n  // Original text: \"Used Memory\"\n  usedMemory: 'Kullanılan Bellek',\n\n  // Original text: \"Total Memory\"\n  totalMemory: 'Toplam Bellek',\n\n  // Original text: \"CPUs Total\"\n  totalCpus: 'Toplam CPU',\n\n  // Original text: \"Used vCPUs\"\n  usedVCpus: 'Kullanılan vCPU',\n\n  // Original text: \"Used Space\"\n  usedSpace: 'Kullanılan Alan',\n\n  // Original text: \"Total Space\"\n  totalSpace: 'Toplam Alan',\n\n  // Original text: \"CPUs Usage\"\n  cpuStatePanel: \"CPU'ların Kullanımı\",\n\n  // Original text: \"VMs Power state\"\n  vmStatePanel: \"VM'lerin Güç durumu\",\n\n  // Original text: \"Halted\"\n  vmStateHalted: 'Durduruldu',\n\n  // Original text: \"Other\"\n  vmStateOther: 'Diğer',\n\n  // Original text: \"Running\"\n  vmStateRunning: 'Çalışıyor',\n\n  // Original text: \"All\"\n  vmStateAll: 'Hepsi',\n\n  // Original text: \"Pending tasks\"\n  taskStatePanel: 'Bekleyen görevler',\n\n  // Original text: \"Users\"\n  usersStatePanel: 'Kullanıcılar',\n\n  // Original text: \"Storage state\"\n  srStatePanel: 'Depolama ünitesi durumu',\n\n  // Original text: \"{usage} (of {total})\"\n  ofUsage: '{usage} (of {total})',\n\n  // Original text: \"{nVcpus, number} vCPU{nVcpus, plural, one {} other {s}} (of {nCpus, number} CPU{nCpus, plural, one {} other {s}})\"\n  ofCpusUsage:\n    '{nVcpus, number} vCPU{nVcpus, plural, one {} other {s}} (of {nCpus, number} CPU{nCpus, plural, one {} other {s}})',\n\n  // Original text: \"No storage\"\n  noSrs: 'Depolama ünitesi yok',\n\n  // Original text: \"Name\"\n  srName: 'Ad',\n\n  // Original text: \"Pool\"\n  srPool: 'Havuz',\n\n  // Original text: \"Host\"\n  srHost: 'Sunucu',\n\n  // Original text: \"Type\"\n  srFormat: 'Tip',\n\n  // Original text: \"Size\"\n  srSize: 'Boyut',\n\n  // Original text: \"Usage\"\n  srUsage: 'Kullanım',\n\n  // Original text: \"used\"\n  srUsed: 'kullnıldı',\n\n  // Original text: \"free\"\n  srFree: 'boş',\n\n  // Original text: \"Storage Usage\"\n  srUsageStatePanel: 'Depolama Ünitesi Kullanımı',\n\n  // Original text: \"Top 5 SR Usage (in %)\"\n  srTopUsageStatePanel: 'En çok kullanılan 5 SR (% olarak)',\n\n  // Original text: \"Not enough permissions!\"\n  notEnoughPermissionsError: 'Yetersiz yetki!',\n\n  // Original text: \"{running, number} running ({halted, number} halted)\"\n  vmsStates: '{running, number} çalışıyor ({halted, number} durduruldu)',\n\n  // Original text: \"Clear selection\"\n  dashboardStatsButtonRemoveAll: 'Seçimi temizle',\n\n  // Original text: \"Add all hosts\"\n  dashboardStatsButtonAddAllHost: 'Tüm sunucuları ekle',\n\n  // Original text: \"Add all VMs\"\n  dashboardStatsButtonAddAllVM: \"Tüm VM'leri ekle\",\n\n  // Original text: \"Send report\"\n  dashboardSendReport: 'Rapor gönder',\n\n  // Original text: \"Report\"\n  dashboardReport: 'Rapor',\n\n  // Original text: \"This will send a usage report to your configured emails.\"\n  dashboardSendReportMessage: 'Bu işlem ayarlanmış eposta adreslerine kullanım raporu gönderecek.',\n\n  // Original text: \"The usage report and transport email plugins need to be loaded!\"\n  dashboardSendReportInfo: \"'usage report' ve 'transport email' eklentilerinin yüklenmesi gerekli!\",\n\n  // Original text: \"{value} {date, date, medium}\"\n  weekHeatmapData: '{value} {date, date, medium}',\n\n  // Original text: \"No data.\"\n  weekHeatmapNoData: 'Veri yok.',\n\n  // Original text: \"Weekly Heatmap\"\n  weeklyHeatmap: 'Haftalık Sıcaklık Haritası',\n\n  // Original text: \"Weekly Charts\"\n  weeklyCharts: 'Haftalık Grafikler',\n\n  // Original text: \"Synchronize scale:\"\n  weeklyChartsScaleInfo: 'Ölçeği senkronize et:',\n\n  // Original text: \"Stats error\"\n  statsDashboardGenericErrorTitle: 'Durum hatası',\n\n  // Original text: \"There is no stats available for:\"\n  statsDashboardGenericErrorMessage: 'Şunun için istatistik mevcut değil:',\n\n  // Original text: \"No selected metric\"\n  noSelectedMetric: 'Seçilen metrik yok',\n\n  // Original text: \"Select\"\n  statsDashboardSelectObjects: 'Seç',\n\n  // Original text: \"Loading…\"\n  metricsLoading: 'Yükleniyor...',\n\n  // Original text: \"Coming soon!\"\n  comingSoon: 'Yakında!',\n\n  // Original text: \"Orphaned snapshot VDIs\"\n  orphanedVdis: \"Yetim snapshot VDI'ları\",\n\n  // Original text: \"Orphaned VMs snapshot\"\n  orphanedVms: \"Yetim VM'lerin snapshot'ı\",\n\n  // Original text: \"No orphans\"\n  noOrphanedObject: 'Yetim yok',\n\n  // Original text: \"Remove all orphaned snapshot VDIs\"\n  removeAllOrphanedObject: \"Tüm yetim snapshot VDI'larını kaldır\",\n\n  // Original text: \"VDIs attached to Control Domain\"\n  vdisOnControlDomain: \"Kontrol Domain'e takılı VDI'lar\",\n\n  // Original text: \"Name\"\n  vmNameLabel: 'Ad',\n\n  // Original text: \"Description\"\n  vmNameDescription: 'Açıklama',\n\n  // Original text: \"Resident on\"\n  vmContainer: 'Üzerinde',\n\n  // Original text: 'VM snapshots related to non-existent backups'\n  vmSnapshotsRelatedToNonExistentBackups: undefined,\n\n  // Original text: 'Snapshot of'\n  snapshotOf: undefined,\n\n  // Original text: 'Legacy backups snapshots'\n  legacySnapshots: undefined,\n\n  // Original text: \"Alarms\"\n  alarmMessage: 'Alarmlar',\n\n  // Original text: \"No alarms\"\n  noAlarms: 'Alarm yok',\n\n  // Original text: \"Date\"\n  alarmDate: 'Tarih',\n\n  // Original text: \"Content\"\n  alarmContent: 'İçerik',\n\n  // Original text: \"Issue on\"\n  alarmObject: 'Sorun üzerinde',\n\n  // Original text: \"Pool\"\n  alarmPool: 'Havuz',\n\n  // Original text: \"Remove all alarms\"\n  alarmRemoveAll: 'Tüm alarmları kaldır',\n\n  // Original text: \"{used}% used ({free} left)\"\n  spaceLeftTooltip: '{used}% kullanılıyor ({free} boş)',\n\n  // Original text: \"Create a new VM on {select}\"\n  newVmCreateNewVmOn: '{select} üzerinden yeni bir VM oluştur',\n\n  // Original text: \"You have no permission to create a VM\"\n  newVmCreateNewVmNoPermission: 'Yeni VM oluşturmak için yetkiniz yok',\n\n  // Original text: \"Infos\"\n  newVmInfoPanel: 'Bilgiler',\n\n  // Original text: \"Name\"\n  newVmNameLabel: 'Ad',\n\n  // Original text: \"Template\"\n  newVmTemplateLabel: 'Kalıp',\n\n  // Original text: \"Description\"\n  newVmDescriptionLabel: 'Açıklama',\n\n  // Original text: \"Performances\"\n  newVmPerfPanel: 'Performanslar',\n\n  // Original text: \"vCPUs\"\n  newVmVcpusLabel: \"vCPU'lar\",\n\n  // Original text: \"RAM\"\n  newVmRamLabel: 'RAM',\n\n  // Original text: \"Static memory max\"\n  newVmStaticMaxLabel: 'En fazla statik bellek',\n\n  // Original text: \"Dynamic memory min\"\n  newVmDynamicMinLabel: 'En az dinamik bellek',\n\n  // Original text: \"Dynamic memory max\"\n  newVmDynamicMaxLabel: 'En fazla dinamik bellek',\n\n  // Original text: \"Install settings\"\n  newVmInstallSettingsPanel: 'Ayarları yükle',\n\n  // Original text: \"ISO/DVD\"\n  newVmIsoDvdLabel: 'ISO/DVD',\n\n  // Original text: \"Network\"\n  newVmNetworkLabel: 'Ağ',\n\n  // Original text: \"e.g: http://httpredir.debian.org/debian\"\n  newVmInstallNetworkPlaceHolder: 'örn: http://httpredir.debian.org/debian',\n\n  // Original text: \"PV Args\"\n  newVmPvArgsLabel: 'PV Args',\n\n  // Original text: \"PXE\"\n  newVmPxeLabel: 'PXE',\n\n  // Original text: \"Interfaces\"\n  newVmInterfacesPanel: 'Arayüzler',\n\n  // Original text: \"MAC\"\n  newVmMacLabel: 'MAC',\n\n  // Original text: \"Add interface\"\n  newVmAddInterface: 'Arayüz ekle',\n\n  // Original text: \"Disks\"\n  newVmDisksPanel: 'Diskler',\n\n  // Original text: \"SR\"\n  newVmSrLabel: 'SR',\n\n  // Original text: \"Size\"\n  newVmSizeLabel: 'Boyut',\n\n  // Original text: \"Add disk\"\n  newVmAddDisk: 'Disk ekle',\n\n  // Original text: \"Summary\"\n  newVmSummaryPanel: 'Özet',\n\n  // Original text: \"Create\"\n  newVmCreate: 'Oluştur',\n\n  // Original text: \"Reset\"\n  newVmReset: 'Sıfırla',\n\n  // Original text: \"Select template\"\n  newVmSelectTemplate: 'Kalıp seç',\n\n  // Original text: \"SSH key\"\n  newVmSshKey: 'SSH anahtarı',\n\n  // Original text: 'No config drive'\n  noConfigDrive: undefined,\n\n  // Original text: \"Custom config\"\n  newVmCustomConfig: 'Özel yapılandırma',\n\n  // Original text: 'Click here to see the available template variables'\n  availableTemplateVarsInfo: undefined,\n\n  // Original text: 'Available template variables'\n  availableTemplateVarsTitle: undefined,\n\n  // Original text: 'the VM\\'s name. It must not contain \"_\"'\n  templateNameInfo: undefined,\n\n  // Original text: \"the VM's index, it will take 0 in case of single VM\"\n  templateIndexInfo: undefined,\n\n  // Original text: \"Boot VM after creation\"\n  newVmBootAfterCreate: \"Oluşturduktan sonra VM'i çalıştır\",\n\n  // Original text: \"Auto-generated if empty\"\n  newVmMacPlaceholder: 'Eğer boşsa otomatik oluştur',\n\n  // Original text: \"CPU weight\"\n  newVmCpuWeightLabel: 'CPU ağırlığı',\n\n  // Original text: \"Default: {value, number}\"\n  newVmDefaultCpuWeight: 'Varsayılan: {value, number}',\n\n  // Original text: \"CPU cap\"\n  newVmCpuCapLabel: 'CPU cap',\n\n  // Original text: \"Default: {value, number}\"\n  newVmDefaultCpuCap: 'Varsayılan: {value, number}',\n\n  // Original text: \"Cloud config\"\n  newVmCloudConfig: 'Bulut yapılandırması',\n\n  // Original text: \"Create VMs\"\n  newVmCreateVms: 'VM oluştur',\n\n  // Original text: \"Are you sure you want to create {nbVms, number} VMs?\"\n  newVmCreateVmsConfirm: '{nbVms, number} adet VM oluşturmak istediğinize emin misiniz?',\n\n  // Original text: \"Multiple VMs:\"\n  newVmMultipleVms: 'Çoklu VM',\n\n  // Original text: \"Select a resource set:\"\n  newVmSelectResourceSet: 'Bir kaynak seti seç',\n\n  // Original text: \"Name pattern:\"\n  newVmMultipleVmsPattern: 'Ad deseni:',\n\n  // Original text: \"e.g.: \\\\{name\\\\}_%\"\n  newVmMultipleVmsPatternPlaceholder: 'örn: \\\\{name\\\\}_%',\n\n  // Original text: \"First index:\"\n  newVmFirstIndex: 'İlk indeks',\n\n  // Original text: \"Recalculate VMs number\"\n  newVmNumberRecalculate: 'VM sayısını tekrar hesapla',\n\n  // Original text: \"Refresh VMs name\"\n  newVmNameRefresh: 'VM isimlerini yenile',\n\n  // Original text: \"Affinity host\"\n  newVmAffinityHost: 'Atanmış sunucu',\n\n  // Original text: \"Advanced\"\n  newVmAdvancedPanel: 'Gelişmiş',\n\n  // Original text: \"Show advanced settings\"\n  newVmShowAdvanced: 'Gelişmiş ayarları göster',\n\n  // Original text: \"Hide advanced settings\"\n  newVmHideAdvanced: 'Gelişmiş ayarları gizle',\n\n  // Original text: \"Share this VM\"\n  newVmShare: \"Bu VM'i paylaş\",\n\n  // Original text: \"Resource sets\"\n  resourceSets: 'Kaynak setleri',\n\n  // Original text: \"No resource sets.\"\n  noResourceSets: 'Kaynak seti yok.',\n\n  // Original text: \"Loading resource sets\"\n  loadingResourceSets: 'Kaynak setleri yükleniyor',\n\n  // Original text: \"Resource set name\"\n  resourceSetName: 'Kaynak seti adı',\n\n  // Original text: \"Users\"\n  resourceSetUsers: 'Kullanıcılar',\n\n  // Original text: \"Pools\"\n  resourceSetPools: 'Havuzlar',\n\n  // Original text: \"Templates\"\n  resourceSetTemplates: 'Kalıplar',\n\n  // Original text: \"SRs\"\n  resourceSetSrs: \"SR'ler\",\n\n  // Original text: \"Networks\"\n  resourceSetNetworks: 'Ağlar',\n\n  // Original text: \"Recompute all limits\"\n  recomputeResourceSets: 'Tüm limitleri tekrar hesapla',\n\n  // Original text: \"Save\"\n  saveResourceSet: 'Kaydet',\n\n  // Original text: \"Reset\"\n  resetResourceSet: 'Sıfırla',\n\n  // Original text: \"Edit\"\n  editResourceSet: 'Düzenle',\n\n  // Original text: \"Delete\"\n  deleteResourceSet: 'Sil',\n\n  // Original text: \"Delete resource set\"\n  deleteResourceSetWarning: 'Kaynak setini sil',\n\n  // Original text: \"Are you sure you want to delete this resource set?\"\n  deleteResourceSetQuestion: 'Bu kaynak setini silmek istediğinize emin misiniz?',\n\n  // Original text: \"Missing objects:\"\n  resourceSetMissingObjects: 'Eksik nesneler:',\n\n  // Original text: \"vCPUs\"\n  resourceSetVcpus: \"vCPU'lar\",\n\n  // Original text: \"Memory\"\n  resourceSetMemory: 'Bellek',\n\n  // Original text: \"Storage\"\n  resourceSetStorage: 'Depolama Ünitesi',\n\n  // Original text: \"Unknown\"\n  unknownResourceSetValue: 'Bilinmeyen',\n\n  // Original text: \"Available hosts\"\n  availableHosts: 'Uygun sunucular',\n\n  // Original text: \"Excluded hosts\"\n  excludedHosts: 'Hariç tutulan sunucular',\n\n  // Original text: \"No hosts available.\"\n  noHostsAvailable: 'Uygun sunucu yok',\n\n  // Original text: \"VMs created from this resource set shall run on the following hosts.\"\n  availableHostsDescription: 'Bu kaynak setinden oluşturulan sanal makineler aşağıdaki sunucularda çalışacak.',\n\n  // Original text: \"Maximum CPUs\"\n  maxCpus: 'En fazla CPU',\n\n  // Original text: \"Maximum RAM\"\n  maxRam: 'En fazla RAM',\n\n  // Original text: \"Maximum disk space\"\n  maxDiskSpace: 'En fazla disk alanı',\n\n  // Original text: \"IP pool\"\n  ipPool: 'IP havuzu',\n\n  // Original text: \"Quantity\"\n  quantity: 'Adet',\n\n  // Original text: \"No limits.\"\n  noResourceSetLimits: 'Limitsiz',\n\n  // Original text: \"Remaining:\"\n  remainingResource: 'Kalan:',\n\n  // Original text: \"Used\"\n  usedResourceLabel: 'Kullanılan',\n\n  // Original text: \"Available\"\n  availableResourceLabel: 'Uygun',\n\n  // Original text: \"Used: {usage} (Total: {total})\"\n  resourceSetQuota: 'Kullanılan: {usage} (Toplam: {total})',\n\n  // Original text: \"New\"\n  resourceSetNew: 'Yeni',\n\n  // Original text: \"Try dropping some VMs files here, or click to select VMs to upload. Accept only .xva/.ova files.\"\n  importVmsList:\n    'Buraya VM dosyaları sürüklemeyi deneyin veya tıklayarak bir VM dosyası seçin. Yalnızca .xva/.ova dosyaları kabul edilir.',\n\n  // Original text: \"No selected VMs.\"\n  noSelectedVms: 'Seçili VM yok',\n\n  // Original text: \"To Pool:\"\n  vmImportToPool: 'Havuz:',\n\n  // Original text: \"To SR:\"\n  vmImportToSr: 'SR:',\n\n  // Original text: \"VM{nVms, plural, one {} other {s}} to import\"\n  vmsToImport: \"içe aktarılacak VM'ler\",\n\n  // Original text: \"Reset\"\n  importVmsCleanList: 'Sıfırla',\n\n  // Original text: \"VM import success\"\n  vmImportSuccess: 'VM içe aktarma başarılı',\n\n  // Original text: \"VM import failed\"\n  vmImportFailed: 'VM içe aktarma başarısız',\n\n  // Original text: \"Error on setting the VM: {vm}\"\n  setVmFailed: \"Şu VM'in ayarlarında hata: {vm}\",\n\n  // Original text: \"Import starting…\"\n  startVmImport: 'İçe aktarma başlatılıyor...',\n\n  // Original text: \"Export starting…\"\n  startVmExport: 'Dışa aktarma başlatılıyor...',\n\n  // Original text: 'Number of CPUs'\n  nCpus: undefined,\n\n  // Original text: \"Memory\"\n  vmMemory: 'Bellek',\n\n  // Original text: \"Disk {position} ({capacity})\"\n  diskInfo: 'Disk {position} ({capacity})',\n\n  // Original text: \"Disk description\"\n  diskDescription: 'Disk Açıklaması',\n\n  // Original text: \"No disks.\"\n  noDisks: 'Disk yok.',\n\n  // Original text: \"No networks.\"\n  noNetworks: 'Ağ yok.',\n\n  // Original text: \"Network {name}\"\n  networkInfo: 'Ağ {name}',\n\n  // Original text: \"No description available\"\n  noVmImportErrorDescription: 'Uygun açıklama yok',\n\n  // Original text: \"Error:\"\n  vmImportError: 'Hata',\n\n  // Original text: \"{type} file:\"\n  vmImportFileType: '{type} dosyası:',\n\n  // Original text: \"Please check and/or modify the VM configuration.\"\n  vmImportConfigAlert: 'Lütfen VM ayarlarını kontrol edin ve/veya değiştirin.',\n\n  // Original text: \"No pending tasks\"\n  noTasks: 'Bekleyen görev yok',\n\n  // Original text: \"Currently, there are not any pending XenServer tasks\"\n  xsTasks: 'Şu anda bekleyen hiç XenServer görevi yok',\n\n  // Original text: \"Cancel\"\n  cancelTask: 'İptal',\n\n  // Original text: \"Destroy\"\n  destroyTask: 'İmha et',\n\n  // Original text: \"Cancel selected tasks\"\n  cancelTasks: 'Seçili işleri iptal et',\n\n  // Original text: \"Destroy selected tasks\"\n  destroyTasks: 'Seçili işleri imha et',\n\n  // Original text: \"Pool\"\n  pool: 'Havuz',\n\n  // Original text: \"Task\"\n  task: 'Görev',\n\n  // Original text: \"Progress\"\n  progress: 'İlerleme',\n\n  // Original text: \"Schedules\"\n  backupSchedules: 'Zamanlamalar',\n\n  // Original text: \"Cron pattern\"\n  scheduleCron: 'Cron kalıbı:',\n\n  // Original text: \"Name\"\n  scheduleName: 'Ad',\n\n  // Original text: \"Timezone\"\n  scheduleTimezone: 'Saat dilimi',\n\n  // Original text: \"Export ret.\"\n  scheduleExportRetention: 'Yedekleme döngüsü',\n\n  // Original text: 'Copy ret.'\n  scheduleCopyRetention: undefined,\n\n  // Original text: \"Snapshot ret.\"\n  scheduleSnapshotRetention: 'Snaphost döngüsü',\n\n  // Original text: \"Get remote\"\n  getRemote: 'Hedef getir',\n\n  // Original text: \"List Remote\"\n  listRemote: 'Hedefleri listele',\n\n  // Original text: \"simple\"\n  simpleBackup: 'Basit',\n\n  // Original text: \"delta\"\n  delta: 'Fark',\n\n  // Original text: \"Restore Backups\"\n  restoreBackups: 'Yedeği geri yükle',\n\n  // Original text: \"Click on a VM to display restore options\"\n  restoreBackupsInfo: \"Geri getirme seçenekleri için bir VM'e tıklayın\",\n\n  // Original text: \"Enabled\"\n  remoteEnabled: 'Etkin',\n\n  // Original text: \"Error\"\n  remoteError: 'Hata',\n\n  // Original text: \"No backup available\"\n  noBackup: 'Uygun yedek yok',\n\n  // Original text: \"VM Name\"\n  backupVmNameColumn: 'VM adı',\n\n  // Original text: \"VM Description\"\n  backupVmDescriptionColumn: 'VM Açıklaması',\n\n  // Original text: \"Tags\"\n  backupTags: 'Etiketler',\n\n  // Original text: \"Oldest backup\"\n  firstBackupColumn: 'En eski yedek',\n\n  // Original text: \"Latest backup\"\n  lastBackupColumn: 'En yeni yedek',\n\n  // Original text: \"Available Backups\"\n  availableBackupsColumn: 'Uygun Yedekler',\n\n  // Original text: \"Missing parameters\"\n  backupRestoreErrorTitle: 'Eksik parametreler',\n\n  // Original text: \"Choose a SR and a backup\"\n  backupRestoreErrorMessage: 'Bir SR ve bir yedek seçin',\n\n  // Original text: \"Select default SR…\"\n  backupRestoreSelectDefaultSr: 'Varsayılan SR seçin...',\n\n  // Original text: \"Choose a SR for each VDI\"\n  backupRestoreChooseSrForEachVdis: 'Her VDI için bir SR seçin',\n\n  // Original text: \"VDI\"\n  backupRestoreVdiLabel: 'VDI',\n\n  // Original text: \"SR\"\n  backupRestoreSrLabel: 'SR',\n\n  // Original text: \"Display backups\"\n  displayBackup: 'Yedekleri görüntüle',\n\n  // Original text: \"Import VM\"\n  importBackupTitle: 'VM içe katar',\n\n  // Original text: \"Starting your backup import\"\n  importBackupMessage: 'Yedek içe aktarma başlatılıyor',\n\n  // Original text: \"VMs to backup\"\n  vmsToBackup: \"Yedeklenecek VM'ler\",\n\n  // Original text: \"Refresh backup list\"\n  refreshBackupList: 'Yedek listesini yenile',\n\n  // Original text: \"Restore\"\n  restoreVmBackups: 'Geri yükle',\n\n  // Original text: \"Restore {vm}\"\n  restoreVmBackupsTitle: 'Geri yükle {vm}',\n\n  // Original text: \"Restore {nVms, number} VM{nVms, plural, one {} other {s}}\"\n  restoreVmBackupsBulkTitle: '{nVms, number} VM geri yükle',\n\n  // Original text: \"Restore {nVms, number} VM{nVms, plural, one {} other {s}} from {nVms, plural, one {its} other {their}} {oldestOrLatest} backup.\"\n  restoreVmBackupsBulkMessage: '{oldestOrLatest} yedekten {nVms, number} VM geri yükle',\n\n  // Original text: \"oldest\"\n  oldest: 'En eski',\n\n  // Original text: \"latest\"\n  latest: 'En yeni',\n\n  // Original text: \"Start VM{nVms, plural, one {} other {s}} after restore\"\n  restoreVmBackupsStart: \"Geri yüklemeden sonra VM'i(leri) başlat\",\n\n  // Original text: \"Multi-restore error\"\n  restoreVmBackupsBulkErrorTitle: 'Çoklu geri yüklemede hata',\n\n  // Original text: \"You need to select a destination SR\"\n  restoreVmBackupsBulkErrorMessage: 'Bir hedef SR seçmelisiniz',\n\n  // Original text: \"Delete backups…\"\n  deleteVmBackups: 'Yedek sil...',\n\n  // Original text: \"Delete {vm} backups\"\n  deleteVmBackupsTitle: '{vm} yedeklerini sil',\n\n  // Original text: \"Select backups to delete:\"\n  deleteVmBackupsSelect: 'Silinecek yedekleri seçin:',\n\n  // Original text: \"All\"\n  deleteVmBackupsSelectAll: 'Hepsi',\n\n  // Original text: \"Delete backups\"\n  deleteVmBackupsBulkTitle: 'Yedekleri sil',\n\n  // Original text: \"Are you sure you want to delete all the backups from {nVms, number} VM{nVms, plural, one {} other {s}}?\"\n  deleteVmBackupsBulkMessage: \"{nVms, number} VM'e ait tüm yedekleri silmek istediğinize emin misiniz?\",\n\n  // Original text: \"delete {nBackups} backup{nBackups, plural, one {} other {s}}\"\n  deleteVmBackupsBulkConfirmText: 'Yedeği(leri) sil',\n\n  // Original text: \"List remote backups\"\n  listRemoteBackups: 'Uzak yedekleri listele',\n\n  // Original text: \"Restore backup files\"\n  restoreFiles: 'Yedek dosyalarını geri yükle',\n\n  // Original text: \"Invalid options\"\n  restoreFilesError: 'Geçersiz seçenekler',\n\n  // Original text: \"Restore file from {name}\"\n  restoreFilesFromBackup: 'Şuradan dosya al {name}',\n\n  // Original text: \"Select a backup…\"\n  restoreFilesSelectBackup: 'Bir yedek seç...',\n\n  // Original text: \"Select a disk…\"\n  restoreFilesSelectDisk: 'Bir disk seç...',\n\n  // Original text: \"Select a partition…\"\n  restoreFilesSelectPartition: 'Bir disk bölümü seçin...',\n\n  // Original text: \"Folder path\"\n  restoreFilesSelectFolderPath: 'Dizin yolu',\n\n  // Original text: \"Select a file…\"\n  restoreFilesSelectFiles: 'Bir dosya seçin...',\n\n  // Original text: \"Content not found\"\n  restoreFileContentNotFound: 'İçerik bulunamadı',\n\n  // Original text: \"No files selected\"\n  restoreFilesNoFilesSelected: 'Hiç dosya seçilmedi',\n\n  // Original text: \"Selected files ({files}):\"\n  restoreFilesSelectedFiles: 'Seçilen dosyalar ({files})',\n\n  // Original text: \"Error while scanning disk\"\n  restoreFilesDiskError: 'Disk tarama esnasında hata',\n\n  // Original text: \"Select all this folder's files\"\n  restoreFilesSelectAllFiles: 'Bu dizinin tüm dosyalarını seç',\n\n  // Original text: \"Unselect all files\"\n  restoreFilesUnselectAll: 'Seçimi kaldır',\n\n  // Original text: \"Emergency shutdown Host\"\n  emergencyShutdownHostModalTitle: 'Acil durum sunucu kapatması',\n\n  // Original text: \"Are you sure you want to shutdown {host}?\"\n  emergencyShutdownHostModalMessage: 'Kapatmak istediğinize emin misiniz {host}',\n\n  // Original text: \"Emergency shutdown Host{nHosts, plural, one {} other {s}}\"\n  emergencyShutdownHostsModalTitle: 'Acil durum sunucu kapatması',\n\n  // Original text: \"Are you sure you want to shutdown {nHosts, number} Host{nHosts, plural, one {} other {s}}?\"\n  emergencyShutdownHostsModalMessage: '{nHosts, number} Sunucu kapatmak istediğinize emin misiniz?',\n\n  // Original text: \"Shutdown host\"\n  stopHostModalTitle: 'Sunucuyu Kapat',\n\n  // Original text: \"This will shutdown your host. Do you want to continue? If it's the pool master, your connection to the pool will be lost\"\n  stopHostModalMessage:\n    'Bu sunucunuzu kapatacak. Devam etmek istiyor musunuz? Eğer havuzun master sunucusu ise, havuzunuzla bağlantınız kesilecek',\n\n  // Original text: \"Add host\"\n  addHostModalTitle: 'Sunucu ekle',\n\n  // Original text: \"Are you sure you want to add {host} to {pool}?\"\n  addHostModalMessage: '{host} sunucusunu {pool} havuzuna eklemek istediğinize emin misiniz?',\n\n  // Original text: \"Restart host\"\n  restartHostModalTitle: 'Sunucuyu yenden başlat',\n\n  // Original text: \"This will restart your host. Do you want to continue?\"\n  restartHostModalMessage: 'Bu işlem sunucunuzu yeniden başlatacak. Devam etmek istiyor musunuz?',\n\n  // Original text: \"Restart Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}\"\n  restartHostsAgentsModalTitle: 'Sunucu ajanını yeniden başlat',\n\n  // Original text: \"Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?\"\n  restartHostsAgentsModalMessage: '{nHosts, number} sunucunun ajanlarını yeniden başlatmak istediğinize emin misiniz?',\n\n  // Original text: \"Restart Host{nHosts, plural, one {} other {s}}\"\n  restartHostsModalTitle: 'Sunucuyu(ları) yeniden başlat',\n\n  // Original text: \"Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}}?\"\n  restartHostsModalMessage: '{nHosts, number} sunucuyu yeniden başlatmak istediğinize emin misiniz?',\n\n  // Original text: \"Start VM{vms, plural, one {} other {s}}\"\n  startVmsModalTitle: 'VM(leri) başlat',\n\n  // Original text: \"Start a copy\"\n  cloneAndStartVM: 'Bir kopya başlat',\n\n  // Original text: \"Force start\"\n  forceStartVm: 'Zorla başlat',\n\n  // Original text: \"Forbidden operation\"\n  forceStartVmModalTitle: 'Yasak işlem',\n\n  // Original text: \"Start operation for this vm is blocked.\"\n  blockedStartVmModalMessage: 'Başlatma işlemi bu VM için engellenmiş.',\n\n  // Original text: \"Forbidden operation start for {nVms, number} vm{nVms, plural, one {} other {s}}.\"\n  blockedStartVmsModalMessage: '{nVms, number} VM için yasak işlem başladı.',\n\n  // Original text: \"Are you sure you want to start {vms, number} VM{vms, plural, one {} other {s}}?\"\n  startVmsModalMessage: '{vms, number} VM başlatmak istediğinize emin misiniz?',\n\n  // Original text: \"{nVms, number} vm{nVms, plural, one {} other {s}} are failed. Please see your logs to get more information\"\n  failedVmsErrorMessage:\n    '{nVms, number} VM başarısız oldu. Daha fazla bilgi almak için lütfen günlüklerinizi inceleyin',\n\n  // Original text: \"Start failed\"\n  failedVmsErrorTitle: 'Başlatma başarısız',\n\n  // Original text: \"Stop Host{nHosts, plural, one {} other {s}}\"\n  stopHostsModalTitle: 'Sunucuyu(ları) durdur',\n\n  // Original text: \"Are you sure you want to stop {nHosts, number} Host{nHosts, plural, one {} other {s}}?\"\n  stopHostsModalMessage: '{nHosts, number} sunucuyu durdurmak istediğinize emin misiniz?',\n\n  // Original text: \"Stop VM{vms, plural, one {} other {s}}\"\n  stopVmsModalTitle: 'VM(leri) durdur',\n\n  // Original text: \"Are you sure you want to stop {vms, number} VM{vms, plural, one {} other {s}}?\"\n  stopVmsModalMessage: '{vms, number} VM durdurmak istediğinize emin misiniz?',\n\n  // Original text: \"Restart VM\"\n  restartVmModalTitle: 'VM yeniden başlat',\n\n  // Original text: \"Are you sure you want to restart {name}?\"\n  restartVmModalMessage: 'Yeniden başlatmak istediğinize emin misiniz {name}?',\n\n  // Original text: \"Stop VM\"\n  stopVmModalTitle: 'VM durdur',\n\n  // Original text: \"Are you sure you want to stop {name}?\"\n  stopVmModalMessage: 'Durdurmak istediğinze emin misiniz {name}?',\n\n  // Original text: \"Suspend VM{vms, plural, one {} other {s}}\"\n  suspendVmsModalTitle: 'VM(leri) duraklat',\n\n  // Original text: \"Are you sure you want to suspend {vms, number} VM{vms, plural, one {} other {s}}?\"\n  suspendVmsModalMessage: '{vms, number} VM duraklatmak istediğinize emin misiniz?',\n\n  // Original text: \"Restart VM{vms, plural, one {} other {s}}\"\n  restartVmsModalTitle: 'VM(leri) yeniden başlat',\n\n  // Original text: \"Are you sure you want to restart {vms, number} VM{vms, plural, one {} other {s}}?\"\n  restartVmsModalMessage: '{vms, number} VM yeniden başlatmak istediğinize emin misiniz?',\n\n  // Original text: \"Snapshot VM{vms, plural, one {} other {s}}\"\n  snapshotVmsModalTitle: 'Snapshot VM',\n\n  // Original text: \"Are you sure you want to snapshot {vms, number} VM{vms, plural, one {} other {s}}?\"\n  snapshotVmsModalMessage: '{vms, number} VM için snapshot almak istediğinize emin misiniz?',\n\n  // Original text: \"Delete VM{vms, plural, one {} other {s}}\"\n  deleteVmsModalTitle: 'VM sil',\n\n  // Original text: \"Are you sure you want to delete {vms, number} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmsModalMessage: '{vms, number} VM silmek istediğinize emin misiniz? BÜTÜN VM DİSKLERİ KALDIRILACAK',\n\n  // Original text: \"delete {nVms, number} vm{nVms, plural, one {} other {s}}\"\n  deleteVmsConfirmText: '{nVms, number} vm sil',\n\n  // Original text: \"Delete VM\"\n  deleteVmModalTitle: 'VM sil',\n\n  // Original text: \"Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmModalMessage: \"Bu VM'i silmek istediğinize emin misiniz? BÜTÜN VM DİSKLERİ KALDIRILACAK\",\n\n  // Original text: \"Blocked operation\"\n  deleteVmBlockedModalTitle: 'Engellenmiş işlem',\n\n  // Original text: \"Removing the VM is a blocked operation. Would you like to remove it anyway?\"\n  deleteVmBlockedModalMessage: 'VM kaldırmak engellenmiş bir işlemdir. Yine de kaldırmak istiyor musunuz?',\n\n  // Original text: \"Migrate VM\"\n  migrateVmModalTitle: 'VM taşı',\n\n  // Original text: \"Select a destination host:\"\n  migrateVmSelectHost: 'Hedef sunucuyu seçin:',\n\n  // Original text: \"Select a migration network:\"\n  migrateVmSelectMigrationNetwork: 'Taşımak için kullnılacak ağı seçin:',\n\n  // Original text: \"For each VIF, select a network:\"\n  migrateVmSelectNetworks: 'Her VIF için bir ağ seçin',\n\n  // Original text: \"Select a destination SR:\"\n  migrateVmsSelectSr: \"Hedef SR'yi seçin\",\n\n  // Original text: \"Select a destination SR for local disks:\"\n  migrateVmsSelectSrIntraPool: \"Yerel diskler için hedef SR'yi seçin:\",\n\n  // Original text: \"Select a network on which to connect each VIF:\"\n  migrateVmsSelectNetwork: \"Her bir VIF'in bağlanacağı bir ağ seçin:\",\n\n  // Original text: \"Smart mapping\"\n  migrateVmsSmartMapping: 'Akıllı haritalama',\n\n  // Original text: \"VIF\"\n  migrateVmVif: 'VIF',\n\n  // Original text: \"Network\"\n  migrateVmNetwork: 'Ağ',\n\n  // Original text: \"No target host\"\n  migrateVmNoTargetHost: 'Hedef sunucu yok',\n\n  // Original text: \"A target host is required to migrate a VM\"\n  migrateVmNoTargetHostMessage: 'Vm taşımak için bir hedef sunucu gereklidir',\n\n  // Original text: \"No default SR\"\n  migrateVmNoDefaultSrError: 'Varsayılan SR yok',\n\n  // Original text: \"Default SR not connected to host\"\n  migrateVmNotConnectedDefaultSrError: 'Varsayılan SR sunucuya bağlı değil',\n\n  // Original text: \"For each VDI, select an SR:\"\n  chooseSrForEachVdisModalSelectSr: 'Her bir VDI için bir SR seçin',\n\n  // Original text: \"Select main SR…\"\n  chooseSrForEachVdisModalMainSr: \"Ana SR'yi seçin...\",\n\n  // Original text: \"VDI\"\n  chooseSrForEachVdisModalVdiLabel: 'VDI',\n\n  // Original text: \"SR*\"\n  chooseSrForEachVdisModalSrLabel: 'SR*',\n\n  // Original text: \"* optional\"\n  optionalEntry: '* opsiyonel',\n\n  // Original text: \"Delete job{nJobs, plural, one {} other {s}}\"\n  deleteJobsModalTitle: 'İşi(leri) sil',\n\n  // Original text: \"Are you sure you want to delete {nJobs, number} job{nJobs, plural, one {} other {s}}?\"\n  deleteJobsModalMessage: '{nJobs, number} işi silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete VBD{nVbds, plural, one {} other {s}}\"\n  deleteVbdsModalTitle: 'VBD sil',\n\n  // Original text: \"Are you sure you want to delete {nVbds, number} VBD{nVbds, plural, one {} other {s}}?\"\n  deleteVbdsModalMessage: '{nVbds, number} VBD silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete VDI\"\n  deleteVdiModalTitle: 'VDI sil',\n\n  // Original text: \"Are you sure you want to delete this disk? ALL DATA ON THIS DISK WILL BE LOST\"\n  deleteVdiModalMessage: 'Bu diski silmek istediğinize emin misiniz? DİSK ÜZERİNDEKİ TÜM VERİ KAYBOLACAK',\n\n  // Original text: \"Delete VDI{nVdis, plural, one {} other {s}}\"\n  deleteVdisModalTitle: 'VDI sil',\n\n  // Original text: \"Are you sure you want to delete {nVdis, number} disk{nVdis, plural, one {} other {s}}? ALL DATA ON THESE DISKS WILL BE LOST\"\n  deleteVdisModalMessage:\n    '{nVdis, number} disk silmek istediğinize emin misiniz? DİSKLER ÜZERİNDEKİ TÜM VERİ KAYBOLACAK',\n\n  // Original text: \"Delete schedule{nSchedules, plural, one {} other {s}}\"\n  deleteSchedulesModalTitle: 'Zamanlama sil',\n\n  // Original text: \"Are you sure you want to delete {nSchedules, number} schedule{nSchedules, plural, one {} other {s}}?\"\n  deleteSchedulesModalMessage: '{nSchedules, number} zamanlama silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete remote{nRemotes, plural, one {} other {s}}\"\n  deleteRemotesModalTitle: 'Hedef sil',\n\n  // Original text: \"Are you sure you want to delete {nRemotes, number} remote{nRemotes, plural, one {} other {s}}?\"\n  deleteRemotesModalMessage: '{nRemotes, number} yedekleme hedefi silmek istediğinze emin misiniz?',\n\n  // Original text: \"Revert your VM\"\n  revertVmModalTitle: \"VM'i eski haline döndür\",\n\n  // Original text: \"Share your VM\"\n  shareVmInResourceSetModalTitle: \"VM'i paylaş\",\n\n  // Original text: \"This VM will be shared with all the members of the self-service {self}. Are you sure?\"\n  shareVmInResourceSetModalMessage: \"Bu VM self-servis'in tüm üyeleri ile paylaşılacak. Emin misiniz?\",\n\n  // Original text: \"Delete VIF{nVifs, plural, one {} other {s}}\"\n  deleteVifsModalTitle: 'VIF sil',\n\n  // Original text: \"Are you sure you want to delete {nVifs, number} VIF{nVifs, plural, one {} other {s}}?\"\n  deleteVifsModalMessage: '{nVifs, number} VIF silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete snapshot\"\n  deleteSnapshotModalTitle: 'Snapshot sil',\n\n  // Original text: \"Are you sure you want to delete this snapshot?\"\n  deleteSnapshotModalMessage: \"Bu snapshot'ı silmek istediğinize emin misiniz?\",\n\n  // Original text: \"Delete snapshot{nVms, plural, one {} other {s}}\"\n  deleteSnapshotsModalTitle: 'Snapshot sil',\n\n  // Original text: \"Are you sure you want to delete {nVms, number} snapshot{nVms, plural, one {} other {s}}?\"\n  deleteSnapshotsModalMessage: '{nVms, number} snapshot silmek istediğinize emin misiniz?',\n\n  // Original text: \"Disconnect VBD{nVbds, plural, one {} other {s}}\"\n  disconnectVbdsModalTitle: 'VBD bağlantısını kes',\n\n  // Original text: \"Are you sure you want to disconnect {nVbds, number} VBD{nVbds, plural, one {} other {s}}?\"\n  disconnectVbdsModalMessage: '{nVbds, number} VBD bağlantısını kesmek istediğinize emin misiniz',\n\n  // Original text: \"Are you sure you want to revert this VM to the snapshot state? This operation is irreversible.\"\n  revertVmModalMessage: \"Bu VM'i snapshot'daki haline döndürmek istiyor musunuz? Bu işlem geri alınamaz.\",\n\n  // Original text: \"Snapshot before\"\n  revertVmModalSnapshotBefore: 'Snapshot öncesi',\n\n  // Original text: \"Import a {name} Backup\"\n  importBackupModalTitle: 'Bir {name} yedeği içe aktar',\n\n  // Original text: \"Start VM after restore\"\n  importBackupModalStart: \"Geri almadan sonra VM'i çalıştır\",\n\n  // Original text: \"Select your backup…\"\n  importBackupModalSelectBackup: 'Yedeğinizi seçin...',\n\n  // Original text: \"Select a destination SR…\"\n  importBackupModalSelectSr: 'Bir hedef SR seçin...',\n\n  // Original text: \"Are you sure you want to remove all orphaned snapshot VDIs?\"\n  removeAllOrphanedModalWarning: \"Bütün yetim VDI snapshot'larını silmek istediğinize emin misiniz?\",\n\n  // Original text: \"Remove all logs\"\n  removeAllLogsModalTitle: 'Bütün günlükleri kaldır',\n\n  // Original text: \"Are you sure you want to remove all logs?\"\n  removeAllLogsModalWarning: 'Bütün günlükleri kaldırmak istediğinize emin misiniz?',\n\n  // Original text: \"This operation is definitive.\"\n  definitiveMessageModal: 'Bu işlem kesindir.',\n\n  // Original text: \"Previous SR Usage\"\n  existingSrModalTitle: 'Önceki SR kullanımı',\n\n  // Original text: \"This path has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingSrModalText:\n    'Bu yol XenServer sunucusu tarafından bir SR olarak kullanılmış. SR oluşturmaya devam ederseniz tüm veri kaybolacak.',\n\n  // Original text: \"Previous LUN Usage\"\n  existingLunModalTitle: 'Önceki LUN kullanımı',\n\n  // Original text: \"This LUN has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingLunModalText:\n    'Bu LUN XenServer sunucusu tarafından bir SR olarak kullanılmış. SR oluşturmaya devam ederseniz tüm veri kaybolacak.',\n\n  // Original text: \"Replace current registration?\"\n  alreadyRegisteredModal: 'Mevcut kaydı değiştir?',\n\n  // Original text: \"Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?\"\n  alreadyRegisteredModalText:\n    'XO kurulumunuz zaten {email} adresine kayıtlı, Bunu unutmak ve değiştirmek istiyor musunuz?',\n\n  // Original text: \"Ready for trial?\"\n  trialReadyModal: 'Deneme için hazır mısınız?',\n\n  // Original text: \"During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!\"\n  trialReadyModalText:\n    'Deneme sürecinde XOA bir internet bağlantısı gerektirir. Bu limit satın alınan sürümlerde yoktur!',\n\n  // Original text: \"Cancel task{nTasks, plural, one {} other {s}}\"\n  cancelTasksModalTitle: 'Görev iptel et',\n\n  // Original text: \"Are you sure you want to cancel {nTasks, number} task{nTasks, plural, one {} other {s}}?\"\n  cancelTasksModalMessage: '{nTasks, number} görevi iptal etmek istediğinize emin misiniz?',\n\n  // Original text: \"Destroy task{nTasks, plural, one {} other {s}}\"\n  destroyTasksModalTitle: 'Görev imha et',\n\n  // Original text: \"Are you sure you want to destroy {nTasks, number} task{nTasks, plural, one {} other {s}}?\"\n  destroyTasksModalMessage: '{nTasks, number} görevi imha etmek istediğinize emin misiniz?',\n\n  // Original text: \"Label\"\n  serverLabel: 'Başlık',\n\n  // Original text: \"Host\"\n  serverHost: 'Sunucu',\n\n  // Original text: \"Username\"\n  serverUsername: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  serverPassword: 'Parola',\n\n  // Original text: \"Action\"\n  serverAction: 'Aksiyon',\n\n  // Original text: \"Read Only\"\n  serverReadOnly: 'Yalnızca okunabilir',\n\n  // Original text: \"Unauthorized Certificates\"\n  serverUnauthorizedCertificates: 'Yetkisiz Sertifikalar',\n\n  // Original text: \"Allow Unauthorized Certificates\"\n  serverAllowUnauthorizedCertificates: 'Yetkisiz Sertifikalara İzin Ver',\n\n  // Original text: \"Enable it if your certificate is rejected, but it's not recommended because your connection will not be secured.\"\n  serverUnauthorizedCertificatesInfo:\n    'Sertifikanız reddedildiğinde bunu yapın ancak bağlantınız güvenli olmayacağı için tavsiye edilmez.',\n\n  // Original text: \"username\"\n  serverPlaceHolderUser: 'kullanıcı adı',\n\n  // Original text: \"password\"\n  serverPlaceHolderPassword: 'parola',\n\n  // Original text: \"address[:port]\"\n  serverPlaceHolderAddress: 'adres[:port]',\n\n  // Original text: \"label\"\n  serverPlaceHolderLabel: 'başlık',\n\n  // Original text: \"Connect\"\n  serverConnect: 'Bağlan',\n\n  // Original text: \"Error\"\n  serverError: 'Hata',\n\n  // Original text: \"Adding server failed\"\n  serverAddFailed: 'Server ekleme başarısız',\n\n  // Original text: \"Status\"\n  serverStatus: 'Durum',\n\n  // Original text: \"Connection failed. Click for more information.\"\n  serverConnectionFailed: 'Bağlantı başarısız. Bilgi için tıklayın.',\n\n  // Original text: \"Connecting…\"\n  serverConnecting: 'Bağlanıyor...',\n\n  // Original text: \"Authentication error\"\n  serverAuthFailed: 'Kimlik doğrulama hatası',\n\n  // Original text: \"Unknown error\"\n  serverUnknownError: 'Bilinmeyen hata',\n\n  // Original text: \"Invalid self-signed certificate\"\n  serverSelfSignedCertError: 'Geçersiz kendinden imzalı sertifika',\n\n  // Original text: \"Do you want to accept self-signed certificate for this server even though it would decrease security?\"\n  serverSelfSignedCertQuestion:\n    'Güvenliği azaltmasına rağmen kendinden imzalı sertifikayı kabul etmek istiyor musunuz?',\n\n  // Original text: \"Copy VM\"\n  copyVm: 'VM kopyala',\n\n  // Original text: \"Are you sure you want to copy this VM to {SR}?\"\n  copyVmConfirm: \"Bu VM'i şuraya kopyalamak istediğinize emin misiniz {SR}?\",\n\n  // Original text: \"Name\"\n  copyVmName: 'Ad',\n\n  // Original text: \"Name pattern\"\n  copyVmNamePattern: 'Ad kalıbı',\n\n  // Original text: \"If empty: name of the copied VM\"\n  copyVmNamePlaceholder: \"Eğer boşsa: kopyalanan VM'in adı\",\n\n  // Original text: \"e.g.: \\\"\\\\{name\\\\}_COPY\\\"\"\n  copyVmNamePatternPlaceholder: 'örn: \"\\\\{name\\\\}_COPY',\n\n  // Original text: \"Select SR\"\n  copyVmSelectSr: 'SR seç',\n\n  // Original text: \"Use compression\"\n  copyVmCompress: 'Sıkıştırma kullan',\n\n  // Original text: \"No target SR\"\n  copyVmsNoTargetSr: 'Hedef SR yok',\n\n  // Original text: \"A target SR is required to copy a VM\"\n  copyVmsNoTargetSrMessage: 'VM kopyalamak için hedef bir SR gereklidir',\n\n  // Original text: \"Detach host\"\n  detachHostModalTitle: 'Sunucuyu ayır',\n\n  // Original text: \"Are you sure you want to detach {host} from its pool? THIS WILL REMOVE ALL VMs ON ITS LOCAL STORAGE AND REBOOT THE HOST.\"\n  detachHostModalMessage:\n    \"{host} sunucusunu havuzundan ayırmak istediğinize emin misiniz? BU İŞLEM YEREL DİSKİNDEKİ TÜM VM'LERİ KALDIRIR VE SUNUCU YENİDEN BAŞLAR\",\n\n  // Original text: \"Detach\"\n  detachHost: 'ayır',\n\n  // Original text: \"Forget host\"\n  forgetHostModalTitle: 'Sunucuyu unut',\n\n  // Original text: \"Are you sure you want to forget {host} from its pool? Be sure this host can't be back online, or use detach instead.\"\n  forgetHostModalMessage:\n    '{host} sunucusunu havuzunun unutmasını istediğinize emin misiniz? Bu sunucunun tekrar çevrimiçi olamayacağından emin olun veya bunun yerine ayırmayı deneyin.',\n\n  // Original text: \"Forget\"\n  forgetHost: 'Unut',\n\n  // Original text: \"Designate a new master\"\n  setPoolMasterModalTitle: 'Yeni bir master tayin et',\n\n  // Original text: \"This operation may take several minutes. Do you want to continue?\"\n  setPoolMasterModalMessage: 'Bu işlem birkaç dakika sürebilir. Devam etmek istiyor musunuz?',\n\n  // Original text: \"Create network\"\n  newNetworkCreate: 'Ağ oluştur',\n\n  // Original text: \"Create bonded network\"\n  newBondedNetworkCreate: 'Bağlı ağ oluştur',\n\n  // Original text: \"Interface\"\n  newNetworkInterface: 'Arayüz',\n\n  // Original text: \"Name\"\n  newNetworkName: 'Ad',\n\n  // Original text: \"Description\"\n  newNetworkDescription: 'Açıklama',\n\n  // Original text: \"VLAN\"\n  newNetworkVlan: 'VLAN',\n\n  // Original text: \"No VLAN if empty\"\n  newNetworkDefaultVlan: 'Boşsa VLAN yok',\n\n  // Original text: \"MTU\"\n  newNetworkMtu: 'MTU',\n\n  // Original text: \"Default: 1500\"\n  newNetworkDefaultMtu: 'Varsayılan: 1500',\n\n  // Original text: \"Name required\"\n  newNetworkNoNameErrorTitle: 'Ad gerekli',\n\n  // Original text: \"A name is required to create a network\"\n  newNetworkNoNameErrorMessage: 'Bir ağ oluşturmak için ad gereklidir',\n\n  // Original text: \"Bond mode\"\n  newNetworkBondMode: 'Bağlı mod',\n\n  // Original text: \"Delete network\"\n  deleteNetwork: 'Ağı sil',\n\n  // Original text: \"Are you sure you want to delete this network?\"\n  deleteNetworkConfirm: 'Bu ağı silmek istediğinize emin misiniz?',\n\n  // Original text: \"This network is currently in use\"\n  networkInUse: 'Bu ağ şu an kullanımda',\n\n  // Original text: \"Bonded\"\n  pillBonded: 'Bağlı',\n\n  // Original text: \"Host\"\n  addHostSelectHost: 'Sunucu',\n\n  // Original text: \"No host\"\n  addHostNoHost: 'Sunucu yok',\n\n  // Original text: \"No host selected to be added\"\n  addHostNoHostMessage: 'Eklemek için bir sunucu seçilmedi',\n\n  // Original text: \"Xen Orchestra\"\n  xenOrchestra: 'Xen Orchestra',\n\n  // Original text: \"No pro support provided!\"\n  noProSupport: 'Hiçbir profesyonel destek verilmez!',\n\n  // Original text: \"Use in production at your own risks\"\n  noProductionUse: 'Üretimde kendi risklerinizle kullanın.',\n\n  // Original text: \"You can download our turnkey appliance at {website}\"\n  downloadXoaFromWebsite: 'Bizim anahtar teslimi sunucumuzu şuradan indirebilirsiniz {website}',\n\n  // Original text: \"Bug Tracker\"\n  bugTracker: 'Hata Takibi',\n\n  // Original text: \"Issues? Report it!\"\n  bugTrackerText: 'Sorun mu var? Raporlayın!',\n\n  // Original text: \"Community\"\n  community: 'Topluluk',\n\n  // Original text: \"Join our community forum!\"\n  communityText: 'Topluluk forumumuza katılın!',\n\n  // Original text: \"Free Trial for Premium Edition!\"\n  freeTrial: 'Premium Sürüm için Bedava Deneme',\n\n  // Original text: \"Request your trial now!\"\n  freeTrialNow: 'Denemenizi hemen talep edin!',\n\n  // Original text: \"Any issue?\"\n  issues: 'Herhangi bir sorun?',\n\n  // Original text: \"Problem? Contact us!\"\n  issuesText: 'Problem? Bizimle iletişime geçin!',\n\n  // Original text: \"Documentation\"\n  documentation: 'Dokümantasyon',\n\n  // Original text: \"Read our official doc\"\n  documentationText: 'Resmi dokümanımızı okuyun',\n\n  // Original text: \"Pro support included\"\n  proSupportIncluded: 'Profesyonel destek dahildir',\n\n  // Original text: \"Access your XO Account\"\n  xoAccount: 'XO hesabınıza erişin',\n\n  // Original text: \"Report a problem\"\n  openTicket: 'Bir problemi raporlayın',\n\n  // Original text: \"Problem? Open a ticket!\"\n  openTicketText: 'Problem? Bir kayıt açın!',\n\n  // Original text: \"Upgrade needed\"\n  upgradeNeeded: 'Yükseltme gerekli',\n\n  // Original text: \"Upgrade now!\"\n  upgradeNow: 'Şimdi yükselt!',\n\n  // Original text: \"Or\"\n  or: 'Veya',\n\n  // Original text: \"Try it for free!\"\n  tryIt: 'Bedava dene!',\n\n  // Original text: \"This feature is available starting from {plan} Edition\"\n  availableIn: 'Bu özellik {plan} sürümü ile başlıyor',\n\n  // Original text: \"This feature is not available in your version, contact your administrator to know more.\"\n  notAvailable:\n    'Bu özellik sizin sürümünüzde kullanılabilir değil. Daha fazlasını öğrenmek için yöneticiniz ile temasa geçin.',\n\n  // Original text: \"Updates\"\n  updateTitle: 'Güncellemeler',\n\n  // Original text: \"Registration\"\n  registration: 'Kayıtlanma',\n\n  // Original text: \"Trial\"\n  trial: 'Deneme',\n\n  // Original text: \"Settings\"\n  settings: 'Ayarlar',\n\n  // Original text: \"Proxy settings\"\n  proxySettings: 'Proxy ayarları',\n\n  // Original text: \"Host (myproxy.example.org)\"\n  proxySettingsHostPlaceHolder: 'Sunucu (myproxy.example.org)',\n\n  // Original text: \"Port (eg: 3128)\"\n  proxySettingsPortPlaceHolder: 'Port (örn: 3128)',\n\n  // Original text: \"Username\"\n  proxySettingsUsernamePlaceHolder: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  proxySettingsPasswordPlaceHolder: 'Parola',\n\n  // Original text: \"Your email account\"\n  updateRegistrationEmailPlaceHolder: 'Eposta hesabınız',\n\n  // Original text: \"Your password\"\n  updateRegistrationPasswordPlaceHolder: 'Parolanız',\n\n  // Original text: \"Troubleshooting documentation\"\n  updaterTroubleshootingLink: 'Sorun giderme dokümanları',\n\n  // Original text: \"Update\"\n  update: 'Güncelle',\n\n  // Original text: \"Refresh\"\n  refresh: 'Yenile',\n\n  // Original text: \"Upgrade\"\n  upgrade: 'Yükselt',\n\n  // Original text: 'Downgrade'\n  downgrade: undefined,\n\n  // Original text: \"No updater available for Community Edition\"\n  noUpdaterCommunity: 'Topluluk sürümü için güncelleştirici sunulmuyor',\n\n  // Original text: \"Please consider subscribing and trying it with all the features for free during 30 days on {link}.\"\n  considerSubscribe:\n    'Lütfen {link} adresinden abone olun ve 30 gün boyunca ücretsiz olarak tüm özellikleri kullanmayı deneyin.',\n\n  // Original text: \"Manual update could break your current installation due to dependencies issues, do it with caution\"\n  noUpdaterWarning:\n    'El ile güncelleştirme, geçerli yüklemenizi bağımlılıklar nedeniyle bozabilir, dikkatli bir şekilde yapın.',\n\n  // Original text: \"Current version:\"\n  currentVersion: 'Mevcut sürüm:',\n\n  // Original text: \"Register\"\n  register: 'Kaydol',\n\n  // Original text: \"Edit registration\"\n  editRegistration: 'Kaydı düzenle',\n\n  // Original text: \"Please, take time to register in order to enjoy your trial.\"\n  trialRegistration: 'Lütfen, denemenizin tadını çıkarmak adına kaydolmak için zaman ayırın.',\n\n  // Original text: \"Start trial\"\n  trialStartButton: 'Denemeyi başlat',\n\n  // Original text: \"You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.\"\n  trialAvailableUntil:\n    'Deneme sürümünü {date, date, medium} tarihine kadar kullanabilirsiniz. Almak için cihazınızı yeni sürüme geçirin.',\n\n  // Original text: \"Your trial has been ended. Contact us or downgrade to Free version\"\n  trialConsumed: 'Denemeniz süreniz sona erdi. Bize ulaşın veya Ücretsiz sürüme geçin.',\n\n  // Original text: \"Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.\"\n  trialLocked: \"Xoa-updater hizmetiniz çalışmıyor gibi görünüyor. XOA'nız bu servise ulaşmadan tamamen çalışamaz.\",\n\n  // Original text: \"No update information available\"\n  noUpdateInfo: 'Güncelleme bilgisi mevcut değil',\n\n  // Original text: \"Update information may be available\"\n  waitingUpdateInfo: 'Güncelleme bilgileri mevcut olabilir',\n\n  // Original text: \"Your XOA is up-to-date\"\n  upToDate: 'XOA güncel',\n\n  // Original text: \"You need to update your XOA (new version is available)\"\n  mustUpgrade: 'XOA güncellenmeli (yeni versiyon kullanıma hazır)',\n\n  // Original text: \"Your XOA is not registered for updates\"\n  registerNeeded: \"XOA'nız güncellemeler için kayıtlı değil\",\n\n  // Original text: \"Can't fetch update information\"\n  updaterError: 'Güncelleme bilgisi alınamıyor',\n\n  // Original text: \"Upgrade successful\"\n  promptUpgradeReloadTitle: 'Yükseltme başarılı',\n\n  // Original text: \"Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?\"\n  promptUpgradeReloadMessage:\n    \"XOA'nız başarıyla yükseltildi ve tarayıcınız uygulamayı yeniden yüklemelidir. Şimdi yeniden yüklemek istiyor musunuz?\",\n\n  // Original text: \"Upgrade warning\"\n  upgradeWarningTitle: 'Yükseltme uyarısı',\n\n  // Original text: \"You have some backup jobs in progress. If you upgrade now, these jobs will be interrupted! Are you sure you want to continue?\"\n  upgradeWarningMessage:\n    'Devam eden bazı yedekleme işleriniz var. Şimdi yükseltirseniz, bu işler kesilecektir! Devam etmek istediğinize emin misiniz?',\n\n  // Original text: \"Xen Orchestra from the sources\"\n  disclaimerTitle: 'Kaynak koddan Xen Orchestra',\n\n  // Original text: \"You are using XO from the sources! That's great for a personal/non-profit usage.\"\n  disclaimerText1: \"XO'yu kaynak koddan kullanıyorsunuz! Kişisel/kar amacı gütmeyen kullanım için mükemmeldir.\",\n\n  // Original text: \"If you are a company, it's better to use it with our appliance + pro support included:\"\n  disclaimerText2: 'Bir şirket iseniz, bizim hazır uygulamamızı kullanmanız daha iyidir + pro destek dahil:',\n\n  // Original text: \"This version is not bundled with any support nor updates. Use it with caution for critical tasks.\"\n  disclaimerText3: 'Bu sürüm herhangi bir destek veya güncellemeyle birlikte verilmez. Dikkatli kullanın.',\n\n  // Original text: \"Connect PIF\"\n  connectPif: \"PIF'e bağlan\",\n\n  // Original text: \"Are you sure you want to connect this PIF?\"\n  connectPifConfirm: \"Bu PIF'e bağlanmak istediğinize emin misiniz?\",\n\n  // Original text: \"Disconnect PIF\"\n  disconnectPif: 'PIF bağlantısını kes',\n\n  // Original text: \"Are you sure you want to disconnect this PIF?\"\n  disconnectPifConfirm: 'PIF bağlantısını kesmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete PIF\"\n  deletePif: 'PIF sil',\n\n  // Original text: \"Are you sure you want to delete this PIF?\"\n  deletePifConfirm: \"Bu PIF'i silmek istediğinize emin misiniz?\",\n\n  // Original text: \"Delete PIFs\"\n  deletePifs: \"PIF'leri sil\",\n\n  // Original text: \"Are you sure you want to delete {nPifs, number} PIF{nPifs, plural, one {} other {s}}?\"\n  deletePifsConfirm: '{nPifs, number} PIF silmek istediğinize emin misiniz?',\n\n  // Original text: \"Connected\"\n  pifConnected: 'Bağlı',\n\n  // Original text: \"Disconnected\"\n  pifDisconnected: 'Bağlı değil',\n\n  // Original text: \"Physically connected\"\n  pifPhysicallyConnected: 'Fiziksel olarak bağlı',\n\n  // Original text: \"Physically disconnected\"\n  pifPhysicallyDisconnected: 'Fiziksel olarak bağlı değil',\n\n  // Original text: \"Username\"\n  username: 'Kullanıcı adı',\n\n  // Original text: \"Password\"\n  password: 'Parola',\n\n  // Original text: \"Language\"\n  language: 'Dil',\n\n  // Original text: \"Old password\"\n  oldPasswordPlaceholder: 'Eski parola',\n\n  // Original text: \"New password\"\n  newPasswordPlaceholder: 'Yeni parola',\n\n  // Original text: \"Confirm new password\"\n  confirmPasswordPlaceholder: 'Yeni parolayı onayla',\n\n  // Original text: \"Confirmation password incorrect\"\n  confirmationPasswordError: 'Onay parola yanlış',\n\n  // Original text: \"Password does not match the confirm password.\"\n  confirmationPasswordErrorBody: 'Parola, onaylama parolasıyla uyuşmuyor.',\n\n  // Original text: \"Password changed\"\n  pwdChangeSuccess: 'Parola değişti',\n\n  // Original text: \"Your password has been successfully changed.\"\n  pwdChangeSuccessBody: 'Parolanız başarılı bir şekilde değiştirildi',\n\n  // Original text: \"Incorrect password\"\n  pwdChangeError: 'Yanlış parola',\n\n  // Original text: \"The old password provided is incorrect. Your password has not been changed.\"\n  pwdChangeErrorBody: 'Girilen eski parola yanlış. Parolanız değiştirilmedi.',\n\n  // Original text: \"OK\"\n  changePasswordOk: 'Tamam',\n\n  // Original text: \"SSH keys\"\n  sshKeys: 'SSH anahtarları',\n\n  // Original text: \"New SSH key\"\n  newSshKey: 'Yeni SSH anahtarı',\n\n  // Original text: \"Delete\"\n  deleteSshKey: 'Sil',\n\n  // Original text: \"Delete selected SSH keys\"\n  deleteSshKeys: 'Seçilen SSH anahtarını sil',\n\n  // Original text: \"No SSH keys\"\n  noSshKeys: 'SSH anahtarı yok',\n\n  // Original text: \"New SSH key\"\n  newSshKeyModalTitle: 'Yeni SSH anahtarı',\n\n  // Original text: \"Invalid key\"\n  sshKeyErrorTitle: 'Geçersiz anahtar',\n\n  // Original text: \"An SSH key requires both a title and a key.\"\n  sshKeyErrorMessage: 'Bir SSH anahtarı hem bir başlık hem de bir anahtar gerektirir.',\n\n  // Original text: \"Title\"\n  title: 'Başlık',\n\n  // Original text: \"Key\"\n  key: 'Anahtar',\n\n  // Original text: \"Delete SSH key\"\n  deleteSshKeyConfirm: 'SSH anahtarını sil',\n\n  // Original text: \"Are you sure you want to delete the SSH key {title}?\"\n  deleteSshKeyConfirmMessage: 'SSH anahtarını silmek istediğinizden emin misiniz {title}?',\n\n  // Original text: \"Delete SSH key{nKeys, plural, one {} other {s}}\"\n  deleteSshKeysConfirm: 'SSH anahtarı sil',\n\n  // Original text: \"Are you sure you want to delete {nKeys, number} SSH key{nKeys, plural, one {} other {s}}?\"\n  deleteSshKeysConfirmMessage: '{nKeys, number} SSH anahtarını silmek istediğinize emin misiniz?',\n\n  // Original text: \"Others\"\n  others: 'Diğerleri',\n\n  // Original text: \"Loading logs…\"\n  loadingLogs: 'Günlükler yükleniyor...',\n\n  // Original text: \"User\"\n  logUser: 'Kullanıcı',\n\n  // Original text: \"Method\"\n  logMethod: 'Metod',\n\n  // Original text: \"Params\"\n  logParams: 'Parametreler',\n\n  // Original text: \"Message\"\n  logMessage: 'Mesaj',\n\n  // Original text: \"Error\"\n  logError: 'Hata',\n\n  // Original text: 'Logs'\n  logTitle: undefined,\n\n  // Original text: \"Display details\"\n  logDisplayDetails: 'Ayrıntıları görüntüle',\n\n  // Original text: \"Date\"\n  logTime: 'Tarih',\n\n  // Original text: \"No stack trace\"\n  logNoStackTrace: 'Yığın izi yok',\n\n  // Original text: \"No params\"\n  logNoParams: 'Parametre yok',\n\n  // Original text: \"Delete log\"\n  logDelete: 'Günlük sil',\n\n  // Original text: \"Delete logs\"\n  logsDelete: 'Günlükleri sil',\n\n  // Original text: \"Delete log{nLogs, plural, one {} other {s}}\"\n  logDeleteMultiple: 'Günlük(leri) sil',\n\n  // Original text: \"Are you sure you want to delete {nLogs, number} log{nLogs, plural, one {} other {s}}?\"\n  logDeleteMultipleMessage: '{nLogs, number} günlük silmek istediğinize emin misiniz?',\n\n  // Original text: \"Delete all logs\"\n  logDeleteAll: 'Bütün günlükleri sil',\n\n  // Original text: \"Delete all logs\"\n  logDeleteAllTitle: 'Bütün günlükleri sil',\n\n  // Original text: \"Are you sure you want to delete all the logs?\"\n  logDeleteAllMessage: 'Bütün günlükleri silmek istediğinizden emin misiniz?',\n\n  // Original text: \"Click to enable\"\n  logIndicationToEnable: 'Açmak için tıklayın',\n\n  // Original text: \"Click to disable\"\n  logIndicationToDisable: 'Kapatmak için tıklayın',\n\n  // Original text: \"Report a bug\"\n  reportBug: 'Bir hata raporla',\n\n  // Original text: \"Job canceled to protect the VDI chain\"\n  unhealthyVdiChainError: 'VDI zincirini korumak için iş iptal edildi',\n\n  // Original text: \"Restart VM's backup\"\n  backupRestartVm: undefined,\n\n  // Original text: \"Click for more information\"\n  clickForMoreInformation: 'Daha fazla bilgi için tıklayın',\n\n  // Original text: \"Name\"\n  ipPoolName: 'Ad',\n\n  // Original text: \"IPs\"\n  ipPoolIps: \"IP'ler\",\n\n  // Original text: \"IPs (e.g.: 1.0.0.12-1.0.0.17;1.0.0.23)\"\n  ipPoolIpsPlaceholder: \"IP'ler (örn: 1.0.0.12-1.0.0.17;1.0.0.23)\",\n\n  // Original text: \"Networks\"\n  ipPoolNetworks: 'Ağlar',\n\n  // Original text: \"No IP pools\"\n  ipsNoIpPool: 'IP havuzu yok',\n\n  // Original text: \"Create\"\n  ipsCreate: 'Oluştur',\n\n  // Original text: \"Delete all IP pools\"\n  ipsDeleteAllTitle: 'Bütün IP havuzlarını sil',\n\n  // Original text: \"Are you sure you want to delete all the IP pools?\"\n  ipsDeleteAllMessage: 'Bütün IP havuzlarını silmek istediğinize emin misiniz?',\n\n  // Original text: \"VIFs\"\n  ipsVifs: \"VIF'ler\",\n\n  // Original text: \"Not used\"\n  ipsNotUsed: 'Kullanılmadı',\n\n  // Original text: \"unknown VIF\"\n  ipPoolUnknownVif: 'Bilinmeyen VIF',\n\n  // Original text: \"Name already exists\"\n  ipPoolNameAlreadyExists: 'Ad zaten var',\n\n  // Original text: \"Keyboard shortcuts\"\n  shortcutModalTitle: 'Klavye kısayolu',\n\n  // Original text: \"Global\"\n  shortcut_XoApp: 'Global',\n\n  // Original text: \"Go to hosts list\"\n  shortcut_XoApp_GO_TO_HOSTS: 'Sunucu listesine git',\n\n  // Original text: \"Go to pools list\"\n  shortcut_XoApp_GO_TO_POOLS: 'Havuz listesine git',\n\n  // Original text: \"Go to VMs list\"\n  shortcut_XoApp_GO_TO_VMS: 'VM listesine git',\n\n  // Original text: \"Go to SRs list\"\n  shortcut_XoApp_GO_TO_SRS: 'SR listesine git',\n\n  // Original text: \"Create a new VM\"\n  shortcut_XoApp_CREATE_VM: 'Yeni bir VM oluştur',\n\n  // Original text: \"Unfocus field\"\n  shortcut_XoApp_UNFOCUS: 'Odaklanmamış alan',\n\n  // Original text: \"Show shortcuts key bindings\"\n  shortcut_XoApp_HELP: 'Kısayol tuşlarını göster',\n\n  // Original text: \"Home\"\n  shortcut_Home: 'Ev',\n\n  // Original text: \"Focus search bar\"\n  shortcut_Home_SEARCH: 'Arama çubuğuna odaklan',\n\n  // Original text: \"Next item\"\n  shortcut_Home_NAV_DOWN: 'Sonraki öğe',\n\n  // Original text: \"Previous item\"\n  shortcut_Home_NAV_UP: 'Önceki öğe',\n\n  // Original text: \"Select item\"\n  shortcut_Home_SELECT: 'Öğe seç',\n\n  // Original text: \"Open\"\n  shortcut_Home_JUMP_INTO: 'Aç',\n\n  // Original text: \"Supported tables\"\n  shortcut_SortedTable: 'Desteklenen tablolar',\n\n  // Original text: \"Focus the table search bar\"\n  shortcut_SortedTable_SEARCH: 'Tablo arama çubuğuna odaklan',\n\n  // Original text: \"Next item\"\n  shortcut_SortedTable_NAV_DOWN: 'Sonraki öğe',\n\n  // Original text: \"Previous item\"\n  shortcut_SortedTable_NAV_UP: 'Önceki öğe',\n\n  // Original text: \"Select item\"\n  shortcut_SortedTable_SELECT: 'Öğe seç',\n\n  // Original text: \"Action\"\n  shortcut_SortedTable_ROW_ACTION: 'Aksiyon',\n\n  // Original text: \"VM\"\n  settingsAclsButtonTooltipVM: 'VM',\n\n  // Original text: \"Hosts\"\n  settingsAclsButtonTooltiphost: 'Sunucular',\n\n  // Original text: \"Pool\"\n  settingsAclsButtonTooltippool: 'Havuz',\n\n  // Original text: \"SR\"\n  settingsAclsButtonTooltipSR: 'SR',\n\n  // Original text: \"Network\"\n  settingsAclsButtonTooltipnetwork: 'Ağ',\n\n  // Original text: 'Template'\n  settingsCloudConfigTemplate: undefined,\n\n  // Original text: 'Delete cloud config{nCloudConfigs, plural, one {} other {s}}'\n  confirmDeleteCloudConfigsTitle: undefined,\n\n  // Original text: 'Are you sure you want to delete {nCloudConfigs, number} cloud config{nCloudConfigs, plural, one {} other {s}}?'\n  confirmDeleteCloudConfigsBody: undefined,\n\n  // Original text: 'Delete cloud config'\n  deleteCloudConfig: undefined,\n\n  // Original text: 'Edit cloud config'\n  editCloudConfig: undefined,\n\n  // Original text: 'Delete selected cloud configs'\n  deleteSelectedCloudConfigs: undefined,\n\n  // Original text: \"No config file selected\"\n  noConfigFile: 'Yapılandırma dosyası seçilmedi',\n\n  // Original text: \"Try dropping a config file here, or click to select a config file to upload.\"\n  importTip: 'Bir yapılandırma dosyasını buraya sürükleyin veya seçmek için tıklayın',\n\n  // Original text: \"Config\"\n  config: 'Yapılandırma',\n\n  // Original text: \"Import\"\n  importConfig: 'İçe aktar',\n\n  // Original text: \"Config file successfully imported\"\n  importConfigSuccess: 'Yapılandırma dosyası başarıyla alındı',\n\n  // Original text: \"Error while importing config file\"\n  importConfigError: 'Yapılandırma dosyası içe aktarılırken hata oluştu',\n\n  // Original text: \"Export\"\n  exportConfig: 'Dışa aktar',\n\n  // Original text: \"Download current config\"\n  downloadConfig: 'Mevcut yapılandırmayı indir',\n\n  // Original text: \"No config import available for Community Edition\"\n  noConfigImportCommunity: 'Topluluk Sürümünde yapılandırma içe aktarma özelliği yoktur',\n\n  // Original text: \"Reconnect all hosts\"\n  srReconnectAllModalTitle: 'Tüm sunuculara tekrar bağlan',\n\n  // Original text: \"This will reconnect this SR to all its hosts.\"\n  srReconnectAllModalMessage: \"Bu işlem bu SR'yi sunucularına tekrar bağlayacak.\",\n\n  // Original text: \"This will reconnect each selected SR to its host (local SR) or to every hosts of its pool (shared SR).\"\n  srsReconnectAllModalMessage:\n    \"Bu işlem seçili yerel SR'leri sunucularına, paylaşımlı SR'leri havuzuna tekrar bağlayacak.\",\n\n  // Original text: \"Disconnect all hosts\"\n  srDisconnectAllModalTitle: 'Tüm sunucuların bağlantısını kes',\n\n  // Original text: \"This will disconnect this SR from all its hosts.\"\n  srDisconnectAllModalMessage: \"Bu işlem bu SR'nin sunucu bağlantısını kesecek.\",\n\n  // Original text: \"This will disconnect each selected SR from its host (local SR) or from every hosts of its pool (shared SR).\"\n  srsDisconnectAllModalMessage:\n    \"Bu işlem seçili yerel SR'nin sunucu bağlantısını, paylaşımlı SR'nin havuz bağlantısını kesecek.\",\n\n  // Original text: \"Forget SR\"\n  srForgetModalTitle: 'SR Unut',\n\n  // Original text: \"Forget selected SRs\"\n  srsForgetModalTitle: \"Seçili SR'leri unut\",\n\n  // Original text: \"Are you sure you want to forget this SR? VDIs on this storage won't be removed.\"\n  srForgetModalMessage: \"Bu SR'yi unutmak istediğinize emin misinz? Bu işlem SR üzerindeki VDI'ları silmez.\",\n\n  // Original text: \"Are you sure you want to forget all the selected SRs? VDIs on these storages won't be removed.\"\n  srsForgetModalMessage: \"Seçili SR'leri unutmak istediğinize emin misinz? Bu işlem SR'ler üzerindeki VDI'ları silmez.\",\n\n  // Original text: \"Disconnected\"\n  srAllDisconnected: 'Bağlantıyı kes',\n\n  // Original text: \"Partially connected\"\n  srSomeConnected: 'Kısmen bağlı',\n\n  // Original text: \"Connected\"\n  srAllConnected: 'Bağlı',\n\n  // Original text: \"XOSAN\"\n  xosanTitle: 'XOSAN',\n\n  // Original text: \"Xen Orchestra SAN SR\"\n  xosanSrTitle: 'Xen Orchestra SAN SR',\n\n  // Original text: \"Select local SRs (lvm)\"\n  xosanAvailableSrsTitle: \"Yerel SR'leri seçin (lvm)\",\n\n  // Original text: \"Suggestions\"\n  xosanSuggestions: 'Öneriler',\n\n  // Original text: \"Warning: using disperse layout is not recommended right now. Please read {link}.\"\n  xosanDisperseWarning: 'Uyarı: dağıtma düzeninin kullanılması şu anda önerilmez. Lütfen okuyun {link}.',\n\n  // Original text: \"Name\"\n  xosanName: 'Ad',\n\n  // Original text: \"Host\"\n  xosanHost: 'Sunucu',\n\n  // Original text: \"Connected Hosts\"\n  xosanHosts: 'Bağlı Sunucular',\n\n  // Original text: \"Pool\"\n  xosanPool: 'Havuz',\n\n  // Original text: \"Volume ID\"\n  xosanVolumeId: 'Volume ID',\n\n  // Original text: \"Size\"\n  xosanSize: 'Boyut',\n\n  // Original text: \"Used space\"\n  xosanUsedSpace: 'Kullanılan alan',\n\n  // Original text: \"License\"\n  license: 'Lisans',\n\n  // Original text: \"This XOSAN has more than 1 license!\"\n  xosanMultipleLicenses: \"Bu XOSAN 1'den fazla lisansa sahip!\",\n\n  // Original text: \"XOSAN pack needs to be installed and up to date on each host of the pool.\"\n  xosanNeedPack: 'XOSAN paketinin havuzdaki tüm sunuculara kurulması gerekir.',\n\n  // Original text: \"Install it now!\"\n  xosanInstallIt: 'Şimdi kur!',\n\n  // Original text: \"Some hosts need their toolstack to be restarted before you can create an XOSAN\"\n  xosanNeedRestart: \"XOSAN oluşturmadan önce bazı sunucuların toolstack'ı yeniden başlatılmalı\",\n\n  // Original text: \"Restart toolstacks\"\n  xosanRestartAgents: \"toolstack'ları yeniden başlat\",\n\n  // Original text: \"Pool master is not running\"\n  xosanMasterOffline: \"Havuzun master'ı çalışmıyor\",\n\n  // Original text: \"Install XOSAN pack on {pool}\"\n  xosanInstallPackTitle: 'XOSAN paketini şuraya kur {pool}',\n\n  // Original text: \"Select at least 2 SRs\"\n  xosanSelect2Srs: 'En az 2 SR seçin',\n\n  // Original text: \"Layout\"\n  xosanLayout: 'Düzen',\n\n  // Original text: \"Redundancy\"\n  xosanRedundancy: 'Fazlalık',\n\n  // Original text: \"Capacity\"\n  xosanCapacity: 'Kapasite',\n\n  // Original text: \"Available space\"\n  xosanAvailableSpace: 'Kullanılabilir alan',\n\n  // Original text: \"* Can fail without data loss\"\n  xosanDiskLossLegend: '* Veri kaybı olmadan başarısız olabilir',\n\n  // Original text: \"Create\"\n  xosanCreate: 'Oluştur',\n\n  // Original text: \"Add\"\n  xosanAdd: 'Ekle',\n\n  // Original text: \"Installing XOSAN. Please wait…\"\n  xosanInstalling: 'XOSAN yükleniyor. Lütfen bekleyin...',\n\n  // Original text: \"No XOSAN available for Community Edition\"\n  xosanCommunity: 'Topluluk sürümünde XOSAN özelliği yoktur',\n\n  // Original text: \"New\"\n  xosanNew: 'Yeni',\n\n  // Original text: \"Advanced\"\n  xosanAdvanced: 'Gelişmiş',\n\n  // Original text: \"Remove subvolumes\"\n  xosanRemoveSubvolumes: \"Alt volume'leri kaldır\",\n\n  // Original text: \"Add subvolume…\"\n  xosanAddSubvolume: 'Alt volume ekle...',\n\n  // Original text: \"This version of XOSAN SR is from the first beta phase. You can keep using it, but to modify it you'll have to save your disks and re-create it.\"\n  xosanWarning:\n    \"XOSAN SR'nin bu versiyonu ilk beta sürümünden. Kullanmaya devam edebilirsiniz, ancak değiştirmek için disklerinizi kaydetmeniz ve yeniden oluşturmanız gerekir.\",\n\n  // Original text: \"VLAN\"\n  xosanVlan: 'VLAN',\n\n  // Original text: \"No XOSAN found\"\n  xosanNoSrs: 'XOSAN bulunamadı',\n\n  // Original text: \"Some SRs are detached from the XOSAN\"\n  xosanPbdsDetached: \"Bazı SR'ler XOSAN'dan ayrıldı\",\n\n  // Original text: \"Something is wrong with: {badStatuses}\"\n  xosanBadStatus: 'Şununla ilgili birşeyler yanlış: {badStatuses}',\n\n  // Original text: \"Running\"\n  xosanRunning: 'Çalışıyor',\n\n  // Original text: 'Update packs'\n  xosanUpdatePacks: undefined,\n\n  // Original text: 'Checking for updates'\n  xosanPackUpdateChecking: undefined,\n\n  // Original text: 'Error while checking XOSAN packs. Please make sure that the Cloud plugin is installed and loaded and that the updater is reachable.'\n  xosanPackUpdateError: undefined,\n\n  // Original text: 'XOSAN resources are unavailable'\n  xosanPackUpdateUnavailable: undefined,\n\n  // Original text: 'Not registered for XOSAN resources'\n  xosanPackUpdateUnregistered: undefined,\n\n  // Original text: \"✓ This pool's XOSAN packs are up to date!\"\n  xosanPackUpdateUpToDate: undefined,\n\n  // Original text: 'Update pool with latest pack v{version}'\n  xosanPackUpdateVersion: undefined,\n\n  // Original text: \"Delete XOSAN\"\n  xosanDelete: 'XOSAN sil',\n\n  // Original text: \"Fix\"\n  xosanFixIssue: 'Onar',\n\n  // Original text: \"Creating XOSAN on {pool}\"\n  xosanCreatingOn: '{pool} üzerinde XOSAN oluşturuluyor',\n\n  // Original text: \"Configuring network…\"\n  xosanState_configuringNetwork: 'Ağ yapılandırılıyor...',\n\n  // Original text: \"Importing VM…\"\n  xosanState_importingVm: 'VM içe aktarılıyor...',\n\n  // Original text: \"Copying VMs…\"\n  xosanState_copyingVms: \"VM'ler kopyalanıyor...\",\n\n  // Original text: \"Configuring VMs…\"\n  xosanState_configuringVms: \"VM'ler yapılandırılıyor...\",\n\n  // Original text: \"Configuring gluster…\"\n  xosanState_configuringGluster: 'Gluster yapılandırılıyor...',\n\n  // Original text: \"Creating SR…\"\n  xosanState_creatingSr: 'SR oluşturuluyor...',\n\n  // Original text: \"Scanning SR…\"\n  xosanState_scanningSr: 'SR taranıyor...',\n\n  // Original text: \"Install cloud plugin first\"\n  xosanInstallCloudPlugin: 'Önce XOA eklentisini kurun',\n\n  // Original text: \"Load cloud plugin first\"\n  xosanLoadCloudPlugin: 'Önce XOA eklentisini yükleyin',\n\n  // Original text: \"Register your appliance first\"\n  xosanRegister: \"Önce XOSAN'ın kaydını yapın\",\n\n  // Original text: \"Loading…\"\n  xosanLoading: 'Yükleniyor...',\n\n  // Original text: \"XOSAN is not available at the moment\"\n  xosanNotAvailable: 'XOSAN şuan kullanılabilir değil',\n\n  // Original text: \"No compatible XOSAN pack found for your XenServer versions.\"\n  xosanNoPackFound: 'XenServer sürümünüz ile uyumlu XOSAN paketi bulunamadı.',\n\n  // Original text: \"Some XOSAN Virtual Machines are not running\"\n  xosanVmsNotRunning: 'Bazı XOSAN Sanal Makinaları çalışmıyor',\n\n  // Original text: \"Some XOSAN Virtual Machines could not be found\"\n  xosanVmsNotFound: 'Bazı XOSAN Sanal Makinaları bulunamadı',\n\n  // Original text: \"Files needing healing\"\n  xosanFilesNeedingHealing: 'İyileştirme ihtiyacı olan dosyalar',\n\n  // Original text: \"Some XOSAN Virtual Machines have files needing healing\"\n  xosanFilesNeedHealing: 'Bazı XOSAN Sanal Makinalarında iyileştirilmesi gereken dosyalar var',\n\n  // Original text: \"Host {hostName} is not in XOSAN network\"\n  xosanHostNotInNetwork: '{hostName} sunucusu XOSAN ağında değil',\n\n  // Original text: \"VM controller\"\n  xosanVm: 'VM denetleyici',\n\n  // Original text: \"SR\"\n  xosanUnderlyingStorage: 'SR',\n\n  // Original text: \"Replace…\"\n  xosanReplace: 'Değiştir...',\n\n  // Original text: \"On same VM\"\n  xosanOnSameVm: 'Aynı VM üzerinde',\n\n  // Original text: \"Brick name\"\n  xosanBrickName: 'Brick adı',\n\n  // Original text: \"Brick UUID\"\n  xosanBrickUuid: 'Brick UUID',\n\n  // Original text: \"Brick size\"\n  xosanBrickSize: 'Brick boyutu',\n\n  // Original text: \"Memory size\"\n  xosanMemorySize: 'Bellek boyutu',\n\n  // Original text: \"Status\"\n  xosanStatus: 'Durum',\n\n  // Original text: \"Arbiter\"\n  xosanArbiter: 'Hakem',\n\n  // Original text: \"Used Inodes\"\n  xosanUsedInodes: 'Kullanılan düğümler',\n\n  // Original text: \"Block size\"\n  xosanBlockSize: 'Blok boyutu',\n\n  // Original text: \"Device\"\n  xosanDevice: 'Cihaz',\n\n  // Original text: \"FS name\"\n  xosanFsName: 'FS adı',\n\n  // Original text: \"Mount options\"\n  xosanMountOptions: 'Mount seçenekleri',\n\n  // Original text: \"Path\"\n  xosanPath: 'Yol',\n\n  // Original text: \"Job\"\n  xosanJob: 'İş',\n\n  // Original text: \"PID\"\n  xosanPid: 'PID',\n\n  // Original text: \"Port\"\n  xosanPort: 'Port',\n\n  // Original text: \"Missing values\"\n  xosanReplaceBrickErrorTitle: 'Eksik değerler',\n\n  // Original text: \"You need to select a SR and a size\"\n  xosanReplaceBrickErrorMessage: 'Bir SR ve bir boyut seçmelisiniz',\n\n  // Original text: \"Bad values\"\n  xosanAddSubvolumeErrorTitle: 'Kötü değerler',\n\n  // Original text: \"You need to select {nSrs, number} and a size\"\n  xosanAddSubvolumeErrorMessage: '{nSrs, number} ve bir boyut seçmelisiniz',\n\n  // Original text: \"Select {nSrs, number} SRs\"\n  xosanSelectNSrs: '{nSrs, number} SR seç',\n\n  // Original text: \"Run\"\n  xosanRun: 'Çalıştır',\n\n  // Original text: \"Remove\"\n  xosanRemove: 'Kaldır',\n\n  // Original text: \"Volume\"\n  xosanVolume: 'Volume',\n\n  // Original text: \"Volume options\"\n  xosanVolumeOptions: 'Volume seçenekleri',\n\n  // Original text: \"Could not find VM\"\n  xosanCouldNotFindVm: 'VM bulunamadı',\n\n  // Original text: \"Using {usage}\"\n  xosanUnderlyingStorageUsage: 'Kullanım {usage}',\n\n  // Original text: \"Custom IP network (/24)\"\n  xosanCustomIpNetwork: 'Özel IP ağı (/24)',\n\n  // Original text: \"Will configure the host xosan network device with a static IP address and plug it in.\"\n  xosanIssueHostNotInNetwork: 'Sunucu, xosan ağ cihazını statik bir IP adresiyle yapılandırır ve fişe takar.',\n\n  // Original text: \"Licenses\"\n  licensesTitle: 'Lisanslar',\n\n  // Original text: \"You are not registered and therefore will not be able to create or manage your XOSAN SRs. {link}\"\n  xosanUnregisteredDisclaimer: 'Kayıtlı değilsiniz ve bu nedenle XOSAN SR oluşturamaz veya yönetemezsiniz. {Link}',\n\n  // Original text: \"In order to create a XOSAN SR, you need to use the Xen Orchestra Appliance and buy a XOSAN license on {link}.\"\n  xosanSourcesDisclaimer:\n    \"Bir XOSAN SR oluşturmak için, XOA kullanmanız ve {link} 'ten bir XOSAN lisansı satın almanız gerekir.\",\n\n  // Original text: \"Register now!\"\n  registerNow: 'Şimdi kaydol!',\n\n  // Original text: \"You need to register your appliance to manage your licenses.\"\n  licensesUnregisteredDisclaimer: 'Lisanlarınızı yönetmek için kaydolmalısınız.',\n\n  // Original text: \"Product\"\n  licenseProduct: 'Ürün',\n\n  // Original text: \"Attached to\"\n  licenseBoundObject: 'Şuraya ekli',\n\n  // Original text: \"Purchaser\"\n  licensePurchaser: 'Müşteri',\n\n  // Original text: \"Expires\"\n  licenseExpires: 'Süre bitimi',\n\n  // Original text: \"You\"\n  licensePurchaserYou: 'Siz',\n\n  // Original text: \"Support\"\n  productSupport: 'Destek',\n\n  // Original text: \"No XOSAN attached\"\n  licenseNotBoundXosan: 'Ekli XOSAN yok',\n\n  // Original text: \"License attached to an unknown XOSAN\"\n  licenseBoundUnknownXosan: \"Lisans bilinmeyen bir XOSAN'a ekli\",\n\n  // Original text: \"Manage the licenses\"\n  licensesManage: 'Lisansları yönet',\n\n  // Original text: \"New license\"\n  newLicense: 'Yeni lisans',\n\n  // Original text: \"Refresh\"\n  refreshLicenses: 'Yenile',\n\n  // Original text: \"Limited size because XOSAN is in trial\"\n  xosanLicenseRestricted: 'Limitli boyut çünkü XOSAN deneme sürecinde',\n\n  // Original text: \"You need a license on this SR to manage the XOSAN.\"\n  xosanAdminNoLicenseDisclaimer: \"XOSAN'ı yönetmek için bu SR üzerinde bir lisansa ihtiyacınız var.\",\n\n  // Original text: \"Your XOSAN license has expired. You can still use the SR but cannot administrate it anymore.\"\n  xosanAdminExpiredLicenseDisclaimer:\n    \"XOSAN lisansınızın süresi doldu. SR'yi hala kullanabilirsiniz ancak artık yönetemezsiniz.\",\n\n  // Original text: \"Could not check the license on this XOSAN SR\"\n  xosanCheckLicenseError: \"Bu XOSAN SR'deki lisans kontrol edilemedi\",\n\n  // Original text: \"Could not fetch licenses\"\n  getLicensesError: 'Lisans alınamadı',\n\n  // Original text: \"License has expired.\"\n  xosanLicenseHasExpired: \"Lisnas'ın süresi doldu\",\n\n  // Original text: \"License expires on {date}.\"\n  licenseExpiresDate: 'Lisans {date} tarihinde bitecek.',\n\n  // Original text: \"Update the license now!\"\n  updateLicenseMessage: \"Lisans'ı şimdi güncelle!\",\n\n  // Original text: \"Unknown XOSAN SR.\"\n  xosanUnknownSr: 'Bilinmeyen XOSAN SR',\n\n  // Original text: \"Contact us!\"\n  contactUs: 'Bizimle iletişime geçin!',\n\n  // Original text: \"No license.\"\n  xosanNoLicense: 'Lisans yok.',\n\n  // Original text: \"Unlock now!\"\n  unlockNow: 'Şimdi kilidi kaldır!',\n\n  // Original text: \"Select a license\"\n  selectLicense: 'Bir lisans seç',\n\n  // Original text: \"Bind license\"\n  bindLicense: \"Lisans'ı bağla\",\n\n  // Original text: \"expires on {date}\"\n  expiresOn: '{date} tarihinde bitecek',\n\n  // Original text: \"Install XOA plugin first\"\n  xosanInstallXoaPlugin: 'Önce XOA eklentisini kurun',\n\n  // Original text: \"Load XOA plugin first\"\n  xosanLoadXoaPlugin: 'Önce XOA eklentisini yükleyin',\n\n  // Original text: '{seconds, plural, one {# second} other {# seconds}}'\n  secondsFormat: undefined,\n\n  // Original text: \"{days, plural, =0 {} one {# day } other {# days }}{hours, plural, =0 {} one {# hour } other {# hours }}{minutes, plural, =0 {} one {# minute } other {# minutes }}{seconds, plural, =0 {} one {# second} other {# seconds}}\"\n  durationFormat:\n    '{days, plural, =0 {} one {# day } other {# days }}{hours, plural, =0 {} one {# hour } other {# hours }}{minutes, plural, =0 {} one {# minute } other {# minutes }}{seconds, plural, =0 {} one {# second} other {# seconds}}',\n}\n","// See http://momentjs.com/docs/#/use-it/browserify/\nimport 'moment/locale/zh-cn'\n\nimport reactIntlData from 'react-intl/locale-data/zh'\nimport { addLocaleData } from 'react-intl'\naddLocaleData(reactIntlData)\n\n// ===================================================================\n\nexport default {\n  // Original text: \"Long click to edit\"\n  editableLongClickPlaceholder: '长按编辑',\n\n  // Original text: \"Click to edit\"\n  editableClickPlaceholder: '点击编辑',\n\n  // Original text: \"OK\"\n  alertOk: '确认',\n\n  // Original text: \"OK\"\n  confirmOk: '确认',\n\n  // Original text: \"Cancel\"\n  confirmCancel: '取消',\n\n  // Original text: \"On error\"\n  onError: '出现错误',\n\n  // Original text: \"Successful\"\n  successful: '成功',\n\n  // Original text: \"Home\"\n  homePage: '主页',\n\n  // Original text: \"Dashboard\"\n  dashboardPage: '仪表盘',\n\n  // Original text: \"Overview\"\n  overviewDashboardPage: '概览',\n\n  // Original text: \"Visualizations\"\n  overviewVisualizationDashboardPage: '虚拟化',\n\n  // Original text: \"Statistics\"\n  overviewStatsDashboardPage: '状态统计',\n\n  // Original text: \"Health\"\n  overviewHealthDashboardPage: '健康状态',\n\n  // Original text: \"Self service\"\n  selfServicePage: '自助服务',\n\n  // Original text: \"Dashboard\"\n  selfServiceDashboardPage: '仪表盘',\n\n  // Original text: \"Administration\"\n  selfServiceAdminPage: '管理',\n\n  // Original text: \"Backup\"\n  backupPage: '备份',\n\n  // Original text: \"Jobs\"\n  jobsPage: '任务',\n\n  // Original text: \"Updates\"\n  updatePage: '更新',\n\n  // Original text: \"Settings\"\n  settingsPage: '设置',\n\n  // Original text: \"Servers\"\n  settingsServersPage: '服务器',\n\n  // Original text: \"Users\"\n  settingsUsersPage: '用户',\n\n  // Original text: \"Groups\"\n  settingsGroupsPage: '组',\n\n  // Original text: \"ACLs\"\n  settingsAclsPage: '访问控制',\n\n  // Original text: \"Plugins\"\n  settingsPluginsPage: '插件',\n\n  // Original text: \"About\"\n  aboutPage: '关于',\n\n  // Original text: \"New\"\n  newMenu: '新建',\n\n  // Original text: \"Tasks\"\n  taskMenu: '任务',\n\n  // Original text: \"Tasks\"\n  taskPage: '任务',\n\n  // Original text: \"VM\"\n  newVmPage: '虚拟机',\n\n  // Original text: \"Storage\"\n  newSrPage: '存储',\n\n  // Original text: \"Server\"\n  newServerPage: '服务器',\n\n  // Original text: \"Import\"\n  newImport: '导入',\n\n  // Original text: \"Overview\"\n  backupOverviewPage: '概览',\n\n  // Original text: \"New\"\n  backupNewPage: '新建',\n\n  // Original text: \"Remotes\"\n  backupRemotesPage: '远程',\n\n  // Original text: \"Restore\"\n  backupRestorePage: '恢复',\n\n  // Original text: \"Schedule\"\n  schedule: '计划',\n\n  // Original text: \"New VM backup\"\n  newVmBackup: '新建虚拟机备份',\n\n  // Original text: \"Edit VM backup\"\n  editVmBackup: '编辑虚拟机备份',\n\n  // Original text: \"Backup\"\n  backup: '备份',\n\n  // Original text: \"Rolling Snapshot\"\n  rollingSnapshot: '滚动快照',\n\n  // Original text: \"Delta Backup\"\n  deltaBackup: '差异备份',\n\n  // Original text: \"Disaster Recovery\"\n  disasterRecovery: '灾难恢复',\n\n  // Original text: \"Continuous Replication\"\n  continuousReplication: '持续复制',\n\n  // Original text: \"Overview\"\n  jobsOverviewPage: '概览',\n\n  // Original text: \"New\"\n  jobsNewPage: '新建',\n\n  // Original text: \"Scheduling\"\n  jobsSchedulingPage: '计划',\n\n  // Original text: \"Custom Job\"\n  customJob: '自定义任务',\n\n  // Original text: \"User\"\n  userPage: '用户',\n\n  // Original text: \"Sign out\"\n  signOut: '注销',\n\n  // Original text: \"Fetching data…\"\n  homeFetchingData: '获取数据',\n\n  // Original text: \"Welcome on Xen Orchestra!\"\n  homeWelcome: '欢迎使用Xen Orchestra',\n\n  // Original text: \"Add your XCP-ng hosts or pools\"\n  homeWelcomeText: '添加您的XenServer主机或资源池',\n\n  // Original text: \"Want some help?\"\n  homeHelp: '需要帮助？',\n\n  // Original text: \"Add server\"\n  homeAddServer: '添加服务器',\n\n  // Original text: \"Online Doc\"\n  homeOnlineDoc: '在线文档',\n\n  // Original text: \"Pro Support\"\n  homeProSupport: '专业支持',\n\n  // Original text: \"There are no VMs!\"\n  homeNoVms: '没有可用的虚拟机',\n\n  // Original text: \"Or…\"\n  homeNoVmsOr: '或',\n\n  // Original text: \"Import VM\"\n  homeImportVm: '导入虚拟机',\n\n  // Original text: \"Import an existing VM in xva format\"\n  homeImportVmMessage: '导入一个XVA格式的虚拟机',\n\n  // Original text: \"Restore a backup\"\n  homeRestoreBackup: '恢复到备份',\n\n  // Original text: \"Restore a backup from a remote store\"\n  homeRestoreBackupMessage: '恢复到远程存储上的备份',\n\n  // Original text: \"This will create a new VM\"\n  homeNewVmMessage: '将创建一个新的虚拟机',\n\n  // Original text: \"Filters\"\n  homeFilters: '过滤器',\n\n  // Original text: \"Pool\"\n  homeTypePool: '资源池',\n\n  // Original text: \"Host\"\n  homeTypeHost: '主机',\n\n  // Original text: \"VM\"\n  homeTypeVm: '虚拟机',\n\n  // Original text: \"SR\"\n  homeTypeSr: '数据存储',\n\n  // Original text: \"VDI\"\n  homeTypeVdi: '虚拟硬盘',\n\n  // Original text: \"Sort\"\n  homeSort: '排序',\n\n  // Original text: \"Pools\"\n  homeAllPools: '资源池',\n\n  // Original text: \"Hosts\"\n  homeAllHosts: '主机',\n\n  // Original text: \"Tags\"\n  homeAllTags: '标签',\n\n  // Original text: \"New VM\"\n  homeNewVm: '新建虚拟机',\n\n  // Original text: \"Running hosts\"\n  homeFilterRunningHosts: '正在运行的主机',\n\n  // Original text: \"Disabled hosts\"\n  homeFilterDisabledHosts: '不可用的主机',\n\n  // Original text: \"Running VMs\"\n  homeFilterRunningVms: '正在运行的虚拟机',\n\n  // Original text: \"Non running VMs\"\n  homeFilterNonRunningVms: '未运行的虚拟机',\n\n  // Original text: \"Pending VMs\"\n  homeFilterPendingVms: '正在创建的虚拟机',\n\n  // Original text: \"HVM guests\"\n  homeFilterHvmGuests: 'HVM客户机',\n\n  // Original text: \"Tags\"\n  homeFilterTags: '标签',\n\n  // Original text: \"Sort by\"\n  homeSortBy: '排序方式',\n\n  // Original text: \"Name\"\n  homeSortByName: '名称',\n\n  // Original text: \"Power state\"\n  homeSortByPowerstate: '电源状态',\n\n  // Original text: \"RAM\"\n  homeSortByRAM: '内存',\n\n  // Original text: \"vCPUs\"\n  homeSortByvCPUs: '虚拟机CPU',\n\n  // Original text: \"CPUs\"\n  homeSortByCpus: 'CPU',\n\n  // Original text: \"{displayed, number}x {icon} (on {total, number})\"\n  homeDisplayedItems: undefined,\n\n  // Original text: \"{selected, number}x {icon} selected (on {total, number})\"\n  homeSelectedItems: undefined,\n\n  // Original text: \"More\"\n  homeMore: '更多',\n\n  // Original text: \"Migrate to…\"\n  homeMigrateTo: '迁移至…',\n\n  // Original text: \"Missing patches\"\n  homeMissingPatches: '缺少补丁',\n\n  // Original text: \"High Availability\"\n  highAvailability: '高可用',\n\n  // Original text: \"Add\"\n  add: '添加',\n\n  // Original text: \"Remove\"\n  remove: '删除',\n\n  // Original text: \"Preview\"\n  preview: '预览',\n\n  // Original text: \"Item\"\n  item: '项',\n\n  // Original text: \"No selected value\"\n  noSelectedValue: '没有选择的值',\n\n  // Original text: \"Choose user(s) and/or group(s)\"\n  selectSubjects: '选择用户和/或用户组',\n\n  // Original text: \"Select Object(s)…\"\n  selectObjects: '选择对象',\n\n  // Original text: \"Choose a role\"\n  selectRole: '选择一个角色',\n\n  // Original text: \"Select Host(s)…\"\n  selectHosts: '选择主机',\n\n  // Original text: \"Select object(s)…\"\n  selectHostsVms: '选择虚拟机',\n\n  // Original text: \"Select Network(s)…\"\n  selectNetworks: '选择网络',\n\n  // Original text: \"Select PIF(s)…\"\n  selectPifs: '选择网卡',\n\n  // Original text: \"Select Pool(s)…\"\n  selectPools: '选择资源池',\n\n  // Original text: \"Select Remote(s)…\"\n  selectRemotes: '选择远程',\n\n  // Original text: \"Select resource set(s)…\"\n  selectResourceSets: '选择资源集',\n\n  // Original text: \"Select template(s)…\"\n  selectResourceSetsVmTemplate: '选择模板',\n\n  // Original text: \"Select SR(s)…\"\n  selectResourceSetsSr: '选择数据存储',\n\n  // Original text: \"Select network(s)…\"\n  selectResourceSetsNetwork: '选择网络',\n\n  // Original text: \"Select disk(s)…\"\n  selectResourceSetsVdi: '选择硬盘',\n\n  // Original text: \"Select SR(s)…\"\n  selectSrs: '选择数据存储',\n\n  // Original text: \"Select VM(s)…\"\n  selectVms: '选择虚拟机',\n\n  // Original text: \"Select VM template(s)…\"\n  selectVmTemplates: '选择虚拟机模板',\n\n  // Original text: \"Select tag(s)…\"\n  selectTags: '选择标签',\n\n  // Original text: \"Select disk(s)…\"\n  selectVdis: '选择硬盘',\n\n  // Original text: \"Fill required informations.\"\n  fillRequiredInformations: '填写需要的信息',\n\n  // Original text: \"Fill informations (optional)\"\n  fillOptionalInformations: '填写信息',\n\n  // Original text: \"Reset\"\n  selectTableReset: '重置',\n\n  // Original text: \"Month\"\n  schedulingMonth: '月',\n\n  // Original text: \"Every month\"\n  schedulingEveryMonth: '每月',\n\n  // Original text: \"Each selected month\"\n  schedulingEachSelectedMonth: '每个选定月份',\n\n  // Original text: \"Day of the month\"\n  schedulingMonthDay: '本月的一天',\n\n  // Original text: \"Every day\"\n  schedulingEveryMonthDay: '每天',\n\n  // Original text: \"Each selected day\"\n  schedulingEachSelectedMonthDay: '每个选定天',\n\n  // Original text: \"Day of the week\"\n  schedulingWeekDay: '本周的一天',\n\n  // Original text: \"Every day\"\n  schedulingEveryWeekDay: '每天',\n\n  // Original text: \"Each selected day\"\n  schedulingEachSelectedWeekDay: '每个选定天',\n\n  // Original text: \"Hour\"\n  schedulingHour: '小时',\n\n  // Original text: \"Every hour\"\n  schedulingEveryHour: '每小时',\n\n  // Original text: \"Every N hour\"\n  schedulingEveryNHour: '每N小时',\n\n  // Original text: \"Each selected hour\"\n  schedulingEachSelectedHour: '每个选定小时',\n\n  // Original text: \"Minute\"\n  schedulingMinute: '分钟',\n\n  // Original text: \"Every minute\"\n  schedulingEveryMinute: '每分钟',\n\n  // Original text: \"Every N minute\"\n  schedulingEveryNMinute: '每N分钟',\n\n  // Original text: \"Each selected minute\"\n  schedulingEachSelectedMinute: '每个选定分钟',\n\n  // Original text: \"Reset\"\n  schedulingReset: '重置',\n\n  // Original text: \"Unknown\"\n  unknownSchedule: '未知',\n\n  // Original text: \"Cannot edit backup\"\n  backupEditNotFoundTitle: '不能编辑备份',\n\n  // Original text: \"Missing required info for edition\"\n  backupEditNotFoundMessage: '缺少版本所需要的信息',\n\n  // Original text: \"Job\"\n  job: '任务',\n\n  // Original text: \"Job ID\"\n  jobId: '任务ID',\n\n  // Original text: \"Name\"\n  jobName: '名称',\n\n  // Original text: \"Start\"\n  jobStart: '开始',\n\n  // Original text: \"End\"\n  jobEnd: '结束',\n\n  // Original text: \"Duration\"\n  jobDuration: '周期',\n\n  // Original text: \"Status\"\n  jobStatus: '状态',\n\n  // Original text: \"Action\"\n  jobAction: '行为',\n\n  // Original text: \"Tag\"\n  jobTag: '标签',\n\n  // Original text: \"Scheduling\"\n  jobScheduling: '计划',\n\n  // Original text: \"State\"\n  jobState: '状态',\n\n  // Original text: \"Run job\"\n  runJob: '运行任务',\n\n  // Original text: \"One shot running started. See overview for logs.\"\n  runJobVerbose: '开始一次运行，可查看概要日志',\n\n  // Original text: \"Started\"\n  jobStarted: '已经开始',\n\n  // Original text: \"Finished\"\n  jobFinished: '已完成',\n\n  // Original text: \"Save\"\n  saveBackupJob: '保存',\n\n  // Original text: \"Remove backup job\"\n  deleteBackupSchedule: '删除备份任务',\n\n  // Original text: \"Are you sure you want to delete this backup job?\"\n  deleteBackupScheduleQuestion: '你确认你要删除这个备份任务吗？',\n\n  // Original text: \"Enable immediately after creation\"\n  scheduleEnableAfterCreation: '创建后立即启用',\n\n  // Original text: \"You are editing Schedule {name} ({id}). Saving will override previous schedule state.\"\n  scheduleEditMessage: '你正在编辑计划{name} ({id}).保存将覆盖前一个计划状态.',\n\n  // Original text: \"You are editing job {name} ({id}). Saving will override previous job state.\"\n  jobEditMessage: '你正在编辑任务{name} ({id}).保存将覆盖前一个任务状态',\n\n  // Original text: \"No scheduled jobs.\"\n  noScheduledJobs: '没有计划任务',\n\n  // Original text: \"No jobs found.\"\n  noJobs: '未找到任务',\n\n  // Original text: \"No schedules found\"\n  noSchedules: '未找到计划',\n\n  // Original text: \"Select a xo-server API command\"\n  jobActionPlaceHolder: '选择一个xo-server API 命令',\n\n  // Original text: \"Select your backup type:\"\n  newBackupSelection: '选择你的备份类型',\n\n  // Original text: \"Remote stores for backup\"\n  remoteList: '远程备份存储',\n\n  // Original text: \"New File System Remote\"\n  newRemote: '新建远程文件系统',\n\n  // Original text: \"Local\"\n  remoteTypeLocal: '本地',\n\n  // Original text: \"NFS\"\n  remoteTypeNfs: 'NFS',\n\n  // Original text: \"SMB\"\n  remoteTypeSmb: 'SMB',\n\n  // Original text: \"Type\"\n  remoteType: '类型',\n\n  // Original text: \"Test your remote\"\n  remoteTestTip: '测试你的远程配置',\n\n  // Original text: \"Test Remote\"\n  testRemote: '测试远程配置',\n\n  // Original text: \"Test failed for {name}\"\n  remoteTestFailure: '失败的测试项 {name}',\n\n  // Original text: \"Test passed for {name}\"\n  remoteTestSuccess: '通过的测试项{name}',\n\n  // Original text: \"Error\"\n  remoteTestError: '错误',\n\n  // Original text: \"Test Step\"\n  remoteTestStep: '测试步骤',\n\n  // Original text: \"Test file\"\n  remoteTestFile: '测试文件',\n\n  // Original text: \"The remote appears to work correctly\"\n  remoteTestSuccessMessage: '远程配置运行正常',\n\n  // Original text: \"Create a new SR\"\n  newSrTitle: '创建一个新的数据存储',\n\n  // Original text: \"General\"\n  newSrGeneral: '常规',\n\n  // Original text: \"Select Strorage Type:\"\n  newSrTypeSelection: '选择存储类型',\n\n  // Original text: \"Settings\"\n  newSrSettings: '设置',\n\n  // Original text: \"Storage Usage\"\n  newSrUsage: '存储利用率',\n\n  // Original text: \"Summary\"\n  newSrSummary: '综述',\n\n  // Original text: \"Host\"\n  newSrHost: '主机',\n\n  // Original text: \"Type\"\n  newSrType: '类型',\n\n  // Original text: \"Name\"\n  newSrName: '名称',\n\n  // Original text: \"Description\"\n  newSrDescription: '描述',\n\n  // Original text: \"Server\"\n  newSrServer: '服务器',\n\n  // Original text: \"Path\"\n  newSrPath: '路径',\n\n  // Original text: \"IQN\"\n  newSrIqn: 'IQN',\n\n  // Original text: \"LUN\"\n  newSrLun: 'LUN',\n\n  // Original text: \"with auth.\"\n  newSrAuth: '启用认证',\n\n  // Original text: \"User Name\"\n  newSrUsername: '用户名',\n\n  // Original text: \"Password\"\n  newSrPassword: '密码',\n\n  // Original text: \"Device\"\n  newSrDevice: '设备',\n\n  // Original text: \"in use\"\n  newSrInUse: '使用中',\n\n  // Original text: \"Size\"\n  newSrSize: '大小',\n\n  // Original text: \"Create\"\n  newSrCreate: '创建',\n\n  // Original text: \"Users/Groups\"\n  subjectName: '用户/组',\n\n  // Original text: \"Object\"\n  objectName: '对象',\n\n  // Original text: \"Role\"\n  roleName: '角色',\n\n  // Original text: \"New Group Name\"\n  newGroupName: '新建组名',\n\n  // Original text: \"Create Group\"\n  createGroup: '创建组',\n\n  // Original text: \"Create\"\n  createGroupButton: '创建',\n\n  // Original text: \"Delete Group\"\n  deleteGroup: '删除组',\n\n  // Original text: \"Are you sure you want to delete this group?\"\n  deleteGroupConfirm: '你确定要删除该组？',\n\n  // Original text: \"Remove user from Group\"\n  removeUserFromGroup: '从组中删除用户',\n\n  // Original text: \"Are you sure you want to delete this user?\"\n  deleteUserConfirm: '你确定要删除该用户？',\n\n  // Original text: \"Delete User\"\n  deleteUser: '删除用户',\n\n  // Original text: \"unknown user\"\n  unknownUser: '未知用户',\n\n  // Original text: \"No group found\"\n  noGroupFound: '没有找到组',\n\n  // Original text: \"Name\"\n  groupNameColumn: '名称',\n\n  // Original text: \"Users\"\n  groupUsersColumn: '用户',\n\n  // Original text: \"Add User\"\n  addUserToGroupColumn: '增加用户',\n\n  // Original text: \"Email\"\n  userNameColumn: '邮件',\n\n  // Original text: \"Permissions\"\n  userPermissionColumn: '权限',\n\n  // Original text: \"Password\"\n  userPasswordColumn: '密码',\n\n  // Original text: \"Email\"\n  userName: '邮件',\n\n  // Original text: \"Password\"\n  userPassword: '密码',\n\n  // Original text: \"Create\"\n  createUserButton: '创建',\n\n  // Original text: \"No user found\"\n  noUserFound: '没有找到用户',\n\n  // Original text: \"User\"\n  userLabel: '用户',\n\n  // Original text: \"Admin\"\n  adminLabel: '管理',\n\n  // Original text: \"No user in group\"\n  noUserInGroup: '组中没有用户',\n\n  // Original text: \"{users} user{users, plural, one {} other {s}}\"\n  countUsers: '{users} 用户{users, plural, one {} 其他 {s}}',\n\n  // Original text: \"Select Permission\"\n  selectPermission: '选择权限',\n\n  // Original text: \"Auto-load at server start\"\n  autoloadPlugin: '服务器启动时自动加载',\n\n  // Original text: \"Save configuration\"\n  savePluginConfiguration: '保存配置',\n\n  // Original text: \"Delete configuration\"\n  deletePluginConfiguration: '删除配置',\n\n  // Original text: \"Plugin error\"\n  pluginError: '插件错误',\n\n  // Original text: \"Unknown error\"\n  unknownPluginError: '未知错误',\n\n  // Original text: \"Purge plugin configuration\"\n  purgePluginConfiguration: '清除插件配置',\n\n  // Original text: \"Are you sure you want to purge this configuration ?\"\n  purgePluginConfigurationQuestion: '你确定要清除此配置？',\n\n  // Original text: \"Edit\"\n  editPluginConfiguration: '编辑',\n\n  // Original text: \"Cancel\"\n  cancelPluginEdition: '取消',\n\n  // Original text: \"Plugin configuration\"\n  pluginConfigurationSuccess: '插件配置',\n\n  // Original text: \"Plugin configuration successfully saved!\"\n  pluginConfigurationChanges: '插件配置保存成功',\n\n  // Original text: \"Start\"\n  startVmLabel: '启动',\n\n  // Original text: \"Recovery start\"\n  recoveryModeLabel: '恢复启动',\n\n  // Original text: \"Suspend\"\n  suspendVmLabel: '暂停',\n\n  // Original text: \"Stop\"\n  stopVmLabel: '关机',\n\n  // Original text: \"Force shutdown\"\n  forceShutdownVmLabel: '强制关机',\n\n  // Original text: \"Reboot\"\n  rebootVmLabel: '重启',\n\n  // Original text: \"Force reboot\"\n  forceRebootVmLabel: '强制重启',\n\n  // Original text: \"Delete\"\n  deleteVmLabel: '删除',\n\n  // Original text: \"Migrate\"\n  migrateVmLabel: '迁移',\n\n  // Original text: \"Snapshot\"\n  snapshotVmLabel: '快照',\n\n  // Original text: \"Export\"\n  exportVmLabel: '导出',\n\n  // Original text: \"Resume\"\n  resumeVmLabel: '恢复',\n\n  // Original text: \"Copy\"\n  copyVmLabel: '复制',\n\n  // Original text: \"Clone\"\n  cloneVmLabel: '克隆',\n\n  // Original text: \"Fast clone\"\n  fastCloneVmLabel: '快速克隆',\n\n  // Original text: \"Convert to template\"\n  convertVmToTemplateLabel: '转换成模板',\n\n  // Original text: \"Console\"\n  vmConsoleLabel: '控制台',\n\n  // Original text: \"Rescan all disks\"\n  srRescan: '重新扫描所有磁盘',\n\n  // Original text: \"Connect to all hosts\"\n  srReconnectAll: '连接所有主机',\n\n  // Original text: \"Disconnect to all hosts\"\n  srDisconnectAll: '断开所有主机',\n\n  // Original text: \"Forget this SR\"\n  srForget: '移除此数据存储',\n\n  // Original text: \"Remove this SR\"\n  srRemoveButton: '删除此数据存储',\n\n  // Original text: \"No VDIs in this storage\"\n  srNoVdis: '此存储中没有VDI',\n\n  // Original text: \"Hosts\"\n  hostsTabName: '主机',\n\n  // Original text: \"High Availability\"\n  poolHaStatus: '高可用',\n\n  // Original text: \"Enabled\"\n  poolHaEnabled: '启用',\n\n  // Original text: \"Disabled\"\n  poolHaDisabled: '禁用',\n\n  // Original text: \"Name\"\n  hostNameLabel: '名称',\n\n  // Original text: \"Description\"\n  hostDescription: '描述',\n\n  // Original text: \"Memory\"\n  hostMemory: '内存',\n\n  // Original text: \"No hosts\"\n  noHost: '没有主机',\n\n  // Original text: \"Name\"\n  poolNetworkNameLabel: '名称',\n\n  // Original text: \"Description\"\n  poolNetworkDescription: '描述',\n\n  // Original text: \"PIFs\"\n  poolNetworkPif: 'PIFs',\n\n  // Original text: \"No networks\"\n  poolNoNetwork: '没有网络',\n\n  // Original text: \"MTU\"\n  poolNetworkMTU: 'MTU',\n\n  // Original text: \"Connected\"\n  poolNetworkPifAttached: '已连接',\n\n  // Original text: \"Disconnected\"\n  poolNetworkPifDetached: '未连接',\n\n  // Original text: \"Add SR\"\n  addSrLabel: '添加数据存储',\n\n  // Original text: \"Add VM\"\n  addVmLabel: '添加虚拟机',\n\n  // Original text: \"Add Host\"\n  addHostLabel: '添加主机',\n\n  // Original text: \"Disconnect\"\n  disconnectServer: '断开',\n\n  // Original text: \"Start\"\n  startHostLabel: '启动',\n\n  // Original text: \"Stop\"\n  stopHostLabel: '关机',\n\n  // Original text: \"Enable\"\n  enableHostLabel: '启用',\n\n  // Original text: \"Disable\"\n  disableHostLabel: '禁用',\n\n  // Original text: \"Restart toolstack\"\n  restartHostAgent: '重启toolstack',\n\n  // Original text: \"Force reboot\"\n  forceRebootHostLabel: '强制重启',\n\n  // Original text: \"Reboot\"\n  rebootHostLabel: '重启',\n\n  // Original text: \"Emergency mode\"\n  emergencyModeLabel: '紧急模式',\n\n  // Original text: \"Storage\"\n  storageTabName: '存储',\n\n  // Original text: \"Patches\"\n  patchesTabName: '补丁',\n\n  // Original text: \"Load average\"\n  statLoad: '负载平衡',\n\n  // Original text: \"Hardware\"\n  hardwareHostSettingsLabel: '硬件',\n\n  // Original text: \"Address\"\n  hostAddress: '地址',\n\n  // Original text: \"Status\"\n  hostStatus: '状态',\n\n  // Original text: \"Build number\"\n  hostBuildNumber: '版本号',\n\n  // Original text: \"iSCSI name\"\n  hostIscsiName: 'iSCSI名称',\n\n  // Original text: \"Version\"\n  hostXenServerVersion: '版本',\n\n  // Original text: \"Enabled\"\n  hostStatusEnabled: '启用',\n\n  // Original text: \"Disabled\"\n  hostStatusDisabled: '禁用',\n\n  // Original text: \"Power on mode\"\n  hostPowerOnMode: '开机模式',\n\n  // Original text: \"Host uptime\"\n  hostStartedSince: '系统启动时间',\n\n  // Original text: \"Toolstack uptime\"\n  hostStackStartedSince: 'Toolstack启动时间',\n\n  // Original text: \"CPU model\"\n  hostCpusModel: 'CPU型号',\n\n  // Original text: \"Core (socket)\"\n  hostCpusNumber: '核 (socket)',\n\n  // Original text: \"Manufacturer info\"\n  hostManufacturerinfo: '制造商信息',\n\n  // Original text: \"BIOS info\"\n  hostBiosinfo: 'BIOS 信息',\n\n  // Original text: \"Licence\"\n  licenseHostSettingsLabel: '授权',\n\n  // Original text: \"Type\"\n  hostLicenseType: '类型',\n\n  // Original text: \"Socket\"\n  hostLicenseSocket: '插槽',\n\n  // Original text: \"Expiry\"\n  hostLicenseExpiry: '过期',\n\n  // Original text: \"Add a network\"\n  networkCreateButton: '新建一个网络',\n\n  // Original text: \"Device\"\n  pifDeviceLabel: '设备',\n\n  // Original text: \"Network\"\n  pifNetworkLabel: '网络',\n\n  // Original text: \"VLAN\"\n  pifVlanLabel: 'VLAN',\n\n  // Original text: \"Address\"\n  pifAddressLabel: '地址',\n\n  // Original text: \"MAC\"\n  pifMacLabel: 'MAC',\n\n  // Original text: \"MTU\"\n  pifMtuLabel: 'MTU',\n\n  // Original text: \"Status\"\n  pifStatusLabel: '状态',\n\n  // Original text: \"Connected\"\n  pifStatusConnected: '已连接',\n\n  // Original text: \"Disconnected\"\n  pifStatusDisconnected: '未连接',\n\n  // Original text: \"No physical interface detected\"\n  pifNoInterface: '没有检测到物理接口',\n\n  // Original text: \"Add a storage\"\n  addSrDeviceButton: '新建存储',\n\n  // Original text: \"Name\"\n  srNameLabel: '名称',\n\n  // Original text: \"Type\"\n  srType: '类型',\n\n  // Original text: \"Status\"\n  pdbStatus: '状态',\n\n  // Original text: \"Connected\"\n  pbdStatusConnected: '已连接',\n\n  // Original text: \"Disconnected\"\n  pbdStatusDisconnected: '未连接',\n\n  // Original text: \"Shared\"\n  srShared: '已共享',\n\n  // Original text: \"Not shared\"\n  srNotShared: '未共享',\n\n  // Original text: \"No storage detected\"\n  pbdNoSr: '未检测到存储',\n\n  // Original text: \"Name\"\n  patchNameLabel: '名称',\n\n  // Original text: \"Install all patches\"\n  patchUpdateButton: '安装所有补丁',\n\n  // Original text: \"Description\"\n  patchDescription: '描述',\n\n  // Original text: \"Applied date\"\n  patchApplied: '应用日期',\n\n  // Original text: \"Size\"\n  patchSize: '大小',\n\n  // Original text: \"Status\"\n  patchStatus: '状态',\n\n  // Original text: \"Applied\"\n  patchStatusApplied: '已应用',\n\n  // Original text: \"Missing patches\"\n  patchStatusNotApplied: '缺少补丁',\n\n  // Original text: \"No patch detected\"\n  patchNothing: '未检测到补丁',\n\n  // Original text: \"Release date\"\n  patchReleaseDate: '发布日期',\n\n  // Original text: \"Guidance\"\n  patchGuidance: '导航',\n\n  // Original text: \"Action\"\n  patchAction: '操作',\n\n  // Original text: \"Applied patches\"\n  hostAppliedPatches: '已应用补丁',\n\n  // Original text: \"Missing patches\"\n  hostMissingPatches: '缺少补丁',\n\n  // Original text: \"Host up-to-date!\"\n  hostUpToDate: '主机补丁为最新',\n\n  // Original text: \"Refresh patches\"\n  refreshPatches: '刷新补丁包',\n\n  // Original text: \"Install pool patches\"\n  installPoolPatches: '安装池补丁',\n\n  // Original text: \"General\"\n  generalTabName: '常规',\n\n  // Original text: \"Stats\"\n  statsTabName: '状态',\n\n  // Original text: \"Console\"\n  consoleTabName: '控制台',\n\n  // Original text: \"Snapshots\"\n  snapshotsTabName: '快照',\n\n  // Original text: \"Logs\"\n  logsTabName: '日志',\n\n  // Original text: \"Advanced\"\n  advancedTabName: '高级',\n\n  // Original text: \"Network\"\n  networkTabName: '网络',\n\n  // Original text: \"Disk{disks, plural, one {} other {s}}\"\n  disksTabName: '磁盘{disks, plural, one {} 其他 {s}}',\n\n  // Original text: \"halted\"\n  powerStateHalted: '已停止',\n\n  // Original text: \"running\"\n  powerStateRunning: '正在运行',\n\n  // Original text: \"suspended\"\n  powerStateSuspended: '已暂停',\n\n  // Original text: \"No Xen tools detected\"\n  vmStatus: '没有检测到Xen Tools',\n\n  // Original text: \"No IPv4 record\"\n  vmName: '没有IPv4记录',\n\n  // Original text: \"No IP record\"\n  vmDescription: '没有IP记录',\n\n  // Original text: \"Started {ago}\"\n  vmSettings: '已启动 {ago}',\n\n  // Original text: \"Current status:\"\n  vmCurrentStatus: '当前状态',\n\n  // Original text: \"Not running\"\n  vmNotRunning: '没有运行',\n\n  // Original text: \"No Xen tools detected\"\n  noToolsDetected: '没有检测到Xen Tools',\n\n  // Original text: \"No IPv4 record\"\n  noIpv4Record: '没有IPv4记录',\n\n  // Original text: \"No IP record\"\n  noIpRecord: '没有IP记录',\n\n  // Original text: \"Started {ago}\"\n  started: '已启动 {ago}',\n\n  // Original text: \"Paravirtualization (PV)\"\n  paraVirtualizedMode: '半虚拟化 (PV)',\n\n  // Original text: \"Hardware virtualization (HVM)\"\n  hardwareVirtualizedMode: '硬件虚拟化 (HVM)',\n\n  // Original text: \"CPU usage\"\n  statsCpu: 'CPU利用率',\n\n  // Original text: \"Memory usage\"\n  statsMemory: '内存利用率',\n\n  // Original text: \"Network throughput\"\n  statsNetwork: '网络流量',\n\n  // Original text: \"Stacked values\"\n  useStackedValuesOnStats: 'Stacked 值',\n\n  // Original text: \"Disk throughput\"\n  statDisk: '磁盘吞吐',\n\n  // Original text: \"Last 10 minutes\"\n  statLastTenMinutes: '最近10分钟',\n\n  // Original text: \"Last 2 hours\"\n  statLastTwoHours: '最近两小时',\n\n  // Original text: \"Last week\"\n  statLastWeek: '最近一周',\n\n  // Original text: \"Last year\"\n  statLastYear: '最近一年',\n\n  // Original text: \"Copy\"\n  copyToClipboardLabel: '复制',\n\n  // Original text: \"Ctrl+Alt+Del\"\n  ctrlAltDelButtonLabel: '发送Ctrl+Alt+Del',\n\n  // Original text: \"Tip:\"\n  tipLabel: '提示',\n\n  // Original text: \"non-US keyboard could have issues with console: switch your own layout to US.\"\n  tipConsoleLabel: '非美式键盘操作控制台可能出现问题：请切换至美式键盘模式',\n\n  // Original text: \"Action\"\n  vdiAction: '操作',\n\n  // Original text: \"Attach disk\"\n  vdiAttachDevice: '附加磁盘',\n\n  // Original text: \"New disk\"\n  vbdCreateDeviceButton: '新建磁盘',\n\n  // Original text: \"Boot order\"\n  vdiBootOrder: '启动顺序',\n\n  // Original text: \"Name\"\n  vdiNameLabel: '名称',\n\n  // Original text: \"Description\"\n  vdiNameDescription: '描述',\n\n  // Original text: \"Tags\"\n  vdiTags: '标签',\n\n  // Original text: \"Size\"\n  vdiSize: '磁盘大小',\n\n  // Original text: \"SR\"\n  vdiSr: '数据存储',\n\n  // Original text: \"VM\"\n  vdiVm: '虚拟机',\n\n  // Original text: \"Boot flag\"\n  vbdBootableStatus: '启动标识',\n\n  // Original text: \"Status\"\n  vbdStatus: '状态',\n\n  // Original text: \"Connected\"\n  vbdStatusConnected: '已连接',\n\n  // Original text: \"Disconnected\"\n  vbdStatusDisconnected: '未连接',\n\n  // Original text: \"No disks\"\n  vbdNoVbd: '没有磁盘',\n\n  // Original text: \"New device\"\n  vifCreateDeviceButton: '新建设备',\n\n  // Original text: \"No interface\"\n  vifNoInterface: '没有网卡',\n\n  // Original text: \"Device\"\n  vifDeviceLabel: '设备',\n\n  // Original text: \"MAC address\"\n  vifMacLabel: 'MAC地址',\n\n  // Original text: \"MTU\"\n  vifMtuLabel: 'MTU',\n\n  // Original text: \"Network\"\n  vifNetworkLabel: '网络',\n\n  // Original text: \"Status\"\n  vifStatusLabel: '状态',\n\n  // Original text: \"Connected\"\n  vifStatusConnected: '已连接',\n\n  // Original text: \"Disconnected\"\n  vifStatusDisconnected: '未连接',\n\n  // Original text: \"IP addresses\"\n  vifIpAddresses: 'IP地址',\n\n  // Original text: \"Auto-generated if empty\"\n  vifMacAutoGenerate: '如果没有自动创建',\n\n  // Original text: \"No snapshots\"\n  noSnapshots: '没有快照',\n\n  // Original text: \"New snapshot\"\n  snapshotCreateButton: '新建快照',\n\n  // Original text: \"Just click on the snapshot button to create one!\"\n  tipCreateSnapshotLabel: '点击快照按钮来创建快照',\n\n  // Original text: \"Creation date\"\n  snapshotDate: '创建日期',\n\n  // Original text: \"Name\"\n  snapshotName: '名称',\n\n  // Original text: \"Action\"\n  snapshotAction: '操作',\n\n  // Original text: \"Remove all logs\"\n  logRemoveAll: '删除所有日志',\n\n  // Original text: \"No logs so far\"\n  noLogs: '目前没有日志',\n\n  // Original text: \"Creation date\"\n  logDate: '创建日期',\n\n  // Original text: \"Name\"\n  logName: '名称',\n\n  // Original text: \"Content\"\n  logContent: '目录',\n\n  // Original text: \"Action\"\n  logAction: '操作',\n\n  // Original text: \"Remove\"\n  vmRemoveButton: '删除',\n\n  // Original text: \"Convert\"\n  vmConvertButton: '转换',\n\n  // Original text: \"Xen settings\"\n  xenSettingsLabel: 'Xen 设置',\n\n  // Original text: \"Guest OS\"\n  guestOsLabel: '客户操作系统',\n\n  // Original text: \"Misc\"\n  miscLabel: 'Misc',\n\n  // Original text: \"UUID\"\n  uuid: 'UUID',\n\n  // Original text: \"Virtualization mode\"\n  virtualizationMode: '虚拟化模式',\n\n  // Original text: \"CPU weight\"\n  cpuWeightLabel: 'CPU权重',\n\n  // Original text: \"Default\"\n  defaultCpuWeight: '默认',\n\n  // Original text: \"PV args\"\n  pvArgsLabel: 'PV参数',\n\n  // Original text: \"Xen tools status\"\n  xenToolsStatus: 'Xen tools状态',\n\n  // Original text: \"{status}\"\n  xenToolsStatusValue: '{status}',\n\n  // Original text: \"OS name\"\n  osName: '操作系统名称',\n\n  // Original text: \"OS kernel\"\n  osKernel: '操作系统内核',\n\n  // Original text: \"Auto power on\"\n  autoPowerOn: '自动卡机',\n\n  // Original text: \"HA\"\n  ha: '高可用',\n\n  // Original text: \"Original template\"\n  originalTemplate: '来源模板',\n\n  // Original text: \"Unknown\"\n  unknownOsName: '未知',\n\n  // Original text: \"Unknown\"\n  unknownOsKernel: '未知',\n\n  // Original text: \"Unknown\"\n  unknownOriginalTemplate: '未知',\n\n  // Original text: \"VM limits\"\n  vmLimitsLabel: '虚拟机限制',\n\n  // Original text: \"CPU limits\"\n  vmCpuLimitsLabel: 'CPU限制',\n\n  // Original text: \"Memory limits (min/max)\"\n  vmMemoryLimitsLabel: '内存限制(min/max)',\n\n  // Original text: \"vCPUs max:\"\n  vmMaxVcpus: '最大虚拟CPU数',\n\n  // Original text: \"Memory max:\"\n  vmMaxRam: '最大内存',\n\n  // Original text: \"Long click to add a name\"\n  vmHomeNamePlaceholder: '长按来添加名称',\n\n  // Original text: \"Long click to add a description\"\n  vmHomeDescriptionPlaceholder: '长按来添加描述',\n\n  // Original text: \"Click to add a name\"\n  vmViewNamePlaceholder: '点击添加名称',\n\n  // Original text: \"Click to add a description\"\n  vmViewDescriptionPlaceholder: '点击添加描述',\n\n  // Original text: \"Pool{pools, plural, one {} other {s}}\"\n  poolPanel: '池{pools, plural, one {} 其他 {s}}',\n\n  // Original text: \"Host{hosts, plural, one {} other {s}}\"\n  hostPanel: '主机{hosts, plural, one {} 其他 {s}}',\n\n  // Original text: \"VM{vms, plural, one {} other {s}}\"\n  vmPanel: '虚拟机{vms, plural, one {} 其他 {s}}',\n\n  // Original text: \"RAM Usage\"\n  memoryStatePanel: '内容使用率',\n\n  // Original text: \"CPUs Usage\"\n  cpuStatePanel: 'CPU使用率',\n\n  // Original text: \"VMs Power state\"\n  vmStatePanel: '虚拟机电源状态',\n\n  // Original text: \"Pending tasks\"\n  taskStatePanel: '正在运行的任务',\n\n  // Original text: \"Users\"\n  usersStatePanel: '用户',\n\n  // Original text: \"Storage state\"\n  srStatePanel: '存储状态',\n\n  // Original text: \"{usage} (of {total})\"\n  ofUsage: '{usage} (of {total})',\n\n  // Original text: \"No storage\"\n  noSrs: '没有存储',\n\n  // Original text: \"Name\"\n  srName: '名称',\n\n  // Original text: \"Pool\"\n  srPool: '资源池',\n\n  // Original text: \"Host\"\n  srHost: '主机',\n\n  // Original text: \"Type\"\n  srFormat: '类型',\n\n  // Original text: \"Size\"\n  srSize: '大小',\n\n  // Original text: \"Usage\"\n  srUsage: '利用率',\n\n  // Original text: \"used\"\n  srUsed: '已使用',\n\n  // Original text: \"free\"\n  srFree: '剩余空间',\n\n  // Original text: \"Storage Usage\"\n  srUsageStatePanel: '存储利用率',\n\n  // Original text: \"Top 5 SR Usage (in %)\"\n  srTopUsageStatePanel: '数据存储使用率前5名(in %)',\n\n  // Original text: \"{running} running ({halted} halted)\"\n  vmsStates: '{running} 正在运行 ({halted} 已停止)',\n\n  // Original text: \"{value} {date, date, medium}\"\n  weekHeatmapData: '{value} {date, date, medium}',\n\n  // Original text: \"No data.\"\n  weekHeatmapNoData: '没有数据',\n\n  // Original text: \"Weekly Heatmap\"\n  weeklyHeatmap: '每周热图',\n\n  // Original text: \"Weekly Charts\"\n  weeklyCharts: '每周图表',\n\n  // Original text: \"Synchronize scale:\"\n  weeklyChartsScaleInfo: '同步范围',\n\n  // Original text: \"Stats error\"\n  statsDashboardGenericErrorTitle: '状态错误',\n\n  // Original text: \"There is no stats available for:\"\n  statsDashboardGenericErrorMessage: '没有可用的状态:',\n\n  // Original text: \"No selected metric\"\n  noSelectedMetric: '没有选择度量标准',\n\n  // Original text: \"Select\"\n  statsDashboardSelectObjects: '选择',\n\n  // Original text: \"Loading…\"\n  metricsLoading: '加载中….',\n\n  // Original text: \"Coming soon!\"\n  comingSoon: '即将呈现',\n\n  // Original text: \"Orphaned VDIs\"\n  orphanedVdis: '孤立的VDI',\n\n  // Original text: \"Orphaned VMs\"\n  orphanedVms: '孤立的虚拟机',\n\n  // Original text: \"No orphans\"\n  noOrphanedObject: '没有孤立的内容',\n\n  // Original text: \"Remove all orphaned VDIs\"\n  removeAllOrphanedObject: '删除所有孤立的VDI',\n\n  // Original text: \"Name\"\n  vmNameLabel: '名称',\n\n  // Original text: \"Description\"\n  vmNameDescription: '描述',\n\n  // Original text: \"Resident on\"\n  vmContainer: '位于',\n\n  // Original text: \"Alarms\"\n  alarmMessage: '警告',\n\n  // Original text: \"No alarms\"\n  noAlarms: '没有警告',\n\n  // Original text: \"Date\"\n  alarmDate: '日期',\n\n  // Original text: \"Content\"\n  alarmContent: '内容',\n\n  // Original text: \"Issue on\"\n  alarmObject: '问题',\n\n  // Original text: \"Pool\"\n  alarmPool: '资源池',\n\n  // Original text: \"Remove all alarms\"\n  alarmRemoveAll: '删除所有警告',\n\n  // Original text: \"Create a new VM on {select}\"\n  newVmCreateNewVmOn: '创建一个新的位于{select}的虚拟机',\n\n  // Original text: \"Create a new VM on {select1} or {select2}\"\n  newVmCreateNewVmOn2: '创建一个新的位于{select1} 或 {select2}的虚拟机',\n\n  // Original text: \"You have no permission to create a VM\"\n  newVmCreateNewVmNoPermission: '你没有权限创建虚拟机',\n\n  // Original text: \"Infos\"\n  newVmInfoPanel: '信息',\n\n  // Original text: \"Name\"\n  newVmNameLabel: '名称',\n\n  // Original text: \"Template\"\n  newVmTemplateLabel: '模板',\n\n  // Original text: \"Description\"\n  newVmDescriptionLabel: '描述',\n\n  // Original text: \"Performances\"\n  newVmPerfPanel: '性能',\n\n  // Original text: \"vCPUs\"\n  newVmVcpusLabel: '虚拟CPU',\n\n  // Original text: \"RAM\"\n  newVmRamLabel: '内存',\n\n  // Original text: \"Install settings\"\n  newVmInstallSettingsPanel: '安装设置',\n\n  // Original text: \"ISO/DVD\"\n  newVmIsoDvdLabel: 'ISO/DVD',\n\n  // Original text: \"Network\"\n  newVmNetworkLabel: '网络',\n\n  // Original text: \"PV Args\"\n  newVmPvArgsLabel: 'PV参数',\n\n  // Original text: \"PXE\"\n  newVmPxeLabel: 'PXE',\n\n  // Original text: \"Interfaces\"\n  newVmInterfacesPanel: '网络接口',\n\n  // Original text: \"MAC\"\n  newVmMacLabel: 'MAC',\n\n  // Original text: \"Add interface\"\n  newVmAddInterface: '添加网络接口',\n\n  // Original text: \"Disks\"\n  newVmDisksPanel: '磁盘',\n\n  // Original text: \"SR\"\n  newVmSrLabel: '数据存储',\n\n  // Original text: \"Bootable\"\n  newVmBootableLabel: '启动项',\n\n  // Original text: \"Size\"\n  newVmSizeLabel: '大小',\n\n  // Original text: \"Add disk\"\n  newVmAddDisk: '添加磁盘',\n\n  // Original text: \"Summary\"\n  newVmSummaryPanel: '概述',\n\n  // Original text: \"Create\"\n  newVmCreate: '创建',\n\n  // Original text: \"Reset\"\n  newVmReset: '重置',\n\n  // Original text: \"Select template\"\n  newVmSelectTemplate: '选择模板',\n\n  // Original text: \"SSH key\"\n  newVmSshKey: 'SSH Key',\n\n  // Original text: \"Config drive\"\n  newVmConfigDrive: '配置驱动器',\n\n  // Original text: \"Custom config\"\n  newVmCustomConfig: '自定义配置',\n\n  // Original text: \"Boot VM after creation\"\n  newVmBootAfterCreate: '创建后启动',\n\n  // Original text: \"Auto-generated if empty\"\n  newVmMacPlaceholder: '如果为空自动创建',\n\n  // Original text: \"CPU weight\"\n  newVmCpuWeightLabel: 'CPU权重',\n\n  // Original text: \"Quarter (1/4)\"\n  newVmCpuWeightQuarter: '四分之一 (1/4)',\n\n  // Original text: \"Half (1/2)\"\n  newVmCpuWeightHalf: '二分之一 (1/2)',\n\n  // Original text: \"Normal\"\n  newVmCpuWeightNormal: '普通',\n\n  // Original text: \"Double (x2)\"\n  newVmCpuWeightDouble: '双倍(x2)',\n\n  // Original text: \"Cloud config\"\n  newVmCloudConfig: '云配置',\n\n  // Original text: \"Create VMs\"\n  newVmCreateVms: '创建虚拟机',\n\n  // Original text: \"Are you sure you want to create {nbVms} VMs?\"\n  newVmCreateVmsConfirm: '你确定要创建 {nbVms} 虚拟机?',\n\n  // Original text: \"Multiple VMs:\"\n  newVmMultipleVms: '多个虚拟机',\n\n  // Original text: \"Select a resource set:\"\n  newVmSelectResourceSet: '选择资源集',\n\n  // Original text: \"Name pattern:\"\n  newVmMultipleVmsPattern: '命名模式',\n\n  // Original text: \"e.g.: \\\\{name\\\\}_%\"\n  newVmMultipleVmsPatternPlaceholder: '例如: \\\\{name\\\\}_%',\n\n  // Original text: \"First index:\"\n  newVmFirstIndex: '首要标识',\n\n  // Original text: \"Resource sets\"\n  resourceSets: '资源集',\n\n  // Original text: \"No resource sets.\"\n  noResourceSets: '没有资源集',\n\n  // Original text: \"Resource set name\"\n  resourceSetName: '资源集名称',\n\n  // Original text: \"Creation and edition\"\n  resourceSetCreation: '创建并编辑',\n\n  // Original text: \"Save\"\n  saveResourceSet: '保存',\n\n  // Original text: \"Reset\"\n  resetResourceSet: '重置',\n\n  // Original text: \"Edit\"\n  editResourceSet: '编辑',\n\n  // Original text: \"Delete\"\n  deleteResourceSet: '删除',\n\n  // Original text: \"Delete resource set\"\n  deleteResourceSetWarning: '删除资源集',\n\n  // Original text: \"Are you sure you want to delete this resource set?\"\n  deleteResourceSetQuestion: '你确定要删除此资源集',\n\n  // Original text: \"Missing objects:\"\n  resourceSetMissingObjects: '缺少对象',\n\n  // Original text: \"vCPUs\"\n  resourceSetVcpus: '虚拟CPU',\n\n  // Original text: \"Memory\"\n  resourceSetMemory: '内存',\n\n  // Original text: \"Storage\"\n  resourceSetStorage: '存储',\n\n  // Original text: \"Unknown\"\n  unknownResourceSetValue: '未知',\n\n  // Original text: \"Available hosts\"\n  availableHosts: '可用主机',\n\n  // Original text: \"Excluded hosts\"\n  excludedHosts: '被排除的主机',\n\n  // Original text: \"No hosts available.\"\n  noHostsAvailable: '没有可用主机',\n\n  // Original text: \"VMs created from this resource set shall run on the following hosts.\"\n  availableHostsDescription: '从这些资源中创建的虚拟机将运行在以下主机上',\n\n  // Original text: \"Maximum CPUs\"\n  maxCpus: '最大CPU',\n\n  // Original text: \"Maximum RAM (GiB)\"\n  maxRam: '最大内存',\n\n  // Original text: \"Maximum disk space\"\n  maxDiskSpace: '最大磁盘空间',\n\n  // Original text: \"No limits.\"\n  noResourceSetLimits: '没有限制',\n\n  // Original text: \"Total:\"\n  totalResource: '合计',\n\n  // Original text: \"Remaining:\"\n  remainingResource: '剩余',\n\n  // Original text: \"Used:\"\n  usedResource: '已使用',\n\n  // Original text: \"Try dropping some backups here, or click to select backups to upload. Accept only .xva files.\"\n  importVmsList: '尝试将备份文件拖拽到这里，或点击选择备份文件上传，仅支持.xva格式的文件',\n\n  // Original text: \"No selected VMs.\"\n  noSelectedVms: '没有选择虚拟机',\n\n  // Original text: \"To Pool:\"\n  vmImportToPool: '到资源池',\n\n  // Original text: \"To SR:\"\n  vmImportToSr: '到存储库',\n\n  // Original text: \"VM{nVms, plural, one {} other {s}} to import\"\n  vmsToImport: '导入虚拟机',\n\n  // Original text: \"Reset\"\n  importVmsCleanList: '重置',\n\n  // Original text: \"VM import success\"\n  vmImportSuccess: '虚拟机导入成功',\n\n  // Original text: \"VM import failed\"\n  vmImportFailed: '虚拟机导入失败',\n\n  // Original text: \"Import starting…\"\n  startVmImport: '开始导入',\n\n  // Original text: \"Export starting…\"\n  startVmExport: '开始导出',\n\n  // Original text: \"No pending tasks\"\n  noTasks: '没有等待中的任务',\n\n  // Original text: \"Currently, there are not any pending XenServer tasks\"\n  xsTasks: '当前，没有任何等待中的XenServer任务',\n\n  // Original text: \"List Remote\"\n  listRemote: '列出远程',\n\n  // Original text: \"simple\"\n  simpleBackup: '简单',\n\n  // Original text: \"delta\"\n  delta: '增量',\n\n  // Original text: \"Restore Backups\"\n  restoreBackups: '恢复备份',\n\n  // Original text: \"No remotes\"\n  noRemotes: '没有远程',\n\n  // Original text: \"enabled\"\n  remoteEnabled: '启用',\n\n  // Original text: \"error\"\n  remoteError: '错误',\n\n  // Original text: \"No backup available\"\n  noBackup: '没有可用的备份',\n\n  // Original text: \"VM Name\"\n  backupVmNameColumn: '虚拟机名称',\n\n  // Original text: \"Backup Tag\"\n  backupTagColumn: '备份标识',\n\n  // Original text: \"Last Backup\"\n  lastBackupColumn: '最后备份',\n\n  // Original text: \"Available Backups\"\n  availableBackupsColumn: '可用的备份',\n\n  // Original text: \"Restore\"\n  restoreColumn: '恢复',\n\n  // Original text: \"Restore VM\"\n  restoreTip: '恢复虚拟机',\n\n  // Original text: \"Import VM\"\n  importBackupTitle: '导入虚拟机',\n\n  // Original text: \"Starting your backup import\"\n  importBackupMessage: '开始你的备份导入',\n\n  // Original text: \"Emergency shutdown Host{nHosts, plural, one {} other {s}}\"\n  emergencyShutdownHostsModalTitle: '紧急关闭主机{nHosts, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to shutdown {nHosts} Host{nHosts, plural, one {} other {s}}?\"\n  emergencyShutdownHostsModalMessage: '你确定要关闭 {nHosts} 主机{nHosts, plural, one {} other {s}}？',\n\n  // Original text: \"Shutdown host\"\n  stopHostModalTitle: '关闭主机',\n\n  // Original text: \"This will shutdown your host. Do you want to continue?\"\n  stopHostModalMessage: '此操作将关闭你的主机，你确定要继续吗？',\n\n  // Original text: \"Restart host\"\n  restartHostModalTitle: '重启主机',\n\n  // Original text: \"This will restart your host. Do you want to continue?\"\n  restartHostModalMessage: '此操作将重启你的主机，你确定要继续吗？',\n\n  // Original text: \"Restart Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}\"\n  restartHostsAgentsModalTitle: '重启主机{nHosts, plural, one {} other {s}} 代理{nHosts, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to restart {nHosts} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?\"\n  restartHostsAgentsModalMessage:\n    '你确定要重启{nHosts}主机{nHosts, plural, one {} other {s}} 代理{nHosts, plural, one {} other {s}}？',\n\n  // Original text: \"Restart Host{nHosts, plural, one {} other {s}}\"\n  restartHostsModalTitle: '重启主机{nHosts, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to restart {nHosts} Host{nHosts, plural, one {} other {s}}?\"\n  restartHostsModalMessage: '你确定要重启{nHosts}主机{nHosts, plural, one {} other {s}}？',\n\n  // Original text: \"Start VM{vms, plural, one {} other {s}}\"\n  startVmsModalTitle: '启动虚拟机{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to start {vms} VM{vms, plural, one {} other {s}}?\"\n  startVmsModalMessage: '你确定要启动 {vms} 虚拟机{vms, plural, one {} other {s}}？',\n\n  // Original text: \"Stop Host{nHosts, plural, one {} other {s}}\"\n  stopHostsModalTitle: '停止主机{nHosts, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to stop {nHosts} Host{nHosts, plural, one {} other {s}}?\"\n  stopHostsModalMessage: '你确定要停止{nHosts}主机{nHosts, plural, one {} other {s}}？',\n\n  // Original text: \"Stop VM{vms, plural, one {} other {s}}\"\n  stopVmsModalTitle: '停止虚拟机{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to stop {vms} VM{vms, plural, one {} other {s}}?\"\n  stopVmsModalMessage: '你确定要停止{vms}虚拟机{vms, plural, one {} other {s}}？',\n\n  // Original text: \"Restart VM\"\n  restartVmModalTitle: '重新启动虚拟机',\n\n  // Original text: \"Are you sure you want to restart {name}?\"\n  restartVmModalMessage: '你确定要重新启动{name}？',\n\n  // Original text: \"Stop VM\"\n  stopVmModalTitle: '停止虚拟机',\n\n  // Original text: \"Are you sure you want to stop {name}?\"\n  stopVmModalMessage: '你确定要停止 {name}？',\n\n  // Original text: \"Restart VM{vms, plural, one {} other {s}}\"\n  restartVmsModalTitle: '重新启动虚拟机{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to restart {vms} VM{vms, plural, one {} other {s}}?\"\n  restartVmsModalMessage: '你确定要重新启动{vms}虚拟机{vms, plural, one {} other {s}}？',\n\n  // Original text: \"Snapshot VM{vms, plural, one {} other {s}}\"\n  snapshotVmsModalTitle: '执行虚拟机快照{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to snapshot {vms} VM{vms, plural, one {} other {s}}?\"\n  snapshotVmsModalMessage: '你确定要执行虚拟机{vms}快照{vms, plural, one {} other {s}}？',\n\n  // Original text: \"Delete VM\"\n  deleteVmModalTitle: '删除虚拟机',\n\n  // Original text: \"Delete VM{vms, plural, one {} other {s}}\"\n  deleteVmsModalTitle: '删除虚拟机{vms, plural, one {} other {s}}',\n\n  // Original text: \"Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmModalMessage: '你确定要删除此虚拟机？所有的虚拟机磁盘将被删除',\n\n  // Original text: \"Are you sure you want to delete {vms} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED\"\n  deleteVmsModalMessage: '你确定要删除 {vms}虚拟机{vms, plural, one {} other {s}}？所有的虚拟机磁盘将被删除',\n\n  // Original text: \"Migrate VM\"\n  migrateVmModalTitle: '迁移虚拟机',\n\n  // Original text: \"Select a destination host:\"\n  migrateVmSelectHost: '选择一个目标主机',\n\n  // Original text: \"Select a migration network:\"\n  migrateVmSelectMigrationNetwork: '选择一个迁移网络',\n\n  // Original text: \"For each VDI, select an SR:\"\n  migrateVmSelectSrs: '为每个虚拟磁盘，选择存储库',\n\n  // Original text: \"For each VIF, select a network:\"\n  migrateVmSelectNetworks: '为每个虚拟网卡，选择一个网络',\n\n  // Original text: \"Select a destination SR:\"\n  migrateVmsSelectSr: '选择一个目标存储库',\n\n  // Original text: \"Select a destination SR for local disks:\"\n  migrateVmsSelectSrIntraPool: '为本地磁盘选择一个目标存储库',\n\n  // Original text: \"Select a network on which to connect each VIF:\"\n  migrateVmsSelectNetwork: '选择一个网络来连接每个虚拟网卡',\n\n  // Original text: \"Smart mapping\"\n  migrateVmsSmartMapping: '智能映射',\n\n  // Original text: \"Name\"\n  migrateVmName: '名称',\n\n  // Original text: \"SR\"\n  migrateVmSr: '存储库',\n\n  // Original text: \"VIF\"\n  migrateVmVif: '虚拟网卡',\n\n  // Original text: \"Network\"\n  migrateVmNetwork: '网络',\n\n  // Original text: \"No target host\"\n  migrateVmNoTargetHost: '没有目标主机',\n\n  // Original text: \"A target host is required to migrate a VM\"\n  migrateVmNoTargetHostMessage: '需要一个目标主机来迁移一个虚拟机',\n\n  // Original text: \"Import a {name} Backup\"\n  importBackupModalTitle: '导入一个{name}备份',\n\n  // Original text: \"Start VM after restore\"\n  importBackupModalStart: '恢复后启动虚拟机',\n\n  // Original text: \"Select your backup…\"\n  importBackupModalSelectBackup: '选择你的备份…',\n\n  // Original text: \"Are you sure you want to remove all orphaned VDIs?\"\n  removeAllOrphanedModalWarning: '你确定要删除所有孤立的虚拟磁盘？',\n\n  // Original text: \"Remove all logs\"\n  removeAllLogsModalTitle: '删除所有日志',\n\n  // Original text: \"Are you sure you want to remove all logs?\"\n  removeAllLogsModalWarning: '你确定要删除所有日志？',\n\n  // Original text: \"This operation is definitive.\"\n  definitiveMessageModal: '这个操作是不可更改的',\n\n  // Original text: \"Previous SR Usage\"\n  existingSrModalTitle: '之前存储库的使用情况',\n\n  // Original text: \"This path has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingSrModalText: '这条路径之前已经被一台XenServer主机用来连接存储。如果你选择继续创建存储库，所有的数据将丢失。',\n\n  // Original text: \"Previous LUN Usage\"\n  existingLunModalTitle: '之前LUN使用情况',\n\n  // Original text: \"This LUN has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.\"\n  existingLunModalText: '这个LUN之前已经被一台XenServer主机使用。如果你选择继续创建存储库，所有的数据将丢失。',\n\n  // Original text: \"Replace current registration?\"\n  alreadyRegisteredModal: '替换当前的注册？',\n\n  // Original text: \"Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?\"\n  alreadyRegisteredModalText: '你的XO设备已经注册给{email}，你确定要删除并替换这个注册信息？',\n\n  // Original text: \"Ready for trial?\"\n  trialReadyModal: '准备试用？',\n\n  // Original text: \"During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!\"\n  trialReadyModalText: '在试用期内，XOA需要Internet连接才能正常使用，如果您正式付费将不受此限制',\n\n  // Original text: \"Host\"\n  serverHost: '主机',\n\n  // Original text: \"Username\"\n  serverUsername: '用户名',\n\n  // Original text: \"Password\"\n  serverPassword: '密码',\n\n  // Original text: \"Action\"\n  serverAction: '操作',\n\n  // Original text: \"Read Only\"\n  serverReadOnly: '只读',\n\n  // Original text: \"Copy VM\"\n  copyVm: '复制虚拟机',\n\n  // Original text: \"Are you sure you want to copy this VM to {SR}?\"\n  copyVmConfirm: '你确定要复制此虚拟机到{SR}',\n\n  // Original text: \"Name\"\n  copyVmName: '名称',\n\n  // Original text: \"Name pattern\"\n  copyVmNamePattern: '命名规范',\n\n  // Original text: \"If empty: name of the copied VM\"\n  copyVmNamePlaceholder: '如果复制虚拟机名称为空',\n\n  // Original text: \"e.g.: \\\"\\\\{name\\\\}_COPY\\\"\"\n  copyVmNamePatternPlaceholder: 'e.g.: \"\\\\{name\\\\}_COPY\"',\n\n  // Original text: \"Select SR\"\n  copyVmSelectSr: '选择存储库',\n\n  // Original text: \"Use compression\"\n  copyVmCompress: '使用压缩',\n\n  // Original text: \"No target SR\"\n  copyVmsNoTargetSr: '没有目标存储库',\n\n  // Original text: \"A target SR is required to copy a VM\"\n  copyVmsNoTargetSrMessage: '复制虚拟机需要选择一个目标存储库',\n\n  // Original text: \"Create network\"\n  newNetworkCreate: '创建网络',\n\n  // Original text: \"Interface\"\n  newNetworkInterface: '接口',\n\n  // Original text: \"Name\"\n  newNetworkName: '名称',\n\n  // Original text: \"Description\"\n  newNetworkDescription: '描述',\n\n  // Original text: \"VLAN\"\n  newNetworkVlan: 'VLAN',\n\n  // Original text: \"No VLAN if empty\"\n  newNetworkDefaultVlan: '如果为空则没有VLAN',\n\n  // Original text: \"MTU\"\n  newNetworkMtu: 'MTU',\n\n  // Original text: \"Default: 1500\"\n  newNetworkDefaultMtu: '默认1500',\n\n  // Original text: \"Delete network\"\n  deleteNetwork: '删除网络',\n\n  // Original text: \"Are you sure you want to delete this network?\"\n  deleteNetworkConfirm: '你确定要删除此网络',\n\n  // Original text: \"Xen Orchestra\"\n  xenOrchestra: 'Xen Orchestra',\n\n  // Original text: \"No pro support provided!\"\n  noProSupport: '不提供专业支持！',\n\n  // Original text: \"Use in production at your own risks\"\n  noProductionUse: '在生产环境中使用将存在风险',\n\n  // Original text: \"You can download our turnkey appliance at\"\n  downloadXoa: '您可以在这里下载我们的整套设备',\n\n  // Original text: \"Bug Tracker\"\n  bugTracker: '问题跟踪器',\n\n  // Original text: \"Issues? Report it!\"\n  bugTrackerText: '出现问题？报告！',\n\n  // Original text: \"Community\"\n  community: '社区',\n\n  // Original text: \"Join our community forum!\"\n  communityText: '加入我们的社区论坛',\n\n  // Original text: \"Free Trial for Premium Edition!\"\n  freeTrial: '铂金版免费试用',\n\n  // Original text: \"Request your trial now!\"\n  freeTrialNow: '立即请求试用',\n\n  // Original text: \"Any issue?\"\n  issues: '出现任何问题？',\n\n  // Original text: \"Problem? Contact us!\"\n  issuesText: '有问题？联系我们！',\n\n  // Original text: \"Documentation\"\n  documentation: '文档',\n\n  // Original text: \"Read our official doc\"\n  documentationText: '阅读我们官方文档',\n\n  // Original text: \"Pro support included\"\n  proSupportIncluded: '包含专业支持',\n\n  // Original text: \"Acces your XO Account\"\n  xoAccount: '进入你的XO账户',\n\n  // Original text: \"Report a problem\"\n  openTicket: '报告一个问题',\n\n  // Original text: \"Problem? Open a ticket !\"\n  openTicketText: '存在问题？开个Case！',\n\n  // Original text: \"Upgrade needed\"\n  upgradeNeeded: '需要升级',\n\n  // Original text: \"Upgrade now!\"\n  upgradeNow: '立即升级',\n\n  // Original text: \"Or\"\n  or: '或',\n\n  // Original text: \"Try it for free!\"\n  tryIt: '免费试用',\n\n  // Original text: \"This feature is available starting from {plan} Edition\"\n  availableIn: '这个功能将在{plan}版本中可用',\n\n  // Original text: \"Updates\"\n  updateTitle: '更新',\n\n  // Original text: \"Registration\"\n  registration: '注册',\n\n  // Original text: \"Trial\"\n  trial: '试用',\n\n  // Original text: \"Settings\"\n  settings: '设置',\n\n  // Original text: \"Update\"\n  update: '更新',\n\n  // Original text: \"Upgrade\"\n  upgrade: '升级',\n\n  // Original text: \"No updater available for Community Edition\"\n  noUpdaterCommunity: '社区版本没有可用的升级',\n\n  // Original text: \"Please consider subscribe and try it with all features for free during 30 days on\"\n  noUpdaterSubscribe: '请考虑订购或在30天内免费试用所有功能',\n\n  // Original text: \"Manual update could break your current installation due to dependencies issues, do it with caution\"\n  noUpdaterWarning: '由于相关依赖关系的问题，手动更新将跑坏你当前的安全，请小心使用',\n\n  // Original text: \"Current version:\"\n  currentVersion: '当前版本',\n\n  // Original text: \"Register\"\n  register: '注册',\n\n  // Original text: \"Please, take time to register in order to enjoy your trial.\"\n  trialRegistration: '为了您的正常使用，请考虑花时间注册',\n\n  // Original text: \"Start trial\"\n  trialStartButton: '开始试用',\n\n  // Original text: \"You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.\"\n  trialAvailableUntil: '你可以使用试用版本直到{date, date, medium}。更新你的设备来获取',\n\n  // Original text: \"Your trial has been ended. Contact us or downgrade to Free version\"\n  trialConsumed: '你的使用已经结束，联系我们或下载免费版本',\n\n  // Original text: \"Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.\"\n  trialLocked: '你的xoa-更新服务已停止。没有此服务你的XOA不能完全正常运行',\n\n  // Original text: \"No update information available\"\n  noUpdateInfo: '没有更新信息可用',\n\n  // Original text: \"Update information may be available\"\n  waitingUpdateInfo: '更新信息可能可用',\n\n  // Original text: \"Your XOA is up-to-date\"\n  upToDate: '你的XOA是最新的',\n\n  // Original text: \"You need to update your XOA (new version is available)\"\n  mustUpgrade: '你需要更新你的XOA（有新版本可用）',\n\n  // Original text: \"Your XOA is not registered for updates\"\n  registerNeeded: '你的XOA没有注册更新',\n\n  // Original text: \"Can't fetch update information\"\n  updaterError: '不能获取更新信息',\n\n  // Original text: \"Upgrade successful\"\n  promptUpgradeReloadTitle: '更新成功',\n\n  // Original text: \"Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?\"\n  promptUpgradeReloadMessage: '你的XOA已经成功更新，你的浏览器必须重新加载，你要现在重新加载吗？',\n\n  // Original text: \"Xen Orchestra from the sources\"\n  disclaimerTitle: 'Xen Orchestra 源码版',\n\n  // Original text: \"You are using XO from the sources! That's great for a personal/non-profit usage.\"\n  disclaimerText1: '你在使用XO的源码版！这非常适合个人/非商业用途',\n\n  // Original text: \"If you are a company, it's better to use it with our appliance + pro support included:\"\n  disclaimerText2: '如果你是一个公司，建议使用我们的设备结合专业的支持',\n\n  // Original text: \"This version is not bundled with any support nor updates. Use it with caution for critical tasks.\"\n  disclaimerText3: '这个版本没有绑定任何支持或更新，请谨慎使用',\n\n  // Original text: \"Connect PIF\"\n  connectPif: '连接物理网卡',\n\n  // Original text: \"Are you sure you want to connect this PIF?\"\n  connectPifConfirm: '你确定要连接这个物理网卡？',\n\n  // Original text: \"Disconnect PIF\"\n  disconnectPif: '断开物理网卡',\n\n  // Original text: \"Are you sure you want to disconnect this PIF?\"\n  disconnectPifConfirm: '你确定要断开这个网卡网卡？',\n\n  // Original text: \"Delete PIF\"\n  deletePif: '删除物理网卡',\n\n  // Original text: \"Are you sure you want to delete this PIF?\"\n  deletePifConfirm: '你确定要删除这个物理网卡？',\n\n  // Original text: \"Username\"\n  username: '用户名',\n\n  // Original text: \"Password\"\n  password: '密码',\n\n  // Original text: \"Language\"\n  language: '语言',\n\n  // Original text: \"Old password\"\n  oldPasswordPlaceholder: '原密码',\n\n  // Original text: \"New password\"\n  newPasswordPlaceholder: '新密码',\n\n  // Original text: \"Confirm new password\"\n  confirmPasswordPlaceholder: '确认新密码',\n\n  // Original text: \"Confirmation password incorrect\"\n  confirmationPasswordError: '确认密码不正确',\n\n  // Original text: \"Password does not match the confirm password.\"\n  confirmationPasswordErrorBody: '确认密码不匹配',\n\n  // Original text: \"Password changed\"\n  pwdChangeSuccess: '密码已修改',\n\n  // Original text: \"Your password has been successfully changed.\"\n  pwdChangeSuccessBody: '你的密码已成功修改',\n\n  // Original text: \"Incorrect password\"\n  pwdChangeError: '密码错误',\n\n  // Original text: \"The old password provided is incorrect. Your password has not been changed.\"\n  pwdChangeErrorBody: '原密码错误，你的密码未更改',\n\n  // Original text: \"OK\"\n  changePasswordOk: '确认',\n\n  // Original text: \"Others\"\n  others: '其他',\n}\n","// This file is coded in ES5 and CommonJS to be compatible with\n// `create-locale`.\n\nconst forEach = require('lodash/forEach')\n\nconst messages = {\n  alpha: 'Alpha',\n  alerts: 'Alerts',\n  connected: 'Connected',\n  dcScope: 'DC Scope',\n  deployDcScope: 'Deploy DC Scope',\n  dcNetScope: 'DC NetScope',\n  deployDcNetScope: 'Deploy DC NetScope',\n  description: 'Description',\n  deleteSourceVm: 'Delete source VM',\n  disable: 'Disable',\n  diskState: 'Disk state',\n  download: 'Download',\n  enable: 'Enable',\n  expiration: 'Expiration',\n  hostIp: 'Host IP',\n  interfaces: 'Interfaces',\n  keyValue: '{key}: {value}',\n  esxiLibraryInfo: 'The V2V tool needs the vddk library, provided by Broadcom. Please download it from their website',\n  esxiLibraryLink: 'Download link',\n\n  esxiVddkLibrary: 'Drop the tar.gz file of the vddk library (linux)',\n  esxiVddkLibraryImport: 'Import and install the Vddk library. VDDK9 need nbdkit 1.42+',\n  esxiLibraryManualInstall:\n    'For other systems, you can install manually from https://gitlab.com/nbdkit/ . For reference the list of packages need for a debian 13 is **git dh-autoreconf pkg-config make libxml2-dev ocaml libc-bin**',\n  esxiLibraryAutoInstall: 'install {library} (debian based system)',\n  esxiLibraryInstalling:\n    \"Installing {library} can take a few minutes. You can check the progress in the XO tasks screen while it's running.\",\n  esxiProgressLinkText: 'Track progress',\n\n  esxiLibraryOutdated:\n    '{library} library is outdated expecting {expectedVersion}, got {version}. Please uninstall it and install the required version.',\n  esxiCheckingPrerequisite: 'Checking prerequisite on XO',\n  esxiCheckedPrerequisite: 'Result of the prerequisite check on XO',\n\n  esxiCheckingPrerequisiteError: 'Must be corrected before importing VM',\n  esxiCheckedPrerequisiteVersion: 'expected version {expectedVersion} , {version} installed',\n  esxiImportSslCertificate: 'Skip SSL check',\n  esxiImportThin: 'Thin mode',\n  esxiImportThinDescription:\n    'Disk created in thin mode (less space used). Data is read twice, no visible task or progress at first',\n  esxiImportStopSource: 'Stop the source VM',\n  esxiImportStopSourceDescription:\n    'Source VM stopped before the last delta transfer (after final snapshot). Needed to fully transfer a running VM',\n  esxiImportStopOnErrorDescription: 'Stop on the first error when importing VMs',\n  inUse: 'In use',\n  nImportVmsInParallel: 'Number of VMs to import in parallel',\n  node: 'Node',\n  pifs: 'PIFs',\n  stopOnError: 'Stop on error',\n  uuid: 'UUID',\n  vdi: 'VDI',\n  vmSrUsage: 'Storage: {used} used of {total} ({free} free)',\n\n  new: 'New',\n  nodeStatus: 'Node status',\n  notDefined: 'Not defined',\n  status: 'Status',\n  statusConnecting: 'Connecting',\n  statusDisconnected: 'Disconnected',\n  statusLoading: 'Loading…',\n  errorPageNotFound: 'Page not found',\n  errorNoSuchItem: 'No such item',\n  errorUnknownItem: 'Unknown {type}',\n  generateNewMacAddress: 'Generate new MAC addresses',\n  memoryFree: '{memoryFree} RAM free',\n  configured: 'Configured',\n  notConfigured: 'Not configured',\n  utcDate: 'UTC date',\n  utcTime: 'UTC time',\n  date: 'Date',\n  notifications: 'Notifications',\n  noNotifications: 'No notifications so far.',\n  notificationNew: 'NEW!',\n  notYetAvailableForXs8: 'Not yet available for XenServer 8',\n  moreDetails: 'More details',\n  messageSubject: 'Subject',\n  messageFrom: 'From',\n  messageReply: 'Reply',\n  sr: 'SR',\n  subdirectory: 'Subdirectory',\n  tryXoa: 'Try XOA for free and deploy it here.',\n  notInstalled: 'Not installed',\n\n  editableLongClickPlaceholder: 'Long click to edit',\n  editableClickPlaceholder: 'Click to edit',\n  browseFiles: 'Browse files',\n  showLogs: 'Show logs',\n  noValue: 'None',\n  noExpiration: 'No expiration',\n  compression: 'Compression',\n  core: 'Core',\n  cpu: 'CPU',\n  multipathing: 'Multipathing',\n  multipathingDisabled: 'Multipathing disabled',\n  enableMultipathing: 'Enable multipathing',\n  disableMultipathing: 'Disable multipathing',\n  enableAllHostsMultipathing: 'Enable multipathing for all hosts',\n  disableAllHostsMultipathing: 'Disable multipathing for all hosts',\n  paths: 'Paths',\n  pbdDisconnected: 'PBD disconnected',\n  hasInactivePath: 'Has an inactive path',\n  pools: 'Pools',\n  remotes: 'Remotes',\n  schedulerGranularity: 'Scheduler granularity',\n  setCbtError: 'Set CBT error',\n  socket: 'Socket',\n  type: 'Type',\n  restore: 'Restore',\n  delete: 'Delete',\n  vms: 'VMs',\n  cpusMax: 'Max vCPUs',\n  metadata: 'Metadata',\n  chooseBackup: 'Choose a backup',\n  temporarilyDisabled: 'Temporarily disabled',\n  clickToShowError: 'Click to show error',\n  backupJobs: 'Backup jobs',\n  iscsiSessions: '({ nSessions, number }) iSCSI session{nSessions, plural, one {} other {s}}',\n  requiresAdminPermissions: 'Requires admin permissions',\n  proxy: 'Proxy',\n  proxies: 'Proxies',\n  name: 'Name',\n  value: 'Value',\n  address: 'Address',\n  vm: 'VM',\n  destinationSR: 'Destination SR',\n  destinationNetwork: 'Destination network',\n  dhcp: 'DHCP',\n  id: 'ID',\n  ip: 'IP',\n  static: 'Static',\n  user: 'User',\n  deletedUser: 'deleted ({ name })',\n  networkConfiguration: 'Network configuration',\n  integrity: 'Integrity',\n  altered: 'Altered',\n  missing: 'Missing',\n  verified: 'Verified',\n  snapshotMode: 'Snapshot mode',\n  normal: 'Normal',\n  withMemory: 'With memory',\n  offline: 'Offline',\n  noLicenseAvailable: 'No license available',\n  emailPlaceholderExample: 'Email address, e.g.: it@company.net',\n  unknown: 'Unknown',\n  upgradesAvailable: 'Upgrades available',\n  advancedSettings: 'Advanced settings',\n  forceUpgrade: 'Force upgrade',\n  txChecksumming: 'TX checksumming',\n  thick: 'Thick',\n  thin: 'Thin',\n  unknownSize: 'Unknown size',\n  installedCertificates: 'Installed certificates',\n  expiry: 'Expiry',\n  fingerprint: 'Fingerprint',\n  certificate: 'Certificate (PEM)',\n  certificateChain: 'Certificate chain (PEM)',\n  privateKey: 'Private key (PKCS#8)',\n  installNewCertificate: 'Install new certificate',\n  replaceExistingCertificate: 'Replace existing certificate',\n  customFields: 'Custom fields',\n  addColor: 'Add color',\n  addCustomField: 'Add custom field',\n  advancedTagCreation: 'Advanced tag creation',\n  availableXoaPremium: 'Available in XOA Premium',\n  availableXoaPlan: 'Available in XOA {plan}',\n  detach: 'Detach',\n  editCustomField: 'Edit custom field',\n  deleteCustomField: 'Delete custom field',\n  onlyAvailableXoaUsers: 'Only available to XOA users',\n  removeColor: 'Remove color',\n  xcpNg: 'XCP-ng',\n  noFileSelected: 'No file selected',\n  nRetriesVmBackupFailures: 'Number of retries if VM backup fails',\n  sequence: 'Sequence',\n  sequences: 'Sequences',\n\n  // ----- Modals -----\n  alertOk: 'OK',\n  confirmOk: 'OK',\n  formOk: 'OK',\n  genericCancel: 'Cancel',\n  enterConfirmText: 'Enter the following text to confirm:',\n\n  // ----- Filters -----\n  onError: 'On error',\n  successful: 'Successful',\n  filterKeepFailed: 'Keep only failed',\n  filterOutShortTasks: 'Hide short tasks',\n  filterOnlyManaged: 'Managed disks',\n  filterOnlyOrphaned: 'Orphaned disks',\n  filterOnlyRegular: 'Normal disks',\n  filterOnlyRunningVms: 'Running VMs',\n  filterOnlySnapshots: 'Snapshot disks',\n  filterOnlyUnmanaged: 'Unmanaged disks',\n  filterSaveAs: 'Save…',\n  filterSyntaxLinkTooltip: 'Explore the search syntax in the documentation',\n  filterVifsOnlyConnected: 'Connected VIFs',\n  filterVifsOnlyDisconnected: 'Disconnected VIFs',\n  filterRemotesOnlyConnected: 'Connected remotes',\n  filterRemotesOnlyDisconnected: 'Disconnected remotes',\n\n  // ----- Copiable component -----\n  copyToClipboard: 'Copy to clipboard',\n  copyToClipboardVdiUuid: 'Copy VDI UUID',\n  copyUuid: 'Copy {uuid}',\n  copyValue: 'Copy {value}',\n\n  // ----- Pills -----\n  pillMaster: 'Master',\n\n  // ----- Titles -----\n  homePage: 'Home',\n  homeVmPage: 'VMs',\n  homeHostPage: 'Hosts',\n  homePoolPage: 'Pools',\n  homeTemplatePage: 'Templates',\n  homeSrPage: 'Storage',\n  dashboardPage: 'Dashboard',\n  overviewDashboardPage: 'Overview',\n  overviewVisualizationDashboardPage: 'Visualizations',\n  overviewStatsDashboardPage: 'Statistics',\n  overviewHealthDashboardPage: 'Health',\n  selfServicePage: 'Self service',\n  backupPage: 'Backup',\n  jobsPage: 'Jobs',\n  xoaPage: 'XOA',\n  updatePage: 'Updates',\n  licensesPage: 'Licenses',\n  notificationsPage: 'Notifications',\n  supportPage: 'Support',\n  settingsPage: 'Settings',\n  settingsAuditPage: 'Audit',\n  settingsServersPage: 'Servers',\n  settingsUsersPage: 'Users',\n  settingsGroupsPage: 'Groups',\n  settingsAclsPage: 'ACLs',\n  settingsPluginsPage: 'Plugins',\n  settingsLogsPage: 'Logs',\n  settingsCloudConfigsPage: 'Cloud configs',\n  settingsIpsPage: 'IPs',\n  aboutPage: 'About',\n  aboutXoaPlan: 'About XO {xoaPlan}',\n  newMenu: 'New',\n  taskMenu: 'Tasks',\n  taskPage: 'Tasks',\n  newNetworkPage: 'Network',\n  newVmPage: 'VM',\n  newSrPage: 'Storage',\n  newServerPage: 'Server',\n  newImport: 'Import',\n  xosan: 'XOSAN',\n  backupOverviewPage: 'Overview',\n  backupNewPage: 'New',\n  backupRemotesPage: 'Remotes',\n  backupRestorePage: 'Restore',\n  backupFileRestorePage: 'File restore',\n  schedule: 'Schedule',\n  backup: 'Backup',\n  rollingSnapshot: 'Rolling Snapshot',\n  deltaBackup: 'Delta Backup',\n  disasterRecovery: 'Disaster Recovery',\n  continuousReplication: 'Continuous Replication',\n  backupType: 'Backup type',\n  poolMetadata: 'Pool metadata',\n  xoConfig: 'XO config',\n  backupVms: 'VM Backup & Replication',\n  backupMetadata: 'XO config & Pool metadata Backup',\n  backupModeSourceRemoteRequired: 'Backup mode and source remote are required',\n  mirrorBackup: 'Mirror backup',\n  mirrorBackupVms: 'VM Mirror Backup',\n  mirrorAllVmBackups: 'Mirror all {mode} VM backups',\n  jobsOverviewPage: 'Overview',\n  jobsNewPage: 'New',\n  jobsSchedulingPage: 'Scheduling',\n  customJob: 'Custom Job',\n  userPage: 'User',\n  xoa: 'XOA',\n  restApiDoc: 'REST API doc',\n  // ----- Support -----\n  noSupport: 'No support',\n  freeUpgrade: 'Free upgrade!',\n  checkXoa: 'Check XOA',\n  xoaCheck: 'XOA check',\n  closeTunnel: 'Close tunnel',\n  createSupportTicket: 'Create a support ticket',\n  restartXoServer: 'Restart XO Server',\n  restartXoServerConfirm:\n    'Restarting XO Server will interrupt any backup job or XO task that is currently running. Xen Orchestra will also be unavailable for a few seconds. Are you sure you want to restart XO Server?',\n  openTunnel: 'Open tunnel',\n  supportCommunity: 'The XOA check and the support tunnel are available in XOA.',\n  supportTunnel: 'Support tunnel',\n  supportTunnelClosed: 'The support tunnel is closed.',\n\n  // ----- Sign out -----\n  signOut: 'Sign out',\n\n  // ----- User Profile -----\n  editUserProfile: 'Edit my settings {username}',\n  xsClientId: 'XenServer Client ID',\n  uploadClientId: 'Upload Client ID file',\n  forgetClientId: 'Forget Client ID',\n  forgetXsCredentialsConfirm: 'Are you sure you want to forget your XenServer Client ID?',\n  forgetXsCredentialsError: 'Could not forget Client ID',\n  forgetXsCredentialsSuccess: 'Client ID forgotten',\n  setXsCredentialsError: 'Could not upload Client ID',\n  setXsCredentialsSuccess: 'Client ID uploaded',\n\n  // ----- Home view ------\n  allVms: 'All VMs',\n  backedUpVms: 'Backed up VMs',\n  notBackedUpVms: 'Not backed up VMs',\n  homeFetchingData: 'Fetching data…',\n  homeWelcome: 'Welcome to Xen Orchestra!',\n  homeWelcomeText: 'Add your XCP-ng hosts or pools',\n  homeConnectServerText: 'Some XCP-ng hosts have been registered but are not connected',\n  homeHelp: 'Want some help?',\n  homeAddServer: 'Add server',\n  homeConnectServer: 'Connect servers',\n  homeOnlineDoc: 'Online doc',\n  homeProSupport: 'Pro support',\n  homeNoVms: 'There are no VMs!',\n  homeNoVmsOr: 'Or…',\n  homeImportVm: 'Import VM',\n  homeImportVmMessage: 'Import an existing VM in xva format',\n  homeRestoreBackup: 'Restore a backup',\n  homeRestoreBackupMessage: 'Restore a backup from a remote store',\n  homeNewVmMessage: 'This will create a new VM',\n  homeFilters: 'Filters',\n  homeNoMatches: 'No results! Click here to reset your filters',\n  homeTypePool: 'Pool',\n  homeTypeHost: 'Host',\n  homeTypeVm: 'VM',\n  homeTypeSr: 'SR',\n  homeTypeVmTemplate: 'Template',\n  homeSort: 'Sort',\n  homeAllPools: 'Pools',\n  homeAllHosts: 'Hosts',\n  homeAllTags: 'Tags',\n  homeAllResourceSets: 'Resource sets',\n  homeNewVm: 'New VM',\n  homeFilterNone: 'None',\n  homeFilterDisabledHosts: 'Disabled hosts',\n  homeFilterPendingVms: 'Pending VMs',\n  homeFilterHvmGuests: 'HVM guests',\n  homeSortBy: 'Sort by',\n  homeSortByCpus: 'CPUs',\n  homeSortByInstallTime: 'Install time',\n  homeSortByStartTime: 'Start time',\n  homeSortByName: 'Name',\n  homeSortByPowerstate: 'Power state',\n  homeSortByRAM: 'RAM',\n  homeSortByShared: 'Shared/Not shared',\n  homeSortBySize: 'Size',\n  homeSortByType: 'Type',\n  homeSortByUsage: 'Usage',\n  homeSortVmsBySnapshots: 'Snapshots',\n  homeSortByContainer: 'Container',\n  homeSortByPool: 'Pool',\n  homeDisplayedItems: '{displayed, number}x {icon} (of {total, number})',\n  homeSelectedItems: '{selected, number}x {icon} selected (of {total, number})',\n  homeMore: 'More',\n  homeMigrateTo: 'Migrate to…',\n  homeMissingPatches: 'Missing patches',\n  homePoolMaster: 'Master:',\n  homeResourceSet: 'Resource set: {resourceSet}',\n  homeSrVdisToCoalesce: 'Some VDIs need to be coalesced',\n  highAvailability: 'High Availability',\n  powerState: 'Power state',\n  srSharedType: 'Shared {type}',\n  warningHostTimeTooltip: 'Host time and XOA time are not consistent with each other',\n  notAllHostsHaveTheSameVersion: 'Not all hosts within {pool} have the same version',\n  sortByDisksUsage: 'Disks usage',\n\n  // ----- Home snapshots -----\n  snapshotVmsName: 'Name',\n  snapshotVmsDescription: 'Description',\n\n  // ----- Common components -----\n  sortedTableAllItemsSelected: 'All of them are selected ({nItems, number})',\n  sortedTableNoItems: 'No items found',\n  sortedTableNumberOfFilteredItems: '{nFiltered, number} of {nTotal, number} items',\n  sortedTableNumberOfItems: '{nTotal, number} items',\n  sortedTableNumberOfSelectedItems: '{nSelected, number} selected',\n  sortedTableSelectAllItems: 'Click here to select all items',\n  chooseCompressionGzipOption: 'GZIP (very slow)',\n  chooseCompressionZstdOption: 'Zstd (fast, XCP-ng only)',\n\n  // ----- state -----\n  state: 'State',\n  stateDisabled: 'Disabled',\n  stateEnabled: 'Enabled',\n\n  // ----- Labels -----\n  labelDisk: 'Disk',\n  labelMerge: 'Merge',\n  labelSize: 'Size',\n  labelSpeed: 'Speed',\n  labelSr: 'SR',\n  labelTransfer: 'Transfer',\n  labelVm: 'VM',\n\n  // ----- Forms -----\n  formCancel: 'Cancel',\n  formCreate: 'Create',\n  formDescription: 'Description',\n  formEdit: 'Edit',\n  formId: 'ID',\n  formName: 'Name',\n  formReset: 'Reset',\n  formSave: 'Save',\n  formNotes: 'Notes',\n  add: 'Add',\n  selectAll: 'Select all',\n  remove: 'Remove',\n  preview: 'Preview',\n  action: 'Action',\n  item: 'Item',\n  noSelectedValue: 'No selected value',\n  filterByTags: 'Filter by tags',\n  selectSubjects: 'Choose user(s) and/or group(s)',\n  selectObjects: 'Select object(s)…',\n  selectRole: 'Choose a role',\n  selectHostFirst: 'Select a host first',\n  selectHosts: 'Select host(s)…',\n  selectHostsVms: 'Select object(s)…',\n  selectNetworks: 'Select network(s)…',\n  selectPcis: 'Select PCI(s)…',\n  selectPifs: 'Select PIF(s)…',\n  selectPools: 'Select pool(s)…',\n  selectRemotes: 'Select remote(s)…',\n  selectProxies: 'Select proxy(ies)…',\n  selectProxy: 'Select proxy…',\n  selectResourceSets: 'Select resource set(s)…',\n  selectResourceSetsVmTemplate: 'Select template(s)…',\n  selectResourceSetsSr: 'Select SR(s)…',\n  selectResourceSetsNetwork: 'Select network(s)…',\n  selectResourceSetsVdi: 'Select disk(s)…',\n  selectSshKey: 'Select SSH key(s)…',\n  selectSrs: 'Select SR(s)…',\n  selectVms: 'Select VM(s)…',\n  selectVmSnapshots: 'Select snapshot(s)…',\n  selectVmTemplates: 'Select VM template(s)…',\n  selectTags: 'Select tag(s)…',\n  selectVdis: 'Select disk(s)…',\n  selectTimezone: 'Select timezone…',\n  selectIp: 'Select IP(s)…',\n  selectIpPool: 'Select IP pool(s)…',\n  selectVgpuType: 'Select VGPU type(s)…',\n  fillOptionalInformations: 'Fill information (optional)',\n  selectTableReset: 'Reset',\n  selectCloudConfigs: 'Select cloud config(s)…',\n  selectNetworkConfigs: 'Select network config(s)…',\n\n  // --- Dates/Scheduler ---\n\n  schedulingMonth: 'Month',\n  schedulingDay: 'Day',\n  schedulingSetWeekDayMode: 'Switch to week days',\n  schedulingSetMonthDayMode: 'Switch to month days',\n  schedulingHour: 'Hour',\n  schedulingMinute: 'Minute',\n  selectTableAllMonth: 'Every month',\n  selectTableAllDay: 'Every day',\n  selectTableAllHour: 'Every hour',\n  selectTableAllMinute: 'Every minute',\n  timezonePickerUseLocalTime: 'Web browser timezone',\n  serverTimezoneOption: 'Server timezone ({value})',\n  cronPattern: 'Cron Pattern:',\n  successfulJobCall: 'Successful',\n  failedJobCall: 'Failed',\n  jobCallSkipped: 'Skipped',\n  jobCallInProgess: 'In progress',\n  jobTransferredDataSize: 'Transfer size:',\n  jobTransferredDataSpeed: 'Transfer speed:',\n  operationSize: 'Size',\n  operationSpeed: 'Speed',\n  exportType: 'Type',\n  jobMergedDataSize: 'Merge size:',\n  jobMergedDataSpeed: 'Merge speed:',\n  allJobCalls: 'All',\n  job: 'Job',\n  jobModalTitle: 'Job {job}',\n  jobId: 'ID',\n  jobType: 'Type',\n  jobName: 'Name',\n  jobModes: 'Modes',\n  jobNamePlaceholder: 'Name of your job (forbidden: \"_\")',\n  jobStart: 'Start',\n  jobEnd: 'End',\n  jobDuration: 'Duration',\n  jobStatus: 'Status',\n  jobAction: 'Action',\n  jobTag: 'Tag',\n  jobScheduling: 'Scheduling',\n  jobTimezone: 'Timezone',\n  jobServerTimezone: 'Server',\n  runJob: 'Run job',\n  cancelJob: 'Cancel job',\n  runJobVerbose: 'Onetime job started. See overview for logs.',\n  jobEdit: 'Edit job',\n  jobDelete: 'Delete',\n  jobFinished: 'Finished',\n  jobInterrupted: 'Interrupted',\n  jobStarted: 'Started',\n  jobFailed: 'Failed',\n  jobSkipped: 'Skipped',\n  jobSuccess: 'Successful',\n  allTasks: 'All',\n  taskDeleteLog: 'Delete task log',\n  taskStart: 'Start',\n  taskEnd: 'End',\n  taskDuration: 'Duration',\n  taskSuccess: 'Successful',\n  taskFailed: 'Failed',\n  taskSkipped: 'Skipped',\n  taskStarted: 'Started',\n  taskInterrupted: 'Interrupted',\n  taskAborted: 'Aborted',\n  taskTransferredDataSize: 'Transfer size',\n  taskTransferredDataSpeed: 'Transfer speed',\n  taskMergedDataSize: 'Merge size',\n  taskMergedDataSpeed: 'Merge speed',\n  taskError: 'Error',\n  taskEstimatedEnd: 'Estimated end',\n  taskReason: 'Reason',\n  taskOpenRawLog: 'Open raw log',\n  saveBackupJob: 'Save',\n  deleteBackupSchedule: 'Remove backup job',\n  deleteBackupScheduleQuestion: 'Are you sure you want to delete this backup job?',\n  deleteSelectedJobs: 'Delete selected jobs',\n  scheduleEnableAfterCreation: 'Enable immediately after creation',\n  scheduleEditMessage: 'You are editing schedule {name} ({id}). Saving will override previous schedule state.',\n  jobEditMessage: 'You are editing job {name} ({id}). Saving will override previous job state.',\n  scheduleEdit: 'Edit schedule',\n  missingBackupName: \"A name is required to create the backup's job!\",\n  missingVms: 'Missing VMs!',\n  missingBackupMode: 'You need to choose a backup mode!',\n  missingRemote: 'Missing remote!',\n  missingRemotes: 'Missing remotes!',\n  missingSrs: 'Missing SRs!',\n  missingPools: 'Missing pools!',\n  missingSchedules: 'Missing schedules!',\n  missingRetentions: 'The modes need at least a schedule with retention higher than 0',\n  missingExportRetention: 'The Backup mode and the Delta Backup mode require backup retention to be higher than 0!',\n  missingCopyRetention: 'The CR mode and The DR mode require replication retention to be higher than 0!',\n  missingSnapshotRetention: 'The Rolling Snapshot mode requires snapshot retention to be higher than 0!',\n  deltaChainRetentionWarning: 'Either the full backup interval or the backup retention should be lower than 50.',\n  retentionNeeded: 'Requires one retention to be higher than 0!',\n  newScheduleError: 'Invalid schedule',\n  createRemoteMessage: 'No remotes found, please click on the remotes settings button to create one!',\n  remotesSettings: 'Remotes settings',\n  pluginsSettings: 'Plugins settings',\n  pluginsWarning: 'To receive the report, the plugins backup-reports and transport-email need to be loaded.',\n  selectSchedule: 'Select a schedule…',\n  scheduleAdd: 'Add a schedule',\n  scheduleDelete: 'Delete',\n  scheduleRun: 'Run schedule',\n  scheduleSequence: 'Schedule sequence',\n  unnamedSchedule: 'Unnamed schedule',\n  unnamedJob: 'Unnamed Job',\n  deleteSelectedSchedules: 'Delete selected schedules',\n  noScheduledJobs: 'No scheduled jobs.',\n  legacySnapshotsLink: 'You can delete all your legacy backup snapshots.',\n  newSchedule: 'New schedule',\n  noSchedules: 'No schedules found',\n  jobActionPlaceHolder: 'Select an xo-server API command',\n  jobTimeoutPlaceHolder: 'Timeout (number of seconds after which a VM is considered failed)',\n  jobSchedules: 'Schedules',\n  jobScheduleNamePlaceHolder: 'Name of your schedule',\n  jobScheduleJobPlaceHolder: 'Select a job',\n  jobOwnerPlaceholder: 'Job owner',\n  jobUserNotFound: \"This job's creator no longer exists\",\n  redirectToMatchingVms: 'Click here to see the matching VMs',\n  noMatchingVms: 'There are no matching VMs!',\n  allMatchingVms: '{icon} See the matching VMs ({nMatchingVms, number})',\n  runBackupNgJobConfirm: 'Are you sure you want to run {name} ({id})?',\n  runBackupJobWarningNVms: 'This job will backup {nVms, number} VM{nVms, plural, one {} other {s}}.',\n  cancelJobConfirm: 'Are you sure you want to cancel {name} ({id})?',\n  scheduleDstWarning:\n    'If your country participates in DST, it is advised that you avoid scheduling jobs at the time of change. e.g. 2AM to 3AM for US.',\n\n  // ------ New backup -----\n  checkBackup: 'Restore health check',\n  newBackupAdvancedSettings: 'Advanced settings',\n  newBackupSettings: 'Settings',\n  reportWhenAlways: 'Always',\n  reportWhenSkippedFailure: 'Skipped and failure',\n  reportWhenFailure: 'Failure',\n  reportWhenNever: 'Never',\n  reportRecipients: 'Report recipients',\n  reportWhen: 'Report when',\n  concurrency: 'Concurrency',\n  mergeBackupsSynchronously: 'Merge backups synchronously',\n  mergeBackupsSynchronouslyTooltip:\n    'This will use more resources on the backup thread, but ensure there is no locking error when chaining multiple backup jobs on the same remote',\n  newBackupSelection: 'Select your backup type:',\n  snapshotRetention: 'Snapshot retention',\n  backupName: 'Name',\n  checkpointSnapshot: 'Checkpoint snapshot',\n  offlineSnapshot: 'Offline snapshot',\n  offlineBackup: 'Offline backup',\n  offlineBackupInfo: 'Export VMs without snapshotting them. The VMs will be shutdown during the export.',\n  timeout: 'Timeout',\n  timeoutInfo: 'Number of hours after which a job is considered failed',\n  fullBackupInterval: 'Full backup interval',\n  forceFullBackup: 'Force full backup',\n  timeoutUnit: 'In hours',\n  dbAndDrRequireEnterprisePlan: 'Delta Backup and DR require an Enterprise plan',\n  crRequiresPremiumPlan: 'CR requires a Premium plan',\n  smartBackupModeTitle: 'Smart mode',\n  backupTargetRemotes: 'Target remotes (for export)',\n  backupTargetSrs: 'Target SRs (for replication)',\n  localRemoteWarningTitle: 'Local remote selected',\n  crOnThickProvisionedSrWarning:\n    'Tip: Using thin-provisioned storage will consume less space. Please click on the icon to get more information',\n  vmsOnThinProvisionedSrTip:\n    'Tip: Creating VMs on thin-provisioned storage will consume less space. Please click on the icon to get more information',\n  deltaBackupOnOutdatedXenServerWarning: 'Delta Backup and Continuous Replication require at least XenServer 6.5.',\n  backupNgLinkToDocumentationMessage: 'Click for more information about the backup methods.',\n  localRemoteWarningMessage: 'Warning: Local remotes will use limited XOA disk space. Only for advanced users.',\n  editBackupVmsTitle: 'VMs',\n  editBackupSmartStatusTitle: 'VMs statuses',\n  editBackupSmartResidentOn: 'Resident on',\n  editBackupSmartNotResidentOn: 'Not resident on',\n  editBackupSmartPools: 'Pools',\n  editBackupSmartTags: 'Tags',\n  editBackupSmartTagsInfo:\n    \"VMs with tags in the form of <b>xo:no-bak</b> or <b>xo:no-bak=Reason</b>won't be included in any backup.For example, ephemeral VMs created by health check have this tag\",\n  sampleOfMatchingVms: 'Sample of matching VMs',\n  backupReplicatedVmsInfo:\n    'Replicated VMs (VMs with Continuous Replication or Disaster Recovery tag) must be excluded!',\n  editBackupSmartTagsTitle: 'VMs Tags',\n  editBackupSmartExcludedTagsTitle: 'Excluded VMs tags',\n  deleteOldBackupsFirst: 'Delete first',\n  deleteOldBackupsFirstMessage:\n    'Delete old backups before backing up the VMs. If the new backup fails, you will lose your old backups.',\n  customTag: 'Custom tag',\n  editJobNotFound: \"The job you're trying to edit wasn't found\",\n  preferNbd: 'Use NBD to transfer disk if available',\n  preferNbdInformation: 'A network accessible by XO or the proxy must have NBD enabled.',\n  nbdConcurrency: 'Number of NBD connection per disk',\n  cbtDestroySnapshotData: 'Purge snapshot data when using CBT.',\n  cbtDestroySnapshotDataInformation:\n    \"This will automatically enable Change Block Tracking (CBT) on the disks. The snapshot won't use any notable space on the SR, won't be shown in the UI and won't be usable to do a rollback nor differential restores\",\n  cbtDestroySnapshotDataDisabledInformation:\n    'Snapshot data can be purged only when NBD is enabled and rolling snapshot is not used',\n  shorterBackupReports: 'Shorter backup reports',\n  longTermRetention: 'Long-term retention of backups',\n  numberOfDailyBackupsKept: 'Number of daily backups kept',\n  numberOfWeeklyBackupsKept: 'Number of weekly backups kept',\n  numberOfMonthlyBackupsKept: 'Number of monthly backups kept',\n  numberOfYearlyBackupsKept: 'Number of yearly backups kept',\n  hideSuccessfulItems: 'Hide successful items in failure reports',\n\n  // ------ New Remote -----\n  newRemote: 'New file system remote',\n  remoteTypeLocal: 'Local',\n  remoteTypeNfs: 'NFS',\n  remoteTypeSmb: 'SMB',\n  remoteTypeS3: 'Amazon Web Services S3',\n  remoteTypeAzure: 'Azure',\n  remoteTypeAzurite: 'Azurite',\n  remoteType: 'Type',\n  remoteSmbWarningMessage:\n    'SMB remotes are meant to work with Windows Server. For other systems (Linux Samba, which means almost all NAS), please use NFS.',\n  remoteTestTip: 'Test your remote',\n  testRemote: 'Test remote',\n  remoteTestFailure: 'Test failed for {name}',\n  remoteTestSuccess: 'Test passed for {name}',\n  remoteTestError: 'Error',\n  remoteTestStep: 'Test step',\n  remoteTestName: 'Test name',\n  remoteTestNameFailure: 'Remote name already exists!',\n  remoteTestSuccessMessage: 'The remote appears to work correctly',\n  remoteConnectionFailed: 'Connection failed',\n  remoteContainer: 'Container',\n  remoteAccountName: 'Account name',\n\n  // ------ Backup job -----\n\n  confirmDeleteBackupJobsTitle: 'Delete backup job{nJobs, plural, one {} other {s}}',\n  confirmDeleteBackupJobsBody:\n    'Are you sure you want to delete {nJobs, number} backup job{nJobs, plural, one {} other {s}}?',\n  mirrorFullBackup: 'Mirror full backup',\n  mirrorIncrementalBackup: 'Mirror incremental backup',\n  runBackupJob: 'Run backup job once',\n  speedLimit: 'Speed limit (in MiB/s)',\n  sourceRemote: 'Source remote',\n  targetRemotes: 'Target remotes',\n\n  // ------ Remote -----\n  remoteName: 'Name',\n  remotePath: 'Path',\n  remoteState: 'State',\n  remoteDevice: 'Device',\n  remoteDisk: 'Disk (Used / Total)',\n  remoteSpeed: 'Speed (Write / Read)',\n  remoteSpeedInfo: 'Read and write rate speed performed during latest test',\n  remoteOptions: 'Options',\n  remoteShare: 'Share',\n  remoteAuth: 'Auth',\n  remoteDeleteTip: 'Delete',\n  remoteDeleteSelected: 'Delete selected remotes',\n  remoteMyNamePlaceHolder: 'Name',\n  remoteLocalPlaceHolderPath: '/path/to/backup',\n  remoteNfsPlaceHolderHost: 'Host',\n  remoteNfsPlaceHolderPort: 'Port',\n  remoteNfsPlaceHolderPath: 'path/to/backup',\n  remoteNfsPlaceHolderOptions: 'Custom mount options',\n  remoteSmbPlaceHolderRemotePath: 'Subfolder [path\\\\\\\\to\\\\\\\\backup]',\n  remoteSmbPlaceHolderUsername: 'Username',\n  remoteSmbPlaceHolderPassword: 'Password',\n  remoteSmbPlaceHolderDomain: 'Domain',\n  remoteSmbPlaceHolderAddressShare: '<address>\\\\\\\\<share>',\n  remoteSmbPlaceHolderOptions: 'Custom mount options',\n  remoteS3LabelUseHttps: 'Use HTTPS',\n  remoteS3LabelAllowInsecure: 'Allow unauthorized',\n  remoteS3PlaceHolderEndpoint: 'AWS S3 endpoint (ex: s3.us-east-2.amazonaws.com)',\n  remoteS3PlaceHolderBucket: 'AWS S3 bucket name',\n  remoteS3PlaceHolderDirectory: 'Directory',\n  remoteS3PlaceHolderAccessKeyID: 'Access key ID',\n  remoteS3PlaceHolderSecret: 'Paste secret here to change it',\n  remoteS3PlaceHolderEncryptionKey: 'Enter your encryption key here (32 characters)',\n  remoteS3Region: 'Region, leave blank for default',\n  remoteS3TooltipProtocol: 'Uncheck if you want HTTP instead of HTTPS',\n  remoteS3TooltipAcceptInsecure: 'Check if you want to accept self signed certificates',\n  remoteAzureLabelUseHttps: 'Use HTTPS',\n  remoteAzureLabelAllowInsecure: 'Allow unauthorized',\n  remoteAzurePlaceHolderEndpoint: 'Azure endpoint (ex: username.blob.core.windows.net)',\n  remoteAzurePlaceHolderContainer: 'Azure container name',\n  remoteAzurePlaceHolderDirectory: 'Directory',\n  remoteAzurePlaceHolderAccessKeyID: 'Access key ID',\n  remoteAzurePlaceHolderSecret: 'Paste secret here to change it',\n  remoteAzurePlaceHolderEncryptionKey: 'Enter your encryption key here (32 characters)',\n  remoteAzureRegion: 'Region, leave blank for default',\n  remoteAzureTooltipProtocol: 'Uncheck if you want HTTP instead of HTTPS',\n  remoteAzureTooltipAcceptInsecure: 'Check if you want to accept self signed certificates',\n  remotePlaceHolderPassword: 'Password(fill to edit)',\n  remoteUseVhdDirectory:\n    'Store backup as multiple data blocks instead of a whole VHD file. (creates 500-1000 files per backed up GB but allows faster merge)',\n  remoteUseVhdDirectoryTooltip:\n    'Your remote must be able to handle parallel access (up to 16 write processes per backup) and the number of files (500-1000 files per GB of backed up data)',\n  remoteEncryptionBackupSize: 'Size of backup is not updated when using encryption.',\n  remoteEncryptionEncryptedfiles:\n    'All the files of the remote except the encryption.json are encrypted, that means you can only activate encryption or change key on an empty remote.',\n  remoteEncryptionMustUseVhd: 'Delta backup must use VHD saved as blocks',\n  remoteEncryptionKey: 'Encrypt all new data sent to this remote',\n  remoteEncryptionKeyStorageLocation:\n    \"You won't be able to get your data back if you lose the encryption key. The encryption key is saved in the XO config backup, they should be secured correctly. Be careful, if you saved it on an encrypted remote, then you won't be able to access it without the remote encryption key.\",\n  encryption: 'Encryption',\n  remoteEncryptionLegacy:\n    'A legacy encryption algorithm is used ({algorithm}), please create a new remote with the recommended algorithm {recommendedAlgorithm}',\n\n  // ------ New Storage -----\n\n  newSr: 'New SR',\n  newSrConfirm:\n    'This will erase the entire disk or partition ({name}) to create a new storage repository. Are you sure you want to continue?',\n  newSrExistingSr:\n    'SR{n, plural, one {} other {s}} already exist on this device, as noted in the Storage Usage section. Creating this SR may erase the content of {path} and cause the loss of existing SR{n, plural, one {} other {s}}. Are you sure you want to continue?',\n  newSrTitle: 'Create a new SR',\n  newSrGeneral: 'General',\n  newSrTypeSelection: 'Select storage type:',\n  newSrSettings: 'Settings',\n  newSrUsage: 'Storage usage',\n  newSrSummary: 'Summary',\n  newSrHost: 'Host',\n  newSrType: 'Type',\n  newSrName: 'Name',\n  newSrDescription: 'Description',\n  newSrServer: 'Server',\n  newSrPath: 'Path',\n  newSrIqn: 'IQN',\n  newSrLun: 'LUN',\n  newSrNoHba: 'No HBA devices',\n  newSrAuth: 'With auth.',\n  newSrUsername: 'User name',\n  newSrPassword: 'Password',\n  newSrDevice: 'Device',\n  newSrInUse: 'In use',\n  newSrSize: 'Size',\n  newSrCreate: 'Create',\n  newSrNamePlaceHolder: 'Storage name',\n  newSrDescPlaceHolder: 'Storage description',\n  newSrIscsiAddressPlaceHolder: 'e.g 93.184.216.34 or iscsi.example.net',\n  newSrNfsAddressPlaceHolder: 'e.g 93.184.216.34 or nfs.example.net',\n  newSrSmbAddressPlaceHolder: 'e.g \\\\\\\\server\\\\sharename',\n  newSrPortPlaceHolder: '[port]',\n  newSrUsernamePlaceHolder: 'Username',\n  newSrPasswordPlaceHolder: 'Password',\n  newSrLvmDevicePlaceHolder: 'Device, e.g /dev/sda…',\n  newSrLocalPathPlaceHolder: '/path/to/directory',\n  newSrNfsDefaultVersion: 'Default NFS version',\n  newSrNfsOptions: 'Comma delimited NFS options',\n  newSrNfs: 'NFS version',\n  noSharedZfsAvailable: 'No shared ZFS available',\n  reattachNewSrTooltip: 'Reattach SR',\n  srLocation: 'Storage location',\n\n  // ------ New Network -----\n  createNewNetworkNoPermission: 'You do not have permission to create a network',\n  createNewNetworkOn: 'Create a new network on {select}',\n\n  // ----- ACLs, Users, Groups ------\n  subjectName: 'Users/Groups',\n  objectName: 'Object',\n  roleName: 'Role',\n  aclCreate: 'Create',\n  newGroupName: 'New group name',\n  createGroup: 'Create group',\n  syncLdapGroups: 'Synchronize LDAP groups',\n  ldapPluginNotConfigured: 'Install and configure the auth-ldap plugin first',\n  syncLdapGroupsWarning:\n    'Are you sure you want to synchronize LDAP groups with XO? This may delete XO groups and their ACLs.',\n  createGroupButton: 'Create',\n  deleteGroup: 'Delete group',\n  deleteGroupConfirm: 'Are you sure you want to delete this group?',\n  deleteSelectedGroups: 'Delete selected groups',\n  deleteGroupsModalTitle: 'Delete group{nGroups, plural, one {} other {s}}',\n  deleteGroupsModalMessage:\n    'Are you sure you want to delete {nGroups, number} group{nGroups, plural, one {} other {s}}?',\n  removeUserFromGroup: 'Remove user from group',\n  deleteUserConfirm: 'Are you sure you want to delete this user?',\n  deleteUser: 'Delete user',\n  deleteSelectedUsers: 'Delete selected users',\n  deleteUsersModalTitle: 'Delete user{nUsers, plural, one {} other {s}}',\n  deleteUsersModalMessage: 'Are you sure you want to delete {nUsers, number} user{nUsers, plural, one {} other {s}}?',\n  noUser: 'No user',\n  unknownUser: 'Unknown user',\n  noGroupFound: 'No group found',\n  groupNameColumn: 'Name',\n  groupUsersColumn: 'Users',\n  addUserToGroupColumn: 'Add user',\n  userNameColumn: 'Username',\n  userGroupsColumn: 'Member of',\n  userCountGroups: '{nGroups, number} group{nGroups, plural, one {} other {s}}',\n  userPermissionColumn: 'Permissions',\n  userAuthColumn: 'Password / Authentication methods',\n  userName: 'Username',\n  userPassword: 'Password',\n  createUserButton: 'Create',\n  noUserFound: 'No user found',\n  userLabel: 'User',\n  adminLabel: 'Admin',\n  noUserInGroup: 'No user in group',\n  countUsers: '{users, number} user{users, plural, one {} other {s}}',\n  selectPermission: 'Select permission',\n  deleteAcl: 'Delete ACL',\n  deleteSelectedAcls: 'Delete selected ACLs',\n  deleteAclsModalTitle: 'Delete ACL{nAcls, plural, one {} other {s}}',\n  deleteAclsModalMessage: 'Are you sure you want to delete {nAcls, number} ACL{nAcls, plural, one {} other {s}}?',\n\n  // ----- Plugins ------\n  noPlugins: 'No plugins found',\n  autoloadPlugin: 'Auto-load at server start',\n  savePluginConfiguration: 'Save configuration',\n  deletePluginConfiguration: 'Delete configuration',\n  pluginConfirmation: 'The test appears to be working.',\n  pluginError: 'Plugin error',\n  pluginTest: 'Plugin test',\n  unknownPluginError: 'Unknown error',\n  purgePluginConfiguration: 'Purge plugin configuration',\n  purgePluginConfigurationQuestion: 'Are you sure you want to purge this configuration?',\n  cancelPluginEdition: 'Cancel',\n  pluginConfigurationSuccess: 'Plugin configuration',\n  pluginConfigurationChanges: 'Plugin configuration successfully saved!',\n  pluginConfigurationPresetTitle: 'Predefined configuration',\n  pluginConfigurationChoosePreset: 'Choose a predefined configuration.',\n  applyPluginPreset: 'Apply',\n  disabledTestPluginTootltip: 'This plugin is not loaded',\n\n  // ----- User preferences -----\n  saveNewUserFilterErrorTitle: 'Save filter error',\n  saveNewUserFilterErrorBody: 'Bad parameter: name must be given.',\n  filterName: 'Name:',\n  filterValue: 'Value:',\n  saveNewFilterTitle: 'Save new filter',\n  removeUserFilterTitle: 'Remove custom filter',\n  removeUserFilterBody: 'Are you sure you want to remove the custom filter?',\n  defaultFilter: 'Default filter',\n  defaultFilters: 'Default filters',\n  customFilters: 'Custom filters',\n  customizeFilters: 'Customize filters',\n\n  // ----- VM actions ------\n  cantInterPoolCopy: 'Interpool copy requires at least Enterprise plan',\n  copyExportedUrl: 'Copy the export URL of the VM',\n  downloadVm: 'Download VM',\n  startVmLabel: 'Start',\n  startVmOnLabel: 'Start on…',\n  startVmOnMissingHostTitle: 'No host selected',\n  startVmOnMissingHostMessage: 'You must select a host',\n  recoveryModeLabel: 'Recovery start',\n  suspendVmLabel: 'Suspend',\n  pauseVmLabel: 'Pause',\n  stopVmLabel: 'Stop',\n  forceShutdownVmLabel: 'Force shutdown',\n  rebootVmLabel: 'Reboot',\n  forceRebootVmLabel: 'Force reboot',\n  deleteVmLabel: 'Delete',\n  deleteSelectedVmsLabel: 'Delete selected VMs',\n  migrateVmLabel: 'Migrate',\n  snapshotVmLabel: 'Snapshot',\n  exportVmLabel: 'Export',\n  resumeVmLabel: 'Resume',\n  copyVmLabel: 'Copy',\n  cloneVmLabel: 'Clone',\n  cleanVm: 'Clean VM directory',\n  fastCloneVmLabel: 'Fast clone',\n  startMigratedVm: 'Start the migrated VM',\n  vmConsoleLabel: 'Console',\n  vmExportUrlValidity: 'The URL is valid once for a short period of time.',\n  vmWarmMigration: 'Warm migration',\n  vmWarmMigrationProcessInfo:\n    'Warm migration process will first create a copy of the VM on the destination while the source VM is still running, then shutdown the source VM and send the changes that happened during the migration to the destination to minimize downtime.',\n  backupLabel: 'Backup',\n\n  // ----- SR general tab -----\n  baseCopyTooltip: '{n, number} base cop{n, plural, one {y} other {ies}} ({usage})',\n  diskTooltip: '{name} ({usage})',\n  snapshotsTooltip: '{n, number} snapshot{n, plural, one {} other {s}} ({usage})',\n  vdiOnVmTooltip: '{name} ({usage}) on {vmName}',\n  vdisTooltip: '{n, number} VDI{n, plural, one {} other {s}} ({usage})',\n\n  // ----- SR advanced tab -----\n\n  provisioning: 'Provisioning',\n  supportedImageFormats: 'Supported image formats',\n  srUnhealthyVdiDepth: 'Depth',\n  srUnhealthyVdiNameLabel: 'Name',\n  srUnhealthyVdiSize: 'Size',\n  srUnhealthyVdiTitle: 'VDI to coalesce ({total, number})',\n  srUnhealthyVdiUuid: 'UUID',\n\n  // ----- SR stats tab -----\n\n  srNoStats: 'No stats',\n  statsIops: 'IOPS',\n  statsIoThroughput: 'IO throughput',\n  statsLatency: 'Latency',\n  statsIowait: 'IOwait',\n\n  // ----- SR actions -----\n  srRescan: 'Rescan all disks',\n  srReconnectAll: 'Connect to all hosts',\n  srDisconnectAll: 'Disconnect from all hosts',\n  srForget: 'Forget this SR',\n  srsForget: 'Forget SRs',\n  nSrsForget: 'Forget {nSrs, number} SR{nSrs, plural, one {} other{s}}',\n  srRemoveButton: 'Remove this SR',\n  srNoVdis: 'No VDIs in this storage',\n  srReclaimSpace: 'Reclaim freed space',\n  srReclaimSpaceConfirm: 'Are you sure you want to reclaim freed space on this SR?',\n  srReclaimSpaceNotSupported: 'Space reclaim not supported. Only supported on block based/LVM based SRs.',\n\n  // ----- SR disks tab -----\n  isMetadataVdi: 'This snapshot has been purged of its data. It only contains the metadata and changed blocks.',\n  multipleActiveVdis: '{firstVdi} and {nVdis} more',\n  noActiveVdi: 'No active VDI',\n\n  // ----- Pool general -----\n  earliestExpirationDate: 'Earliest expiration: {dateString}',\n  poolNoSupport: 'No XCP-ng Pro support enabled on this pool',\n  poolPartialSupport:\n    'Only {nHostsLicense, number} host{nHostsLicense, plural, one {} other {s}} under license on {nHosts, number} host{nHosts, plural, one {} other {s}}. This means this pool is not supported at all until you license all its hosts.',\n  poolTitleRamUsage: 'Pool RAM usage:',\n  poolRamUsage: '{used} used of {total} ({free} free)',\n  poolMaster: 'Master:',\n  displayAllHosts: 'Display all hosts of this pool',\n  displayAllStorages: 'Display all storage for this pool',\n  displayAllVMs: 'Display all VMs of this pool',\n  licenseRestrictions: 'License restrictions',\n  licenseRestrictionsModalTitle: 'Warning: You are using a Free XenServer license',\n  actionsRestricted: 'Some functionality is restricted.',\n  counterRestrictionsOptions: 'You can:',\n  counterRestrictionsOptionsXcp: 'upgrade to XCP-ng for free to get rid of these restrictions',\n  counterRestrictionsOptionsXsLicense: 'or get a commercial Citrix license',\n  // ----- Pool tabs -----\n  hostsTabName: 'Hosts',\n  vmsTabName: 'VMs',\n  srsTabName: 'SRs',\n  // ----- Pool advanced tab -----\n  backupNetwork: 'Backup network',\n  crashDumpSr: 'Crash dump SR',\n  defaultMigrationNetwork: 'Default migration network',\n  migrationCompression: 'Migration compression',\n  migrationCompressionDisabled: 'Migration compression is not available on this pool',\n  poolDisableHa: 'Disabling high availability',\n  poolDisableHaConfirm: 'Are you sure you want to disable high availability on this pool?',\n  poolEnableHa: 'Enabling high availability',\n  poolEditAll: 'Edit all',\n  poolHaSelectSrs: 'Select heartbeat SR candidates',\n  poolHaSelectSrsDetails: 'The XAPI will pick one of these SR as heartbeat SR',\n  poolHaEnabled: 'Enabled',\n  poolHaDisabled: 'Disabled',\n  poolHaStatus: 'High Availability',\n  poolHeartbeatSr: 'Heartbeat SR',\n  poolGpuGroups: 'GPU groups',\n  poolRemoteSyslogPlaceHolder: 'Logging host',\n  poolSupportSourceUsers: 'XCP-ng Pro Support not available for source users',\n  poolSupportXcpngOnly: 'Only available for pool of XCP-ng hosts',\n  poolLicenseAlreadyFullySupported: 'The pool is already fully supported',\n  rollingPoolReboot: 'Rolling Pool Reboot',\n  rollingPoolRebootHaWarning: 'High Availability is enabled. This will automatically disable it during the reboot.',\n  rollingPoolRebootLoadBalancerWarning:\n    'Load Balancer plugin is running. This will automatically pause it during the reboot.',\n  rollingPoolRebootMessage:\n    'Are you sure you want to start a Rolling Pool Reboot? Running VMs will be migrated back and forth and this can take a while. Scheduled backups that may concern this pool will be disabled.',\n\n  setpoolMaster: 'Master',\n  syslogRemoteHost: 'Remote syslog host',\n  syncNetbox: 'Synchronize with Netbox',\n  syncNetboxWarning: 'Are you sure you want to synchronize with Netbox?',\n  updateMissingNetwork: '{networkID} not found, please select a new one',\n  // ----- Pool host tab -----\n  hostNameLabel: 'Name',\n  hostDescription: 'Description',\n  noHost: 'No hosts',\n  memoryLeftTooltip: '{used}% used ({free} free)',\n  // ----- Pool network tab -----\n  bondMode: 'Bond Mode',\n  pif: 'PIF',\n  poolNetworkAutomatic: 'Automatic',\n  poolNetworkNameLabel: 'Name',\n  poolNetworkDescription: 'Description',\n  poolNetworkPif: 'PIFs',\n  privateNetworks: 'Private networks',\n  manage: 'Manage',\n  poolNoNetwork: 'No networks',\n  poolNetworkMTU: 'MTU',\n  poolNetworkPifAttached: 'Connected',\n  poolNetworkPifDetached: 'Disconnected',\n  showPifs: 'Show PIFs',\n  hidePifs: 'Hide PIFs',\n  networkAutomaticTooltip: 'Network(s) selected by default for new VMs',\n  noNbdConnection: 'No NBD Connection',\n  nbdConnection: 'NBD Connection',\n  insecureNbdConnection: 'Insecure NBD Connection (not allowed through XO)',\n  // ----- Pool patches tab -----\n  multiHostPoolUpdate: \"Rolling pool update can only work when there's multiple hosts in a pool with a shared storage\",\n  nVmsRunningOnLocalStorage:\n    '{nVms, number} VM{nVms, plural, one {} other {s}} {nVms, plural, one {is} other {are}} currently running and using at least one local storage. A shared storage for all your VMs is needed to start a rolling pool update',\n  // ----- Pool stats tab -----\n  poolNoStats: 'No stats',\n  poolAllHosts: 'All hosts',\n  // ----- Pool actions ------\n  addSrLabel: 'Add SR',\n  addVmLabel: 'Add VM',\n  addHostsLabel: 'Add hosts',\n  clickLinkForDetails: 'Follow this link for more details',\n  missingPatchesPool:\n    'The pool needs to install {nMissingPatches, number} patch{nMissingPatches, plural, one {} other {es}}. This operation may take a while.',\n  missingPatchesHost:\n    'The selected host{nHosts, plural, one {} other {s}} need{nHosts, plural, one {s} other {}} to install {nMissingPatches, number} patch{nMissingPatches, plural, one {} other {es}}. This operation may take a while.',\n  patchUpdateNoInstall:\n    'The selected host{nHosts, plural, one {} other {s}} cannot be added to the pool because the patches are not homogeneous.',\n  addHostsErrorTitle: 'Adding host{nHosts, plural, one {} other {s}} failed',\n  addHostNotHomogeneousErrorMessage: 'Host patches could not be homogenized.',\n  disconnectServer: 'Disconnect',\n\n  // ----- Host item ------\n  host: 'Host',\n  hostHvmDisabled: 'Hardware-assisted virtualization is not enabled on this host',\n  hostNoLicensePartialProSupport:\n    'This host does not have an active license, even though it is in a pool with licensed hosts. In order for XCP-ng Pro Support to be enabled on a pool, all hosts within the pool must have an active license',\n  hostNoSupport: 'No XCP-ng Pro Support enabled on this host',\n  hostSupportEnabled: 'XCP-ng Pro Support enabled on this host',\n  noMoreMaintained: 'This host version is no longer maintained',\n  pubKeyTooShort: 'TLS key is too small to update host to XCP-ng 8.3',\n  longerCustomCertficate:\n    'If your certificate is custom, you need to install a new one with a key length of 2048 or greater.',\n  longerDefaultCertificate:\n    'If your certificate is the default self-signed certificate from host installation, you need to re-generate it from XCP-ng 8.2.1.',\n\n  // ----- Host actions ------\n  disableMaintenanceMode: 'Disable maintenance mode',\n  enableMaintenanceMode: 'Enable maintenance mode',\n  slaveHostMoreUpToDateThanMasterAfterRestart:\n    'It appears that this host will be more up-to-date than the master ({master}) after the restart. This will result in the slave being unable to contact the pool master. Please update and restart your master node first.',\n  startHostLabel: 'Start',\n  stopHostLabel: 'Stop',\n  enableHostLabel: 'Enable',\n  disableHostLabel: 'Disable',\n  restartHostAgent: 'Restart toolstack',\n  smartRebootBypassCurrentVmCheck:\n    'As the XOA is hosted on the host that is scheduled for a reboot, it will also be restarted. Consequently, XO won\\'t be able to resume VMs, and VMs with the \"Protect from accidental shutdown\" option enabled will not have this option reactivated automatically.',\n  smartRebootHostLabel: 'Smart reboot',\n  smartRebootHostTooltip: 'Suspend resident VMs, reboot host and resume VMs automatically',\n  forceRebootHostLabel: 'Force reboot',\n  forceSmartRebootHost:\n    'Smart Reboot failed because {nVms, number} VM{nVms, plural, one {} other {s}} ha{nVms, plural, one {s} other {ve}} {nVms, plural, one {its} other {their}} Suspend operation blocked. Would you like to force?',\n  restartAnyway: 'Restart anyway',\n  rebootHostLabel: 'Reboot',\n  noHostsAvailableErrorTitle: 'Error while restarting host',\n  noHostsAvailableErrorMessage:\n    'Some VMs cannot be migrated without first rebooting this host. Please try force reboot.',\n  failHostBulkRestartTitle: 'Error while restarting hosts',\n  failHostBulkRestartMessage:\n    '{failedHosts, number}/{totalHosts, number} host{failedHosts, plural, one {} other {s}} could not be restarted.',\n  rebootUpdateHostLabel: 'Reboot to apply updates',\n  emergencyModeLabel: 'Emergency mode',\n  // ----- Host tabs -----\n  storageTabName: 'Storage',\n  patchesTabName: 'Patches',\n  // ----- host stat tab -----\n  statLoad: 'Load average',\n  // ----- host advanced tab -----\n  applyChangeOnPcis:\n    'This operation will reboot the host in order to apply the change on the PCI{nPcis, plural, one {} other {s}}. Are you sure you want to continue?',\n  className: 'Class name',\n  confirmForceRebootHost: 'Force reboot?',\n  deviceName: 'Device name',\n  enabled: 'Enabled',\n  disksSystemHealthy: 'All disks are healthy ✅',\n  editHostIscsiIqnTitle: 'Edit iSCSI IQN',\n  editHostIscsiIqnMessage:\n    'Are you sure you want to edit the iSCSI IQN? This may result in failures connecting to existing SRs if the host is attached to iSCSI SRs.',\n  hostTitleRamUsage: 'Host RAM usage:',\n  hostEvacuationFailed: 'The host evacuation failed, do you want to force reboot?',\n  maintenanceHostModalMessage:\n    'Are you sure you want to enter maintenance mode? This will migrate all the VMs running on this host to other hosts of the pool.',\n  maintenanceHostModalTitle: 'Maintenance mode',\n  maintenanceHostTooltip: 'Evacuate and disable the host',\n  memoryHostState: 'RAM: {memoryUsed} used of {memoryTotal} ({memoryFree} free)',\n  hardwareHostSettingsLabel: 'Hardware',\n  hyperThreading: 'Hyper-threading (SMT)',\n  hyperThreadingNotAvailable: 'HT detection is only available on XCP-ng 7.6 and higher',\n  hostDownloadLogs: 'Download system logs',\n  hostDownloadLogsContainEntireHostLogs:\n    \"The logs you are about to download contain the entire host's logs, potentially hundreds of megabytes. Please note that these logs can be technical and complex to analyze, requiring some expertise.\",\n  hostAddress: 'Address',\n  hostStatus: 'Status',\n  hostBuildNumber: 'Build number',\n  hostIscsiIqn: 'iSCSI IQN',\n  hostIommuTooltip: 'PCI passthrough capable',\n  hostNoIscsiSr: 'Not connected to an iSCSI SR',\n  hostMultipathingSrs: 'Click to see concerned SRs',\n  hostMultipathingPaths: '{nActives, number} of {nPaths, number} path{nPaths, plural, one {} other {s}}',\n  hostMultipathingRequiredState:\n    'This action will not be fulfilled if a VM is in a running state. Please ensure that all VMs are evacuated or stopped before performing this action!',\n  hostMultipathingWarning:\n    'The host{nHosts, plural, one {} other {s}} will lose their connection to the SRs. Do you want to continue?',\n  hostXenServerVersion: 'Version',\n  hostStatusEnabled: 'Enabled',\n  hostStatusDisabled: 'Disabled',\n  hostPowerOnMode: 'Power on mode',\n  hostControlDomainMemory: 'Control domain memory',\n  setControlDomainMemory: 'Set control domain memory',\n  setControlDomainMemoryMessage:\n    'Editing the control domain memory will immediately restart the host in order to apply the changes.',\n  maintenanceModeRequired: 'The host needs to be in maintenance mode',\n  hostStartedSince: 'Host uptime',\n  hostStackStartedSince: 'Toolstack uptime',\n  hostCpusModel: 'CPU model',\n  hostGpus: 'GPUs',\n  hostCpusNumber: 'Core (socket)',\n  hostManufacturerinfo: 'Manufacturer info',\n  hostBiosinfo: 'BIOS info',\n  licenseHostSettingsLabel: 'License',\n  hostLicenseType: 'Type',\n  hostLicenseSocket: 'Socket',\n  hostLicenseExpiry: 'Expiry',\n  hostRemoteSyslog: 'Remote syslog',\n  hostIommu: 'IOMMU',\n  hostNoCertificateInstalled: 'No certificates installed on this host',\n  'onlyAvailableXcp8.3OrHigher': 'Only available for XCP-ng 8.3.0 or higher',\n  installRaidPlugin: 'To display RAID info, install raid.py plugin',\n  noRaidInformationAvailable: 'No RAID information available',\n  pciDevices: 'PCI Devices',\n  pciId: 'PCI ID',\n  pcisEnable: 'PCI{nPcis, plural, one {} other {s}} enable',\n  pcisDisable: 'PCI{nPcis, plural, one {} other {s}} disable',\n  passthroughEnabled: 'Passthrough enabled',\n  pusbDevices: 'PUSB Devices',\n  smartctlPluginNotInstalled: 'Smartctl plugin not installed',\n  supplementalPacks: 'Installed supplemental packs',\n  supplementalPackNew: 'Install new supplemental pack',\n  supplementalPackPoolNew: 'Install supplemental pack on every host',\n  supplementalPackTitle: '{name} (by {author})',\n  supplementalPackInstallStartedTitle: 'Installation started',\n  supplementalPackInstallStartedMessage: 'Installing new supplemental pack…',\n  supplementalPackInstallErrorTitle: 'Installation error',\n  supplementalPackInstallErrorMessage: 'The installation of the supplemental pack failed.',\n  supplementalPackInstallSuccessTitle: 'Installation success',\n  supplementalPackInstallSuccessMessage: 'Supplemental pack successfully installed.',\n  systemDisksHealth: 'System disks health',\n  raidHealthy: 'All mdadm RAID are healthy ✅',\n  raidStateWarning: 'RAID state needs your attention: {state}',\n  raidStatus: 'RAID Status',\n  uniqueHostIscsiIqnInfo: 'The iSCSI IQN must be unique. ',\n  vendorId: 'Vendor ID',\n  // ----- Host net tabs -----\n  networkCreateButton: 'Add a network',\n  pifDeviceLabel: 'Device',\n  pifNetworkLabel: 'Network',\n  pifVlanLabel: 'VLAN',\n  pifAddressLabel: 'Address',\n  pifModeLabel: 'Mode',\n  pifMacLabel: 'MAC',\n  pifMtuLabel: 'MTU',\n  pifSpeedLabel: 'Speed',\n  pifStatusLabel: 'Status',\n  pifInUse: 'This interface is currently in use',\n  defaultLockingMode: 'Default locking mode',\n  pifConfigureIp: 'Configure IP address',\n  configIpErrorTitle: 'Invalid parameters',\n  staticIp: 'Static IP address',\n  staticIpv6: 'Static IPv6 address',\n  netmask: 'Netmask',\n  dns: 'DNS',\n  gateway: 'Gateway',\n  ipRequired: 'An IP address is required',\n  netmaskRequired: 'Netmask required',\n  // ----- Host storage tabs -----\n  addSrDeviceButton: 'Add a storage',\n  srType: 'Type',\n  pbdDetails: 'PBD details',\n  pbdStatus: 'Status',\n  pbdStatusConnected: 'Connected',\n  pbdStatusDisconnected: 'Disconnected',\n  pbdConnect: 'Connect',\n  pbdDisconnect: 'Disconnect',\n  pbdForget: 'Forget',\n  srShared: 'Shared',\n  srNotShared: 'Not shared',\n  pbdNoSr: 'No storage detected',\n  // ----- Host patch tabs -----\n  patchNameLabel: 'Name',\n  patchUpdateButton: 'Install all patches',\n  patchDescription: 'Description',\n  patchVersion: 'Version',\n  patchApplied: 'Applied date',\n  patchSize: 'Size',\n  patchNothing: 'No patches detected',\n  patchReleaseDate: 'Release date',\n  patchGuidance: 'Guidance',\n  hostAppliedPatches: 'Applied patches',\n  hostMissingPatches: 'Missing patches',\n  hostUpToDate: 'Host up-to-date!',\n  installAllPatchesTitle: 'Install all patches',\n  installAllPatchesContent: 'To install all patches go to pool.',\n  installAllPatchesRedirect: 'Go to pool',\n  installAllPatchesOnHostContent:\n    'The pool master must always be updated FIRST. Updating will automatically restart the toolstack. Running VMs will not be affected. Are you sure you want to continue and install all patches on this host?',\n  patchRelease: 'Release',\n  updatePluginNotInstalled:\n    'An error occurred while fetching the patches. Please make sure the updater plugin is installed by running `yum install xcp-ng-updater` on the host.',\n  showChangelog: 'Show changelog',\n  changelog: 'Changelog',\n  changelogPatch: 'Patch',\n  changelogAuthor: 'Author',\n  changelogDate: 'Date',\n  changelogDescription: 'Description',\n  // ----- Pool patch tabs -----\n  install: 'Install',\n  installPatchesTitle: 'Install patch{nPatches, plural, one {} other {es}}',\n  installPatchesContent:\n    'This will automatically restart the toolstack on every host. Running VMs will not be affected. Are you sure you want to continue and install {nPatches, number} patch{nPatches, plural, one {} other {es}}?',\n  installPoolPatches: 'Install pool patches',\n  confirmPoolPatch:\n    'This will automatically restart the toolstack on every host. Running VMs will not be affected. Are you sure you want to continue and install all the patches on this pool?',\n  rollingPoolUpdate: 'Rolling pool update',\n  rollingPoolUpdateMessage:\n    'Are you sure you want to start a rolling pool update? Running VMs will be migrated back and forth and this can take a while. Scheduled backups that may concern this pool will be disabled.',\n  rollingPoolUpdateHaWarning: 'High Availability is enabled. This will automatically disable it during the update.',\n  rollingPoolUpdateLoadBalancerWarning:\n    'Load Balancer plugin is running. This will automatically pause it during the update.',\n  poolNeedsDefaultSr: 'The pool needs a default SR to install the patches.',\n  vmsHaveCds: '{nVms, number} VM{nVms, plural, one {} other {s}} {nVms, plural, one {has} other {have}} CDs',\n  ejectCds: 'Eject CDs',\n  highAvailabilityNotDisabledTooltip: 'High Availability must be disabled',\n  xsCredentialsMissing:\n    'In order to install XenServer updates, you first need to configure your XenServer Client ID. See {link}.',\n  xsCredentialsMissingShort: 'Missing XenServer Client ID',\n\n  // ----- Pool storage tabs -----\n  defaultSr: 'Default SR',\n  setAsDefaultSr: 'Set as default SR',\n  setDefaultSr: 'Set default SR:',\n\n  // ----- VM tabs -----\n  generalTabName: 'General',\n  statsTabName: 'Stats',\n  consoleTabName: 'Console',\n  containersTabName: 'Container',\n  snapshotsTabName: 'Snapshots',\n  logsTabName: 'Logs',\n  advancedTabName: 'Advanced',\n  networkTabName: 'Network',\n  disksTabName: 'Disk{disks, plural, one {} other {s}}',\n\n  powerStateHalted: 'Halted',\n  powerStateRunning: 'Running',\n  powerStateSuspended: 'Suspended',\n  powerStatePaused: 'Paused',\n  powerStateDisabled: 'Disabled',\n  powerStateBusy: 'Busy',\n\n  // ----- VM home -----\n  vmCurrentStatus: 'Current status:',\n  vmNotRunning: 'Not running',\n  vmHaltedSince: 'Halted {ago}',\n\n  // ----- VM general tab -----\n  availableForUefiOnly: 'This feature is only available for UEFI VMs.',\n  noToolsDetected: 'No Xen tools detected',\n  managementAgentDetected: 'Management agent {version} detected',\n  managementAgentOutOfDate: 'Management agent {version} out of date',\n  managementAgentNotDetected: 'Management agent not detected',\n  noIpv4Record: 'No IPv4 record',\n  noIpRecord: 'No IP record',\n  secureBootEnforced: 'Secure boot enforced',\n  secureBootNotEnforced: 'Secure boot not enforced',\n  secureBootNoDbx: 'Secure boot enforced, but no dbx present',\n  secureBootStatus: 'Secure boot status',\n  secureBootWantedButCertificatesMissing: 'Secure boot wanted, but some EFI certificates are missing',\n  secureBootWantedButDisabled: 'Secure boot wanted, but disabled due to the VM being in UEFI setup mode',\n  secureBootWantedPendingBoot: 'Secure boot wanted, pending first boot',\n  started: 'Started {ago}',\n  paraVirtualizedMode: 'Paravirtualization (PV)',\n  hardwareVirtualizedMode: 'Hardware virtualization (HVM)',\n  hvmModeWithPvDriversEnabled: 'Hardware virtualization with paravirtualization drivers enabled (PVHVM)',\n  pvInPvhMode: 'PV inside a PVH container (PV in PVH)',\n  vmCreatedAdmin: 'Created by {user}\\non {date}\\nwith template {template}',\n  vmCreatedNonAdmin: 'Created on {date}\\nwith template {template}',\n  windowsUpdateTools: 'Manage Citrix PV drivers via Windows Update',\n  windowsToolsModalTitle: 'Windows Update Tools',\n  windowsToolsModalMessage:\n    'Enabling this will allow the VM to automatically install Citrix PV drivers from Windows Update. This only includes drivers, the Citrix management agent must still be separately installed.',\n  windowsToolsModalWarning:\n    'If you have previously installed XCP-ng tools instead of Citrix tools, this option will break your VM.',\n  editVmNotes: 'Edit VM notes',\n  supportsMarkdown: 'Supports Markdown syntax',\n  vmNotesTooLong: 'VM notes cannot be longer than 2048 characters',\n\n  // ----- VM stat tab -----\n  statsCpu: 'CPU usage',\n  statsMemory: 'Memory usage',\n  statsNetwork: 'Network throughput',\n  useStackedValuesOnStats: 'Stacked values',\n  statDisk: 'Disk throughput',\n  statLastTenMinutes: 'Last 10 minutes',\n  statLastTwoHours: 'Last 2 hours',\n  statLastDay: 'Last day',\n  statLastWeek: 'Last week',\n  statLastYear: 'Last year',\n\n  // ----- VM console tab -----\n  copyToClipboardLabel: 'Copy',\n  ctrlAltDelButtonLabel: 'Ctrl+Alt+Del',\n  ctrlAltDelConfirmation: 'Send Ctrl+Alt+Del to VM?',\n  disabledConsole: 'Console is disabled for this VM',\n  multilineCopyToClipboard: 'Multiline copy',\n  tipLabel: 'Tip:',\n  hideHeaderTooltip: 'Hide info',\n  showHeaderTooltip: 'Show info',\n  sendToClipboard: 'Send to clipboard',\n  sshRootTooltip: 'Connect using external SSH tool as root',\n  sshRootLabel: 'SSH',\n  sshUserTooltip: 'Connect using external SSH tool as user…',\n  sshUserLabel: 'SSH as…',\n  sshUsernameLabel: 'SSH user name',\n  remoteNeedClientTools: 'No IP address reported by client tools',\n  rdp: 'RDP',\n  rdpRootTooltip: 'Connect using external RDP tool',\n\n  // ----- VM container tab -----\n  containerName: 'Name',\n  containerCommand: 'Command',\n  containerCreated: 'Creation date',\n  containerStatus: 'Status',\n  containerAction: 'Action',\n  noContainers: 'No existing containers',\n  containerStop: 'Stop this container',\n  containerStart: 'Start this container',\n  containerPause: 'Pause this container',\n  containerResume: 'Resume this container',\n  containerRestart: 'Restart this container',\n\n  // ----- VM disk tab -----\n  rescanIsoSrs: 'Rescan all ISO SRs',\n  vbdCreateDeviceButton: 'New disk',\n  vdiAttachDevice: 'Attach disk',\n  vdiAttachDeviceConfirm: 'The selected VDI is already attached to this VM. Are you sure you want to continue?',\n  vdiBootOrder: 'Boot order',\n  vdiNameLabel: 'Name',\n  vdiNameDescription: 'Description',\n  vdiPool: 'Pool',\n  vdiTags: 'Tags',\n  vdiTasks: 'VDI tasks',\n  vdiSize: 'Size',\n  vdiImageFormat: 'Image format',\n  vdiSr: 'SR',\n  vdiVms: 'VMs',\n  vdiMigrate: 'Migrate VDI',\n  vdiMigrateSelectSr: 'Destination SR:',\n  vdiMigrateNoSr: 'No SR',\n  vdiMigrateNoSrMessage: 'A target SR is required to migrate a VDI',\n  vdiForget: 'Forget',\n  noControlDomainVdis: 'No VDIs attached to control domain',\n  vbdBootableStatus: 'Boot flag',\n  vbdDevice: 'Device',\n  vbdCbt: 'CBT',\n  vbdStatus: 'Status',\n  vbdStatusConnected: 'Connected',\n  vbdStatusDisconnected: 'Disconnected',\n  vbdConnect: 'Connect VBD',\n  vbdDisconnect: 'Disconnect VBD',\n  vbdBootable: 'Bootable',\n  vbdReadonly: 'Readonly',\n  vbdCreate: 'Create',\n  vbdAttach: 'Attach',\n  vbdNamePlaceHolder: 'Disk name',\n  vbdSizePlaceHolder: 'Size',\n  cdDriveNotInstalled: 'CD drive not completely installed',\n  cdDriveInstallation: 'Stop and start the VM to install the CD drive',\n  saveBootOption: 'Save',\n  resetBootOption: 'Reset',\n  destroySelectedVdis: 'Destroy selected VDIs',\n  destroyVdi: 'Destroy VDI',\n  exportVdi: 'Export VDI content',\n  format: 'Format',\n  importVdi: 'Import VDI content',\n  importVdiNoFile: 'No file selected',\n  selectVdiMessage: 'Drop VHD file here',\n  useQuotaWarning:\n    'Creating this disk will use the disk space quota from the resource set {resourceSet} ({spaceLeft} left)',\n  notEnoughSpaceInResourceSet: 'Not enough space in resource set {resourceSet} ({spaceLeft} left)',\n  warningVdiSr: \"The VDIs' SRs must either be shared or on the same host for the VM to be able to start.\",\n  removeSelectedVdisFromVm: 'Remove selected VDIs from this VM',\n  removeVdiFromVm: 'Remove VDI from this VM',\n  qcow2: 'QCOW2',\n  vhd: 'VHD',\n  vmdk: 'VMDK',\n  raw: 'RAW',\n\n  // ----- VM network tab -----\n\n  editVifLockingMode: 'Edit locking mode',\n  aclRuleAllow: 'Allow the traffic',\n  aclRuleProtocol: 'Select a protocol',\n  aclRulePort: 'Select a port',\n  aclRuleIpRange: 'Select an IP or an IP range (CIDR format)',\n  aclRuleDirection: 'Select a direction',\n  aclRuleAllowField: 'Traffic Enabled/Disabled',\n  aclRuleProtocolField: 'Protocol',\n  aclRulePortField: 'Port',\n  aclRuleIpRangeField: 'IP range (CIDR format)',\n  aclRuleDirectionField: 'Direction',\n  addRule: 'Add rule',\n  deleteRule: 'Delete rule',\n  hideRules: 'Hide rules',\n  sdnControllerNotLoaded: 'SDN Controller must be loaded',\n  showRules: 'Show rules',\n  vifAclRules: 'Traffic rules',\n  vifCreateDeviceButton: 'New device',\n  vifDeviceLabel: 'Device',\n  vifMacLabel: 'MAC address',\n  vifMtuLabel: 'MTU',\n  vifNetworkLabel: 'Network',\n  vifRateLimitLabel: 'Rate limit (kB/s)',\n  vifStatusLabel: 'Status',\n  vifStatusConnected: 'Connected',\n  vifStatusDisconnected: 'Disconnected',\n  vifConnect: 'Connect',\n  vifDisconnect: 'Disconnect',\n  vifRemove: 'Remove',\n  vifsRemove: 'Remove selected VIFs',\n  vifIpAddresses: 'IP addresses',\n  vifMacAutoGenerate: 'Auto-generated if empty',\n  vifAllowedIps: 'Allowed IPs',\n  selectIpFromIpPool: 'Select an IP',\n  enterIp: 'Enter an IP',\n  addAllowedIp: 'Add allowed IP',\n  addIpError: 'Error while adding allowed IP',\n  invalidIp: 'Invalid IP',\n  vifNoIps: 'No IPs',\n  vifLockingModeDisabled: 'VIF locking mode is disabled',\n  vifLockingModeUnlocked: 'VIF locking mode is unlocked',\n  vifLockingModeLocked: 'VIF locking mode is locked',\n  networkDefaultLockingModeDisabled: 'Network default locking mode is disabled',\n  networkDefaultLockingModeUnlocked: 'Network default locking mode is unlocked',\n  vifLockedNetworkNoIps: 'Network locked and no IPs are allowed for this interface',\n  vifUnlockedNetworkWithIps: 'Some IPs are unnecessarily set as allowed for this interface',\n  vifUnknownNetwork: 'Unknown network',\n  vifCreate: 'Create',\n  nbd: 'NBD',\n  nbdTootltip: 'Network Block Device status',\n  nbdInsecureTooltip: 'Use of insecure NBD is not advised',\n  nbdSecureTooltip: 'Nbd connection is secure and ready',\n\n  // ----- VM snapshot tab -----\n  noSnapshots: 'No snapshots',\n  newSnapshotWithMemory: 'New snapshot with memory',\n  newSnapshotWithMemoryConfirm:\n    'Are you sure you want to create a snapshot with memory? This could take a while and the VM will be unusable during that time.',\n  snapshotMemorySaved: 'Memory saved',\n  snapshotCreateButton: 'New snapshot',\n  tipCreateSnapshotLabel: 'Just click on the snapshot button to create one!',\n  revertSnapshot: 'Revert VM to this snapshot',\n  deleteSnapshot: 'Remove this snapshot',\n  deleteSnapshots: 'Remove selected snapshots',\n  copySnapshot: 'Create a VM from this snapshot',\n  exportSnapshot: 'Export this snapshot',\n  exportSnapshotMemory: 'Export snapshot memory',\n  secureBoot: 'Secure boot',\n  snapshotDate: 'Creation date',\n  snapshotError: 'Snapshot error',\n  snapshotName: 'Name',\n  snapshotDescription: 'Description',\n  snapshotQuiesce: 'Quiesced snapshot',\n  vmRevertSuccessfulTitle: 'Revert successful',\n  vmRevertSuccessfulMessage: 'VM successfully reverted',\n  currentSnapshot: 'Current snapshot',\n\n  // ----- VM backup tab -----\n  goToBackupPage: 'Go to the backup page.',\n\n  // ----- VM log tab -----\n  logRemoveAll: 'Remove all logs',\n  noLogs: 'No logs so far',\n  logDate: 'Creation date',\n  logName: 'Name',\n  logContent: 'Content',\n  logAction: 'Action',\n\n  // ----- VM advanced tab -----\n  addXenStoreEntry: 'Add new XenStore entry',\n  attachedPcis: 'Attached PCIs',\n  attachingDetachingPciNeedVmBoot: 'Attaching/detaching a PCI will be taken into consideration for the next VM boot.',\n  attachPcis: 'Attach PCIs',\n  createVtpm: 'Create a VTPM',\n  deleteEntryDeleteValue: 'To delete an entry, simply delete its value',\n  deleteVtpm: 'Delete the VTPM',\n  deleteVtpmWarning:\n    'If the VTPM is in use, removing it will result in a dangerous data loss. Are you sure you want to remove the VTPM?',\n  infoUnknownPciOnNonRunningVm:\n    \"When a VM is offline, it's not attached to any host, and therefore, it's impossible to determine the associated PCI devices, as it depends on the hardware environment in which it would be deployed.\",\n  coalesceLeaf: 'Coalesce leaf',\n  coalesceLeafSuccess: 'Coalesce leaf success',\n  coalesceLeafSuspendVm: 'This will suspend the VM during the operation. Do you want to continue?',\n  noSecureBoot: 'This pool was not setup for Guest UEFI SecureBoot yet',\n  propagateCertificatesTitle: 'Propagate certificates',\n  propagateCertificatesConfirm:\n    \"This will overwrite the VM's UEFI certificates with certificates defined at the pool level. Continue?\",\n  propagateCertificates: \"Copy the pool's default UEFI certificates to the VM\",\n  propagateCertificatesSuccessful: 'Certificates propagated successfully',\n  poolAutoPoweronDisabled: 'Auto power on is disabled at pool level, click to fix automatically.',\n  rebootRequiredAfterXenStoreChanges: 'A reboot is required after any XenStore changes',\n  vmRemoveButton: 'Remove',\n  vmConvertToTemplateButton: 'Convert to template',\n  vmSwitchVirtualizationMode: 'Convert to {mode}',\n  vmVirtualizationModeModalTitle: 'Change virtualization mode',\n  vmVirtualizationModeModalBody:\n    \"You must know what you are doing, because it could break your setup (if you didn't install the bootloader in the MBR while switching from PV to HVM, or even worse, in HVM to PV, if you don't have the correct PV args)\",\n  vmShareButton: 'Share',\n  xenSettingsLabel: 'Xen settings',\n  xenStore: 'XenStore',\n  guestOsLabel: 'Guest OS',\n  miscLabel: 'Misc',\n  virtualizationMode: 'Virtualization mode',\n  startDelayLabel: 'Start delay (seconds)',\n  cpuMaskLabel: 'CPU mask',\n  selectCpuMask: 'Select core(s)…',\n  cpuWeightLabel: 'CPU weight',\n  defaultCpuWeight: 'Default ({value, number})',\n  cpuCapLabel: 'CPU cap',\n  defaultCpuCap: 'Default ({value, number})',\n  pvArgsLabel: 'PV args',\n  managementAgentVersion: 'Management agent version',\n  osName: 'OS name',\n  osKernel: 'OS kernel',\n  autoPowerOn: 'Auto power on',\n  protectFromDeletion: 'Protect from accidental deletion',\n  protectFromShutdown: 'Protect from accidental shutdown',\n  blockMigration: 'Prevent migration',\n  unblockMigrationTitle: 'Allow migration',\n  unblockMigrationConfirm: 'Are you sure you want to allow migration for this VM?',\n  ha: 'HA',\n  srHaTooltip: 'SR used for High Availability',\n  nestedVirt: 'Nested virtualization',\n  nestedVirtualizationWarning: 'Unstable feature, insecure for the host, usage is discouraged. Click for more details.',\n  vmAffinityHost: 'Affinity host',\n  vmNeedToBeHalted: 'The VM needs to be halted',\n  vmVga: 'VGA',\n  vmVideoram: 'Video RAM',\n  vmNicType: 'NIC type',\n  vtpm: 'VTPM',\n  vtpmRequireUefi: 'A UEFI boot firmware is necessary to use a VTPM',\n  noAffinityHost: 'None',\n  originalTemplate: 'Original template',\n  unknownOsName: 'Unknown',\n  unknownOsKernel: 'Unknown',\n  unknownOriginalTemplate: 'Unknown',\n  vmLimitsLabel: 'VM limits',\n  resourceSet: 'Resource set',\n  resourceSetNone: 'None',\n  selectUser: 'Select user',\n  suspendSr: 'Suspend SR',\n  viridian: 'Viridian',\n  vmCpuLimitsLabel: 'CPU limits',\n  vmCpuTopology: 'Topology',\n  vmChooseCoresPerSocket: 'Default behavior',\n  vmSocketsWithCoresPerSocket:\n    '{nSockets, number} socket{nSockets, plural, one {} other {s}} with {nCores, number} core{nCores, plural, one {} other {s}} per socket',\n  vmCoresPerSocketNone: 'None',\n  vmCoresPerSocket: '{nCores, number} core{nCores, plural, one {} other {s}} per socket',\n  vmCoresPerSocketNotDivisor: \"Not a divisor of the VM's max CPUs\",\n  vmCoresPerSocketExceedsCoresLimit: 'The selected value exceeds the cores limit ({maxCores, number})',\n  vmCoresPerSocketExceedsSocketsLimit: 'The selected value exceeds the sockets limit ({maxSockets, number})',\n  vmHaDisabled: 'Disabled',\n  vmMemoryLimitsLabel: 'Memory limits (min/max)',\n  vmUuid: 'VM UUID',\n  vmVgpu: 'vGPU',\n  vmVgpus: 'GPUs',\n  vmVgpuNone: 'None',\n  vmAddVgpu: 'Add vGPU',\n  vmSelectVgpuType: 'Select vGPU type',\n  vmAcls: 'ACLs',\n  vmAddAcls: 'Add ACLs',\n  addAclsErrorTitle: 'Failed to add ACL(s)',\n  addAclsErrorMessage: 'User(s)/group(s) and role are required.',\n  createVusb: 'Create VUSB',\n  removeAcl: 'Delete',\n  moreAcls: '{nAcls, number} more…',\n  pusbDescription: 'PUSB description',\n  pusbSpeed: 'PUSB speed',\n  pusbVersion: 'PUSB version',\n  selectPusb: 'Select PUSB',\n  vmBootFirmware: 'Boot firmware',\n  vmCreator: 'VM creator',\n  vmDefaultBootFirmwareLabel: 'default (bios)',\n  vmBootFirmwareWarningMessage:\n    \"You're about to change your boot firmware. This is still experimental in CH/XCP-ng 8.0. Are you sure you want to continue?\",\n  setAndRestartVmFailed: 'Error on restarting and setting the VM: {vm}',\n  vmEditAndRestartModalTitle: 'VM is currently running',\n  vmEditAndRestartModalMessage:\n    'This VM is currently running, and needs to be stopped to modify this value. Restart VM and modify this value?',\n  firmwareNotSupported: 'Firmware not supported',\n  vusbs: 'VUSBs',\n  vusbRemainUnplugged: 'The VUSB remain unplugged until the next shutdown/start',\n  vusbUnplugTooltip: 'Unplug until the next shutdown/start',\n  // ----- VM placeholders -----\n\n  vmHomeNamePlaceholder: 'Long click to add a name',\n  vmHomeDescriptionPlaceholder: 'Long click to add a description',\n\n  // ----- Templates -----\n\n  copyToTemplate: 'Copy to template',\n  copyToTemplateMessage: 'Are you sure you want to copy this snapshot to a template?',\n  templateHomeNamePlaceholder: 'Click to add a name',\n  templateHomeDescriptionPlaceholder: 'Click to add a description',\n  templateDelete: 'Delete template',\n  templateDeleteModalTitle: 'Delete VM template{templates, plural, one {} other {s}}',\n  templateDeleteModalBody:\n    'Are you sure you want to delete {templates, plural, one {this} other {these}} template{templates, plural, one {} other {s}}?',\n  failedToDeleteTemplatesTitle: 'Delete template{nTemplates, plural, one {} other {s}} failed',\n  failedToDeleteTemplatesMessage:\n    'Failed to delete {nTemplates, number} template{nTemplates, plural, one {} other {s}}.',\n  deleteDefaultTemplatesTitle: 'Delete default template{nDefaultTemplates, plural, one {} other {s}}',\n  deleteDefaultTemplatesMessage:\n    'You are attempting to delete {nDefaultTemplates, number} default template{nDefaultTemplates, plural, one {} other {s}}. Do you want to continue?',\n  deleteProtectedTemplatesTitle: 'Delete protected template{nProtectedTemplates, plural, one {} other {s}}',\n  deleteProtectedTemplatesMessage:\n    'You are attempting to delete {nProtectedTemplates, plural, one {a} other {nProtectedTemplates}} template{nProtectedTemplates, plural, one {} other {s}} protected from accidental deletion. Do you want to continue?',\n  // ----- Dashboard -----\n  poolPanel: 'Pool{pools, plural, one {} other {s}}',\n  hostPanel: 'Host{hosts, plural, one {} other {s}}',\n  vmPanel: 'VM{vms, plural, one {} other {s}}',\n  memoryStatePanel: 'RAM Usage:',\n  usedMemory: 'Used Memory',\n  totalMemory: 'Total Memory',\n  totalCpus: 'CPUs Total',\n  usedVCpus: 'Used vCPUs',\n  usedSpace: 'Used Space',\n  totalSpace: 'Total Space',\n  cpuStatePanel: 'CPUs Usage',\n  vmStatePanel: 'VMs Power state',\n  vmStateHalted: 'Halted',\n  vmStateOther: 'Other',\n  vmStateRunning: 'Running',\n  vmStateAll: 'All',\n  taskStatePanel: 'Pending tasks',\n  usersStatePanel: 'Users',\n  srStatePanel: 'Storage state',\n  ofUsage: '{usage} (of {total})',\n  ofCpusUsage:\n    '{nVcpus, number} vCPU{nVcpus, plural, one {} other {s}} (of {nCpus, number} CPU{nCpus, plural, one {} other {s}})',\n  noSrs: 'No storage',\n  srName: 'Name',\n  srPool: 'Pool',\n  srHost: 'Host',\n  srFormat: 'Type',\n  srSize: 'Size',\n  srUsage: 'Usage',\n  srUsed: 'used',\n  srFree: 'free',\n  srUsageStatePanel: 'Storage Usage',\n  srTopUsageStatePanel: 'Top 5 SR Usage (in %)',\n  notEnoughPermissionsError: 'Not enough permissions!',\n  vmsStates: '{running, number} running ({halted, number} halted)',\n  dashboardStatsButtonRemoveAll: 'Clear selection',\n  dashboardStatsButtonAddAllHost: 'Add all hosts',\n  dashboardStatsButtonAddAllVM: 'Add all VMs',\n  dashboardSendReport: 'Send report',\n  dashboardReport: 'Report',\n  dashboardSendReportMessage: 'This will send a usage report to your configured emails.',\n  dashboardSendReportInfo: 'The usage report and transport email plugins need to be loaded!',\n\n  // --- Stats board --\n  weekHeatmapData: '{value} {date, date, medium}',\n  weekHeatmapNoData: 'No data.',\n  weeklyHeatmap: 'Weekly Heatmap',\n  weeklyCharts: 'Weekly Charts',\n  weeklyChartsScaleInfo: 'Synchronize scale:',\n  statsDashboardGenericErrorTitle: 'Stats error',\n  statsDashboardGenericErrorMessage: 'There is no stats available for:',\n  noSelectedMetric: 'No selected metric',\n  statsDashboardSelectObjects: 'Select',\n  metricsLoading: 'Loading…',\n\n  // ----- Health -----\n  length: 'Length: {length}',\n  deleteBackups: 'Delete backup{nBackups, plural, one {} other {s}}',\n  deleteBackupsMessage:\n    'Are you sure you want to delete {nBackups, number} backup{nBackups, plural, one {} other {s}}?',\n  detachedBackups: 'Detached backups',\n  detachedVmSnapshots: 'Detached VM snapshots',\n  duplicatedMacAddresses: 'Duplicated MAC addresses',\n  localDefaultSrs: 'Local default SRs',\n  localDefaultSrsStatusTip:\n    \"It is usually recommended for a pool's default SR to be shared to avoid unexpected behaviors\",\n  missingJob: 'Missing job',\n  missingVm: 'Missing VM',\n  missingVmInJob: 'This VM does not belong to this job',\n  missingSchedule: 'Missing schedule',\n  unknownSchedule: 'Unknown schedule',\n  noDetachedBackups: 'No backups',\n  noDuplicatedMacAddresses: 'No duplicated MAC addresses',\n  noOldSnapshots: 'No snapshots older than 30 days with no enabled schedule',\n  reason: 'Reason',\n  oldSnapshots: 'Snapshots older than 30 days with no enabled schedule',\n  orphanedVdis: 'Orphan VDIs',\n  orphanVdisTip: 'VDIs and VDI snapshots that are not attached to a VM',\n  orphanedVms: 'Orphaned VMs snapshot',\n  noOrphanedObject: 'No orphans',\n  poolsWithNoDefaultSr: 'Pools with no default SR',\n  tooManySnapshots: 'Too many snapshots',\n  tooManySnapshotsTip: 'VMs with more than the recommended amount of snapshots',\n  noLocalDefaultSrs: 'No local default SRs',\n  noTooManySnapshotsObject: 'No VMs with too many snapshots',\n  numberOfSnapshots: 'Number of snapshots',\n  guestToolsNecessary: 'Guest tools must be installed to display stats',\n  guestToolStatus: 'Guest Tools status',\n  guestToolStatusTip: 'VMs with missing or outdated guest tools',\n  noGuestToolStatusObject: 'All running VMs have up to date guest tools',\n  guestToolStatusColumn: 'Status',\n  deleteOrphanedVdi: 'Delete orphaned snapshot VDI',\n  deleteSelectedOrphanedVdis: 'Delete selected orphaned snapshot VDIs',\n  vdisOnControlDomain: 'VDIs attached to Control Domain',\n  vifOnVmWithNetwork: 'VIF #{vifDevice, number} on {vm} ({network})',\n  vifs: 'VIFs',\n  vmNameLabel: 'Name',\n  vmNameDescription: 'Description',\n  vmContainer: 'Resident on',\n  snapshotOf: 'Snapshot of',\n  legacySnapshots: 'Legacy backups snapshots',\n  alarmMessage: 'Alarms',\n  noAlarms: 'No alarms',\n  alarmDate: 'Date',\n  alarmContent: 'Content',\n  alarmObject: 'Issue on',\n  alarmPool: 'Pool',\n  spaceLeftTooltip: '{used}% used ({free} left)',\n  unhealthyVdis: 'Unhealthy VDIs',\n  vdisToCoalesce: 'VDIs to coalesce',\n  vdisWithInvalidVhdParent: 'VDIs with invalid parent VHD',\n  srVdisToCoalesceWarning: 'This SR has {nVdis, number} VDI{nVdis, plural, one {} other {s}} to coalesce',\n\n  // ----- New VM -----\n  createVmModalTitle: 'Create VM',\n  createVmModalWarningMessage:\n    \"You're about to use a large amount of resources available on the resource set. Are you sure you want to continue?\",\n  copyHostBiosStrings: 'Copy host BIOS strings to VM',\n  enableVtpm: 'Enable VTPM',\n  newVmCreateNewVmOn: 'Create a new VM on {select}',\n  newVmCreateNewVmNoPermission: 'You have no permission to create a VM',\n  newVmInfoPanel: 'Info',\n  newVmNameLabel: 'Name',\n  newVmTemplateLabel: 'Template',\n  newVmDescriptionLabel: 'Description',\n  newVmPerfPanel: 'Performance',\n  newVmVcpusLabel: 'vCPUs',\n  newVmRamLabel: 'RAM',\n  newVmRamWarning: 'The memory is below the threshold ({threshold})',\n  newVmStaticMaxLabel: 'Static memory max',\n  newVmDynamicMinLabel: 'Dynamic memory min',\n  newVmDynamicMaxLabel: 'Dynamic memory max',\n  newVmInstallSettingsPanel: 'Install settings',\n  newVmIsoDvdLabel: 'ISO/DVD',\n  newVmNetworkLabel: 'Network',\n  newVmInstallNetworkPlaceHolder: 'e.g: http://httpredir.debian.org/debian',\n  newVmPvArgsLabel: 'PV Args',\n  newVmPxeLabel: 'PXE',\n  newVmInterfacesPanel: 'Interfaces',\n  newVmMacLabel: 'MAC',\n  newVmAddInterface: 'Add interface',\n  newVmDisksPanel: 'Disks',\n  newVmSrLabel: 'SR',\n  newVmSizeLabel: 'Size',\n  newVmAddDisk: 'Add disk',\n  newVmSummaryPanel: 'Summary',\n  newVmCreate: 'Create',\n  newVmReset: 'Reset',\n  newVmSelectTemplate: 'Select template',\n  newVmSshKey: 'SSH key',\n  noConfigDrive: 'No config drive',\n  newVmCustomConfig: 'Custom config',\n  availableTemplateVarsInfo: 'Click here to see the available template variables',\n  availableTemplateVarsTitle: 'Available template variables',\n  templateNameInfo: 'the VM\\'s name. It must not contain \"_\"',\n  templateIndexInfo: \"the VM's index, it will take 0 in case of single VM\",\n  templateSshInfo: 'SSH key corresponding to the SSH title',\n  templateEscape: 'Tip: escape any variable with a preceding backslash (\\\\)',\n  coreOsDefaultTemplateError: 'Error on getting the default coreOS cloud template',\n  newVmBootAfterCreate: 'Boot VM after creation',\n  newVmMacPlaceholder: 'Auto-generated if empty',\n  newVmCpuWeightLabel: 'CPU weight',\n  newVmDefaultCpuWeight: 'Default: {value, number}',\n  newVmCpuCapLabel: 'CPU cap',\n  newVmDefaultCpuCap: 'Default: {value, number}',\n  newVmCloudConfig: 'Cloud config',\n  newVmCreateVms: 'Create VMs',\n  newVmCreateVmsConfirm: 'Are you sure you want to create {nbVms, number} VMs?',\n  newVmMultipleVms: 'Multiple VMs:',\n  newVmMultipleVmsPattern: 'Name pattern:',\n  newVmMultipleVmsPatternPlaceholder: 'e.g.: \\\\{name\\\\}_%',\n  newVmFirstIndex: 'First index:',\n  newVmNumberRecalculate: 'Recalculate VMs number',\n  newVmNameRefresh: 'Refresh VMs name',\n  newVmAffinityHost: 'Affinity host',\n  newVmAdvancedPanel: 'Advanced',\n  newVmShowAdvanced: 'Show advanced settings',\n  newVmHideAdvanced: 'Hide advanced settings',\n  newVmShare: 'Share this VM',\n  newVmSrsNotOnSameHost: 'The SRs must either be on the same host or shared',\n  newVmNetworkConfigLabel: 'Network config',\n  newVmNetworkConfigInfo: 'Network configuration is only compatible with the {noCloudDatasourceLink}.',\n  newVmNetworkConfigDocLink: 'See {networkConfigDocLink}.',\n  newVmNetworkConfigTooltip: 'Click here to get more information about network config',\n  newVmUserConfigLabel: 'User config',\n  newVmNoCloudDatasource: 'NoCloud datasource',\n  newVmNetworkConfigDoc: 'Network config documentation',\n  templateHasBiosStrings: 'The template already contains the BIOS strings',\n  secureBootLinkToDocumentationMessage: 'Click for more information about Guest UEFI Secure Boot.',\n  secureBootNotSetup: 'This pool has not yet been setup for Guest UEFI Secure Boot. Click for more information.',\n  seeVtpmDocumentation: 'See VTPM documentation',\n  vmBootFirmwareIsUefi: 'The boot firmware is UEFI',\n  destroyCloudConfigVdiAfterBoot: 'Destroy cloud config drive after first boot',\n  vtpmNotSupported: 'VTPM is only supported on pools running XCP-ng/XS 8.3 or later.',\n  warningVtpmRequired: 'This template requires a VTPM, if you proceed, the VM will likely not be able to boot.',\n\n  // ----- Self -----\n  resourceSets: 'Resource sets',\n  noResourceSets: 'No resource sets.',\n  resourceSetName: 'Resource set name',\n  resourceSetUsers: 'Users',\n  resourceSetPools: 'Pools',\n  resourceSetTemplates: 'Templates',\n  resourceSetSrs: 'SRs',\n  resourceSetNetworks: 'Networks',\n  recomputeResourceSets: 'Recompute all limits',\n  saveResourceSet: 'Save',\n  resetResourceSet: 'Reset',\n  editResourceSet: 'Edit',\n  defaultTags: 'Default tags',\n  deleteResourceSet: 'Delete',\n  deleteResourceSetWarning: 'Delete resource set',\n  deleteResourceSetQuestion: 'Are you sure you want to delete this resource set?',\n  resourceSetMissingObjects: 'Missing objects:',\n  unknownResourceSetValue: 'Unknown',\n  availableHosts: 'Available hosts',\n  excludedHosts: 'Excluded hosts',\n  noHostsAvailable: 'No hosts available.',\n  availableHostsDescription: 'VMs created from this resource set shall run on the following hosts.',\n  maxCpus: 'Maximum CPUs',\n  maxRam: 'Maximum RAM',\n  maxDiskSpace: 'Maximum disk space',\n  ipPool: 'IP pool',\n  quantity: 'Quantity',\n  usedResourceLabel: 'Used',\n  availableResourceLabel: 'Available',\n  resourceSetQuota: 'Used: {usage} (Total: {total})',\n  resourceSetNew: 'New',\n  shareVmsByDefault: 'Share VMs by default',\n  nVmsInResourceSet:\n    '{nVms, number} VM{nVms, plural, one {} other {s}} belong{nVms, plural, one {s} other {}} to this Resource Set',\n  unlimitedResourceSetUsage: 'Used: {usage}',\n\n  // ---- VM import ---\n  fileType: 'File type:',\n  firmware: 'Firmware',\n  fromUrl: 'From URL',\n  UrlImportSrsCompatible: 'URL import is only compatible with ISO SRs',\n  fromVmware: 'From VMware',\n  importVmsList: 'Drop OVA or XVA files here to import Virtual Machines.',\n  noSelectedVms: 'No selected VMs.',\n  noToolsInstalled: 'No tools installed',\n  url: 'URL:',\n  vmImportToPool: 'To Pool:',\n  vmImportToSr: 'To SR:',\n  vmsToImport: 'VM{nVms, plural, one {} other {s}} to import',\n  importVmsCleanList: 'Reset',\n  vmImportSuccess: 'VM import success',\n  vmImportFailed: 'VM import failed',\n  vdiImportSuccess: 'VDI import success',\n  vdiImportFailed: 'VDI import failed',\n  setVmFailed: 'Error on setting the VM: {vm}',\n  startVmImport: 'Import starting…',\n  startVdiImport: 'VDI import starting…',\n  startVmExport: 'Export starting…',\n  startVdiExport: 'VDI export starting…',\n  nCpus: 'Number of CPUs',\n  vmMemory: 'Memory',\n  diskInfo: 'Disk {position} ({capacity})',\n  diskDescription: 'Disk description',\n  noDisks: 'No disks.',\n  noNetworks: 'No networks.',\n  networkInfo: 'Network {name}',\n  noVmImportErrorDescription: 'No description available',\n  vmImportError: 'Error:',\n  vmImportFileType: '{type} file:',\n  vmImportConfigAlert: 'Please check and/or modify the VM configuration.',\n  toolsInstalled: 'The tools are installed',\n\n  // ---- Disk import ---\n  diskImportFailed: 'Disk import failed',\n  diskImportSuccess: 'Disk import success',\n  dropDisksFiles: 'Drop {types} files here to import disks.',\n  importToSr: 'To SR',\n  isoImportRequirement: 'To import ISO files, an ISO repository is required',\n\n  // ---- Tasks ---\n  poolTasks: 'Pool tasks',\n  xoTasks: 'XO tasks',\n  cancelTask: 'Cancel',\n  destroyTask: 'Destroy',\n  cancelTasks: 'Cancel selected tasks',\n  destroyTasks: 'Destroy selected tasks',\n  object: 'Object',\n  objects: 'Objects',\n  pool: 'Pool',\n  task: 'Task',\n  progress: 'Progress',\n  previousTasks: 'Previous tasks',\n  taskLastSeen: 'Last seen',\n\n  // ---- Backup views ---\n  backupSchedules: 'Schedules',\n  loneSnapshotsMessages: '{nLoneSnapshots} lone snapshot{nLoneSnapshots, plural, one {} other {s}} to delete!',\n  scheduleCron: 'Cron pattern',\n  scheduleLastRun: 'Click to display last run details',\n  scheduleName: 'Name',\n  scheduleCopyId: 'Copy ID {id}',\n  scheduleTimezone: 'Timezone',\n  scheduleExportRetention: 'Backup retention',\n  scheduleCopyRetention: 'Replication retention',\n  scheduleSnapshotRetention: 'Snapshot retention',\n  poolMetadataRetention: 'Pool retention',\n  xoMetadataRetention: 'XO retention',\n  getRemote: 'Get remote',\n  noBackups: 'There are no backups!',\n  restoreBackupsInfo: 'Click on a VM to display restore options',\n  remoteEnabled: 'Enabled',\n  remoteDisabled: 'Disabled',\n  enableRemote: 'Enable',\n  disableRemote: 'Disable',\n  remoteErrorMessage: 'The URL ({url}) is invalid (colon in path). Click this button to change the URL to {newUrl}.',\n  backupVmNameColumn: 'VM Name',\n  backupVmDescriptionColumn: 'VM Description',\n  firstBackupColumn: 'Oldest backup',\n  lastBackupColumn: 'Latest backup',\n  availableBackupsColumn: 'Available Backups',\n  backupRestoreErrorTitle: 'Missing parameters',\n  backupRestoreErrorMessage: 'Choose a SR and a backup',\n  backupisKey: 'key',\n  backupIsIncremental: 'incremental',\n  backupIsDifferencing: 'differencing',\n  vmsToBackup: 'VMs to backup',\n  refreshBackupList: 'Refresh backup list',\n  restoreVmBackups: 'Restore',\n  restoreVmBackupsTitle: 'Restore {vm}',\n  checkVmBackupsTitle: 'Restore health check {vm}',\n  restoreVmBackupsBulkTitle: 'Restore {nVms, number} VM{nVms, plural, one {} other {s}}',\n  restoreVmBackupsBulkMessage:\n    'Restore {nVms, number} VM{nVms, plural, one {} other {s}} from {nVms, plural, one {its} other {their}} {oldestOrLatest} backup.',\n  restoreMetadataBackupWarning:\n    'This operation will overwrite the host metadata. Only perform a metadata restore if it is a new server with nothing running on it.',\n  oldest: 'oldest',\n  latest: 'latest',\n  restoreVmBackupsStart: 'Start VM{nVms, plural, one {} other {s}} after restore',\n  restoreVmBackupsBulkErrorTitle: 'Multi-restore error',\n  restoreVmUseDifferentialRestore: 'Use differential restore',\n  restoreMetadataBackupTitle: 'Restore {item}',\n  bulkRestoreMetadataBackupTitle:\n    'Restore {nMetadataBackups, number} metadata backup{nMetadataBackups, plural, one {} other {s}}',\n  bulkRestoreMetadataBackupMessage:\n    'Restore {nMetadataBackups, number} metadata backup{nMetadataBackups, plural, one {} other {s}} from {nMetadataBackups, plural, one {its} other {their}} {oldestOrLatest} backup',\n  deleteMetadataBackupTitle: 'Delete {item} backup',\n  restoreVmBackupsBulkErrorMessage: 'You need to select a destination SR',\n  deleteVmBackups: 'Delete backups…',\n  deleteVmBackupsTitle: 'Delete {vm} backups',\n  deleteBackupsSelect: 'Select backups to delete:',\n  deleteVmBackupsSelectAll: 'All',\n  deleteVmBackupsBulkTitle: 'Delete backups',\n  deleteVmBackupsBulkMessage:\n    'Are you sure you want to delete all the backups from {nVms, number} VM{nVms, plural, one {} other {s}}?',\n  deleteVmBackupsBulkConfirmText: 'delete {nBackups} backup{nBackups, plural, one {} other {s}}',\n  bulkDeleteMetadataBackupsTitle: 'Delete metadata backups',\n  bulkDeleteMetadataBackupsMessage:\n    'Are you sure you want to delete all the backups from {nMetadataBackups, number} metadata backup{nMetadataBackups, plural, one {} other {s}}?',\n  bulkDeleteMetadataBackupsConfirmText:\n    'delete {nMetadataBackups} metadata backup{nMetadataBackups, plural, one {} other {s}}',\n  healthCheck: 'Health check',\n  healthCheckChooseSr: 'Choose SR used for VMs restoration',\n  healthCheckTagsInfo: 'If no tags are specified, all VMs in the backup will be tested.',\n  healthCheckAvailableEnterpriseUser: 'Only available to enterprise users',\n  remoteNotCompatibleWithSelectedProxy:\n    \"The backup will not be run on this remote because it's not compatible with the selected proxy\",\n  remoteLoadBackupsFailure: 'Loading backups failed',\n  remoteLoadBackupsFailureMessage: 'Failed to load backups from {name}.',\n  vmsTags: 'VMs tags',\n  tagNoBak: 'VMs with this tag will not be backed up {reason, select, null {} other {({reason})}}',\n  tagNoHealthCheck: 'VMs with this tag will not be tested by health check {reason, select, null {} other {({reason})}}',\n  tagNotifyOnSnapshot: 'An email will be sent when a VM with this tag is snapshotted',\n  nbdConnections: `NBD connections`,\n  speedLimitNoUnit: 'Speed limit',\n\n  // ----- Restore files view -----\n  restoreFiles: 'Restore backup files',\n  restoreFilesError: 'Invalid options',\n  restoreFilesExportFormat: 'Export format:',\n  restoreFilesFromBackup: 'Restore file from {name}',\n  restoreFilesSelectBackup: 'Select a backup…',\n  restoreFilesSelectDisk: 'Select a disk…',\n  restoreFilesSelectPartition: 'Select a partition…',\n  restoreFilesSelectFiles: 'Select a file…',\n  restoreFilesNoFilesSelected: 'No files selected',\n  restoreFilesSelectedFilesAndFolders: 'Selected files/folders ({files}):',\n  restoreFilesDiskError: 'Error while scanning disk',\n  restoreFilesSelectAllFiles: \"Select all this folder's files\",\n  restoreFilesSelectFolder: 'Select this folder',\n  restoreFilesTgz: 'tar+gzip (.tgz)',\n  restoreFilesUnselectAll: 'Unselect all files',\n  restoreFilesZip: 'ZIP (slow)',\n\n  // ----- Modals -----\n  bypassBackupHostModalMessage: 'There may be ongoing backups on the host. Are you sure you want to continue?',\n  bypassBackupPoolModalMessage: 'There may be ongoing backups on the pool. Are you sure you want to continue?',\n  bypassBackupStorageModalMessage: 'There may be ongoing backups on the storage. Are you sure you want to continue?',\n  bypassBlockedMigrationsModalTitle: 'Bypass blocked migrations',\n  bypassBlockedMigrationsModalMessage: 'This will allow migration on these VMs: {vms}',\n  emergencyShutdownHostModalTitle: 'Emergency shutdown Host',\n  emergencyShutdownHostModalMessage: 'Are you sure you want to shutdown {host}?',\n  emergencyShutdownHostsModalTitle: 'Emergency shutdown Host{nHosts, plural, one {} other {s}}',\n  emergencyShutdownHostsModalMessage:\n    'Are you sure you want to shutdown {nHosts, number} Host{nHosts, plural, one {} other {s}}?',\n  stopHostModalTitle: 'Shutdown host',\n  stopHostModalMessage:\n    \"This will shutdown your host. Do you want to continue? If it's the pool master, your connection to the pool will be lost\",\n  forceStopHost: 'Force shutdown host',\n  forceStopHostMessage: 'This will shutdown your host without evacuating its VMs. Do you want to continue?',\n  addHostModalTitle: 'Add host',\n  addHostModalMessage: 'Are you sure you want to add {host} to {pool}?',\n  restartHostModalTitle: 'Restart host',\n  restartHostModalMessage: 'This will restart your host. Do you want to continue?',\n  restartHostsAgentsModalTitle:\n    'Restart Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}',\n  restartHostsAgentsModalMessage:\n    'Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}} agent{nHosts, plural, one {} other {s}}?',\n  restartHostsModalTitle: 'Restart Host{nHosts, plural, one {} other {s}}',\n  restartHostsModalMessage: 'Are you sure you want to restart {nHosts, number} Host{nHosts, plural, one {} other {s}}?',\n  startVmsModalTitle: 'Start VM{vms, plural, one {} other {s}}',\n  cloneAndStartVM: 'Start a copy',\n  forceStartVm: 'Force start',\n  forceStartVmModalTitle: 'Forbidden operation',\n  blockedStartVmModalMessage: 'Start operation for this vm is blocked.',\n  blockedStartVmsModalMessage: 'Forbidden operation start for {nVms, number} vm{nVms, plural, one {} other {s}}.',\n  startVmsModalMessage: 'Are you sure you want to start {vms, number} VM{vms, plural, one {} other {s}}?',\n  failedVmsErrorMessage:\n    '{nVms, number} VM{nVms, plural, one {} other {s}} failed. Please check logs for more information',\n  failedVmsErrorTitle: 'Start failed',\n  failedDeleteErrorTitle: 'Delete failed',\n  stopHostsModalTitle: 'Stop Host{nHosts, plural, one {} other {s}}',\n  stopHostsModalMessage: 'Are you sure you want to stop {nHosts, number} Host{nHosts, plural, one {} other {s}}?',\n  stopVmsModalTitle: 'Stop VM{vms, plural, one {} other {s}}',\n  stopVmsModalMessage: 'Are you sure you want to stop {vms, number} VM{vms, plural, one {} other {s}}?',\n  restartVmModalTitle: 'Restart VM',\n  restartVmModalMessage: 'Are you sure you want to restart {name}?',\n  stopVmModalTitle: 'Stop VM',\n  stopVmModalMessage: 'Are you sure you want to stop {name}?',\n  blockedOperation: 'Blocked operation',\n  stopVmBlockedModalMessage: 'Stop operation for this VM is blocked. Would you like to stop it anyway?',\n  vmHasNoTools: 'No guest tools',\n  vmHasNoToolsMessage: \"The VM doesn't have Xen tools installed, which are required to properly stop or reboot it.\",\n  confirmForceShutdown: 'Would you like to force shutdown the VM?',\n  confirmForceReboot: 'Would you like to force reboot the VM?',\n  suspendVmsModalTitle: 'Suspend VM{vms, plural, one {} other {s}}',\n  suspendVmsModalMessage: 'Are you sure you want to suspend {vms, number} VM{vms, plural, one {} other {s}}?',\n  pauseVmsModalTitle: 'Pause VM{vms, plural, one {} other {s}}',\n  pauseVmsModalMessage: 'Are you sure you want to pause {vms, number} VM{vms, plural, one {} other {s}}?',\n  restartVmsModalTitle: 'Restart VM{vms, plural, one {} other {s}}',\n  restartVmsModalMessage: 'Are you sure you want to restart {vms, number} VM{vms, plural, one {} other {s}}?',\n  restartVmBlockedModalMessage: 'Restart operation for this VM is blocked. Would you like to restart it anyway?',\n  snapshotSaveMemory: 'save memory',\n  snapshotVmsModalTitle: 'Snapshot VM{vms, plural, one {} other {s}}',\n  deleteVmsModalTitle: 'Delete VM{vms, plural, one {} other {s}}',\n  deleteVmsModalMessage:\n    'Are you sure you want to delete {vms, number} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED',\n  deleteVmsConfirmText: 'delete {nVms, number} vm{nVms, plural, one {} other {s}}',\n  deleteVmModalTitle: 'Delete VM',\n  deleteVmModalMessage: 'Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED',\n  deleteVmBlockedModalTitle: 'Blocked operation',\n  deleteVmBlockedModalMessage: 'Removing the VM is a blocked operation. Would you like to remove it anyway?',\n  forceVmMigrateModalTitle: 'Force migration',\n  forceVmMigrateModalMessage:\n    'The VM is incompatible with the CPU features of the destination host. Would you like to force it anyway?',\n  migrateVmModalTitle: 'Migrate VM',\n  migrateVmSelectHost: 'Select a destination host:',\n  migrateVmSelectMigrationNetwork: 'Select a migration network:',\n  migrateVmSelectNetworks: 'For each VIF, select a network:',\n  migrateVmsSelectSr: 'Select a destination SR:',\n  migrateVmsSelectSrIntraPool: 'Select a destination SR for local disks:',\n  migrateVmsSelectNetwork: 'Select a network on which to connect each VIF:',\n  migrateVmsSmartMapping: 'Smart mapping',\n  migrateVmVif: 'VIF',\n  migrateVmNetwork: 'Network',\n  migrateVmNoTargetHost: 'No target host',\n  migrateVmNoTargetHostMessage: 'A target host is required to migrate a VM',\n  migrateVmNoSr: 'SR required',\n  migrateVmNoSrMessage: 'A destination SR is required',\n  migrateVmNoDefaultSrError: 'No default SR',\n  migrateVmNotConnectedDefaultSrError: 'Default SR not connected to host',\n  chooseSrForEachVdisModalSelectSr: 'For each VDI, select an SR (optional)',\n  chooseSrForEachVdisModalMainSr: 'Select main SR…',\n  chooseSrForEachVdisModalVdiLabel: 'VDI',\n  chooseSrForEachVdisModalSrLabel: 'SR*',\n  deleteJobsModalTitle: 'Delete job{nJobs, plural, one {} other {s}}',\n  deleteJobsModalMessage: 'Are you sure you want to delete {nJobs, number} job{nJobs, plural, one {} other {s}}?',\n  deleteVbdsModalTitle: 'Delete VBD{nVbds, plural, one {} other {s}}',\n  deleteVbdsModalMessage: 'Are you sure you want to delete {nVbds, number} VBD{nVbds, plural, one {} other {s}}?',\n  deleteVdiModalTitle: 'Delete VDI',\n  deleteVdiModalMessage: 'Are you sure you want to delete this disk? ALL DATA ON THIS DISK WILL BE LOST',\n  deleteVdisModalTitle: 'Delete VDI{nVdis, plural, one {} other {s}}',\n  deleteVdisModalMessage:\n    'Are you sure you want to delete {nVdis, number} disk{nVdis, plural, one {} other {s}}? ALL DATA ON THESE DISKS WILL BE LOST',\n  deleteSchedulesModalTitle: 'Delete schedule{nSchedules, plural, one {} other {s}}',\n  deleteSchedulesModalMessage:\n    'Are you sure you want to delete {nSchedules, number} schedule{nSchedules, plural, one {} other {s}}?',\n  deleteRemotesModalTitle: 'Delete remote{nRemotes, plural, one {} other {s}}',\n  deleteRemotesModalMessage:\n    'Are you sure you want to delete {nRemotes, number} remote{nRemotes, plural, one {} other {s}}?',\n  revertVmModalTitle: 'Revert your VM',\n  shareVmInResourceSetModalTitle: 'Share your VM',\n  shareVmInResourceSetModalMessage:\n    'This VM will be shared with all the members of the self-service {self}. Are you sure?',\n  deleteVifsModalTitle: 'Delete VIF{nVifs, plural, one {} other {s}}',\n  deleteVifsModalMessage: 'Are you sure you want to delete {nVifs, number} VIF{nVifs, plural, one {} other {s}}?',\n  deleteSnapshotModalTitle: 'Delete snapshot',\n  deleteSnapshotModalMessage: 'Are you sure you want to delete this snapshot?',\n  deleteSnapshotsModalTitle: 'Delete snapshot{nVms, plural, one {} other {s}}',\n  deleteSnapshotsModalMessage:\n    'Are you sure you want to delete {nVms, number} snapshot{nVms, plural, one {} other {s}}?',\n  disconnectVbdsModalTitle: 'Disconnect VBD{nVbds, plural, one {} other {s}}',\n  disconnectVbdsModalMessage:\n    'Are you sure you want to disconnect {nVbds, number} VBD{nVbds, plural, one {} other {s}}?',\n  disableHost: 'Disable host',\n  disableHostModalMessage: 'Are you sure you want to disable {host}? This will prevent new VMs from starting.',\n  revertVmModalMessage:\n    'Are you sure you want to revert this VM to the snapshot state? This operation is irreversible.',\n  revertVmModalSnapshotBefore: 'Snapshot before',\n  importBackupModalSelectBackup: 'Select your backup…',\n  importBackupModalSelectSr: 'Select a destination SR…',\n  deleteOrphanedVdisModalTitle: 'Delete orphaned snapshot VDIs',\n  deleteOrphanedVdisModalMessage:\n    'Are you sure you want to delete {nVdis, number} orphaned snapshot VDI{nVdis, plural, one {} other {s}}?',\n  definitiveMessageModal: 'This operation is definitive.',\n  existingLunModalTitle: 'Previous LUN Usage',\n  existingLunModalText:\n    'This LUN has been previously used as storage by a XenServer host. All data will be lost if you choose to continue with the SR creation.',\n  alreadyRegisteredModal: 'Replace current registration?',\n  alreadyRegisteredModalText:\n    'Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?',\n  trialReadyModal: 'Ready for trial?',\n  trialReadyModalText:\n    'During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!',\n  cancelTasksModalTitle: 'Cancel task{nTasks, plural, one {} other {s}}',\n  cancelTasksModalMessage: 'Are you sure you want to cancel {nTasks, number} task{nTasks, plural, one {} other {s}}?',\n  destroyTasksModalTitle: 'Destroy task{nTasks, plural, one {} other {s}}',\n  destroyTasksModalMessage: 'Are you sure you want to destroy {nTasks, number} task{nTasks, plural, one {} other {s}}?',\n  forgetHostFromSrModalTitle: 'Forget host',\n  forgetHostFromSrModalMessage:\n    'Are you sure you want to forget this host? This will disconnect the SR from the host by removing the link between them (PBD).',\n  forgetHostsFromSrModalTitle: 'Forget host{nPbds, plural, one {} other {s}}',\n  forgetHostsFromSrModalMessage:\n    'Are you sure you want to forget {nPbds, number} host{nPbds, plural, one {} other {s}}? This will disconnect the SR from these hosts by removing the links between the SR and the hosts (PBDs).',\n  forgetSrFromHostModalTitle: 'Forget SR',\n  forgetSrFromHostModalMessage:\n    'Are you sure you want to forget this SR? This will disconnect the SR from the host by removing the link between them (PBD).',\n  forgetSrsFromHostModalTitle: 'Forget SR{nPbds, plural, one {} other {s}}',\n  forgetSrsFromHostModalMessage:\n    'Are you sure you want to forget {nPbds, number} SR{nPbds, plural, one {} other {s}}? This will disconnect the SRs from the host by removing the links between the host and the SRs (PBDs).',\n  optionalEntry: '* optional',\n  vmWithDuplicatedMacAddressesMessage:\n    'This VM contains a duplicate MAC address or has the same MAC address as another running VM. Do you want to continue?',\n  vmsWithDuplicatedMacAddressesMessage:\n    '{nVms, number} VM{nVms, plural, one {} other {s}} contain{nVms, plural, one {s} other {}} duplicate MAC addresses or {nVms, plural, one {has} other {have}} the same MAC addresses as other running VMs. Do you want to continue?',\n  ignoreVdi: 'Ignore this VDI',\n  selectDestinationSr: 'Select a destination SR',\n\n  // ----- Servers -----\n  enableServerErrorTitle: 'Enable server',\n  enableServerErrorMessage: 'Unexpected response. Please check your server address.',\n  serverLabel: 'Label',\n  serverHost: 'Host',\n  serverUsername: 'Username',\n  serverPassword: 'Password',\n  serverReadOnly: 'Read Only',\n  serverUnauthorizedCertificates: 'Unauthorized Certificates',\n  serverAllowUnauthorizedCertificates: 'Allow Unauthorized Certificates',\n  serverUnauthorizedCertificatesInfo:\n    \"Enable it if your certificate is rejected, but it's not recommended because your connection will not be secured.\",\n  serverPlaceHolderUser: 'username',\n  serverPlaceHolderPassword: 'password',\n  serverPlaceHolderAddress: 'address[:port]',\n  serverPlaceHolderLabel: 'label',\n  serverConnect: 'Connect',\n  serverError: 'Error',\n  serverAddFailed: 'Adding server failed',\n  serverStatus: 'Status',\n  serverConnectionFailed: 'Connection failed. Click for more information.',\n  serverAuthFailed: 'Authentication error',\n  serverUnknownError: 'Unknown error',\n  serverSelfSignedCertError: 'Invalid self-signed certificate',\n  serverSelfSignedCertQuestion:\n    'Do you want to accept self-signed certificate for this server even though it would decrease security?',\n  serverEnable: 'Enable',\n  serverEnabled: 'Enabled',\n  serverDisabled: 'Disabled',\n  serverDisable: 'Disable server',\n  serverHttpProxy: ' HTTP proxy URL',\n  serverHttpProxyPlaceHolder: ' HTTP proxy URL',\n\n  // ----- Copy VM -----\n  copyVm: 'Copy VM',\n  copyVmName: 'Name',\n  copyVmNamePatternPlaceholder: 'e.g.: \"\\\\{name\\\\}_COPY\"',\n  copyVmSelectSr: 'Select SR',\n  copyVmsNoTargetSr: 'No target SR',\n  copyVmsNoTargetSrMessage: 'A target SR is required to copy a VM',\n  notSupportedZstdWarning: 'Zstd is not supported on {nVms, number} VM{nVms, plural, one {} other {s}}',\n  notSupportedZstdTooltip: 'Click to see the concerned VMs',\n  fastCloneMode: 'Fast clone',\n  fullCopyMode: 'Full copy',\n  copyTemplate: 'Copy template',\n\n  // ----- Detach host -----\n  detachHostModalTitle: 'Detach host',\n  detachHostModalMessage:\n    'Are you sure you want to detach {host} from its pool? THIS WILL REMOVE ALL VMs ON ITS LOCAL STORAGE AND REBOOT THE HOST.',\n  detachHost: 'Detach',\n\n  // ----- Advanced Live Telemetry -----\n  advancedLiveTelemetry: 'Advanced Live Telemetry',\n  pluginNetDataIsNecessary: 'Netdata plugin is necessary',\n  enableAdvancedLiveTelemetry: 'Enable Advanced Live Telemetry',\n  enableAdvancedLiveTelemetrySuccess: 'Advanced Live Telemetry successfully enabled',\n  xcpOnlyFeature: 'This feature is only XCP-ng compatible',\n\n  // ----- Forget host -----\n  forgetHostModalTitle: 'Forget host',\n  forgetHostModalMessage:\n    \"Are you sure you want to forget {host} from its pool? Be sure this host can't be back online, or use detach instead.\",\n  forgetHost: 'Forget',\n\n  // ----- Set pool master -----\n\n  setPoolMasterModalTitle: 'Designate a new master',\n  setPoolMasterModalMessage: 'This operation may take several minutes. Do you want to continue?',\n\n  // ----- Network -----\n  networkManagement: 'Management',\n  newNetworkCreate: 'Create network',\n  newNetworkInterface: 'Interface',\n  newNetworkName: 'Name',\n  newNetworkDescription: 'Description',\n  newNetworkVlan: 'VLAN',\n  newNetworkDefaultVlan: 'No VLAN if empty',\n  newNetworkMtu: 'MTU',\n  newNetworkDefaultMtu: 'Default: 1500',\n  newNetworkBondMode: 'Bond mode',\n  newNetworkInfo: 'Info',\n  newNetworkType: 'Type',\n  newNetworkPreferredCenter: 'Preferred center (optional)',\n  newNetworkEncapsulation: 'Encapsulation',\n  newNetworkEncrypted: 'Encrypted',\n  encryptionWarning: 'A pool can have 1 encrypted GRE network and 1 encrypted VxLAN network max',\n  preferredCenterTip: 'The host to try first to elect as center of the network',\n  newNetworkSdnControllerTip: 'Please see the requirements',\n  deleteNetwork: 'Delete network',\n  deleteNetworkConfirm: 'Are you sure you want to delete this network?',\n  networkInUse: 'This network is currently in use',\n  pillBonded: 'Bonded',\n  bondedNetwork: 'Bonded network',\n  privateNetwork: 'Private network',\n  addPool: 'Add pool',\n\n  // ----- Add host -----\n  hosts: 'Hosts',\n  addHostNoHost: 'No host',\n  addHostNoHostMessage: 'No host selected to be added',\n\n  // ----- About View -----\n  failedToFetchLatestMasterCommit: 'Failed to fetch latest master commit',\n  noProSupport: 'Professional support missing!',\n  productionUse: 'Want to use in production?',\n  getSupport: 'Get pro support with the Xen Orchestra Appliance at {website}',\n  bugTracker: 'Bug Tracker',\n  bugTrackerText: 'Issues? Report it!',\n  community: 'Community',\n  communityText: 'Join our community forum!',\n  freeTrial: 'Free Trial for Premium Edition!',\n  freeTrialNow: 'Request your trial now!',\n  issues: 'Any issue?',\n  issuesText: 'Problem? Contact us!',\n  documentation: 'Documentation',\n  documentationText: 'Read our official doc',\n  proSupportIncluded: 'Pro support included',\n  xoAccount: 'Access your XO Account',\n  openTicket: 'Report a problem',\n  openTicketText: 'Problem? Open a ticket!',\n  xoUpToDate: 'Your Xen Orchestra is up to date',\n  xoFromSourceNotUpToDate:\n    'You are not up to date with master. {nBehind} commit{nBehind, plural, one {} other {s}} behind {nAhead, plural, =0 {} other {and {nAhead, number} commit{nAhead, plural, one {} other {s}} ahead}}',\n\n  // ----- Upgrade Panel -----\n  upgradeNeeded: 'Upgrade needed',\n  upgradeNow: 'Upgrade now!',\n  or: 'Or',\n  tryIt: 'Try it for free!',\n  availableIn: 'This feature is available starting from {plan} Edition',\n  notAvailable: 'This feature is not available in your version, contact your administrator to know more.',\n\n  // ----- Updates View -----\n  registration: 'Registration',\n  settings: 'Settings',\n  proxySettings: 'Proxy settings',\n  proxySettingsHostPlaceHolder: 'Host (myproxy.example.org)',\n  proxySettingsPortPlaceHolder: 'Port (eg: 3128)',\n  proxySettingsUsernamePlaceHolder: 'Username',\n  proxySettingsPasswordPlaceHolder: 'Password',\n  updateRegistrationEmailPlaceHolder: 'Your email account',\n  updateRegistrationPasswordPlaceHolder: 'Your password',\n  updaterTroubleshootingLink: 'Troubleshooting documentation',\n  update: 'Update',\n  refresh: 'Refresh',\n  upgrade: 'Upgrade',\n  considerSubscribe:\n    'Please consider subscribing and trying it with all the features for free during 30 days on {link}.',\n  currentVersion: 'Current version:',\n  register: 'Register',\n  editRegistration: 'Edit registration',\n  trialRegistration: 'Please, take time to register in order to enjoy your trial.',\n  trialStartButton: 'Start trial',\n  trialAvailableUntil: 'You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.',\n  trialConsumed: 'Your trial has been ended. Contact us or downgrade to Free version',\n  trialLocked: 'Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.',\n  noUpdateInfo: 'No update information available',\n  waitingUpdateInfo: 'Update information may be available',\n  upToDate: 'Your XOA is up-to-date',\n  mustUpgrade: 'You need to update your XOA (new version is available)',\n  registerNeeded: 'Your XOA is not registered for updates',\n  updaterError: \"Can't fetch update information\",\n  promptUpgradeReloadTitle: 'Upgrade successful',\n  promptUpgradeReloadMessage:\n    'Your XOA has successfully upgraded, and your browser must reload the application. Do you want to reload now ?',\n  upgradeWarningTitle: 'Upgrade warning',\n  upgradeWarningMessage:\n    'You have some backup jobs in progress. If you upgrade now, these jobs will be interrupted! Are you sure you want to continue?',\n  releaseChannels: 'Release channels',\n  unlistedChannel: 'unlisted channel',\n  unlistedChannelName: 'Unlisted channel name',\n  selectChannel: 'Select channel',\n  changeChannel: 'Change channel',\n  updaterCommunity: 'The Web updater, the release channels and the proxy settings are available in XOA.',\n  xoaBuild: 'XOA build:',\n\n  // ----- OS Disclaimer -----\n  disclaimerTitle: 'Xen Orchestra from the sources',\n  disclaimerText1: \"You are using XO from the sources! That's great for a personal/non-profit usage.\",\n  disclaimerText2: \"If you are a company, it's better to use it with our appliance + pro support included:\",\n  disclaimerText3: 'This version is not bundled with any support nor updates. Use it with caution.',\n  disclaimerText4: 'Why do I see this message?',\n  notRegisteredDisclaimerInfo: 'You are not registered. Your XOA may not be up to date.',\n  notRegisteredDisclaimerCreateAccount: 'Click here to create an account.',\n  notRegisteredDisclaimerRegister: 'Click here to register and update your XOA.',\n\n  // ----- PIF -----\n  connectPif: 'Connect PIF',\n  connectPifConfirm: 'Are you sure you want to connect this PIF?',\n  disconnectPif: 'Disconnect PIF',\n  disconnectPifConfirm: 'Are you sure you want to disconnect this PIF?',\n  deletePif: 'Delete PIF',\n  deletePifConfirm: 'Are you sure you want to delete this PIF?',\n  deletePifs: 'Delete PIFs',\n  deletePifsConfirm: 'Are you sure you want to delete {nPifs, number} PIF{nPifs, plural, one {} other {s}}?',\n  pifConnected: 'Connected',\n  pifDisconnected: 'Disconnected',\n  pifPhysicallyConnected: 'Physically connected',\n  pifPhysicallyDisconnected: 'Physically disconnected',\n\n  // ----- User -----\n  authToken: 'Token',\n  authTokens: 'Authentication tokens',\n  authTokenLastUse: 'Last use',\n  username: 'Username',\n  password: 'Password',\n  language: 'Language',\n  oldPasswordPlaceholder: 'Old password',\n  newPasswordPlaceholder: 'New password',\n  confirmPasswordPlaceholder: 'Confirm new password',\n  confirmationPasswordError: 'Confirmation password incorrect',\n  confirmationPasswordErrorBody: 'Password does not match the confirm password.',\n  pwdChangeSuccess: 'Password changed',\n  pwdChangeSuccessBody: 'Your password has been successfully changed.',\n  pwdChangeError: 'Incorrect password',\n  pwdChangeErrorBody: 'The old password provided is incorrect. Your password has not been changed.',\n  changePasswordOk: 'OK',\n  forgetTokens: 'Forget all authentication tokens',\n  forgetTokensExplained: 'This prevents authenticating with existing tokens but the one used by the current session',\n  forgetTokensSuccess: 'Successfully forgot authentication tokens',\n  forgetTokensError: 'Error while forgetting authentication tokens',\n  sshKeys: 'SSH keys',\n  newAuthToken: 'New token',\n  newSshKey: 'New SSH key',\n  deleteAuthTokens: 'Delete selected authentication tokens',\n  deleteSshKey: 'Delete',\n  deleteSshKeys: 'Delete selected SSH keys',\n  newAuthTokenModalTitle: 'New authentication token',\n  newSshKeyModalTitle: 'New SSH key',\n  sshKeyAlreadyExists: 'SSH key already exists!',\n  sshKeyErrorTitle: 'Invalid key',\n  sshKeyErrorMessage: 'An SSH key requires both a title and a key.',\n  title: 'Title',\n  key: 'Key',\n  deleteAuthTokenConfirm: 'Delete authentication token',\n  deleteAuthTokenConfirmMessage: 'Are you sure you want to delete the authentication token: {id}?',\n  deleteAuthTokensConfirm: 'Delete authentication token{nTokens, plural, one {} other {s}}',\n  deleteAuthTokensConfirmMessage:\n    'Are you sure you want to delete {nTokens, number} autentication token{nTokens, plural, one {} other {s}}?',\n  deleteSshKeyConfirm: 'Delete SSH key',\n  deleteSshKeyConfirmMessage: 'Are you sure you want to delete the SSH key {title}?',\n  deleteSshKeysConfirm: 'Delete SSH key{nKeys, plural, one {} other {s}}',\n  deleteSshKeysConfirmMessage:\n    'Are you sure you want to delete {nKeys, number} SSH key{nKeys, plural, one {} other {s}}?',\n  addOtpConfirm: 'Add OTP authentication',\n  addOtpConfirmMessage:\n    'To enable OTP authentication, add it to your application and then enter the current password to validate.',\n  addOtpInvalidPassword: 'Password is invalid',\n  removeOtpConfirm: 'Remove OTP authentication',\n  removeOtpConfirmMessage: 'Are you sure you want to remove OTP authentication?',\n  OtpAuthentication: 'OTP authentication',\n  OtpCode: 'OTP code',\n\n  // ----- Usage -----\n  others: '{nOthers, number} other{nOthers, plural, one {} other {s}}',\n\n  // ----- Logs -----\n  logUser: 'User',\n  logMessage: 'Message',\n  logSuggestXcpNg: 'Use XCP-ng to get rid of restrictions',\n  logXapiError: 'This is a XenServer/XCP-ng error',\n  logError: 'Error',\n  logTitle: 'Logs',\n  logDisplayDetails: 'Display details',\n  logDownload: 'Download log',\n  logTime: 'Date',\n  logDelete: 'Delete log',\n  logsDelete: 'Delete logs',\n  logsJobId: 'Job ID',\n  logsJobName: 'Job name',\n  logsBackupTime: 'Backup time',\n  logsRestoreTime: 'Restore time',\n  copyLogToClipboard: 'Copy log to clipboard',\n  logsVmNotFound: 'VM not found!',\n  logsFailedRestoreError: 'Click to show error',\n  logsFailedRestoreTitle: 'Restore error',\n  logDeleteMultiple: 'Delete log{nLogs, plural, one {} other {s}}',\n  logDeleteMultipleMessage: 'Are you sure you want to delete {nLogs, number} log{nLogs, plural, one {} other {s}}?',\n  logIndicationToEnable: 'Click to enable',\n  logIndicationToDisable: 'Click to disable',\n  reportBug: 'Report a bug',\n  unhealthyVdiChainError: 'Job canceled to protect the VDI chain',\n  backupRestartVm: \"Restart VM's backup\",\n  backupForceRestartVm: \"Force restart VM's backup\",\n  backupRestartFailedVms: \"Restart failed VMs' backup\",\n  backupForceRestartFailedVms: \"Force restart failed VMs' backup\",\n  clickForMoreInformation: 'Click for more information',\n  goToThisJob: 'Click to go to this job',\n  goToCorrespondingLogs: 'Click to see corresponding logs',\n\n  // ----- IPs ------\n  ipPoolName: 'Name',\n  ipPoolIps: 'IPs',\n  ipPoolNetworks: 'Networks',\n  ipsNoIpPool: 'No IP pools',\n  ipsCreate: 'Create',\n  ipsVifs: 'VIFs',\n  ipsNotUsed: 'Not used',\n  ipPoolUnknownVif: 'unknown VIF',\n  ipPoolNameAlreadyExists: 'Name already exists',\n\n  // ----- Shortcuts -----\n  shortcutModalTitle: 'Keyboard shortcuts',\n  shortcut_XoApp: 'Global',\n  shortcut_XoApp_GO_TO_HOSTS: 'Go to hosts list',\n  shortcut_XoApp_GO_TO_POOLS: 'Go to pools list',\n  shortcut_XoApp_GO_TO_VMS: 'Go to VMs list',\n  shortcut_XoApp_GO_TO_SRS: 'Go to SRs list',\n  shortcut_XoApp_CREATE_VM: 'Create a new VM',\n  shortcut_XoApp_UNFOCUS: 'Unfocus field',\n  shortcut_XoApp_HELP: 'Show shortcuts key bindings',\n  shortcut_Home: 'Home',\n  shortcut_Home_SEARCH: 'Focus search bar',\n  shortcut_Home_NAV_DOWN: 'Next item',\n  shortcut_Home_NAV_UP: 'Previous item',\n  shortcut_Home_SELECT: 'Select item',\n  shortcut_Home_JUMP_INTO: 'Open',\n  shortcut_SortedTable: 'Supported tables',\n  shortcut_SortedTable_SEARCH: 'Focus the table search bar',\n  shortcut_SortedTable_NAV_DOWN: 'Next item',\n  shortcut_SortedTable_NAV_UP: 'Previous item',\n  shortcut_SortedTable_SELECT: 'Select item',\n  shortcut_SortedTable_ROW_ACTION: 'Action',\n\n  // ----- Settings/ACLs -----\n  settingsAclsButtonTooltipVM: 'VM',\n  settingsAclsButtonTooltiphost: 'Hosts',\n  settingsAclsButtonTooltippool: 'Pool',\n  settingsAclsButtonTooltipSR: 'SR',\n  settingsAclsButtonTooltipnetwork: 'Network',\n\n  // ----- Settings/Cloud configs -----\n  settingsCloudConfigTemplate: 'Template',\n  confirmDeleteCloudConfigsTitle: 'Delete cloud config{nCloudConfigs, plural, one {} other {s}}',\n  confirmDeleteCloudConfigsBody:\n    'Are you sure you want to delete {nCloudConfigs, number} cloud config{nCloudConfigs, plural, one {} other {s}}?',\n  confirmDeleteNetworkConfigsTitle: 'Delete network config{nNetworkConfigs, plural, one {} other {s}}',\n  confirmDeleteNetworkConfigsBody:\n    'Are you sure you want to delete {nNetworkConfigs, number} network config{nNetworkConfigs, plural, one {} other {s}}?',\n  deleteCloudConfig: 'Delete cloud config',\n  editCloudConfig: 'Edit cloud config',\n  deleteSelectedCloudConfigs: 'Delete selected cloud configs',\n  networkConfig: 'Network config',\n  cloudConfig: 'Cloud config',\n\n  // ----- Config -----\n  noConfigFile: 'No config file selected',\n  importTip: 'Try dropping a config file here or click to select a config file to upload.',\n  config: 'Config',\n  importConfig: 'Import',\n  importConfigEnterPassphrase: 'If the config is encrypted, please enter the passphrase:',\n  importConfigSuccess: 'Config file successfully imported',\n  importConfigError: 'Error while importing config file',\n  exportConfig: 'Export',\n  exportConfigEnterPassphrase: 'If you want to encrypt the exported config, please enter a passphrase:',\n  downloadConfig: 'Download current config',\n\n  // ----- SR -----\n  andNMore: 'and {n} more',\n  disabledVdiMigrateTooltip: \"Snapshots and base copies can't be migrated individually\",\n  srReconnectAllModalTitle: 'Reconnect all hosts',\n  srReconnectAllModalMessage: 'This will reconnect this SR to all its hosts.',\n  srDisconnectAllModalTitle: 'Disconnect all hosts',\n  srDisconnectAllModalMessage: 'This will disconnect this SR from all its hosts.',\n  srsDisconnectAllModalMessage:\n    'This will disconnect each selected SR from its host (local SR) or from every hosts of its pool (shared SR).',\n  forgetNSrsModalMessage: 'Are you sure you want to forget {nSrs, number} SR{nSrs, plural, one {} other{s}}?',\n  srForgetModalWarning:\n    'You will lose all the metadata, meaning all the links between the VDIs (disks) and their respective VMs. This operation cannot be undone.',\n  srAllDisconnected: 'Disconnected',\n  srSomeConnected: 'Partially connected',\n  srAllConnected: 'Connected',\n  maintenanceSrModalBody:\n    'In order to put this SR in maintenance mode, the following VM{n, plural, one {} other {s}} will be shut down. Are you sure you want to continue?',\n  maintenanceMode: 'Maintenance mode',\n  migrateSelectedVdis: 'Migrate selected VDIs',\n  migrateVdiMessage:\n    'All the VDIs attached to a VM must either be on a shared SR or on the same host (local SR) for the VM to be able to start.',\n\n  // ----- XO cloud config -----\n  backedUpXoConfigs: 'Backed up XO Configs',\n  manageXoConfigCloudBackup: 'Manage XO Config Cloud Backup',\n  selectXoConfig: 'Select XO config',\n  xoConfigCloudBackup: 'XO Config Cloud Backup',\n  xoConfigCloudBackupTips:\n    'Your encrypted configuration is securely stored inside your Vates account and backed up once a day',\n  xoCloudConfigEnterPassphrase: 'Passphrase is required to encrypt backups',\n  xoCloudConfigRestoreEnterPassphrase: 'Enter the passphrase:',\n\n  // ----- XOSAN -----\n  xosanTitle: 'XOSAN',\n  xosanSuggestions: 'Suggestions',\n  xosanDisperseWarning: 'Warning: using disperse layout is not recommended right now. Please read {link}.',\n  xosanName: 'Name',\n  xosanHost: 'Host',\n  xosanHosts: 'Connected Hosts',\n  xosanPool: 'Pool',\n  xosanSize: 'Size',\n  xosanUsedSpace: 'Used space',\n  license: 'License',\n  xosanMultipleLicenses: 'This XOSAN has more than 1 license!',\n  xosanNeedPack: 'XOSAN pack needs to be installed and up to date on each host of the pool.',\n  xosanInstallIt: 'Install it now!',\n  xosanNeedRestart: 'Some hosts need their toolstack to be restarted before you can create an XOSAN',\n  xosanRestartAgents: 'Restart toolstacks',\n  xosanSrOnSameHostMessage: 'Select no more than 1 SR per host',\n  xosanLayout: 'Layout',\n  xosanRedundancy: 'Redundancy',\n  xosanCapacity: 'Capacity',\n  xosanAvailableSpace: 'Available space',\n  xosanDiskLossLegend: '* Can fail without data loss',\n  xosanCreate: 'Create',\n  xosanCommunity: 'XOSAN is available in XOA',\n  xosanNew: 'New',\n  xosanAdvanced: 'Advanced',\n  xosanRemoveSubvolumes: 'Remove subvolumes',\n  xosanAddSubvolume: 'Add subvolume…',\n  xosanWarning:\n    \"This version of XOSAN SR is from the first beta phase. You can keep using it, but to modify it you'll have to save your disks and re-create it.\",\n  xosanVlan: 'VLAN',\n  xosanNoSrs: 'No XOSAN found',\n  xosanPbdsDetached: 'Some SRs are detached from the XOSAN',\n  xosanBadStatus: 'Something is wrong with: {badStatuses}',\n  xosanRunning: 'Running',\n  xosanUpdatePacks: 'Update packs',\n  xosanPackUpdateChecking: 'Checking for updates',\n  xosanPackUpdateError:\n    'Error while checking XOSAN packs. Please make sure that the Cloud plugin is installed and loaded, and that the updater is reachable.',\n  xosanPackUpdateUnavailable: 'XOSAN resources are unavailable',\n  xosanPackUpdateUnregistered: 'Not registered for XOSAN resources',\n  xosanPackUpdateUpToDate: \"✓ This pool's XOSAN packs are up to date!\",\n  xosanPackUpdateVersion: 'Update pool with latest pack v{version}',\n  xosanDelete: 'Delete XOSAN',\n  xosanFixIssue: 'Fix',\n  xosanCreatingOn: 'Creating XOSAN on {pool}',\n  xosanState_configuringNetwork: 'Configuring network…',\n  xosanState_importingVm: 'Importing VM…',\n  xosanState_copyingVms: 'Copying VMs…',\n  xosanState_configuringVms: 'Configuring VMs…',\n  xosanState_configuringGluster: 'Configuring gluster…',\n  xosanState_creatingSr: 'Creating SR…',\n  xosanState_scanningSr: 'Scanning SR…',\n  xosanXcpngWarning:\n    'XOSAN cannot be installed on XCP-ng yet. Incoming XOSANv2 will be compatible with XCP-ng: {link}.',\n  // Pack download modal\n  xosanInstallCloudPlugin: 'Install XOA plugin first',\n  xosanLoadCloudPlugin: 'Load XOA plugin first',\n  xosanNoPackFound: 'No compatible XOSAN pack found for your XenServer versions.',\n  // SR tab XOSAN\n  xosanVmsNotRunning: 'Some XOSAN Virtual Machines are not running',\n  xosanVmsNotFound: 'Some XOSAN Virtual Machines could not be found',\n  xosanFilesNeedingHealing: 'Files needing healing',\n  xosanFilesNeedHealing: 'Some XOSAN Virtual Machines have files needing healing',\n  xosanHostNotInNetwork: 'Host {hostName} is not in XOSAN network',\n  xosanVm: 'VM controller',\n  xosanUnderlyingStorage: 'SR',\n  xosanReplace: 'Replace…',\n  xosanOnSameVm: 'On same VM',\n  xosanBrickName: 'Brick name',\n  xosanBrickUuid: 'Brick UUID',\n  xosanBrickSize: 'Brick size',\n  xosanMemorySize: 'Memory size',\n  xosanStatus: 'Status',\n  xosanArbiter: 'Arbiter',\n  xosanUsedInodes: 'Used Inodes',\n  xosanBlockSize: 'Block size',\n  xosanDevice: 'Device',\n  xosanFsName: 'FS name',\n  xosanMountOptions: 'Mount options',\n  xosanPath: 'Path',\n  xosanJob: 'Job',\n  xosanPid: 'PID',\n  xosanPort: 'Port',\n  xosanReplaceBrickErrorTitle: 'Missing values',\n  xosanReplaceBrickErrorMessage: 'You need to select a SR and a size',\n  xosanAddSubvolumeErrorTitle: 'Bad values',\n  xosanAddSubvolumeErrorMessage: 'You need to select {nSrs, number} and a size',\n  xosanSelectNSrs: 'Select {nSrs, number} SRs',\n  xosanRun: 'Run',\n  xosanRemove: 'Remove',\n  xosanVolume: 'Volume',\n  xosanVolumeOptions: 'Volume options',\n  xosanCouldNotFindVm: 'Could not find VM',\n  xosanUnderlyingStorageUsage: 'Using {usage}',\n  xosanCustomIpNetwork: 'Custom IP network (/24)',\n  xosanIssueHostNotInNetwork: 'Will configure the host xosan network device with a static IP address and plug it in.',\n  // ----- XOSTOR -----\n  approximateSrCapacity: 'Approximate SR capacity',\n  byDefaultManagementNetworkUsed: 'By default, the management network will be used',\n  cantFetchDisksFromNonXcpngHost: 'Unable to fetch physical disks from non-XCP-ng host',\n  createInterface: 'Create interface',\n  createXostoreConfirm:\n    'If packages need to be installed, the toolstack on those hosts will restart. Do you want to continue?',\n  diskAlreadyMounted: 'The disk is mounted on: {mountpoint}',\n  diskful: 'Diskful',\n  diskHasExistingPartition: 'The disk has existing partition',\n  diskIncompatibleXostor: 'Disk incompatible with XOSTOR',\n  diskIsReadOnly: 'The disk is Read-Only',\n  diskless: 'Diskless',\n  disks: 'Disks',\n  fieldRequired: '{field} is required',\n  fieldsMissing: 'Some fields are missing',\n  hostBoundToMultipleXostorLicenses: 'More than 1 XOSTOR license on {host}',\n  hostHasNoXostorLicense: 'No XOSTOR license on {host}',\n  hostsNotSameNumberOfDisks: 'Hosts do not have the same number of disks',\n  ignoreFileSystems: 'Ignore file systems',\n  ignoreFileSystemsInfo: 'Force LINSTOR group creation on existing filesystem',\n  interfaceName: 'Interface name',\n  interfaceNameRequired: 'Interface name is required if a network is provided',\n  interfaceNameReserved: 'This interface name is reserved',\n  isTapdevDisk: 'This is \"tapdev\" disk',\n  licenseBoundUnknownXostor: 'License attached to an unknown XOSTOR',\n  licenseNotBoundXostor: 'No XOSTOR attached',\n  licenseExpiredXostorWarning:\n    'License{nLicenseIds, plural, one {} other {s}} {licenseIds} ha{nLicenseIds, plural, one {s} other {ve}} expired on {host}',\n  manageXostorWarning: 'To manage this XOSTOR storage, you must resolve the following issues:',\n  networkNoPifs: 'The network does not have PIFs',\n  networks: 'Networks',\n  notXcpPool: 'Not an XCP-ng pool',\n  noXostorFound: 'No XOSTOR found',\n  numberOfHosts: 'Number of hosts',\n  objectDoesNotMeetXostorRequirements: '{object} does not meet XOSTOR requirements. Refer to the documentation.',\n  onlyShowXostorRequirements: 'Only show {type} that meet XOSTOR requirements',\n  poolAlreadyHasXostor: 'Pool already has a XOSTOR',\n  poolNotRecentEnough: 'Not recent enough. Current version: {version}',\n  pifsNoIp: 'Not all PIFs have an IP',\n  pifsNotAttached: 'Not all PIFs are attached',\n  pifsNotStatic: 'Not all PIFs are static',\n  replication: 'Replication',\n  replicationCountHigherThanHostsWithDisks: 'Replication count is higher than number of hosts with disks',\n  resourceList: 'Resource list',\n  rpuRequireVmsReboot: 'To fully apply the patches, some VMs will reboot. Are you sure you want to continue?',\n  selectDisks: 'Select disk(s)…',\n  selectedDiskTypeIncompatibleXostor: 'Only disks of type \"Disk\" and \"Raid\" are accepted. Selected disk type: {type}.',\n  setAsPreferred: 'Set as preferred',\n  storage: 'Storage',\n  summary: 'Summary',\n  tieBreaker: 'Tie breaker',\n  whiteSpaceNotAllowed: 'White space not allowed',\n  wrongNumberOfHosts: 'Wrong number of hosts',\n  xostor: 'XOSTOR',\n  xostorAvailableInXoa: 'XOSTOR is available in XOA',\n  xostorCreation: 'XOSTOR creation',\n  xostorDiskRequired: 'At least one disk is required',\n  xostorDisksDropdownLabel: '({nDisks, number} disk{nDisks, plural, one {} other {s}}) {hostname}',\n  xostorPackagesWillBeInstalled: '\"xcp-ng-release-linstor\" and \"xcp-ng-linstor\" will be installed on each host',\n  xostorReplicationWarning: 'If a disk dies, you will lose data',\n\n  // Hub\n  hubPage: 'Hub',\n  hubCommunity: 'Hub is available in XOA',\n  noDefaultSr: 'The selected pool has no default SR',\n  successfulInstall: 'VM installed successfully',\n  vmNoAvailable: 'No VMs available ',\n  create: 'Create',\n  hubResourceAlert: 'Resource alert',\n  os: 'OS',\n  version: 'Version',\n  size: 'Size',\n  totalDiskSize: 'Total disk size',\n  hideInstalledPool: 'Already installed templates are hidden',\n  hubImportNotificationTitle: 'XVA import',\n  hubTemplateDescriptionNotAvailable: 'No description available for this template',\n  recipeCreatedSuccessfully: 'Recipe created successfully',\n  recipeViewCreatedVms: 'View created VMs',\n  templatesLabel: 'Templates',\n  recipesLabel: 'Recipes',\n  network: 'Network',\n\n  // Recipe Kubernetes\n  recipeSelectK8sVersion: 'Select Kubernetes version',\n  recipeClusterNameLabel: 'Cluster name',\n  recipeNumberOfNodesLabel: 'Number of worker nodes',\n  recipeSshKeyLabel: 'SSH key',\n  recipeStaticIpAddresses: 'Static IP addresses',\n  recipeFaultTolerance: 'Control plane fault tolerance',\n  recipeNoneFaultTolerance: 'No fault tolerance (one control plane)',\n  recipeOneFaultTolerance: 'One fault tolerance (three control planes)',\n  recipeTwoFaultTolerance: 'Two fault tolerances (five control planes)',\n  recipeThreeFaultTolerance: 'Three fault tolerances (seven control planes)',\n  recipeHaControPlaneIpAddress: 'Control plane { i, number } node IP address/subnet mask',\n  recipeVip: 'VIP address',\n  recipeControlPlaneIpAddress: 'Control plane node IP address/subnet mask',\n  recipeWorkerIpAddress: 'Worker node { i, number } IP address/subnet mask',\n  recipeGatewayIpAddress: 'Gateway IP address',\n  recipeNameserverAddresses: 'Nameserver IP addresses',\n  recipeStaticIpAddress: 'Static IP Address',\n  recipeNameserverAddressesExample: '192.168.1.0,172.16.1.0',\n  recipeSearches: 'Search domains',\n  recipeSearchesExample: 'domain.com,search.org',\n\n  // Recipe DC Scope\n  vmNameCompleteLabel: 'VM Name',\n  easyVirtVmLabel: 'EasyVirt VM',\n  easyVirtDescription: 'Creates a DC Scope or a DC NetScope VM with parameters and application inside',\n  xoPassword: 'Xen Orchestra Password',\n  xoUsername: 'Xen Orchestra Username',\n  dcNetscopePassword: 'Password for DC Netscope web interface',\n  xoFqdn: 'Xen Orchestra FQDN / IP',\n  dcScopeVm: 'DC Scope VM',\n  dcNetScopeVm: 'DC NetScope VM',\n  recipeEasyVirt: 'EasyVirt VM to deploy',\n  recipeUserCompany: 'Company',\n  gdprCompliance: 'I agree that the data in this form may be shared exclusively between Vates and EasyVirt',\n  recipeUserEmail: 'Email for EasyVirt',\n  performanceConfigDcScope: 'Performance for VM DC Scope',\n  dcScopeTest: 'Test config (10 VM): CPU(2), RAM(4), Disk(10GB)',\n  dcScopeVerySmall: 'Very small config (<1000 VM): CPU(2), RAM(12), Disk(250GB)',\n  dcScopeSmall: 'Small config (1000-2500 VM): CPU(2), RAM(24), Disk(550GB)',\n  dcScopeMedium: 'Medium config (2500-5000 VM): CPU(4), RAM(48), Disk(750GB)',\n  dcScopeBig: 'Big config (5000-7500 VM): CPU(4), RAM(64), Disk(1.2TB)',\n  dcScopeVeryBig: 'Very big config (7500-10000 VM: CPU(8), RAM(96), Disk(1.5TB)',\n  dcScopeHuge: 'Huge config (>10000 VM): CPU(8), RAM(128), Disk(2TB)',\n\n  // Audit\n  auditActionEvent: 'Action/Event',\n  auditAlteredRecord: 'The record ({ id }) was altered ({ n, number } valid records)',\n  auditCheckIntegrity: 'Check integrity',\n  auditCopyFingerprintToClipboard: 'Copy fingerprint to clipboard',\n  auditGenerateNewFingerprint: 'Generate a new fingerprint',\n  auditMissingRecord: 'The record ({ id }) is missing ({ n, number } valid records)',\n  auditEnterFingerprint: 'Fingerprint',\n  auditEnterFingerprintInfo:\n    \"Enter the saved fingerprint to check the previous logs' integrity. If you don't have any, click OK.\",\n  auditRecord: 'Audit record',\n  auditIntegrityVerified: 'Integrity verified',\n  auditSaveFingerprintInfo: 'Keep this fingerprint to be able to check the integrity of the current records later.',\n  auditSaveFingerprintInErrorInfo:\n    'However, if you trust the current state of the records, keep this fingerprint to be able to check their integrity later.',\n  auditNewFingerprint: 'New fingerprint',\n  downloadAuditRecords: 'Download records',\n  displayAuditRecord: 'Display record',\n  noAuditRecordAvailable: 'No audit record available',\n  refreshAuditRecordsList: 'Refresh records list',\n  auditInactiveUserActionsRecord: 'User actions recording is currently inactive',\n  importAuditRecords: 'Import records',\n  importRecordsTip: 'Try dropping a .ndjson.gz or .ndjson file here or click to select a file.',\n  importAuditRecordsCleanList: 'Reset',\n  importAuditRecordsButton: 'Import',\n  importAuditRecordsTooltip: 'Import audit record from another XOA. Audit log database must be empty.',\n  importAuditRecordsSuccess: 'Audit records successfully imported',\n  importAuditRecordsSuccessWithProblems:\n    \"Audit records successfully imported, but {nInvalidRecords} invalid records were imported and at least {nMissingRecords} records were missing. Logs prior to the missing entries will not appear. The oldest visible log's ID is {lastLogId}\",\n  importAuditRecordsError: 'Error while importing audit records: {importError}',\n  noAuditRecordsFile: 'No audit records file selected',\n\n  // Licenses\n  allHostsMustBeBound: 'All hosts must be bound to a license',\n  boundSelectLicense: 'Bound (Plan (ID), expiration date, host - pool)',\n  bindXcpngLicenses: 'Bind XCP-ng licenses',\n  confirmBindingOnUnsupportedHost:\n    'You are about to bind {nLicenses, number} professional support license{nLicenses, plural, one {} other {s}} on older and unsupported XCP-ng version{nLicenses, plural, one {} other {s}}. Are you sure you want to continue?',\n  confirmRebindLicenseFromFullySupportedPool: 'The following pools will no longer be fully supported',\n  licenses: 'Licenses',\n  licensesBinding: 'Licenses binding',\n  notEnoughXcpngLicenses: 'Not enough XCP-ng licenses',\n  notBoundSelectLicense: 'Not bound (Plan (ID), expiration date)',\n  xcpngLicensesBindingAvancedView: \"To bind an XCP-ng license, go to the pool's Advanced tab.\",\n  xosanUnregisteredDisclaimer:\n    'You are not registered and therefore will not be able to create or manage your XOSAN SRs. {link}',\n  xosanSourcesDisclaimer:\n    'In order to create a XOSAN SR, you need to use the Xen Orchestra Appliance and buy a XOSAN license on {link}.',\n  registerNow: 'Register now!',\n  licensesUnregisteredDisclaimer: 'You need to register your appliance to manage your licenses.',\n  licenseProduct: 'Product',\n  licensePurchaser: 'Purchaser',\n  licenseExpires: 'Expires',\n  licensePurchaserYou: 'You',\n  productSupport: 'Support',\n  licenseNotBoundXosan: 'No XOSAN attached',\n  licenseNotBoundProxy: 'No proxy attached',\n  licenseBoundUnknownXosan: 'License attached to an unknown XOSAN',\n  licenseBoundUnknownProxy: 'License attached to an unknown proxy',\n  licensesManage: 'Manage the licenses',\n  newLicense: 'New license',\n  refreshLicenses: 'Refresh',\n  xosanLicenseRestricted: 'Limited size because XOSAN is in trial',\n  xosanAdminNoLicenseDisclaimer: 'You need a license on this SR to manage the XOSAN.',\n  xosanAdminExpiredLicenseDisclaimer:\n    'Your XOSAN license has expired. You can still use the SR but cannot administrate it anymore.',\n  xosanCheckLicenseError: 'Could not check the license on this XOSAN SR',\n  getLicensesError: 'Could not fetch licenses',\n  licenseHasExpired: 'License has expired.',\n  licenseBoundToOtherXoa: 'License bound to another XOA',\n  licenseBoundToThisXoa: 'This license is active on this XOA',\n  licenseExpiresDate: 'License expires on {date}.',\n  updateLicenseMessage: 'Update the license now!',\n  xosanUnknownSr: 'Unknown XOSAN SR.',\n  contactUs: 'Contact us!',\n  xosanNoLicense: 'No license.',\n  unlockNow: 'Unlock now!',\n  selectLicense: 'Select a license',\n  bindLicense: 'Bind license',\n  bindLicenses: 'Bind licenses',\n  expiresOn: 'expires on {date}',\n  xosanInstallXoaPlugin: 'Install XOA plugin first',\n  xosanLoadXoaPlugin: 'Load XOA plugin first',\n  bindXoaLicense: 'Activate license',\n  rebindXoaLicense: 'Move license to this XOA',\n  bindXoaLicenseConfirm: 'Are you sure you want to activate this license on your XOA? This action is not reversible!',\n  bindXoaLicenseConfirmText: 'activate {licenseType} license',\n  updateNeeded: 'Update needed',\n  starterLicense: 'Starter license',\n  enterpriseLicense: 'Enterprise license',\n  premiumLicense: 'Premium license',\n  trialLicenseInfo: 'You are currently in a {edition} trial period that will end on {date, date, medium}',\n  licenseNearlyExpired:\n    'Your current Xen Orchestra license is about to expire (less than {duration} to {date, date, medium}). Please reach out to your vendor.',\n  licenseExpired:\n    'Your current Xen Orchestra license has expired ({date, date, medium}). Please reach out to your vendor.',\n  proxyMultipleLicenses: 'This proxy has more than 1 license!',\n  proxyUnknownVm: 'Unknown proxy VM.',\n  xostorProSupportEnabled: 'XOSTOR Pro Support enabled',\n\n  // ----- plan -----\n  onlyAvailableToEnterprise: 'Only available to Enterprise users',\n\n  // ----- proxies -----\n  forgetProxyApplianceTitle: 'Forget prox{n, plural, one {y} other {ies}}',\n  forgetProxyApplianceMessage: 'Are you sure you want to forget {n, number} prox{n, plural, one {y} other {ies}}?',\n  forgetProxies: 'Forget proxy(ies)',\n  destroyProxyApplianceTitle: 'Destroy prox{n, plural, one {y} other {ies}}',\n  destroyProxyApplianceMessage: 'Are you sure you want to destroy {n, number} prox{n, plural, one {y} other {ies}}?',\n  destroyProxies: 'Destroy proxy(ies)',\n  deployProxy: 'Deploy a proxy',\n  redeployProxy: 'Redeploy proxy',\n  redeployProxyAction: 'Redeploy this proxy',\n  redeployProxyWarning: 'This action will destroy the old proxy VM',\n  registerProxy: 'Register a proxy',\n  noProxiesAvailable: 'No proxies available',\n  checkProxyHealth: 'Test your proxy',\n  updateProxyApplianceSettings: 'Update appliance settings',\n  urlNotFound: 'URL not found',\n  proxyAuthToken: 'Authentication token',\n  proxyConnectionFailedAfterRegistrationMessage: 'Unable to connect to this proxy. Do you want to forget it?',\n  proxyCopyUrl: 'Copy proxy URL',\n  proxyError: 'Proxy error',\n  proxyOptionalVmUuid: 'VM UUID is optional but recommended.',\n  proxyTestSuccess: 'Test passed for {name}',\n  proxyTestSuccessMessage: 'The proxy appears to work correctly',\n  proxyTestFailed: 'Test failed for {name}',\n  proxyTestFailedConnectionIssueMessage: 'Unable to connect to this proxy',\n  proxyLinkedRemotes: 'Click to see linked remotes',\n  proxyLinkedBackups: 'Click to see linked backups',\n  proxyNetworkDnsPlaceHolder: 'Default to: {dns}',\n  proxyNetworkNetmaskPlaceHolder: 'Default to: {netmask}',\n  proxySrPredicateInfo: 'The select only contains SRs connected to at least one HVM-capable host',\n  httpProxy: 'HTTP proxy',\n  httpProxyPlaceholder: 'protocol://username:password@address:port',\n  proxyUpgradesError: 'Unable to check upgrades availability',\n  proxyApplianceSettingsInfo: 'Leave the field empty and click on OK to remove the existing configuration',\n  proxyUpToDate: 'Your proxy is up-to-date',\n  proxyRunningBackupsMessage:\n    'The upgrade will interrupt {nJobs, number} running backup job{nJobs, plural, one {} other {s}}. Do you want to continue?',\n  proxiesNeedUpgrade: 'Some proxies need to be upgraded.',\n  upgradeNeededForProxies: 'Some proxies need to be upgraded. Click here to get more information.',\n  xoProxyConcreteGuide: 'XO Proxy: a concrete guide',\n  someProxiesHaveErrors:\n    '{n, number} prox{n, plural, one {y} other {ies}} ha{n, plural, one {s} other {ve}} error{n, plural, one {} other {s}}',\n\n  // ----- Utils -----\n  secondsFormat: '{seconds, plural, one {# second} other {# seconds}}',\n  durationFormat:\n    '{days, plural, =0 {} one {# day } other {# days }}{hours, plural, =0 {} one {# hour } other {# hours }}{minutes, plural, =0 {} one {# minute } other {# minutes }}{seconds, plural, =0 {} one {# second} other {# seconds}}',\n\n  // ----- IPMI -----\n  currentBiosVersion: 'Current BIOS version: {version}',\n  downloadBiosUpdate: 'Download BIOS update ({version})',\n  highestCpuTemperature: '{n, number}x CPU{n, plural, one {} other {s}} (highest: {degres})',\n  highestFanSpeed: '{n, number}x fan{n, plural, one {} other {s}} (highest: {speed})',\n  inletTemperature: 'Inlet temperature',\n  ipmi: 'IPMI',\n  nFanStatus: '{n, number}x fan{n, plural, one {} other {s}} status: {status}',\n  nPsuStatus: '{n, number}x PSU{n, plural, one {} other {s}} status: {status}',\n  outletTemperature: 'Outlet temperature',\n  totalPower: 'Total power',\n}\nforEach(messages, function (message, id) {\n  if (typeof message === 'string') {\n    messages[id] = {\n      id,\n      defaultMessage: message,\n    }\n  } else if (!message.id) {\n    message.id = id\n  }\n})\n\nmodule.exports = messages\n","// Invoke a function and returns it result.\n// All parameters are forwarded.\n//\n// Why using `invoke()`?\n// - avoid tedious IIFE syntax\n// - avoid declaring variables in the common scope\n// - monkey-patching\n//\n// ```js\n// const sum = invoke(1, 2, (a, b) => a + b)\n//\n// eventEmitter.emit = invoke(eventEmitter.emit, emit => function (event) {\n//   if (event === 'foo') {\n//     throw new Error('event foo is disabled')\n//   }\n//\n//   return emit.apply(this, arguments)\n// })\n// ```\nexport default function invoke(fn) {\n  const n = arguments.length - 1\n  if (!n) {\n    return fn()\n  }\n\n  fn = arguments[n]\n  const args = new Array(n)\n  for (let i = 0; i < n; ++i) {\n    args[i] = arguments[i]\n  }\n\n  return fn.apply(undefined, args)\n}\n","import forEachRight from 'lodash/forEachRight'\nimport forEach from 'lodash/forEach'\nimport isIp from 'is-ip'\nimport some from 'lodash/some'\n\nexport { isIp }\nexport const isIpV4 = isIp.v4\nexport const isIpV6 = isIp.v6\n\n// Source: https://github.com/ezpaarse-project/ip-range-generator/blob/master/index.js\n\nconst ipv4 = /^(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:\\.(?!$)|$)){4}$/\n\nfunction ip2hex(ip) {\n  const parts = ip.split('.').map(str => parseInt(str, 10))\n  let n = 0\n\n  n += parts[3]\n  n += parts[2] * 256 // 2^8\n  n += parts[1] * 65536 // 2^16\n  n += parts[0] * 16777216 // 2^24\n\n  return n\n}\n\nfunction assertIpv4(str, msg) {\n  if (!ipv4.test(str)) {\n    throw new Error(msg)\n  }\n}\n\nfunction* range(ip1, ip2) {\n  assertIpv4(ip1, 'argument \"ip1\" must be a valid IPv4 address')\n  assertIpv4(ip2, 'argument \"ip2\" must be a valid IPv4 address')\n\n  let hex = ip2hex(ip1)\n  let hex2 = ip2hex(ip2)\n\n  if (hex > hex2) {\n    const tmp = hex\n    hex = hex2\n    hex2 = tmp\n  }\n\n  for (let i = hex; i <= hex2; i++) {\n    yield `${(i >> 24) & 0xff}.${(i >> 16) & 0xff}.${(i >> 8) & 0xff}.${i & 0xff}`\n  }\n}\n\n// -----------------------------------------------------------------------------\n\nexport const getNextIpV4 = ip => {\n  const splitIp = ip.split('.')\n  if (splitIp.length !== 4 || some(splitIp, value => value < 0 || value > 255)) {\n    return\n  }\n  let index\n  forEachRight(splitIp, (value, i) => {\n    if (value < 255) {\n      index = i\n      return false\n    }\n    splitIp[i] = 0\n  })\n  if (index === 0 && +splitIp[0] === 255) {\n    return 0\n  }\n  splitIp[index]++\n\n  return splitIp.join('.')\n}\n\nexport const formatIps = ips => {\n  if (!Array.isArray(ips)) {\n    throw new Error('ips must be an array')\n  }\n  if (ips.length === 0) {\n    return []\n  }\n  const sortedIps = ips.sort((ip1, ip2) => {\n    const splitIp1 = ip1.split('.')\n    const splitIp2 = ip2.split('.')\n    if (splitIp1.length !== 4) {\n      return 1\n    }\n    if (splitIp2.length !== 4) {\n      return -1\n    }\n    return (\n      splitIp1[3] -\n      splitIp2[3] +\n      (splitIp1[2] - splitIp2[2]) * 256 +\n      (splitIp1[1] - splitIp2[1]) * 256 * 256 +\n      (splitIp1[0] - splitIp2[0]) * 256 * 256 * 256\n    )\n  })\n  const range = { first: '', last: '' }\n  const formattedIps = []\n  let index = 0\n  forEach(sortedIps, ip => {\n    if (ip !== getNextIpV4(range.last)) {\n      if (range.first) {\n        formattedIps[index] = range.first === range.last ? range.first : { ...range }\n        index++\n      }\n      range.first = range.last = ip\n    } else {\n      range.last = ip\n    }\n  })\n  formattedIps[index] = range.first === range.last ? range.first : range\n\n  return formattedIps\n}\n\nexport const parseIpPattern = pattern => {\n  const ips = []\n  forEach(pattern.split(';'), rawIpRange => {\n    const ipRange = rawIpRange.split('-')\n    if (ipRange.length < 2) {\n      ips.push(ipRange[0])\n    } else if (!isIpV4(ipRange[0]) || !isIpV4(ipRange[1])) {\n      ips.push(rawIpRange)\n    } else {\n      ips.push(...range(ipRange[0], ipRange[1]))\n    }\n  })\n\n  return ips\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport _ from 'intl'\nimport ActionButton from './action-button'\nimport Component from './base-component'\nimport Icon from 'icon'\nimport Tooltip from 'tooltip'\nimport { alert } from 'modal'\nimport { isAdmin } from 'selectors'\nimport isEmpty from 'lodash/isEmpty.js'\nimport { addSubscriptions, connectStore, resolveResourceSet } from './utils'\nimport { ejectCd, insertCd, rescanSrs, subscribeResourceSets } from './xo'\nimport { createGetObjectsOfType, createFinder, createGetObject, createSelector } from './selectors'\nimport { SelectResourceSetsVdi, SelectVdi as SelectAnyVdi } from './select-objects'\n\nconst vdiPredicate = vdi => !vdi.missing\n\n@addSubscriptions({\n  resourceSets: subscribeResourceSets,\n})\n@connectStore(() => {\n  const getCdDrive = createFinder(\n    createGetObjectsOfType('VBD').pick((_, { vm }) => vm.$VBDs),\n    [vbd => vbd.is_cd_drive]\n  )\n\n  const getIsoSrs = createGetObjectsOfType('SR').filter(\n    (_, { vm: { $pool } }) =>\n      sr =>\n        sr.$pool === $pool && sr.SR_type === 'iso'\n  )\n\n  const getMountedIso = createGetObject((state, props) => {\n    const cdDrive = getCdDrive(state, props)\n    if (cdDrive) {\n      return cdDrive.VDI\n    }\n  })\n\n  return {\n    cdDrive: getCdDrive,\n    isAdmin,\n    isoSrs: getIsoSrs,\n    mountedIso: getMountedIso,\n  }\n})\nexport default class IsoDevice extends Component {\n  static propTypes = {\n    vm: PropTypes.object.isRequired,\n  }\n\n  _getSrPredicate = createSelector(\n    () => this.props.vm.$pool,\n    () => this.props.vm.$container,\n    (vmPool, vmContainer) => sr => {\n      return (\n        vmPool === sr.$pool &&\n        (sr.shared || vmContainer === sr.$container) &&\n        (sr.SR_type === 'iso' || (sr.SR_type === 'udev' && sr.size))\n      )\n    }\n  )\n\n  _getResolvedResourceSet = createSelector(\n    createFinder(\n      () => this.props.resourceSets,\n      createSelector(\n        () => this.props.vm.resourceSet,\n        id => resourceSet => resourceSet.id === id\n      )\n    ),\n    resolveResourceSet\n  )\n\n  _handleInsert = iso => {\n    const { vm } = this.props\n\n    if (iso) {\n      insertCd(vm, iso.id, true)\n    } else {\n      ejectCd(vm)\n    }\n  }\n\n  _handleEject = () => ejectCd(this.props.vm)\n\n  _rescanIsoSrs = () => rescanSrs(this.props.isoSrs)\n\n  _showWarning = () => alert(_('cdDriveNotInstalled'), _('cdDriveInstallation'))\n\n  render() {\n    const { cdDrive, isAdmin, isoSrs, mountedIso } = this.props\n    const resourceSet = this._getResolvedResourceSet()\n    const useResourceSet = !(isAdmin || resourceSet === undefined)\n    const SelectVdi = useResourceSet ? SelectResourceSetsVdi : SelectAnyVdi\n\n    return (\n      <div className='input-group'>\n        <SelectVdi\n          onChange={this._handleInsert}\n          predicate={vdiPredicate}\n          resourceSet={useResourceSet ? resourceSet : undefined}\n          srPredicate={this._getSrPredicate()}\n          value={mountedIso}\n        />\n        {!useResourceSet && (\n          <span className='input-group-btn'>\n            <ActionButton\n              disabled={isEmpty(isoSrs)}\n              handler={this._rescanIsoSrs}\n              icon='refresh'\n              tooltip={_('rescanIsoSrs')}\n            />\n          </span>\n        )}\n        <span className='input-group-btn'>\n          <ActionButton disabled={!mountedIso} handler={this._handleEject} icon='vm-eject' />\n        </span>\n        {mountedIso && !cdDrive.device && (\n          <Tooltip content={_('cdDriveNotInstalled')}>\n            <a className='text-warning btn btn-link' onClick={this._showWarning}>\n              <Icon icon='alarm' size='lg' />\n            </a>\n          </Tooltip>\n        )}\n      </div>\n    )\n  }\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport uncontrollableInput from 'uncontrollable-input'\nimport { filter, map } from 'lodash'\n\nimport _ from '../intl'\nimport Button from '../button'\nimport Component from '../base-component'\nimport { EMPTY_ARRAY } from '../utils'\n\nimport GenericInput from './generic-input'\nimport { descriptionRender, forceDisplayOptionalAttr } from './helpers'\n\n@uncontrollableInput()\nexport default class ObjectInput extends Component {\n  static propTypes = {\n    depth: PropTypes.number,\n    disabled: PropTypes.bool,\n    label: PropTypes.any.isRequired,\n    required: PropTypes.bool,\n    schema: PropTypes.object.isRequired,\n    uiSchema: PropTypes.object,\n  }\n\n  state = {\n    use: this.props.required || forceDisplayOptionalAttr(this.props),\n  }\n\n  _onAddItem = () => {\n    const { props } = this\n    props.onChange((props.value || EMPTY_ARRAY).concat(undefined))\n  }\n\n  _onChangeItem = (value, name) => {\n    const key = Number(name)\n\n    const { props } = this\n    const newValue = (props.value || EMPTY_ARRAY).slice()\n    newValue[key] = value\n    props.onChange(newValue)\n  }\n\n  _onRemoveItem = key => {\n    const { props } = this\n    props.onChange(filter(props.value, (_, i) => i !== key))\n  }\n\n  render() {\n    const {\n      props: { depth = 0, disabled, label, required, schema, uiSchema, value = EMPTY_ARRAY },\n      state: { use },\n    } = this\n\n    const childDepth = depth + 2\n    const itemSchema = schema.items\n    const itemUiSchema = uiSchema && uiSchema.items\n\n    const itemLabel = itemSchema.title || _('item')\n\n    return (\n      <div style={{ paddingLeft: `${depth}em` }}>\n        <legend>{label}</legend>\n        {descriptionRender(schema.description)}\n        <hr />\n        {!required && (\n          <div className='checkbox'>\n            <label>\n              <input checked={use} disabled={disabled} onChange={this.linkState('use')} type='checkbox' />{' '}\n              {_('fillOptionalInformations')}\n            </label>\n          </div>\n        )}\n        {use && (\n          <div className='card-block'>\n            <ul style={{ paddingLeft: 0 }}>\n              {map(value, (value, key) => (\n                <li className='list-group-item clearfix' key={key}>\n                  <GenericInput\n                    depth={childDepth}\n                    disabled={disabled}\n                    label={itemLabel}\n                    name={key}\n                    onChange={this._onChangeItem}\n                    required\n                    schema={itemSchema}\n                    uiSchema={itemUiSchema}\n                    value={value}\n                  />\n                  <Button\n                    btnStyle='danger'\n                    className='pull-right'\n                    disabled={disabled}\n                    name={key}\n                    onClick={() => this._onRemoveItem(key)}\n                  >\n                    {_('remove')}\n                  </Button>\n                </li>\n              ))}\n            </ul>\n            <Button btnStyle='primary' className='pull-right mt-1 mr-1' disabled={disabled} onClick={this._onAddItem}>\n              {_('add')}\n            </Button>\n          </div>\n        )}\n      </div>\n    )\n  }\n}\n","import React from 'react'\n\nimport uncontrollableInput from 'uncontrollable-input'\nimport Component from '../base-component'\nimport { Toggle } from '../form'\n\nimport { PrimitiveInputWrapper } from './helpers'\n\n// ===================================================================\n\n@uncontrollableInput()\nexport default class BooleanInput extends Component {\n  render() {\n    const { disabled, onChange, value, ...props } = this.props\n\n    return (\n      <PrimitiveInputWrapper {...props}>\n        <div className='checkbox form-control'>\n          <Toggle disabled={disabled} onChange={onChange} value={value || false} />\n        </div>\n      </PrimitiveInputWrapper>\n    )\n  }\n}\n","import _ from 'intl'\nimport uncontrollableInput from 'uncontrollable-input'\nimport Component from 'base-component'\nimport React from 'react'\nimport { createSelector } from 'reselect'\nimport { findIndex, map } from 'lodash'\n\nimport { PrimitiveInputWrapper } from './helpers'\n\n// ===================================================================\n\n@uncontrollableInput()\nexport default class EnumInput extends Component {\n  _getSelectedIndex = createSelector(\n    () => this.props.schema.enum,\n    () => {\n      const { schema, value = schema.default } = this.props\n      return value\n    },\n    (enumValues, value) => {\n      const index = findIndex(enumValues, current => current === value)\n      return index === -1 ? '' : index\n    }\n  )\n\n  _onChange = event => {\n    this.props.onChange(this.props.schema.enum[event.target.value])\n  }\n\n  render() {\n    const {\n      disabled,\n      schema: { enum: enumValues, enumNames = enumValues },\n      required,\n    } = this.props\n\n    return (\n      <PrimitiveInputWrapper {...this.props}>\n        <select\n          className='form-control'\n          disabled={disabled}\n          onChange={this._onChange}\n          required={required}\n          value={this._getSelectedIndex()}\n        >\n          {_('noSelectedValue', message => (\n            <option value=''>{message}</option>\n          ))}\n          {map(enumNames, (name, index) => (\n            <option value={index} key={index}>\n              {name}\n            </option>\n          ))}\n        </select>\n      </PrimitiveInputWrapper>\n    )\n  }\n}\n","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\n\nimport getEventValue from '../get-event-value'\nimport uncontrollableInput from 'uncontrollable-input'\nimport { EMPTY_OBJECT } from '../utils'\n\nimport ArrayInput from './array-input'\nimport BooleanInput from './boolean-input'\nimport EnumInput from './enum-input'\nimport IntegerInput from './integer-input'\nimport NumberInput from './number-input'\nimport ObjectInput from './object-input'\nimport StringInput from './string-input'\n\nimport { getType } from './helpers'\n\n// ===================================================================\n\nconst InputByType = {\n  array: ArrayInput,\n  boolean: BooleanInput,\n  integer: IntegerInput,\n  number: NumberInput,\n  object: ObjectInput,\n  string: StringInput,\n}\n\n// ===================================================================\n\n@uncontrollableInput()\nexport default class GenericInput extends Component {\n  static propTypes = {\n    depth: PropTypes.number,\n    disabled: PropTypes.bool,\n    label: PropTypes.any.isRequired,\n    required: PropTypes.bool,\n    schema: PropTypes.object.isRequired,\n    uiSchema: PropTypes.object,\n  }\n\n  _onChange = event => {\n    const { name, onChange } = this.props\n    onChange && onChange(getEventValue(event), name)\n  }\n\n  render() {\n    const { schema, value, uiSchema = EMPTY_OBJECT, ...opts } = this.props\n\n    const props = {\n      ...opts,\n      onChange: this._onChange,\n      schema,\n      uiSchema,\n      value,\n    }\n\n    // Enum, special case.\n    if (schema.enum) {\n      return <EnumInput {...props} />\n    }\n\n    const type = getType(schema)\n    const Input = uiSchema.widget || InputByType[type.toLowerCase()]\n\n    if (!Input) {\n      throw new Error(`Unsupported type: ${type}.`)\n    }\n\n    return <Input {...props} {...uiSchema.config} />\n  }\n}\n","import React from 'react'\nimport includes from 'lodash/includes'\nimport marked from 'marked'\n\nimport { Col, Row } from 'grid'\n\n// ===================================================================\n\nexport const getType = schema => {\n  if (!schema) {\n    return\n  }\n\n  const type = schema.type\n\n  if (Array.isArray(type)) {\n    if (includes(type, 'integer')) {\n      return 'integer'\n    }\n    if (includes(type, 'number')) {\n      return 'number'\n    }\n\n    return 'string'\n  }\n\n  return type\n}\n\nexport const getXoType = schema => {\n  const type = schema && (schema['xo:type'] || schema.$type)\n\n  if (type) {\n    return type.toLowerCase()\n  }\n}\n\n// ===================================================================\n\nexport const descriptionRender = description => (\n  <span className='text-muted' dangerouslySetInnerHTML={{ __html: marked(description || '') }} />\n)\n\n// ===================================================================\n\nexport const PrimitiveInputWrapper = ({ label, required = false, schema, children }) => (\n  <Row>\n    <Col mediumSize={6}>\n      <div className='input-group'>\n        <span className='input-group-addon'>\n          {label}\n          {required && <span className='text-warning'>*</span>}\n        </span>\n        {children}\n      </div>\n    </Col>\n    <Col mediumSize={6}>{descriptionRender(schema.description)}</Col>\n  </Row>\n)\n\n// ===================================================================\n\nexport const forceDisplayOptionalAttr = ({ schema, value }) => {\n  if (!schema || !value) {\n    return false\n  }\n\n  // Array\n  if (schema.items && Array.isArray(value)) {\n    return true\n  }\n\n  // Object\n  for (const key in schema.properties) {\n    if (value[key]) {\n      return true\n    }\n  }\n\n  return false\n}\n","export default from './generic-input'\n","import React from 'react'\n\nimport uncontrollableInput from 'uncontrollable-input'\nimport Combobox from '../combobox'\nimport Component from '../base-component'\nimport getEventValue from '../get-event-value'\n\nimport { PrimitiveInputWrapper } from './helpers'\n\n// ===================================================================\n\n@uncontrollableInput()\nexport default class IntegerInput extends Component {\n  _onChange = event => {\n    const value = getEventValue(event)\n    this.props.onChange(value ? +value : undefined)\n  }\n\n  render() {\n    const { required, schema } = this.props\n    const {\n      disabled,\n      onChange, // eslint-disable-line no-unused-vars\n      placeholder = schema.default,\n      value,\n      ...props\n    } = this.props\n\n    return (\n      <PrimitiveInputWrapper {...props}>\n        <Combobox\n          value={value === undefined ? '' : String(value)}\n          disabled={disabled}\n          max={schema.max}\n          min={schema.min}\n          onChange={this._onChange}\n          options={schema.defaults}\n          placeholder={placeholder}\n          required={required}\n          step={1}\n          type='number'\n        />\n      </PrimitiveInputWrapper>\n    )\n  }\n}\n","import React from 'react'\n\nimport uncontrollableInput from 'uncontrollable-input'\nimport Combobox from '../combobox'\nimport Component from '../base-component'\nimport getEventValue from '../get-event-value'\n\nimport { PrimitiveInputWrapper } from './helpers'\n\n// ===================================================================\n\n@uncontrollableInput()\nexport default class NumberInput extends Component {\n  _onChange = event => {\n    const value = getEventValue(event)\n    this.props.onChange(value ? +value : undefined)\n  }\n\n  render() {\n    const { required, schema } = this.props\n    const {\n      disabled,\n      onChange, // eslint-disable-line no-unused-vars\n      placeholder = schema.default,\n      value,\n      ...props\n    } = this.props\n\n    return (\n      <PrimitiveInputWrapper {...props}>\n        <Combobox\n          value={value === undefined ? '' : String(value)}\n          disabled={disabled}\n          max={schema.max}\n          min={schema.min}\n          onChange={this._onChange}\n          options={schema.defaults}\n          placeholder={placeholder}\n          required={required}\n          step='any'\n          type='number'\n        />\n      </PrimitiveInputWrapper>\n    )\n  }\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport uncontrollableInput from 'uncontrollable-input'\nimport { createSelector } from 'reselect'\nimport { keyBy, map } from 'lodash'\n\nimport _ from '../intl'\nimport Component from '../base-component'\nimport getEventValue from '../get-event-value'\nimport { EMPTY_OBJECT } from '../utils'\n\nimport GenericInput from './generic-input'\nimport { descriptionRender, forceDisplayOptionalAttr } from './helpers'\n\n@uncontrollableInput()\nexport default class ObjectInput extends Component {\n  static propTypes = {\n    depth: PropTypes.number,\n    disabled: PropTypes.bool,\n    label: PropTypes.any.isRequired,\n    required: PropTypes.bool,\n    schema: PropTypes.object.isRequired,\n    uiSchema: PropTypes.object,\n  }\n\n  state = {\n    use: this.props.required || forceDisplayOptionalAttr(this.props),\n  }\n\n  _onChildChange = (value, key) => {\n    this.props.onChange({\n      ...this.props.value,\n      [key]: value,\n    })\n  }\n\n  _onUseChange = event => {\n    const use = getEventValue(event)\n    if (!use) {\n      this.props.onChange()\n    }\n    this.setState({ use })\n  }\n\n  _getRequiredProps = createSelector(\n    () => this.props.schema.required,\n    required => (required ? keyBy(required) : EMPTY_OBJECT)\n  )\n\n  render() {\n    const {\n      props: { depth = 0, disabled, label, required, schema, uiSchema, value = EMPTY_OBJECT },\n      state: { use },\n    } = this\n\n    const childDepth = depth + 2\n    const properties = (uiSchema != null && uiSchema.properties) || EMPTY_OBJECT\n    const requiredProps = this._getRequiredProps()\n\n    return (\n      <div style={{ paddingLeft: `${depth}em` }}>\n        <legend>{label}</legend>\n        {descriptionRender(schema.description)}\n        <hr />\n        {!required && (\n          <div className='checkbox'>\n            <label>\n              <input checked={use} disabled={disabled} onChange={this._onUseChange} type='checkbox' />{' '}\n              {_('fillOptionalInformations')}\n            </label>\n          </div>\n        )}\n        {use && (\n          <div className='card-block'>\n            {map(schema.properties, (childSchema, key) => (\n              <div className='pb-1' key={key}>\n                <GenericInput\n                  depth={childDepth}\n                  disabled={disabled}\n                  label={childSchema.title || key}\n                  name={key}\n                  onChange={this._onChildChange}\n                  required={Boolean(requiredProps[key])}\n                  schema={childSchema}\n                  uiSchema={properties[key]}\n                  value={value[key]}\n                />\n              </div>\n            ))}\n          </div>\n        )}\n      </div>\n    )\n  }\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport uncontrollableInput from 'uncontrollable-input'\n\nimport Combobox from '../combobox'\nimport Component from '../base-component'\nimport getEventValue from '../get-event-value'\n\nimport { PrimitiveInputWrapper } from './helpers'\n\n// ===================================================================\n\n@uncontrollableInput()\nexport default class StringInput extends Component {\n  static propTypes = {\n    password: PropTypes.bool,\n  }\n\n  // the value of this input  is undefined not '' when empty to make\n  // it homogenous with when the user has never touched this input\n  _onChange = event => {\n    const value = getEventValue(event)\n    this.props.onChange(value !== '' ? value : undefined)\n  }\n\n  render() {\n    const { required, schema } = this.props\n    const { disabled, password, placeholder = schema.default, value, ...props } = this.props\n    delete props.onChange\n\n    return (\n      <PrimitiveInputWrapper {...props}>\n        <Combobox\n          value={value !== undefined ? value : ''}\n          disabled={disabled}\n          multiline={schema.$multiline}\n          onChange={this._onChange}\n          options={schema.defaults}\n          placeholder={placeholder || schema.default}\n          required={required}\n          type={password && 'password'}\n        />\n      </PrimitiveInputWrapper>\n    )\n  }\n}\n","import Link from 'react-router/lib/Link'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { routerShape } from 'react-router/lib/PropTypes'\n\nimport Component from './base-component'\n\n// ===================================================================\n\nexport { Link as default }\n\n// -------------------------------------------------------------------\n\nconst _IGNORED_TAGNAMES = {\n  A: true,\n  BUTTON: true,\n  INPUT: true,\n  SELECT: true,\n}\n\nexport class BlockLink extends Component {\n  static propTypes = {\n    className: PropTypes.string,\n    tagName: PropTypes.string,\n  }\n\n  static contextTypes = {\n    router: routerShape,\n  }\n\n  _style = { cursor: 'pointer' }\n  _onClickCapture = event => {\n    const { currentTarget } = event\n    let element = event.target\n    while (element !== currentTarget) {\n      if (_IGNORED_TAGNAMES[element.tagName]) {\n        return\n      }\n      element = element.parentNode\n    }\n    event.stopPropagation()\n    if (event.ctrlKey || event.button === 1) {\n      window.open(this.context.router.createHref(this.props.to))\n    } else {\n      this.context.router.push(this.props.to)\n    }\n  }\n\n  _addAuxClickListener = ref => {\n    // FIXME: when https://github.com/facebook/react/issues/8529 is fixed,\n    // remove and use onAuxClickCapture.\n    // In Chrome ^55 and Firefox ^53, middle-clicking triggers auxclick event\n    // instead of click\n    // Other browsers may trigger both events.\n    if (ref !== null) {\n      ref.addEventListener('auxclick', this._onClickCapture)\n      ref.addEventListener('mousedown', event => {\n        if (event.button === 1) {\n          event.preventDefault() // Prevent enabling auto-scroll\n        }\n      })\n    }\n  }\n\n  render() {\n    const { children, tagName = 'div', className } = this.props\n    const Component = tagName\n    return (\n      <Component\n        className={className}\n        ref={this._addAuxClickListener}\n        style={this._style}\n        onClickCapture={this._onClickCapture}\n      >\n        {children}\n      </Component>\n    )\n  }\n}\n","// Logs an error properly, correctly use the source map for the stack.\n//\n// This is achieved by throwing the error asynchronously.\nconst logError = (error, ...args) => {\n  setTimeout(() => {\n    if (args.length) {\n      console.error(...args)\n    }\n\n    throw error\n  }, 0)\n}\nexport { logError as default }\n","import PropTypes from 'prop-types'\nimport React, { Component, cloneElement } from 'react'\nimport { createSelector } from 'selectors'\nimport { identity, map } from 'lodash'\nimport { injectIntl } from 'react-intl'\nimport { injectState, provideState } from 'reaclette'\nimport { Modal as ReactModal } from 'react-bootstrap-4/lib'\n\nimport _, { messages } from './intl'\nimport ActionButton from './action-button'\nimport Button from './button'\nimport decorate from './apply-decorators'\nimport getEventValue from './get-event-value'\nimport Icon from './icon'\nimport Tooltip from './tooltip'\nimport { generateId } from './reaclette-utils'\nimport { disable as disableShortcuts, enable as enableShortcuts } from './shortcuts'\n\n// -----------------------------------------------------------------------------\n\nlet instance\nconst modal = (content, onClose, props) => {\n  if (!instance) {\n    throw new Error('No modal instance.')\n  } else if (instance.state.showModal) {\n    throw new Error('Other modal still open.')\n  }\n  instance.setState({ content, onClose, showModal: true, props }, disableShortcuts)\n}\n\nconst _addRef = (component, ref) => {\n  if (typeof component === 'string' || Array.isArray(component)) {\n    return component\n  }\n\n  try {\n    return cloneElement(component, { ref })\n  } catch (_) {} // Stateless component.\n  return component\n}\n\n// -----------------------------------------------------------------------------\n\nclass GenericModal extends Component {\n  static propTypes = {\n    buttons: PropTypes.arrayOf(\n      PropTypes.shape({\n        btnStyle: PropTypes.string,\n        icon: PropTypes.string,\n        label: PropTypes.node.isRequired,\n        tooltip: PropTypes.node,\n        value: PropTypes.any,\n      })\n    ).isRequired,\n    children: PropTypes.node.isRequired,\n    icon: PropTypes.string,\n    title: PropTypes.node.isRequired,\n  }\n\n  _getBodyValue = () => {\n    const { body } = this.refs\n    if (body !== undefined) {\n      return body.getWrappedInstance === undefined ? body.value : body.getWrappedInstance().value\n    }\n  }\n\n  _resolve = (value = this._getBodyValue()) => {\n    this.props.resolve(value)\n    instance.close()\n  }\n\n  _reject = () => {\n    this.props.reject()\n    instance.close()\n  }\n\n  render() {\n    const { buttons, icon, title } = this.props\n\n    const body = _addRef(this.props.children, 'body')\n\n    return (\n      <div>\n        <ReactModal.Header closeButton>\n          <ReactModal.Title>\n            {icon ? (\n              <span>\n                <Icon icon={icon} /> {title}\n              </span>\n            ) : (\n              title\n            )}\n          </ReactModal.Title>\n        </ReactModal.Header>\n        <ReactModal.Body>{body}</ReactModal.Body>\n        <ReactModal.Footer>\n          {map(buttons, ({ label, tooltip, value, icon, ...props }, key) => {\n            const button = (\n              <Button onClick={() => this._resolve(value)} {...props}>\n                {icon !== undefined && <Icon icon={icon} fixedWidth />}\n                {label}\n              </Button>\n            )\n            return (\n              <span key={key}>{tooltip !== undefined ? <Tooltip content={tooltip}>{button}</Tooltip> : button} </span>\n            )\n          })}\n          {this.props.reject !== undefined && <Button onClick={this._reject}>{_('genericCancel')}</Button>}\n        </ReactModal.Footer>\n      </div>\n    )\n  }\n}\n\nexport const chooseAction = ({ body, buttons, icon, title }) => {\n  return new Promise((resolve, reject) => {\n    modal(\n      <GenericModal buttons={buttons} icon={icon} reject={reject} resolve={resolve} title={title}>\n        {body}\n      </GenericModal>,\n      reject\n    )\n  })\n}\n\n@injectIntl\nclass StrongConfirm extends Component {\n  static propTypes = {\n    body: PropTypes.node,\n    strongConfirm: PropTypes.object.isRequired,\n    icon: PropTypes.string,\n    reject: PropTypes.func,\n    resolve: PropTypes.func,\n    title: PropTypes.node.isRequired,\n  }\n\n  state = {\n    buttons: [{ btnStyle: 'danger', label: _('confirmOk'), disabled: true }],\n  }\n\n  _getStrongConfirmString = createSelector(\n    () => this.props.intl.formatMessage,\n    () => this.props.strongConfirm,\n    (format, { messageId, values }) => format(messages[messageId], values)\n  )\n\n  _onInputChange = event => {\n    const userInput = event.target.value\n    const strongConfirmString = this._getStrongConfirmString()\n    const confirmButton = this.state.buttons[0]\n\n    let disabled\n    if ((userInput.toLowerCase() === strongConfirmString.toLowerCase()) ^ (disabled = !confirmButton.disabled)) {\n      this.setState({\n        buttons: [{ ...confirmButton, disabled }],\n      })\n    }\n  }\n\n  _confirm = () => {\n    this.props.resolve()\n    instance.close()\n  }\n\n  _handleKeyDown = event => {\n    if (event.keyCode === 13 && !this.state.buttons[0].disabled) {\n      this._confirm()\n    }\n  }\n\n  _focusAndAddEventListener = ref => {\n    if (ref !== null) {\n      // When the modal is triggered by a react-bootstrap Dropdown, the Dropdown takes the focus back\n      // https://github.com/vatesfr/react-bootstrap/blob/bootstrap-4/src/Dropdown.js#L63-L85\n      // FIXME: remove the setTimeout workaround when react-bootstrap-4 is removed\n      // See https://github.com/react-bootstrap/react-bootstrap/issues/2553#issuecomment-324356126\n      setTimeout(() => {\n        ref.focus()\n      })\n      ref.addEventListener('keydown', this._handleKeyDown)\n      this.componentWillUnmount = () => ref.removeEventListener('keydown', this._handleKeyDown)\n    }\n  }\n\n  render() {\n    const {\n      body,\n      strongConfirm: { messageId, values },\n      icon,\n      reject,\n      resolve,\n      title,\n    } = this.props\n\n    return (\n      <GenericModal buttons={this.state.buttons} icon={icon} reject={reject} resolve={resolve} title={title}>\n        {body}\n        <hr />\n        <div>\n          {_('enterConfirmText')} <strong className='no-text-selection'>{_(messageId, values)}</strong>\n        </div>\n        <div>\n          <input className='form-control' ref={this._focusAndAddEventListener} onChange={this._onInputChange} />\n        </div>\n      </GenericModal>\n    )\n  }\n}\n\n// -----------------------------------------------------------------------------\n\nconst ALERT_BUTTONS = [{ label: _('alertOk'), value: 'ok' }]\n\nexport const alert = (title, body) =>\n  new Promise(resolve => {\n    modal(\n      <GenericModal buttons={ALERT_BUTTONS} resolve={resolve} title={title}>\n        {body}\n      </GenericModal>,\n      resolve\n    )\n  })\n\n// -----------------------------------------------------------------------------\n\nconst CONFIRM_BUTTONS = [{ btnStyle: 'primary', label: _('confirmOk') }]\n\nexport const confirm = ({ body, icon = 'alarm', title, strongConfirm }) =>\n  strongConfirm\n    ? new Promise((resolve, reject) => {\n        modal(\n          <StrongConfirm\n            body={body}\n            icon={icon}\n            reject={reject}\n            resolve={resolve}\n            strongConfirm={strongConfirm}\n            title={title}\n          />,\n          reject\n        )\n      })\n    : chooseAction({\n        body,\n        buttons: CONFIRM_BUTTONS,\n        icon,\n        title,\n      })\n\n// -----------------------------------------------------------------------------\n\nlet formModalState\nexport const form = ({ component, defaultValue, handler = identity, header, render, size }) =>\n  new Promise((resolve, reject) => {\n    formModalState.component = component\n    formModalState.handler = handler\n    formModalState.header = header\n    formModalState.reject = reject\n    formModalState.render = render\n    formModalState.resolve = resolve\n    formModalState.size = size\n    formModalState.value = defaultValue\n    disableShortcuts()\n\n    // the modal should be opened after its props have been set to avoid race conditions\n    formModalState.opened = true\n  })\n\nconst getInitialState = () => ({\n  component: undefined,\n  handler: undefined,\n  header: undefined,\n  isHandlerRunning: false,\n  opened: false,\n  reject: undefined,\n  render: undefined,\n  resolve: undefined,\n  size: undefined,\n  value: undefined,\n})\nexport const FormModal = decorate([\n  provideState({\n    initialState: getInitialState,\n    effects: {\n      initialize() {\n        if (formModalState !== undefined) {\n          throw new Error('FormModal is a singleton!')\n        }\n        formModalState = this.state\n      },\n      finalize: () => {\n        formModalState = undefined\n      },\n      onChange: (_, value) => () => ({\n        value: getEventValue(value),\n      }),\n      onCancel() {\n        const { state } = this\n        if (!state.isHandlerRunning) {\n          state.opened = false\n          state.reject()\n        }\n      },\n      async onSubmit({ close }) {\n        const { state } = this\n        state.isHandlerRunning = true\n\n        let result\n        try {\n          result = await state.handler(state.value)\n        } finally {\n          state.isHandlerRunning = false\n        }\n        state.opened = false\n        state.resolve(result)\n      },\n      reset: () => () => {\n        enableShortcuts()\n        return getInitialState()\n      },\n    },\n    computed: {\n      formId: generateId,\n    },\n  }),\n  injectState,\n  ({ state, effects }) => {\n    const Component = state.component\n\n    return (\n      <ReactModal\n        backdrop='static'\n        bsSize={state.size}\n        keyboard={false}\n        onExited={effects.reset}\n        onHide={effects.onCancel}\n        show={state.opened}\n      >\n        <ReactModal.Header closeButton>\n          <ReactModal.Title>{state.header}</ReactModal.Title>\n        </ReactModal.Header>\n\n        <ReactModal.Body>\n          <form id={state.formId}>\n            {/* It should be better to use a computed to avoid calling the render function on each render,\n            but reaclette(v0.4.0) not allow us to access to the effects from a computed */}\n            {Component !== undefined ? (\n              <Component onChange={effects.onChange} value={state.value} />\n            ) : (\n              state.render !== undefined &&\n              state.render({\n                onChange: effects.onChange,\n                value: state.value,\n              })\n            )}\n          </form>\n        </ReactModal.Body>\n\n        <ReactModal.Footer>\n          <ActionButton btnStyle='primary' form={state.formId} handler={effects.onSubmit} icon='save' size='large'>\n            {_('formOk')}\n          </ActionButton>{' '}\n          <ActionButton handler={effects.onCancel} icon='cancel' size='large'>\n            {_('formCancel')}\n          </ActionButton>\n        </ReactModal.Footer>\n      </ReactModal>\n    )\n  },\n])\n\n// -----------------------------------------------------------------------------\n\nexport default class Modal extends Component {\n  constructor() {\n    super()\n\n    this.state = { showModal: false }\n  }\n\n  static close() {\n    if (instance.state.showModal) {\n      instance.setState({ showModal: false })\n    }\n  }\n\n  componentDidMount() {\n    if (instance) {\n      throw new Error('Modal is a singleton!')\n    }\n    instance = this\n  }\n\n  componentWillUnmount() {\n    instance = undefined\n  }\n\n  close() {\n    this.setState({ showModal: false }, enableShortcuts)\n  }\n\n  _onHide = () => {\n    this.close()\n\n    const { onClose } = this.state\n    onClose && onClose()\n  }\n\n  render() {\n    const { content, showModal, props } = this.state\n    return (\n      <ReactModal show={showModal} onHide={this._onHide} {...props}>\n        {content}\n      </ReactModal>\n    )\n  }\n}\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport Link from './link'\n\nexport const NavLink = ({ children, exact, to }) => (\n  <li className='nav-item' role='tab'>\n    <Link activeClassName='active' className='nav-link' onlyActiveOnIndex={exact} to={to}>\n      {children}\n    </Link>\n  </li>\n)\n\nexport const NavTabs = ({ children, className }) => (\n  <ul className={classNames(className, 'nav nav-tabs')} role='tablist'>\n    {children}\n  </ul>\n)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport isEmpty from 'lodash/isEmpty.js'\n\n// This component returns :\n//  - A loading icon when the objects are not fetched\n//  - A default message if the objects are fetched and the collection is empty\n//  - The children if the objects are fetched and the collection is not empty\n//\n// ```js\n//  <NoObjects collection={collection} emptyMessage={message}>\n//    {children}\n// </NoObjects>\n// ````\nconst NoObjects = props => {\n  const { collection } = props\n\n  if (collection == null) {\n    return <img src='assets/loading.svg' alt='loading' />\n  }\n\n  if (isEmpty(collection)) {\n    return <p>{props.emptyMessage}</p>\n  }\n\n  const { children, component: Component, componentRef, ...otherProps } = props\n  return children !== undefined ? children(otherProps) : <Component ref={componentRef} {...otherProps} />\n}\n\nNoObjects.propTypes = {\n  children: PropTypes.func,\n  collection: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  component: PropTypes.func,\n  componentRef: PropTypes.func,\n  emptyMessage: PropTypes.node.isRequired,\n}\nexport { NoObjects as default }\n","import _ from 'intl'\nimport ButtonLink from 'button-link'\nimport Icon from 'icon'\nimport React, { Component } from 'react'\nimport ReactNotify from 'react-notify'\nimport { connectStore } from 'utils'\nimport { isAdmin } from 'selectors'\n\nlet instance\n\nexport let error\nexport let info\nexport let success\n\n@connectStore({\n  isAdmin,\n})\nexport class Notification extends Component {\n  componentDidMount() {\n    if (instance) {\n      throw new Error('Notification is a singleton!')\n    }\n    instance = this\n  }\n\n  componentWillUnmount() {\n    instance = undefined\n  }\n\n  // This special component never have to rerender!\n  shouldComponentUpdate() {\n    return false\n  }\n\n  render() {\n    return (\n      <ReactNotify\n        ref={notification => {\n          if (!notification) {\n            return\n          }\n\n          error = (title, body, autoCloseTimeout = 6e3) =>\n            notification.error(\n              title,\n              this.props.isAdmin ? (\n                <div>\n                  <div>{body}</div>\n                  <ButtonLink btnStyle='danger' className='mt-1' size='small' to='/settings/logs'>\n                    <Icon icon='logs' /> {_('showLogs')}\n                  </ButtonLink>\n                </div>\n              ) : (\n                body\n              ),\n              autoCloseTimeout\n            )\n          info = (title, body, autoCloseTimeout = 3e3) => notification.info(title, body, autoCloseTimeout)\n          success = (title, body, autoCloseTimeout = 3e3) => notification.success(title, body, autoCloseTimeout)\n        }}\n      />\n    )\n  }\n}\n\nexport { info as default }\n\n/* Example:\n\nimport info, { success, error } from 'notification'\n\n<button onClick={() => info('Info', 'This is an info notification')}>\n  Info notification\n</button>\n\n<button onClick={() => success('Success', 'This is a success notification')}>\n  Success notification\n</button>\n\n<button onClick={() => error('Error', 'This is an error notification')}>\n  Error notification\n</button>\n*/\n","import authenticator from 'otplib/authenticator'\nimport crypto from 'crypto'\n\nauthenticator.options = { crypto }\n\nexport { authenticator as default }\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst PageItem = ({ active, children, disabled, onClick, value }) =>\n  active ? (\n    <li className='active page-item'>\n      <span className='page-link'>{children}</span>\n    </li>\n  ) : disabled ? (\n    <li className='disabled page-item'>\n      <span className='page-link'>{children}</span>\n    </li>\n  ) : (\n    <li className='page-item'>\n      <a className='page-link' href='#' onClick={onClick} data-value={value}>\n        {children}\n      </a>\n    </li>\n  )\n\nexport default class Pagination extends React.PureComponent {\n  static defaultProps = {\n    ellipsis: true,\n    maxButtons: 7,\n    next: true,\n    prev: true,\n  }\n\n  static propTypes = {\n    ariaLabel: PropTypes.string,\n    ellipsis: PropTypes.bool,\n    maxButtons: PropTypes.number,\n    next: PropTypes.bool,\n    onChange: PropTypes.func.isRequired,\n    pages: PropTypes.number.isRequired,\n    prev: PropTypes.bool,\n    value: PropTypes.number.isRequired,\n  }\n\n  _onClick(event) {\n    event.preventDefault()\n    this.props.onChange(+event.currentTarget.dataset.value)\n  }\n  _onClick = this._onClick.bind(this)\n\n  render() {\n    const { ariaLabel, ellipsis, maxButtons, next, pages, prev, value } = this.props\n    const onClick = this._onClick\n\n    let min, max\n    if (pages <= maxButtons) {\n      min = 1\n      max = pages\n    } else {\n      min = Math.max(1, Math.min(value - Math.floor(maxButtons / 2), pages - maxButtons + 1))\n      max = min + maxButtons - 1\n    }\n\n    const pageButtons = []\n    if (ellipsis && min !== 1) {\n      pageButtons.push(\n        <PageItem disabled key='firstEllipsis'>\n          …\n        </PageItem>\n      )\n    }\n    for (let page = min; page <= max; ++page) {\n      pageButtons.push(\n        <PageItem active={page === value} key={page} onClick={onClick} value={page}>\n          {page}\n        </PageItem>\n      )\n    }\n    if (ellipsis && max !== pages) {\n      pageButtons.push(\n        <PageItem disabled key='lastEllipsis'>\n          …\n        </PageItem>\n      )\n    }\n    return (\n      <nav aria-label={ariaLabel}>\n        <ul className='pagination'>\n          {prev && (\n            <PageItem aria-label='Previous' disabled={value === 1} onClick={onClick} value={value - 1}>\n              ‹\n            </PageItem>\n          )}\n          {pageButtons}\n          {next && (\n            <PageItem aria-label='Next' disabled={value === pages} onClick={onClick} value={value + 1}>\n              ›\n            </PageItem>\n          )}\n        </ul>\n      </nav>\n    )\n  }\n}\n","// this computed can be used to generate a random id for the lifetime of the\n// component\nexport const generateId = () => `i${Math.random().toString(36).slice(2)}`\n\n// TODO: remove these functions once the PR: https://github.com/JsCommunity/reaclette/pull/5 has been merged\n// It only supports native inputs\nexport const linkState =\n  (_, { target }) =>\n  () => ({\n    [target.name]:\n      target.nodeName.toLowerCase() === 'input' && target.type.toLowerCase() === 'checkbox'\n        ? target.checked\n        : target.value,\n  })\n\nexport const toggleState =\n  (_, { currentTarget: { name } }) =>\n  state => ({\n    [name]: !state[name],\n  })\n","import PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport RFB from '@nraynaud/novnc/lib/rfb'\nimport URL from 'url-parse'\nimport { createBackoff } from 'jsonrpc-websocket-client'\nimport { enable as enableShortcuts, disable as disableShortcuts } from 'shortcuts'\n\nconst PROTOCOL_ALIASES = {\n  'http:': 'ws:',\n  'https:': 'wss:',\n}\nconst fixProtocol = url => {\n  const protocol = PROTOCOL_ALIASES[url.protocol]\n  if (protocol) {\n    url.protocol = protocol\n  }\n}\n\nexport default class NoVnc extends Component {\n  static propTypes = {\n    onClipboardChange: PropTypes.func,\n    url: PropTypes.string.isRequired,\n  }\n\n  constructor(props) {\n    super(props)\n    this._rfb = null\n    this._retryGen = createBackoff(Infinity)\n\n    this._onUpdateState = (rfb, state) => {\n      if (state === 'normal') {\n        if (this._retryTimeout) {\n          clearTimeout(this._retryTimeout)\n          this._retryTimeout = undefined\n          this._retryGen = createBackoff(Infinity)\n        }\n      }\n\n      if (state !== 'disconnected' || this.refs.canvas == null) {\n        return\n      }\n\n      clearTimeout(this._retryTimeout)\n      this._retryTimeout = setTimeout(this._connect, this._retryGen.next().value)\n    }\n  }\n\n  sendCtrlAltDel() {\n    const rfb = this._rfb\n    if (rfb) {\n      rfb.sendCtrlAltDel()\n    }\n  }\n\n  setClipboard(text) {\n    const rfb = this._rfb\n    if (rfb) {\n      rfb.clipboardPasteFrom(text)\n    }\n  }\n\n  _clean() {\n    const rfb = this._rfb\n    if (rfb) {\n      this._rfb = null\n      rfb.disconnect()\n    }\n    enableShortcuts()\n  }\n\n  _connect = () => {\n    this._clean()\n\n    const { canvas } = this.refs\n    if (!canvas) {\n      return\n    }\n\n    const url = new URL(this.props.url)\n    fixProtocol(url)\n\n    const isSecure = url.protocol === 'wss:'\n\n    const { onClipboardChange } = this.props\n    const rfb = (this._rfb = new RFB({\n      encrypt: isSecure,\n      target: this.refs.canvas,\n      onClipboard:\n        onClipboardChange &&\n        ((_, text) => {\n          onClipboardChange(text)\n        }),\n      onUpdateState: this._onUpdateState,\n    }))\n\n    // remove leading slashes from the path\n    //\n    // a leading slash will be added by noVNC\n    const clippedPath = url.pathname.replace(/^\\/+/, '')\n\n    // a port is required\n    //\n    // if not available from the URL, use the default ones\n    const port = url.port || (isSecure ? 443 : 80)\n\n    rfb.connect(url.hostname, port, null, clippedPath)\n    disableShortcuts()\n  }\n\n  componentDidMount() {\n    this._connect()\n  }\n\n  componentWillUnmount() {\n    this._clean()\n  }\n\n  componentWillReceiveProps(props) {\n    const rfb = this._rfb\n    if (rfb && this.props.scale !== props.scale) {\n      rfb.get_display().set_scale(props.scale || 1)\n      rfb.get_mouse().set_scale(props.scale || 1)\n    }\n  }\n\n  _focus = () => {\n    const rfb = this._rfb\n    if (rfb) {\n      const { activeElement } = document\n      if (activeElement) {\n        activeElement.blur()\n      }\n\n      rfb.get_keyboard().grab()\n      rfb.get_mouse().grab()\n\n      disableShortcuts()\n    }\n  }\n\n  _unfocus = () => {\n    const rfb = this._rfb\n    if (rfb) {\n      rfb.get_keyboard().ungrab()\n      rfb.get_mouse().ungrab()\n\n      enableShortcuts()\n    }\n  }\n\n  render() {\n    return (\n      <canvas\n        className='center-block'\n        height='480'\n        onMouseEnter={this._focus}\n        onMouseLeave={this._unfocus}\n        ref='canvas'\n        width='640'\n      />\n    )\n  }\n}\n","import * as CM from 'complex-matcher'\nimport _ from 'intl'\nimport CopyToClipboard from 'react-copy-to-clipboard'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { get } from '@xen-orchestra/defined'\nimport { injectState, provideState } from 'reaclette'\nimport find from 'lodash/find.js'\nimport isEmpty from 'lodash/isEmpty.js'\n\nimport decorate from './apply-decorators'\nimport Icon from './icon'\nimport Link from './link'\nimport Tooltip from './tooltip'\nimport { addSubscriptions, connectStore, formatSize, NumericDate, ShortDate } from './utils'\nimport { createGetObject, createSelector } from './selectors'\nimport {\n  isSrWritable,\n  subscribeBackupNgJobs,\n  subscribeMetadataBackupJobs,\n  subscribeProxies,\n  subscribeRemotes,\n  subscribeSchedules,\n  subscribeUsers,\n  subscribeMirrorBackupJobs,\n} from './xo'\n\n// ===================================================================\n\nconst unknowItem = (uuid, type, placeholder) => (\n  <Tooltip content={_('copyUuid', { uuid })}>\n    <CopyToClipboard text={uuid}>\n      <span className='text-muted' style={{ cursor: 'pointer' }}>\n        {placeholder === undefined ? _('errorUnknownItem', { type }) : placeholder}\n      </span>\n    </CopyToClipboard>\n  </Tooltip>\n)\n\nconst LinkWrapper = ({ children, link, to, newTab }) =>\n  link ? (\n    <Link to={to} target={newTab && '_blank'}>\n      {children}\n    </Link>\n  ) : (\n    <span>{children}</span>\n  )\n\nLinkWrapper.propTypes = {\n  link: PropTypes.bool,\n  newTab: PropTypes.bool,\n  to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n}\n\n// ===================================================================\n\nexport const Pool = decorate([\n  connectStore(() => ({\n    pool: createGetObject(),\n  })),\n  ({ id, pool, link, newTab }) => {\n    if (pool === undefined) {\n      return unknowItem(id, 'pool')\n    }\n\n    return (\n      <LinkWrapper link={link} newTab={newTab} to={`/pools/${pool.id}`}>\n        <Icon icon='pool' /> {pool.name_label}\n      </LinkWrapper>\n    )\n  },\n])\n\nPool.propTypes = {\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  newTab: PropTypes.bool,\n}\n\nPool.defaultProps = {\n  link: false,\n  newTab: false,\n}\n\n// ===================================================================\n\nexport const Host = decorate([\n  connectStore(() => {\n    const getHost = createGetObject()\n    return {\n      host: getHost,\n      pool: createGetObject(\n        createSelector(\n          getHost,\n          (_, props) => props.pool,\n          (host, showPool) => showPool && get(() => host.$pool)\n        )\n      ),\n    }\n  }),\n  ({ id, host, pool, link, newTab, memoryFree }) => {\n    if (host === undefined) {\n      return unknowItem(id, 'host')\n    }\n\n    return (\n      <LinkWrapper link={link} newTab={newTab} to={`/hosts/${host.id}`}>\n        <Icon icon='host' /> {host.name_label}\n        {memoryFree && (\n          <span>\n            {' ('}\n            {_('memoryFree', {\n              memoryFree: formatSize(host.memory.size - host.memory.usage),\n            })}\n            )\n          </span>\n        )}\n        {pool !== undefined && <span>{` - ${pool.name_label}`}</span>}\n      </LinkWrapper>\n    )\n  },\n])\n\nHost.propTypes = {\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  memoryFree: PropTypes.bool,\n  newTab: PropTypes.bool,\n  pool: PropTypes.bool,\n}\n\nHost.defaultProps = {\n  link: false,\n  memoryFree: false,\n  newTab: false,\n  pool: true,\n}\n\n// ===================================================================\n\nexport const Vm = decorate([\n  connectStore(() => {\n    const getVm = createGetObject()\n    return {\n      vm: getVm,\n      container: createGetObject(createSelector(getVm, vm => get(() => vm.$container))),\n    }\n  }),\n  ({ id, vm, container, link, newTab, name }) => {\n    if (vm === undefined) {\n      return unknowItem(id, 'VM', name)\n    }\n\n    return (\n      <LinkWrapper link={link} newTab={newTab} to={`/vms/${vm.id}`}>\n        <Icon icon={isEmpty(vm.current_operations) ? `vm-${vm.power_state.toLowerCase()}` : 'vm-busy'} />{' '}\n        {vm.name_label}\n        {container !== undefined && ` (${container.name_label})`}\n      </LinkWrapper>\n    )\n  },\n])\n\nVm.propTypes = {\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  name: PropTypes.string,\n  newTab: PropTypes.bool,\n}\n\nVm.defaultProps = {\n  link: false,\n  newTab: false,\n}\n\n// ===================================================================\n\nexport const VmTemplate = decorate([\n  connectStore(() => {\n    const getObject = createGetObject()\n    const getPool = createGetObject(createSelector(getObject, vm => get(() => vm.$pool)))\n    return (state, props) => ({\n      // FIXME: props.self ugly workaround to get object as a self user\n      template: getObject(state, props, props.self),\n      pool: getPool(state, props),\n    })\n  }),\n  ({ id, template, pool }) => {\n    if (template === undefined) {\n      return unknowItem(id, 'template')\n    }\n\n    return (\n      <span>\n        <Icon icon='vm' /> {template.name_label}\n        {pool !== undefined && <span className='text-muted'>{` - ${pool.name_label}`}</span>}\n      </span>\n    )\n  },\n])\n\nVmTemplate.propTypes = {\n  id: PropTypes.string.isRequired,\n  self: PropTypes.bool,\n}\n\nVmTemplate.defaultProps = {\n  link: false,\n  newTab: false,\n  self: false,\n}\n\n// ===================================================================\n\nexport const Sr = decorate([\n  connectStore(() => {\n    const getSr = createGetObject()\n    const getContainer = createGetObject(\n      createSelector(\n        getSr,\n        (_, props) => props.container,\n        (sr, showContainer) => showContainer && get(() => sr.$container)\n      )\n    )\n    return (state, props) => ({\n      // FIXME: props.self ugly workaround to get object as a self user\n      sr: getSr(state, props, props.self),\n      container: getContainer(state, props),\n    })\n  }),\n  ({ id, sr, container, link, newTab, spaceLeft, self, name }) => {\n    if (sr === undefined) {\n      return unknowItem(id, 'SR', name)\n    }\n\n    return (\n      <LinkWrapper link={link} newTab={newTab} to={`/srs/${sr.id}`}>\n        <Icon icon='sr' /> {sr.name_label}\n        {!self && spaceLeft && isSrWritable(sr) && (\n          <span className={!link && 'text-muted'}>\n            {` (${formatSize(sr.size - sr.physical_usage)} free`}\n            {sr.allocationStrategy !== undefined && ` - ${sr.allocationStrategy}`})\n          </span>\n        )}\n        {!self && container !== undefined && <span className={!link && 'text-muted'}> - {container.name_label}</span>}\n      </LinkWrapper>\n    )\n  },\n])\n\nSr.propTypes = {\n  container: PropTypes.bool,\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  name: PropTypes.string,\n  newTab: PropTypes.bool,\n  self: PropTypes.bool,\n  spaceLeft: PropTypes.bool,\n}\n\nSr.defaultProps = {\n  container: true,\n  link: false,\n  newTab: false,\n  self: false,\n  spaceLeft: true,\n}\n\n// ===================================================================\n\nexport const Vdi = decorate([\n  connectStore(() => {\n    const getObject = createGetObject()\n    const getSr = createGetObject((state, props) => {\n      const vdi = getObject(state, props, props.self)\n      return vdi && vdi.$SR\n    })\n    // FIXME: props.self ugly workaround to get object as a self user\n    return (state, props) => ({\n      vdi: getObject(state, props, props.self),\n      sr: getSr(state, props),\n    })\n  }),\n  ({ id, showSize, showSr, sr, vdi }) => {\n    if (vdi === undefined) {\n      return unknowItem(id, 'VDI')\n    }\n\n    return (\n      <span>\n        <Icon icon='disk' /> {vdi.name_label}\n        {sr !== undefined && showSr && <span className='text-muted'> - {sr.name_label}</span>}\n        {showSize && <span className='text-muted'> ({formatSize(vdi.size)})</span>}\n      </span>\n    )\n  },\n])\n\nVdi.propTypes = {\n  id: PropTypes.string.isRequired,\n  self: PropTypes.bool,\n  showSize: PropTypes.bool,\n}\n\nVdi.defaultProps = {\n  self: false,\n  showSize: false,\n  showSr: false,\n}\n\n// ===================================================================\n\nexport const Pif = decorate([\n  connectStore(() => {\n    const getObject = createGetObject()\n    const getNetwork = createGetObject(createSelector(getObject, pif => get(() => pif.$network)))\n\n    // FIXME: props.self ugly workaround to get object as a self user\n    return (state, props) => ({\n      pif: getObject(state, props, props.self),\n      network: getNetwork(state, props),\n    })\n  }),\n  ({ id, showNetwork, pif, network }) => {\n    if (pif === undefined) {\n      return unknowItem(id, 'PIF')\n    }\n\n    const { carrier, device, deviceName, vlan } = pif\n    const showExtraInfo = deviceName || vlan !== -1 || (showNetwork && network !== undefined)\n\n    return (\n      <span>\n        <Icon icon='network' color={carrier ? 'text-success' : 'text-danger'} /> {device}\n        {showExtraInfo && (\n          <span>\n            {' '}\n            ({deviceName}\n            {vlan !== -1 && (\n              <span>\n                {' '}\n                -{' '}\n                {_('keyValue', {\n                  key: _('pifVlanLabel'),\n                  value: vlan,\n                })}\n              </span>\n            )}\n            {showNetwork && network !== undefined && <span> - {network.name_label}</span>})\n          </span>\n        )}\n      </span>\n    )\n  },\n])\n\nPif.propTypes = {\n  id: PropTypes.string.isRequired,\n  self: PropTypes.bool,\n  showNetwork: PropTypes.bool,\n}\n\nPif.defaultProps = {\n  self: false,\n  showNetwork: false,\n}\n\n// ===================================================================\n\nexport const Network = decorate([\n  connectStore(() => {\n    const getObject = createGetObject()\n    const getPool = createGetObject(createSelector(getObject, network => get(() => network.$pool)))\n\n    // FIXME: props.self ugly workaround to get object as a self user\n    return (state, props) => ({\n      network: getObject(state, props, props.self),\n      pool: getPool(state, props),\n    })\n  }),\n  ({ id, network, pool }) => {\n    if (network === undefined) {\n      return unknowItem(id, 'network')\n    }\n\n    return (\n      <span>\n        <Icon icon='network' /> {network.name_label}\n        {pool !== undefined && <span className='text-muted'>{` - ${pool.name_label}`}</span>}\n      </span>\n    )\n  },\n])\n\nNetwork.propTypes = {\n  id: PropTypes.string.isRequired,\n  self: PropTypes.bool,\n}\n\nNetwork.defaultProps = {\n  self: false,\n}\n\n// ===================================================================\n\nexport const Remote = decorate([\n  addSubscriptions(({ id }) => ({\n    remote: cb => subscribeRemotes(remotes => cb(find(remotes, { id }))),\n  })),\n  ({ id, remote, link, newTab }) => {\n    if (remote === undefined) {\n      return unknowItem(id, 'remote') // TODO: handle remotes not fetched yet\n    }\n\n    return (\n      <LinkWrapper link={link} newTab={newTab} to='/settings/remotes'>\n        <Icon icon='remote' /> {remote.name}\n      </LinkWrapper>\n    )\n  },\n])\n\nRemote.propTypes = {\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  newTab: PropTypes.bool,\n}\n\nRemote.defaultProps = {\n  link: false,\n  newTab: false,\n}\n\n// ===================================================================\n\nexport const Proxy = decorate([\n  addSubscriptions(({ id }) => ({\n    proxy: cb => subscribeProxies(proxies => cb(proxies.find(proxy => proxy.id === id))),\n  })),\n  ({ id, proxy, link, newTab }) =>\n    proxy !== undefined ? (\n      <LinkWrapper\n        link={link}\n        newTab={newTab}\n        to={{\n          pathname: '/proxies',\n          query: {\n            s: new CM.Property('id', new CM.String(id)).toString(),\n          },\n        }}\n      >\n        <Icon icon='proxy' /> {proxy.name || proxy.address}\n      </LinkWrapper>\n    ) : (\n      unknowItem(id, 'proxy')\n    ),\n])\n\nProxy.propTypes = {\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  newTab: PropTypes.bool,\n}\n\nProxy.defaultProps = {\n  link: false,\n  newTab: false,\n}\n\n// ===================================================================\n\nexport const BackupJob = decorate([\n  addSubscriptions(({ id }) => ({\n    job: cb => subscribeBackupNgJobs(jobs => cb(jobs.find(job => job.id === id))),\n  })),\n  ({ id, job, link, newTab }) => {\n    if (job === undefined) {\n      return unknowItem(id, 'job')\n    }\n\n    return (\n      <LinkWrapper\n        link={link}\n        newTab={newTab}\n        to={`/backup/overview?s=${encodeURIComponent(new CM.Property('id', new CM.String(id)).toString())}`}\n      >\n        {job.name}\n      </LinkWrapper>\n    )\n  },\n])\n\nBackupJob.propTypes = {\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  newTab: PropTypes.bool,\n}\n\nBackupJob.defaultProps = {\n  link: false,\n  newTab: false,\n}\n\n// ===================================================================\n\nexport const Schedule = decorate([\n  addSubscriptions(({ id }) => ({\n    schedule: cb => subscribeSchedules(schedules => cb(schedules.find(schedule => schedule.id === id))),\n    backupJobs: subscribeBackupNgJobs,\n    metadataBackupJobs: subscribeMetadataBackupJobs,\n    mirrorBackupJobs: subscribeMirrorBackupJobs,\n  })),\n  provideState({\n    initialState: () => ({}),\n    computed: {\n      job: (_, { backupJobs = [], metadataBackupJobs = [], mirrorBackupJobs = [], schedule }) =>\n        schedule && [...backupJobs, ...metadataBackupJobs, ...mirrorBackupJobs].find(job => job.id === schedule.jobId),\n    },\n  }),\n  injectState,\n  ({ id, schedule, showJob, showState, state: { job } }) => {\n    if (schedule === undefined) {\n      return unknowItem(id, 'schedule')\n    }\n\n    const isEnabled = schedule.enabled\n    const scheduleName = (schedule.name ?? '').trim()\n    const jobName = (job?.name ?? '').trim()\n\n    return (\n      <span>\n        {showState && (\n          <span className={`mr-1 tag tag-${isEnabled ? 'success' : 'danger'}`}>\n            {isEnabled ? _('stateEnabled') : _('stateDisabled')}\n          </span>\n        )}\n        <span>{scheduleName === '' ? <em>{_('unnamedSchedule')}</em> : scheduleName}</span>\n        {showJob && (\n          <span>\n            {' '}\n            ({job ? jobName === '' ? <em>{_('unnamedJob')}</em> : jobName : unknowItem(schedule.jobId, 'job')})\n          </span>\n        )}\n      </span>\n    )\n  },\n])\n\nSchedule.propTypes = {\n  id: PropTypes.string.isRequired,\n  showState: PropTypes.bool,\n  showJob: PropTypes.bool,\n}\n\nSchedule.defaultProps = {\n  showState: true,\n  showJob: true,\n}\n\n// ===================================================================\n\nexport const Vgpu = connectStore(() => ({\n  vgpuType: createGetObject((_, props) => props.vgpu.vgpuType),\n}))(({ vgpu, vgpuType }) => (\n  <span>\n    <Icon icon='vgpu' /> {vgpuType.modelName}\n  </span>\n))\n\nVgpu.propTypes = {\n  vgpu: PropTypes.object.isRequired,\n}\n\n// ===================================================================\n\nexport const User = decorate([\n  addSubscriptions(({ id }) => ({\n    user: cb =>\n      subscribeUsers(users => {\n        const user = users.find(user => user.id === id)\n        cb(user === undefined ? null : user)\n      }),\n  })),\n  ({ defaultRender, id, link, newTab, user }) => {\n    if (user === undefined) {\n      return <Icon icon='loading' />\n    }\n    if (user === null) {\n      return defaultRender || unknowItem(id, 'user')\n    }\n    return (\n      <LinkWrapper\n        link={link}\n        newTab={newTab}\n        to={`/settings/users?s=${encodeURIComponent(new CM.Property('id', new CM.String(id)).toString())}`}\n      >\n        <Icon icon='user' /> {user.email}\n      </LinkWrapper>\n    )\n  },\n])\n\nUser.propTypes = {\n  defaultRender: PropTypes.node,\n  id: PropTypes.string.isRequired,\n  link: PropTypes.bool,\n  newTab: PropTypes.bool,\n}\n\nUser.defaultProps = {\n  link: false,\n  newTab: false,\n}\n\n// ===================================================================\n\nexport const Pci = decorate([\n  connectStore(() => ({\n    pci: createGetObject(),\n  })),\n  ({ pci }) => (\n    <span>\n      {pci.class_name} {pci.device_name} ({pci.pci_id})\n    </span>\n  ),\n])\n\n// ===================================================================\n\nconst xoItemToRender = {\n  // Subscription objects.\n  cloudConfig: template => (\n    <span>\n      <Icon icon='template' /> {template.name}\n    </span>\n  ),\n  group: group => (\n    <span>\n      <Icon icon='group' /> {group.name}\n    </span>\n  ),\n  remote: ({ value: { id } }) => <Remote id={id} />,\n  proxy: ({ id }) => <Proxy id={id} />,\n  role: role => <span>{role.name}</span>,\n  user: ({ id }) => <User id={id} />,\n  resourceSet: resourceSet => (\n    <span>\n      <strong>\n        <Icon icon='resource-set' /> {resourceSet.name}\n      </strong>\n    </span>\n  ),\n  sshKey: key => (\n    <span>\n      <Icon icon='ssh-key' /> {key.label}\n    </span>\n  ),\n  ipPool: ipPool => (\n    <span>\n      <Icon icon='ip' /> {ipPool.name}\n    </span>\n  ),\n  ipAddress: ({ label, used }) => {\n    if (used) {\n      return <strong className='text-warning'>{label}</strong>\n    }\n    return <span>{label}</span>\n  },\n  xoConfig: ({ createdAt }) => (\n    <span>\n      <Icon icon='xo-cloud-config' /> <ShortDate timestamp={createdAt} />\n    </span>\n  ),\n  // XO objects.\n  pool: props => <Pool {...props} />,\n\n  VDI: props => <Vdi {...props} showSr />,\n  'VDI-resourceSet': props => <Vdi {...props} self showSr />,\n\n  // Pool objects.\n  'VM-template': props => <VmTemplate {...props} />,\n  'VM-template-resourceSet': props => <VmTemplate {...props} self />,\n  host: props => <Host {...props} />,\n  network: props => <Network {...props} />,\n  'network-resourceSet': props => <Network {...props} self />,\n\n  // SR.\n  SR: props => <Sr {...props} />,\n  'SR-resourceSet': props => <Sr {...props} self />,\n\n  // VM.\n  VM: props => <Vm {...props} />,\n  'VM-snapshot': props => <Vm {...props} />,\n  'VM-controller': props => (\n    <span>\n      <Icon icon='host' /> <Vm {...props} />\n    </span>\n  ),\n\n  // PIF.\n  PIF: props => <Pif {...props} />,\n\n  // Tags.\n  tag: tag => (\n    <span>\n      <Icon icon='tag' /> {tag.value}\n    </span>\n  ),\n\n  // GPUs\n\n  vgpu: vgpu => <Vgpu vgpu={vgpu} />,\n\n  vgpuType: type => (\n    <span>\n      <Icon icon='gpu' /> {type.modelName} ({type.vendorName}) {type.maxResolutionX}x{type.maxResolutionY}\n    </span>\n  ),\n\n  gpuGroup: group => (\n    <span>{group.name_label.startsWith('Group of ') ? group.name_label.slice(9) : group.name_label}</span>\n  ),\n\n  backup: backup => (\n    <span>\n      <span className='tag tag-info' style={{ textTransform: 'capitalize' }}>\n        {backup.mode === 'delta' ? _('backupIsIncremental') : backup.mode}\n      </span>{' '}\n      {backup.isImmutable && (\n        <span className='tag tag-info'>\n          <Icon icon='lock' />\n        </span>\n      )}{' '}\n      <span className='tag tag-warning'>{backup.remote.name}</span>{' '}\n      {backup.differencingVhds > 0 && (\n        <span className='tag tag-info'>\n          {backup.differencingVhds} {_('backupIsDifferencing')}{' '}\n        </span>\n      )}\n      {backup.dynamicVhds > 0 && (\n        <span className='tag tag-info'>\n          {backup.dynamicVhds} {_('backupisKey')}{' '}\n        </span>\n      )}\n      {backup.withMemory && <span className='tag tag-info'>{_('withMemory')} </span>}\n      {backup.size !== undefined && <span className='tag tag-info'>{formatSize(backup.size)}</span>}{' '}\n      <NumericDate timestamp={backup.timestamp} />\n    </span>\n  ),\n\n  PCI: props => <Pci {...props} self />,\n\n  schedule: props => <Schedule {...props} />,\n\n  job: job => <spans>{job.name}</spans>,\n}\n\nconst renderXoItem = (item, { className, type: xoType, ...props } = {}) => {\n  const { id, label } = item\n  const type = xoType || item.type\n\n  if (item.removed) {\n    return (\n      <span key={id} className='text-danger'>\n        {' '}\n        <Icon icon='alarm' /> {id}\n      </span>\n    )\n  }\n\n  if (!type) {\n    if (process.env.NODE_ENV !== 'production' && !label) {\n      throw new Error(`an item must have at least either a type or a label`)\n    }\n    return (\n      <span key={id} className={className}>\n        {label}\n      </span>\n    )\n  }\n\n  const Component = xoItemToRender[type]\n\n  if (process.env.NODE_ENV !== 'production' && !Component) {\n    throw new Error(`no available component for type ${type}`)\n  }\n\n  if (Component) {\n    return (\n      <span key={id} className={className}>\n        <Component {...item} {...props} />\n      </span>\n    )\n  }\n}\n\nexport { renderXoItem as default }\n\nexport const getRenderXoItemOfType =\n  type =>\n  (item, options = {}) =>\n    renderXoItem(item, { ...options, type })\n\nconst GenericXoItem = connectStore(() => {\n  const getObject = createGetObject()\n\n  return (state, props) => ({\n    xoItem: getObject(state, props),\n  })\n})(({ xoItem, ...props }) => (xoItem ? renderXoItem(xoItem, props) : renderXoUnknownItem()))\n\nexport const renderXoItemFromId = (id, props) => <GenericXoItem {...props} id={id} />\n\nexport const renderXoUnknownItem = () => <span className='text-muted'>{_('errorNoSuchItem')}</span>\n","import _ from 'intl'\nimport * as xoaPlans from 'xoa-plans'\nimport decorate from 'apply-decorators'\nimport defined from '@xen-orchestra/defined'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport stripAnsi from 'strip-ansi'\nimport xoaUpdater from 'xoa-updater'\nimport { checkXoa, getApplianceInfo } from 'xo'\nimport { createBlobFromString } from 'utils'\nimport { createLogger } from '@xen-orchestra/log'\nimport { identity, omit } from 'lodash'\nimport { injectState, provideState } from 'reaclette'\nimport { post } from 'fetch'\nimport { timeout } from 'promise-toolbox'\n\nimport ActionButton from './action-button'\nimport ActionRowButton from './action-row-button'\n\nconst ADDITIONAL_FILES_FETCH_TIMEOUT = 5e3\n\nconst jsonStringify = json => JSON.stringify(json, null, 2)\nconst logger = createLogger('report-bug-button')\n\nconst GITHUB_URL = 'https://github.com/vatesfr/xen-orchestra/issues/new'\nconst GITHUB_BUG_TEMPLATE = 'bug_report.yml'\nconst XO_SUPPORT_URL = 'https://xen-orchestra.com/#!/member/support'\nconst SUPPORT_PANEL_URL = './api/support/create/ticket'\n\nconst ADDITIONAL_FILES = [\n  {\n    fetch: () => xoaUpdater.getLocalManifest().then(jsonStringify),\n    name: 'manifest.json',\n  },\n  {\n    fetch: () => checkXoa().then(stripAnsi),\n    name: 'xoaCheck.txt',\n  },\n  {\n    fetch: () => getApplianceInfo().then(jsonStringify),\n    name: 'xoaInfo.json',\n  },\n]\n\nconst reportInNewWindow = (url, { title, message, formatMessage = identity }) => {\n  const encodedTitle = encodeURIComponent(title == null ? '' : title)\n\n  let _url = `${url}?title=${encodedTitle}`\n\n  if (url === GITHUB_URL) {\n    const encodedErrorMessage = encodeURIComponent(jsonStringify(message.error))\n    const encodedLabels = encodeURIComponent('type: bug :bug:,status: triaging :triangular_flag_on_post:')\n\n    _url += `&template=${GITHUB_BUG_TEMPLATE}&labels=${encodedLabels}&error-message=${encodedErrorMessage}`\n  }\n\n  window.open(_url)\n}\n\nexport const reportOnSupportPanel = async ({ files = [], formatMessage = identity, message, title } = {}) => {\n  const { FormData, open } = window\n\n  const formData = new FormData()\n  if (title !== undefined) {\n    formData.append('title', title)\n  }\n  if (message !== undefined) {\n    formData.append('message', formatMessage(message))\n  }\n  files.forEach(({ content, name }) => {\n    formData.append('attachments', content, name)\n  })\n\n  await Promise.all(\n    ADDITIONAL_FILES.map(({ fetch, name }) =>\n      timeout.call(fetch(), ADDITIONAL_FILES_FETCH_TIMEOUT).then(\n        file => formData.append('attachments', createBlobFromString(file), name),\n        error => logger.warn(`cannot get ${name}`, { error })\n      )\n    )\n  )\n\n  try {\n    const res = await timeout.call(post(SUPPORT_PANEL_URL, formData), 1e4)\n    if (res.status !== 200) {\n      throw new Error(`not a valid response status (${res.status})`)\n    }\n    open(await res.text())\n  } catch (error) {\n    logger.warn('cannot get the new ticket URL', { error })\n    reportInNewWindow(XO_SUPPORT_URL, {\n      title: defined(title, 'Bug report'),\n      message,\n      formatMessage,\n    })\n  }\n}\n\nexport const reportBug =\n  xoaPlans.CURRENT === xoaPlans.SOURCES ? params => reportInNewWindow(GITHUB_URL, params) : reportOnSupportPanel\n\nconst REPORT_BUG_BUTTON_PROP_TYPES = {\n  files: PropTypes.arrayOf(\n    PropTypes.shape({\n      content: PropTypes.oneOfType([PropTypes.instanceOf(window.Blob), PropTypes.instanceOf(window.File)]).isRequired,\n      name: PropTypes.string.isRequired,\n    })\n  ),\n  formatMessage: PropTypes.func,\n  message: PropTypes.string,\n  rowButton: PropTypes.bool,\n  title: PropTypes.string,\n}\n\nconst ReportBugButton = decorate([\n  provideState({\n    effects: {\n      async reportBug() {\n        const { files, formatMessage, message, title } = this.props\n        await reportBug({\n          files,\n          formatMessage,\n          message,\n          title,\n        })\n      },\n    },\n    computed: {\n      Button: (state, { rowButton }) => (rowButton ? ActionRowButton : ActionButton),\n      buttonProps: (state, props) => omit(props, Object.keys(REPORT_BUG_BUTTON_PROP_TYPES)),\n    },\n  }),\n  injectState,\n  ({ state, effects }) => (\n    <state.Button {...state.buttonProps} handler={effects.reportBug} icon='bug' tooltip={_('reportBug')} />\n  ),\n])\n\nReportBugButton.propTypes = REPORT_BUG_BUTTON_PROP_TYPES\n\nexport { ReportBugButton as default }\n","import _, { messages } from 'intl'\nimport ChartistGraph from 'react-chartist'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { Card, CardBlock, CardHeader } from 'card'\nimport { Container, Row, Col } from 'grid'\nimport { forEach, map } from 'lodash'\nimport { injectIntl } from 'react-intl'\n\nimport Component from './base-component'\nimport Icon from './icon'\nimport { createSelector } from './selectors'\nimport { formatSize } from './utils'\n\n// ===================================================================\n\nconst RESOURCES = ['disk', 'memory', 'cpus']\n\n// ===================================================================\n\n@injectIntl\nexport default class ResourceSetQuotas extends Component {\n  static propTypes = {\n    limits: PropTypes.object.isRequired,\n  }\n\n  _getQuotas = createSelector(\n    () => this.props.limits,\n    limits => {\n      const quotas = {}\n\n      forEach(RESOURCES, resource => {\n        if (limits[resource] != null) {\n          const { total, usage } = limits[resource]\n          quotas[resource] = {\n            total,\n            usage,\n          }\n        }\n      })\n\n      return quotas\n    }\n  )\n\n  render() {\n    const {\n      intl: { formatMessage },\n    } = this.props\n    const labels = [formatMessage(messages.availableResourceLabel), formatMessage(messages.usedResourceLabel)]\n    const { cpus, disk, memory } = this._getQuotas()\n    const quotas = [\n      {\n        header: (\n          <span>\n            <Icon icon='cpu' /> {_('cpuStatePanel')}\n          </span>\n        ),\n        validFormat: true,\n        quota: cpus,\n      },\n      {\n        header: (\n          <span>\n            <Icon icon='memory' /> {_('memoryStatePanel')}\n          </span>\n        ),\n        validFormat: false,\n        quota: memory,\n      },\n      {\n        header: (\n          <span>\n            <Icon icon='disk' /> {_('srUsageStatePanel')}\n          </span>\n        ),\n        validFormat: false,\n        quota: disk,\n      },\n    ]\n    return (\n      <Container>\n        <Row>\n          {map(quotas, ({ header, validFormat, quota }, key) => (\n            <Col key={key} mediumSize={4}>\n              <Card>\n                <CardHeader>{header}</CardHeader>\n                <CardBlock className='text-center'>\n                  {quota !== undefined ? (\n                    <div>\n                      {Number.isFinite(quota.total) ? (\n                        <ChartistGraph\n                          data={{\n                            labels,\n                            series: [quota.total - quota.usage, quota.usage],\n                          }}\n                          options={{\n                            donut: true,\n                            donutWidth: 40,\n                            showLabel: false,\n                          }}\n                          type='Pie'\n                        />\n                      ) : (\n                        <p className='text-xs-center display-1'>&infin;</p>\n                      )}\n                      <p className='text-xs-center'>\n                        {!Number.isFinite(quota.total)\n                          ? _('unlimitedResourceSetUsage', {\n                              usage: validFormat ? quota.usage?.toString() : formatSize(quota.usage),\n                            })\n                          : _('resourceSetQuota', {\n                              total: validFormat ? quota.total?.toString() : formatSize(quota.total),\n                              usage: validFormat ? quota.usage?.toString() : formatSize(quota.usage),\n                            })}\n                      </p>\n                    </div>\n                  ) : (\n                    <p className='text-xs-center display-1'>&infin;</p>\n                  )}\n                </CardBlock>\n              </Card>\n            </Col>\n          ))}\n        </Row>\n      </Container>\n    )\n  }\n}\n","import React from 'react'\nimport { connectStore } from 'utils'\nimport { createGetObjectsOfType } from 'selectors'\nimport PropTypes from 'prop-types'\nimport decorate from 'apply-decorators'\nimport { injectState, provideState } from 'reaclette'\nimport Copiable from 'copiable'\nimport { flatMap } from 'lodash'\nimport Link from 'link'\nimport store from 'store'\n\n/**\n * TODO : check user permissions on objects retrieved by refs, if using the component in non-admin pages\n */\nconst RichText = decorate([\n  connectStore({\n    vms: createGetObjectsOfType('VM'),\n    hosts: createGetObjectsOfType('host'),\n    pools: createGetObjectsOfType('pool'),\n    srs: createGetObjectsOfType('SR'),\n  }),\n  provideState({\n    computed: {\n      idToLink: (_, props) => {\n        const regex = /\\b(?:OpaqueRef:)?[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}\\b/g\n        const parts = props.message.split(regex)\n        const ids = props.message.match(regex) || []\n        const { objects } = store.getState()\n\n        return flatMap(parts, (part, index) => {\n          // If on last part, return only the part without adding Copiable component\n          if (index === ids.length) {\n            return part\n          }\n\n          const id = ids[index]\n          let _object\n\n          for (const collection of [props.vms, props.hosts, props.pools, props.srs]) {\n            _object = id.startsWith('OpaqueRef:') ? objects.byRef.get(id) : collection[id]\n\n            if (_object !== undefined) break\n          }\n\n          if (_object !== undefined && ['VM', 'host', 'pool', 'SR'].includes(_object.type)) {\n            return [\n              part,\n              <Link key={index} to={`/${_object.type.toLowerCase()}s/${_object.uuid}`}>\n                {id}\n              </Link>,\n            ]\n          } else {\n            return [part, <Copiable key={index}>{id}</Copiable>]\n          }\n        })\n      },\n    },\n  }),\n  injectState,\n  ({ state: { idToLink }, copiable, message }) =>\n    copiable ? (\n      <Copiable tagName='pre' data={message}>\n        {idToLink}\n      </Copiable>\n    ) : (\n      <pre>{idToLink}</pre>\n    ),\n])\n\nRichText.propTypes = {\n  message: PropTypes.string,\n  copiable: PropTypes.bool,\n}\n\nRichText.defaultProps = {\n  copiable: false,\n}\n\nexport default RichText\n","import classNames from 'classnames'\nimport Icon from 'icon'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { createSchedule } from '@xen-orchestra/cron'\nimport { FormattedDate, FormattedTime } from 'react-intl'\nimport { injectState, provideState } from 'reaclette'\nimport { flatten, forEach, identity, map, sortedIndex } from 'lodash'\n\nimport _ from './intl'\nimport Button from './button'\nimport Component from './base-component'\nimport decorate from './apply-decorators'\nimport TimezonePicker from './timezone-picker'\nimport Tooltip from './tooltip'\nimport { Card, CardHeader, CardBlock } from './card'\nimport { Col, Row } from './grid'\nimport { getXoServerTimezone } from './xo'\nimport { Range, Toggle } from './form'\n\n// ===================================================================\n\nconst CLICKABLE = { cursor: 'pointer' }\nconst PREVIEW_SLIDER_STYLE = { width: '400px' }\n\n// ===================================================================\n\nconst UNITS = ['minute', 'hour', 'monthDay', 'month', 'weekDay']\n\nconst MIN_PREVIEWS = 5\nconst MAX_PREVIEWS = 20\n\nconst MONTHS = [\n  [0, 1, 2],\n  [3, 4, 5],\n  [6, 7, 8],\n  [9, 10, 11],\n]\n\nconst DAYS = (() => {\n  const days = []\n\n  for (let i = 0; i < 4; i++) {\n    days[i] = []\n\n    for (let j = 1; j < 8; j++) {\n      days[i].push(7 * i + j)\n    }\n  }\n\n  days.push([29, 30, 31])\n\n  return days\n})()\n\nconst WEEK_DAYS = [[0, 1, 2], [3, 4, 5], [6]]\n\nconst HOURS = (() => {\n  const hours = []\n\n  for (let i = 0; i < 4; i++) {\n    hours[i] = []\n\n    for (let j = 0; j < 6; j++) {\n      hours[i].push(6 * i + j)\n    }\n  }\n\n  return hours\n})()\n\nconst MINS = (() => {\n  const minutes = []\n\n  for (let i = 0; i < 6; i++) {\n    minutes[i] = []\n\n    for (let j = 0; j < 10; j++) {\n      minutes[i].push(10 * i + j)\n    }\n  }\n\n  return minutes\n})()\n\nconst PICKTIME_TO_ID = {\n  minute: 0,\n  hour: 1,\n  monthDay: 2,\n  month: 3,\n  weekDay: 4,\n}\n\nconst TIME_FORMAT = {\n  weekday: 'long',\n  year: 'numeric',\n  month: 'long',\n  day: 'numeric',\n  hour: 'numeric',\n  minute: 'numeric',\n}\n\n// ===================================================================\n\n// monthNum: [ 0 : 11 ]\nconst getMonthName = monthNum => <FormattedDate value={Date.UTC(1970, monthNum)} month='long' timeZone='UTC' />\n\n// dayNum: [ 0 : 6 ]\nconst getDayName = dayNum => (\n  // January, 1970, 5th => Monday\n  <FormattedDate value={Date.UTC(1970, 0, 4 + dayNum)} weekday='long' timeZone='UTC' />\n)\n\n// ===================================================================\n\nexport class SchedulePreview extends Component {\n  static propTypes = {\n    cronPattern: PropTypes.string.isRequired,\n    timezone: PropTypes.string,\n  }\n\n  componentDidMount() {\n    getXoServerTimezone.then(serverTimezone => {\n      this.setState({\n        defaultTimezone: serverTimezone,\n      })\n    })\n  }\n\n  render() {\n    const { defaultTimezone, value } = this.state\n    const { cronPattern, timezone = defaultTimezone } = this.props\n    const dates = createSchedule(cronPattern, timezone).next(value)\n\n    return (\n      <div>\n        <div className='alert alert-info' role='alert'>\n          {_('cronPattern')} <strong>{cronPattern}</strong>\n        </div>\n        <div className='mb-1' style={PREVIEW_SLIDER_STYLE}>\n          <Range\n            min={MIN_PREVIEWS}\n            max={MAX_PREVIEWS}\n            onChange={this.linkState('value')}\n            value={value && +value}\n            required\n          />\n        </div>\n        <ul className='list-group'>\n          {map(dates, (date, id) => (\n            <li className='list-group-item' key={id}>\n              <FormattedTime value={date} {...TIME_FORMAT} />\n            </li>\n          ))}\n          <li className='list-group-item'>...</li>\n        </ul>\n      </div>\n    )\n  }\n}\n\n// ===================================================================\n\nclass ToggleTd extends Component {\n  static propTypes = {\n    children: PropTypes.any.isRequired,\n    onChange: PropTypes.func.isRequired,\n    tdId: PropTypes.number.isRequired,\n    value: PropTypes.bool.isRequired,\n  }\n\n  _onClick = () => {\n    const { props } = this\n    props.onChange(props.tdId, !props.value)\n  }\n\n  render() {\n    const { props } = this\n    return (\n      <td\n        className={classNames('text-xs-center', props.value && 'table-success')}\n        onClick={this._onClick}\n        style={CLICKABLE}\n      >\n        {props.children}\n      </td>\n    )\n  }\n}\n\n// ===================================================================\n\nconst TableSelect = decorate([\n  provideState({\n    effects: {\n      onChange:\n        (_, tdId, add) =>\n        (_, { value, onChange, options }) => {\n          let newValue = [...value]\n          const index = sortedIndex(newValue, tdId)\n          if (add) {\n            newValue[index] !== tdId && newValue.splice(index, 0, tdId)\n          } else if (newValue[index] === tdId) {\n            if (newValue.length > 1) {\n              newValue.splice(index, 1)\n            } else {\n              newValue = [options[0][0]]\n            }\n          }\n          onChange(newValue)\n        },\n      selectAll:\n        () =>\n        ({ optionsValues }, { onChange }) => {\n          onChange(optionsValues)\n        },\n    },\n    computed: {\n      optionsValues: (_, { options }) => flatten(options),\n    },\n  }),\n  injectState,\n  ({ state, effects, labelId, options, optionRenderer = identity, value }) => {\n    let k = 0\n    return (\n      <div>\n        <table className='table table-bordered table-sm'>\n          <tbody>\n            {map(options, (line, i) => (\n              <tr key={i}>\n                {map(line, tdOption => (\n                  <ToggleTd\n                    children={optionRenderer(tdOption)}\n                    tdId={tdOption}\n                    key={tdOption}\n                    onChange={effects.onChange}\n                    value={k < value.length && value[k] === tdOption && (++k, true)}\n                  />\n                ))}\n              </tr>\n            ))}\n          </tbody>\n        </table>\n        <Button className='pull-right' onClick={effects.selectAll}>\n          {_(`selectTableAll${labelId}`)}\n        </Button>\n      </div>\n    )\n  },\n])\n\nTableSelect.propTypes = {\n  labelId: PropTypes.string.isRequired,\n  options: PropTypes.array.isRequired,\n  optionRenderer: PropTypes.func,\n  onChange: PropTypes.func.isRequired,\n  value: PropTypes.array.isRequired,\n}\n\n// ===================================================================\n\nconst TimePicker = decorate([\n  provideState({\n    effects: {\n      onChange:\n        (_, value) =>\n        ({ optionsValues }, { onChange }) => {\n          if (Array.isArray(value)) {\n            value = value.length === optionsValues.length ? '*' : value.join(',')\n          } else {\n            value = `*/${value}`\n          }\n\n          onChange(value)\n        },\n    },\n    computed: {\n      maxStep: ({ optionsValues }) => Math.floor(optionsValues.length / 2),\n      optionsValues: (_, { options }) => flatten(options),\n\n      // '*' or '*/1' => all values\n      // '2,7' => [2,7]\n      // '*/2' => [min + 2 * 0, min + 2 * 1, ..., min + 2 * n <= max]\n      tableValue: ({ optionsValues, step }, { value }) =>\n        step === 1\n          ? optionsValues\n          : step !== undefined\n            ? optionsValues.filter((_, i) => i % step === 0)\n            : value.split(',').map(Number),\n\n      // '*' => 1\n      // '*/2' => 2\n      // otherwise => undefined\n      step: (_, { value }) => (value === '*' ? 1 : value.indexOf('/') === 1 ? +value.split('/')[1] : undefined),\n    },\n  }),\n  injectState,\n  ({ state, effects, ...props }) => (\n    <Card>\n      <CardHeader>\n        {_(`scheduling${props.labelId}`)}\n        {props.headerAddon}\n      </CardHeader>\n      <CardBlock>\n        <TableSelect\n          labelId={props.labelId}\n          onChange={effects.onChange}\n          optionRenderer={props.optionRenderer}\n          options={props.options}\n          value={state.tableValue}\n        />\n        <Range max={state.maxStep} min={1} onChange={effects.onChange} value={state.step} />\n      </CardBlock>\n    </Card>\n  ),\n])\n\nTimePicker.propTypes = {\n  headerAddon: PropTypes.node,\n  labelId: PropTypes.string.isRequired,\n  onChange: PropTypes.func.isRequired,\n  optionRenderer: PropTypes.func,\n  options: PropTypes.array.isRequired,\n  value: PropTypes.string.isRequired,\n}\n\nconst isWeekDayMode = ({ monthDayPattern, weekDayPattern }) => {\n  if (monthDayPattern === '*' && weekDayPattern === '*') {\n    return\n  }\n\n  return weekDayPattern !== '*'\n}\n\nclass DayPicker extends Component {\n  static propTypes = {\n    monthDayPattern: PropTypes.string.isRequired,\n    weekDayPattern: PropTypes.string.isRequired,\n  }\n\n  state = {\n    weekDayMode: isWeekDayMode(this.props),\n  }\n\n  componentWillReceiveProps(props) {\n    const weekDayMode = isWeekDayMode(props)\n\n    if (weekDayMode !== undefined) {\n      this.setState({ weekDayMode })\n    }\n  }\n\n  _setWeekDayMode = weekDayMode => {\n    this.props.onChange(['*', '*'])\n    this.setState({ weekDayMode })\n  }\n\n  _onChange = cron => {\n    this.props.onChange(this.state.weekDayMode ? ['*', cron] : [cron, '*'])\n  }\n\n  render() {\n    const { monthDayPattern, weekDayPattern } = this.props\n    const { weekDayMode } = this.state\n\n    const dayModeToggle = (\n      <Tooltip content={_(weekDayMode ? 'schedulingSetMonthDayMode' : 'schedulingSetWeekDayMode')}>\n        <span className='pull-right'>\n          <Toggle onChange={this._setWeekDayMode} iconSize={1} value={weekDayMode} />\n        </span>\n      </Tooltip>\n    )\n\n    return (\n      <TimePicker\n        headerAddon={dayModeToggle}\n        key={weekDayMode ? 'week' : 'month'}\n        labelId='Day'\n        onChange={this._onChange}\n        optionRenderer={weekDayMode ? getDayName : undefined}\n        options={weekDayMode ? WEEK_DAYS : DAYS}\n        value={weekDayMode ? weekDayPattern : monthDayPattern}\n      />\n    )\n  }\n}\n\n// ===================================================================\n\nexport default class Scheduler extends Component {\n  static propTypes = {\n    cronPattern: PropTypes.string,\n    onChange: PropTypes.func,\n    timezone: PropTypes.string,\n    value: PropTypes.shape({\n      cronPattern: PropTypes.string.isRequired,\n      timezone: PropTypes.string,\n    }),\n  }\n\n  constructor(props) {\n    super(props)\n\n    this._onCronChange = newCrons => {\n      const cronPattern = this._getCronPattern().split(' ')\n      forEach(newCrons, (cron, unit) => {\n        cronPattern[PICKTIME_TO_ID[unit]] = cron\n      })\n\n      this.props.onChange({\n        cronPattern: cronPattern.join(' '),\n        timezone: this._getTimezone(),\n      })\n    }\n\n    forEach(UNITS, unit => {\n      this[`_${unit}Change`] = cron => this._onCronChange({ [unit]: cron })\n    })\n    this._dayChange = ([monthDay, weekDay]) => this._onCronChange({ monthDay, weekDay })\n  }\n\n  _onTimezoneChange = timezone => {\n    this.props.onChange({\n      cronPattern: this._getCronPattern(),\n      timezone,\n    })\n  }\n\n  _getCronPattern = () => {\n    const { value, cronPattern = value.cronPattern } = this.props\n    return cronPattern\n  }\n\n  _getTimezone = () => {\n    const { value, timezone = value && value.timezone } = this.props\n    return timezone\n  }\n\n  render() {\n    const cronPatternArr = this._getCronPattern().split(' ')\n    const timezone = this._getTimezone()\n\n    return (\n      <div className='card-block'>\n        <em>\n          <Icon icon='info' /> {_('scheduleDstWarning')}\n        </em>\n        <Row>\n          <Col largeSize={6}>\n            <TimePicker\n              labelId='Month'\n              optionRenderer={getMonthName}\n              options={MONTHS}\n              onChange={this._monthChange}\n              value={cronPatternArr[PICKTIME_TO_ID.month]}\n            />\n          </Col>\n          <Col largeSize={6}>\n            <DayPicker\n              onChange={this._dayChange}\n              monthDayPattern={cronPatternArr[PICKTIME_TO_ID.monthDay]}\n              weekDayPattern={cronPatternArr[PICKTIME_TO_ID.weekDay]}\n            />\n          </Col>\n        </Row>\n        <Row>\n          <Col largeSize={6}>\n            <TimePicker\n              labelId='Hour'\n              options={HOURS}\n              onChange={this._hourChange}\n              value={cronPatternArr[PICKTIME_TO_ID.hour]}\n            />\n          </Col>\n          <Col largeSize={6}>\n            <TimePicker\n              labelId='Minute'\n              options={MINS}\n              onChange={this._minuteChange}\n              value={cronPatternArr[PICKTIME_TO_ID.minute]}\n            />\n          </Col>\n        </Row>\n        <Row>\n          <Col>\n            <hr />\n            <TimezonePicker value={timezone} onChange={this._onTimezoneChange} />\n          </Col>\n        </Row>\n      </div>\n    )\n  }\n}\n","import _ from 'intl'\nimport classNames from 'classnames'\nimport DropdownMenu from 'react-bootstrap-4/lib/DropdownMenu' // https://phabricator.babeljs.io/T6662 so Dropdown.Menu won't work like https://react-bootstrap.github.io/components.html#btn-dropdowns-custom\nimport DropdownToggle from 'react-bootstrap-4/lib/DropdownToggle' // https://phabricator.babeljs.io/T6662 so Dropdown.Toggle won't work https://react-bootstrap.github.io/components.html#btn-dropdowns-custom\nimport PropTypes from 'prop-types'\nimport React, { Component } from 'react'\nimport { Dropdown, MenuItem } from 'react-bootstrap-4/lib'\nimport { Input as DebouncedInput } from 'debounce-input-decorator'\nimport { isEmpty, map } from 'lodash'\n\nimport Button from './button'\nimport Icon from './icon'\nimport Tooltip from './tooltip'\n\nexport default class SearchBar extends Component {\n  static propTypes = {\n    filters: PropTypes.object,\n    onChange: PropTypes.func.isRequired,\n    value: PropTypes.string.isRequired,\n  }\n\n  _cleanFilter = () => this._setFilter('')\n\n  _setFilter = filterValue => {\n    const filter = this.refs.filter.getWrappedInstance()\n    filter.value = filterValue\n    filter.focus()\n    this.props.onChange(filterValue)\n  }\n\n  _onChange = event => {\n    this.props.onChange(event.target.value)\n  }\n\n  focus() {\n    this.refs.filter.getWrappedInstance().focus()\n  }\n\n  render() {\n    const { props } = this\n\n    return (\n      <div className={classNames('input-group', props.className)}>\n        {isEmpty(props.filters) ? (\n          <span className='input-group-addon'>\n            <Icon icon='search' />\n          </span>\n        ) : (\n          <span className='input-group-btn'>\n            <Dropdown id='filter'>\n              <DropdownToggle bsStyle='info'>\n                <Icon icon='search' />\n              </DropdownToggle>\n              <DropdownMenu>\n                {map(props.filters, (filter, label) => (\n                  <MenuItem key={label} onClick={() => this._setFilter(filter)}>\n                    {_(label)}\n                  </MenuItem>\n                ))}\n              </DropdownMenu>\n            </Dropdown>\n          </span>\n        )}\n        <DebouncedInput className='form-control' onChange={this._onChange} ref='filter' value={props.value} />\n        <Tooltip content={_('filterSyntaxLinkTooltip')}>\n          <a\n            className='input-group-addon'\n            href='https://docs.xen-orchestra.com/manage_infrastructure#live-filter-searchh'\n            rel='noopener noreferrer'\n            target='_blank'\n          >\n            <Icon icon='info' />\n          </a>\n        </Tooltip>\n        <span className='input-group-btn'>\n          <Button onClick={this._cleanFilter}>\n            <Icon icon='clear-search' />\n          </Button>\n        </span>\n      </div>\n    )\n  }\n}\n","import _ from 'intl'\nimport decorate from 'apply-decorators'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { confirm } from 'modal'\nimport { createGetObject } from 'selectors'\nimport { injectState, provideState } from 'reaclette'\nimport { satisfies as versionSatisfies } from 'semver'\n\nimport { connectStore, noop } from './utils'\n\n// XAPI values should be lowercased\nconst VM_BOOT_FIRMWARES = ['bios', 'uefi']\n\nconst SelectBootFirmware = decorate([\n  connectStore({\n    host: createGetObject((_, props) => props.host),\n  }),\n  provideState({\n    effects: {\n      handleBootFirmwareChange(__, { target: { value } }) {\n        if (value !== '' && this.props.host !== undefined && versionSatisfies(this.props.host.version, '~8.0')) {\n          // Guest UEFI boot is provided in CH/XCP-ng 8.0 as an experimental feature.\n          // https://docs.citrix.com/en-us/citrix-hypervisor/8-0/downloads/citrix-hypervisor-8.0.pdf#page=10\n          confirm({\n            title: _('vmBootFirmware'),\n            body: _('vmBootFirmwareWarningMessage'),\n          }).then(() => this.props.onChange(value), noop)\n        } else {\n          this.props.onChange(value)\n        }\n      },\n    },\n  }),\n  injectState,\n  ({ effects, value }) => (\n    <select className='form-control' onChange={effects.handleBootFirmwareChange} value={value}>\n      <option value=''>{_('vmDefaultBootFirmwareLabel')}</option>\n      {VM_BOOT_FIRMWARES.map(val => (\n        <option key={val} value={val}>\n          {val}\n        </option>\n      ))}\n    </select>\n  ),\n])\n\nSelectBootFirmware.propTypes = {\n  host: PropTypes.string,\n  onChange: PropTypes.func.isRequired,\n  value: PropTypes.string.isRequired,\n}\n\nexport default SelectBootFirmware\n","import _ from 'intl'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { injectState, provideState } from 'reaclette'\nimport omit from 'lodash/omit.js'\n\nimport decorate from './apply-decorators'\nimport { Select } from './form'\n\nconst OPTIONS = [\n  {\n    label: _('stateDisabled'),\n    value: '',\n  },\n  {\n    label: _('chooseCompressionGzipOption'),\n    value: 'native',\n  },\n]\n\nconst OPTIONS_WITH_ZSTD = [\n  ...OPTIONS,\n  {\n    label: _('chooseCompressionZstdOption'),\n    value: 'zstd',\n  },\n]\n\nconst SELECT_COMPRESSION_PROP_TYPES = {\n  showZstd: PropTypes.bool,\n}\n\nconst SelectCompression = decorate([\n  provideState({\n    computed: {\n      options: (_, { showZstd }) => (showZstd ? OPTIONS_WITH_ZSTD : OPTIONS),\n      selectProps: (_, props) => omit(props, Object.keys(SELECT_COMPRESSION_PROP_TYPES)),\n    },\n  }),\n  injectState,\n  ({ onChange, state, value }) => (\n    <Select labelKey='label' options={state.options} required simpleValue {...state.selectProps} />\n  ),\n])\n\nSelectCompression.defaultProps = { showZstd: true }\nSelectCompression.propTypes = SELECT_COMPRESSION_PROP_TYPES\nexport { SelectCompression as default }\n","import _ from 'intl'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { injectState, provideState } from 'reaclette'\nimport omit from 'lodash/omit.js'\n\nimport decorate from './apply-decorators'\nimport Icon from './icon'\nimport Tooltip from './tooltip'\nimport { Select } from './form'\n\nconst PROP_TYPES = {\n  maxCores: PropTypes.number,\n  maxVcpus: PropTypes.number,\n  value: PropTypes.number,\n}\n\nconst SELECT_STYLE = {\n  display: 'inline-block',\n  fontSize: '1rem',\n  width: '20em',\n}\n\nconst LINE_ITEM_STYLE = {\n  alignItems: 'center',\n  display: 'flex',\n}\n\n// https://github.com/xcp-ng/xenadmin/blob/0160cd0119fae3b871eef656c23e2b76fcc04cb5/XenModel/XenAPI-Extensions/VM.cs#L62\nconst MAX_VM_SOCKETS = 16\n\n// This algorithm was inspired from: https://github.com/xcp-ng/xenadmin/blob/master/XenAdmin/Controls/ComboBoxes/CPUTopologyComboBox.cs#L116\nconst SelectCoresPerSocket = decorate([\n  provideState({\n    computed: {\n      isValidValue: (state, { maxVcpus, value }) =>\n        value == null || (maxVcpus % value === 0 && !state.valueExceedsCoresLimit && !state.valueExceedsSocketsLimit),\n      valueExceedsCoresLimit: (state, { maxCores, value }) => value > maxCores,\n      valueExceedsSocketsLimit: (state, { maxCores, maxVcpus, value }) => maxVcpus / value > MAX_VM_SOCKETS,\n      options: ({ isValidValue }, { maxCores, maxVcpus, value }) => {\n        const options = []\n\n        if (maxCores === undefined || maxVcpus === undefined) {\n          return options\n        }\n\n        const minCores = maxVcpus / MAX_VM_SOCKETS\n\n        // cores per socket must be a divisor of the max vCPUs and must not exceed the cores and sockets limit\n        // e.g: with maxCores = 4, maxSockets = 16 and maxVCPUS = 6\n        // 2 cores per socket is a valid value and 4 cores per socket isn't a valid value\n        for (let coresPerSocket = maxCores; coresPerSocket >= minCores; coresPerSocket--) {\n          if (maxVcpus % coresPerSocket === 0) {\n            options.push({\n              label: _('vmSocketsWithCoresPerSocket', {\n                nSockets: maxVcpus / coresPerSocket,\n                nCores: coresPerSocket,\n              }),\n              value: coresPerSocket,\n            })\n          }\n        }\n\n        if (!isValidValue) {\n          options.push({\n            label: _('vmCoresPerSocket', {\n              nCores: value,\n            }),\n            value,\n          })\n        }\n        return options\n      },\n      selectProps: (_, props) => omit(props, Object.keys(PROP_TYPES)),\n    },\n  }),\n  injectState,\n  ({ maxCores, state, value }) => (\n    <div style={LINE_ITEM_STYLE}>\n      <span style={SELECT_STYLE}>\n        <Select\n          options={state.options}\n          placeholder={_('vmChooseCoresPerSocket')}\n          simpleValue\n          value={value}\n          {...state.selectProps}\n        />\n      </span>\n      &nbsp;\n      {!state.isValidValue && (\n        <Tooltip\n          content={\n            state.valueExceedsCoresLimit\n              ? _('vmCoresPerSocketExceedsCoresLimit', { maxCores })\n              : state.valueExceedsSocketsLimit\n                ? _('vmCoresPerSocketExceedsSocketsLimit', {\n                    maxSockets: MAX_VM_SOCKETS,\n                  })\n                : _('vmCoresPerSocketNotDivisor')\n          }\n        >\n          <Icon icon='error' size='lg' />\n        </Tooltip>\n      )}\n    </div>\n  ),\n])\n\nSelectCoresPerSocket.propTypes = PROP_TYPES\n\nexport { SelectCoresPerSocket as default }\n","import _ from 'intl'\nimport React from 'react'\nimport { injectState, provideState } from 'reaclette'\n\nimport decorate from './apply-decorators'\nimport { Select } from './form'\n\nconst OPTIONS = [\n  {\n    label: 'xva',\n    value: 'xva',\n  },\n  {\n    label: 'ova',\n    value: 'ova',\n  },\n]\n\nconst SelectExportFormat = decorate([\n  provideState({\n    computed: {\n      options: () => OPTIONS,\n      selectProps: (_, props) => props,\n    },\n  }),\n  injectState,\n  ({ onChange, state, value }) => (\n    <Select labelKey='label' valueKey='value' options={state.options} required simpleValue {...state.selectProps} />\n  ),\n])\n\nexport { SelectExportFormat as default }\n","import _ from 'intl'\nimport Component from 'base-component'\nimport Icon from 'icon'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport omit from 'lodash/omit.js'\n\nconst STYLE = {\n  marginBottom: 0,\n}\n\nexport default class SelectFiles extends Component {\n  static propTypes = {\n    multi: PropTypes.bool,\n    label: PropTypes.node,\n    onChange: PropTypes.func.isRequired,\n  }\n\n  _onChange = e => {\n    const { multi, onChange } = this.props\n    const { files } = e.target\n\n    onChange(multi ? files : files[0])\n  }\n\n  render() {\n    return (\n      <label className='btn btn-secondary btn-file hidden' style={STYLE}>\n        <Icon icon='file' /> {this.props.label || _('browseFiles')}\n        <input\n          {...omit(this.props, ['hidden', 'label', 'onChange', 'multi'])}\n          hidden\n          onChange={this._onChange}\n          type='file'\n        />\n      </label>\n    )\n  }\n}\n","import _ from 'intl'\nimport decorate from 'apply-decorators'\nimport React from 'react'\nimport { getLicenses } from 'xo'\nimport { injectIntl } from 'react-intl'\nimport { injectState, provideState } from 'reaclette'\nimport map from 'lodash/map.js'\n\nimport { renderXoItemFromId } from './render-xo-item'\n\nconst LicenseOptions = ({ license, formatDate }) => {\n  /**\n   * license.productId can be:\n   * - xcpng-enterprise\n   * - xcpng-standard\n   * - xo-proxy\n   * - xostor\n   * - xostor.trial\n   */\n  const productId = license.productId.startsWith('xostor') ? license.productId : license.productId.split('-')[1]\n  return (\n    <option value={license.id}>\n      <span>\n        {productId.charAt(0).toUpperCase() + productId.slice(1)} ({license.id.slice(-4)}),{' '}\n        {license.expires !== undefined ? formatDate(license.expires) : '-'}\n        {license.boundObjectId !== undefined && <span>, {renderXoItemFromId(license.boundObjectId)}</span>}\n      </span>\n    </option>\n  )\n}\n\nconst SelectLicense = decorate([\n  injectIntl,\n  provideState({\n    computed: {\n      licenses: async (state, { productType }) => {\n        try {\n          const availableLicenses = {\n            bound: [],\n            notBound: [],\n          }\n          ;(await getLicenses({ productType })).forEach(license => {\n            if (license.expires === undefined || license.expires > Date.now()) {\n              availableLicenses[license.boundObjectId === undefined ? 'notBound' : 'bound'].push(license)\n            }\n          })\n          return availableLicenses\n        } catch (error) {\n          return { licenseError: error }\n        }\n      },\n    },\n  }),\n  injectState,\n  ({ state: { licenses }, intl: { formatDate }, onChange, showBoundLicenses }) =>\n    licenses?.licenseError !== undefined ? (\n      <span>\n        <em className='text-danger'>{_('getLicensesError')}</em>\n      </span>\n    ) : (\n      <select className='form-control' onChange={onChange}>\n        {_('selectLicense', message => (\n          <option key='none' value='none'>\n            {message}\n          </option>\n        ))}\n\n        {_('notBoundSelectLicense', i18nNotBound => (\n          <optgroup label={i18nNotBound}>\n            {map(licenses?.notBound, license => (\n              <LicenseOptions formatDate={formatDate} key={license.id} license={license} />\n            ))}\n          </optgroup>\n        ))}\n        {showBoundLicenses &&\n          _('boundSelectLicense', i18nBound => (\n            <optgroup label={i18nBound}>\n              {map(licenses?.bound, license => (\n                <LicenseOptions formatDate={formatDate} key={license.id} license={license} />\n              ))}\n            </optgroup>\n          ))}\n      </select>\n    ),\n])\nexport default SelectLicense\n","import decorate from 'apply-decorators'\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { injectState, provideState } from 'reaclette'\nimport { parse as parseRemote } from 'xo-remote-parser'\nimport {\n  filter,\n  flatten,\n  forEach,\n  groupBy,\n  includes,\n  isEmpty,\n  isInteger,\n  keyBy,\n  keys,\n  map,\n  mapValues,\n  pick,\n  sortBy,\n  toArray,\n} from 'lodash'\n\nimport _ from './intl'\nimport Button from './button'\nimport EphemeralInput from './ephemeral-input'\nimport Icon from './icon'\nimport renderXoItem from './render-xo-item'\nimport Select from './form/select'\nimport store from './store'\nimport Tooltip from './tooltip'\nimport uncontrollableInput from 'uncontrollable-input'\nimport {\n  createCollectionWrapper,\n  createFilter,\n  createGetObjectsOfType,\n  createGetTags,\n  createSelector,\n  createSort,\n  getObject,\n} from './selectors'\nimport { addSubscriptions, connectStore, resolveResourceSets } from './utils'\nimport {\n  isSrWritable,\n  subscribeBackupNgJobs,\n  subscribeCloudConfigs,\n  subscribeCloudXoConfigBackups,\n  subscribeCurrentUser,\n  subscribeGroups,\n  subscribeIpPools,\n  subscribeJobs,\n  subscribeMetadataBackupJobs,\n  subscribeMirrorBackupJobs,\n  subscribeNetworkConfigs,\n  subscribeProxies,\n  subscribeRemotes,\n  subscribeResourceSets,\n  subscribeRoles,\n  subscribeSchedules,\n  subscribeUsers,\n} from './xo'\nimport { toggleState } from './reaclette-utils'\n\n// ===================================================================\n\n// react-select's line-height is 1.4\n// https://github.com/JedWatson/react-select/blob/916ab0e62fc7394be8e24f22251c399a68de8b1c/less/multi.less#L33\n// while bootstrap button's line-height is 1.25\n// https://github.com/twbs/bootstrap/blob/959c4e527c6ef69623928db638267ba1c370479d/scss/_variables.scss#L342\nconst ADDON_BUTTON_STYLE = { lineHeight: '1.4' }\n\nconst getIds = value =>\n  value == null || typeof value === 'string' || isInteger(value)\n    ? value\n    : Array.isArray(value)\n      ? map(value, getIds)\n      : value.id\n\nconst getOption = (object, container) => ({\n  label: container ? `${getLabel(object)} ${getLabel(container)}` : getLabel(object),\n  value: object.id,\n  xoItem: object,\n})\n\nconst getLabel = object =>\n  object.name_label ||\n  object.name ||\n  object.email ||\n  (object.value && object.value.name) ||\n  object.value ||\n  object.label\n\nconst options = props => ({\n  defaultValue: props.multi ? [] : undefined,\n})\n\nconst getObjectsById = objects => keyBy(Array.isArray(objects) ? objects : flatten(toArray(objects)), 'id')\n\n// ===================================================================\n\n/*\n * WITHOUT xoContainers :\n *\n * xoObjects: [\n *  { type: 'myType', id: 'abc', label: 'First object' },\n *  { type: 'myType', id: 'def', label: 'Second object' }\n * ]\n *\n *\n * WITH xoContainers :\n *\n * xoContainers: [\n *  { type: 'containerType', id: 'ghi', label: 'First container' },\n *  { type: 'containerType', id: 'jkl', label: 'Second container' }\n * ]\n *\n * xoObjects: {\n *  ghi: [\n *    { type: 'objectType', id: 'mno', label: 'First object' }\n *    { type: 'objectType', id: 'pqr', label: 'Second object' }\n *  ],\n *  jkl: [\n *    { type: 'objectType', id: 'stu', label: 'Third object' }\n *  ]\n * }\n */\nclass GenericSelect extends React.Component {\n  static propTypes = {\n    allowMissingObjects: PropTypes.bool,\n    compareContainers: PropTypes.func,\n    compareOptions: PropTypes.func,\n    hasSelectAll: PropTypes.bool,\n    multi: PropTypes.bool,\n    onChange: PropTypes.func.isRequired,\n    xoContainers: PropTypes.array,\n    xoObjects: PropTypes.oneOfType([PropTypes.array, PropTypes.objectOf(PropTypes.array)]).isRequired,\n  }\n\n  _getSelectedIds = createSelector(() => this.props.value, createCollectionWrapper(getIds))\n\n  _getObjects = createSelector(\n    () => this.props.xoContainers !== undefined,\n    () => this.props.xoObjects,\n    this._getSelectedIds,\n    () => !this.props.allowMissingObjects,\n    (withContainers, objects, ids, removed) => {\n      const objectsById = getObjectsById(objects)\n      const missingObjects = []\n      const addIfMissing = id => {\n        if (id != null && !(id in objectsById)) {\n          missingObjects.push({\n            id,\n            label: id,\n            removed,\n            value: id,\n          })\n        }\n      }\n      if (Array.isArray(ids)) {\n        ids.forEach(addIfMissing)\n      } else {\n        addIfMissing(ids)\n      }\n\n      return isEmpty(missingObjects)\n        ? objects\n        : withContainers\n          ? {\n              ...objects,\n              missingObjects,\n            }\n          : [...objects, ...missingObjects]\n    }\n  )\n\n  _getObjectsById = createSelector(this._getObjects, getObjectsById)\n\n  _getOptions = createSelector(\n    () => this.props.xoContainers,\n    this._getObjects,\n    () => this.props.compareContainers,\n    () => this.props.compareOptions,\n    (containers, objects, compareContainers, compareOptions) => {\n      // createCollectionWrapper with a depth?\n      const { name } = this.constructor\n\n      let options\n      if (containers === undefined) {\n        if (__DEV__ && !Array.isArray(objects)) {\n          throw new Error(`${name}: without xoContainers, xoObjects must be an array`)\n        }\n\n        options = (compareOptions !== undefined ? objects.sort(compareOptions) : objects).map(getOption)\n      } else {\n        if (__DEV__ && Array.isArray(objects)) {\n          throw new Error(`${name}: with xoContainers, xoObjects must be an object`)\n        }\n\n        options = []\n        const _containers = compareContainers !== undefined ? containers.sort(compareContainers) : containers\n        forEach(_containers, container => {\n          options.push({\n            disabled: true,\n            xoItem: container,\n          })\n\n          const _objects =\n            compareOptions !== undefined ? objects[container.id].sort(compareOptions) : objects[container.id]\n          forEach(_objects, object => {\n            options.push(getOption(object, container))\n          })\n        })\n\n        // missing objects have \"missingObjects\" as container\n        const { missingObjects } = objects\n        if (missingObjects !== undefined) {\n          missingObjects.forEach(object => {\n            options.push(getOption(object))\n          })\n        }\n      }\n\n      options.map(option => {\n        if (option.xoItem.removed) {\n          option.disabled = true\n        }\n        return option\n      })\n      return options\n    }\n  )\n\n  _getSelectedObjects = (() => {\n    const helper = createSelector(\n      this._getObjectsById,\n      value => value,\n      (objectsById, value) =>\n        Array.isArray(value) ? map(value, value => objectsById[value.value]) : objectsById[value.value]\n    )\n    return value => (value == null ? value : helper(value))\n  })()\n\n  _onChange = value => {\n    this.props.onChange(this._getSelectedObjects(value))\n  }\n\n  _selectAll = () => {\n    this._onChange(filter(this._getOptions(), ({ disabled }) => !disabled))\n  }\n\n  // GroupBy: Display option with margin if not disabled and containers exists.\n  _renderOption = option => (\n    <span className={!option.disabled && this.props.xoContainers !== undefined ? 'ml-1' : undefined}>\n      {renderXoItem(option.xoItem, {\n        type:\n          this.props.resourceSet !== undefined && option.xoItem.type !== undefined\n            ? `${option.xoItem.type}-resourceSet`\n            : undefined,\n        memoryFree: option.xoItem.type === 'host' || undefined,\n        showNetwork: true,\n        ...(this.props.optionProps ?? {}),\n      })}\n    </span>\n  )\n\n  render() {\n    const { hasSelectAll, xoContainers, xoObjects, ...props } = this.props\n\n    const select = (\n      <Select\n        {...props}\n        onChange={this._onChange}\n        openOnFocus\n        optionRenderer={this._renderOption}\n        options={this._getOptions()}\n        value={this._getSelectedIds()}\n      />\n    )\n\n    if (!props.multi || !hasSelectAll) {\n      return select\n    }\n\n    // `hasSelectAll` should be provided by react-select after this pull request has been merged:\n    // https://github.com/JedWatson/react-select/pull/748\n    // TODO: remove once it has been merged upstream.\n    return (\n      <div className='input-group'>\n        {select}\n        <span className='input-group-btn'>\n          <Tooltip content={_('selectAll')}>\n            <Button onClick={this._selectAll} style={ADDON_BUTTON_STYLE}>\n              <Icon icon='add' />\n            </Button>\n          </Tooltip>\n        </span>\n      </div>\n    )\n  }\n}\n\nconst makeStoreSelect = (createSelectors, defaultProps) =>\n  uncontrollableInput(options)(connectStore(createSelectors)(props => <GenericSelect {...defaultProps} {...props} />))\n\nconst makeSubscriptionSelect = (subscribe, { placeholder, placeholderMulti = placeholder, ...props } = {}) =>\n  uncontrollableInput(options)(\n    class extends React.PureComponent {\n      state = {}\n\n      _getFilteredXoContainers = createFilter(\n        () => this.state.xoContainers,\n        () => this.props.containerPredicate\n      )\n\n      _getFilteredXoObjects = createSelector(\n        () => this.state.xoObjects,\n        () => this.state.xoContainers && this._getFilteredXoContainers(),\n        () => this.props.predicate,\n        (xoObjects, xoContainers, predicate) => {\n          if (xoContainers == null) {\n            return filter(xoObjects, predicate)\n          } else {\n            // Filter xoObjects with `predicate`...\n            const filteredObjects = mapValues(xoObjects, xoObjectsGroup => filter(xoObjectsGroup, predicate))\n            // ...and keep only those whose xoContainer hasn't been filtered out\n            return pick(\n              filteredObjects,\n              map(xoContainers, container => container.id)\n            )\n          }\n        }\n      )\n\n      componentWillMount() {\n        this.componentWillUnmount = subscribe(::this.setState)\n      }\n\n      render() {\n        return (\n          <GenericSelect\n            {...props}\n            {...this.props}\n            placeholder={this.props.multi ? placeholderMulti : placeholder}\n            xoObjects={this._getFilteredXoObjects()}\n            xoContainers={this.state.xoContainers && this._getFilteredXoContainers()}\n          />\n        )\n      }\n    }\n  )\n\n// ===================================================================\n// XO objects.\n// ===================================================================\n\nconst getPredicate = (state, props) => props.predicate\n\n// ===================================================================\n\nexport const SelectHost = makeStoreSelect(\n  () => {\n    const getHostsByPool = createGetObjectsOfType('host').filter(getPredicate).sort().groupBy('$pool')\n\n    const getPools = createGetObjectsOfType('pool')\n      .pick(createSelector(getHostsByPool, hostsByPool => Object.keys(hostsByPool)))\n      .sort()\n\n    return {\n      xoObjects: getHostsByPool,\n      xoContainers: getPools,\n    }\n  },\n  { placeholder: _('selectHosts') }\n)\n\n// ===================================================================\n\nexport const SelectPool = makeStoreSelect(\n  () => ({\n    xoObjects: createGetObjectsOfType('pool').filter(getPredicate).sort(),\n  }),\n  { placeholder: _('selectPools') }\n)\n\n// ===================================================================\n\nexport const SelectSr = makeStoreSelect(\n  () => {\n    const getPools = createGetObjectsOfType('pool')\n    const getHosts = createGetObjectsOfType('host')\n\n    const getSrsByContainer = createGetObjectsOfType('SR')\n      .filter((_, { predicate }) => predicate || isSrWritable)\n      .sort()\n      .groupBy('$container')\n\n    const getContainerIds = createSelector(getSrsByContainer, srsByContainer => keys(srsByContainer))\n\n    const getContainers = createSelector(\n      getPools.pick(getContainerIds).sort(),\n      getHosts.pick(getContainerIds).sort(),\n      (pools, hosts) => pools.concat(hosts)\n    )\n\n    return {\n      xoObjects: getSrsByContainer,\n      xoContainers: getContainers,\n    }\n  },\n  { placeholder: _('selectSrs') }\n)\n\n// ===================================================================\n\nexport const SelectVm = makeStoreSelect(\n  () => {\n    const getVmsByContainer = createGetObjectsOfType('VM').filter(getPredicate).sort().groupBy('$container')\n\n    const getContainerIds = createSelector(getVmsByContainer, vmsByContainer => keys(vmsByContainer))\n\n    const getPools = createGetObjectsOfType('pool').pick(getContainerIds).sort()\n    const getHosts = createGetObjectsOfType('host').pick(getContainerIds).sort()\n\n    const getContainers = createSelector(getPools, getHosts, (pools, hosts) => pools.concat(hosts))\n\n    return {\n      xoObjects: getVmsByContainer,\n      xoContainers: getContainers,\n    }\n  },\n  { placeholder: _('selectVms') }\n)\n\n// ===================================================================\n\nexport const SelectVmSnapshot = makeStoreSelect(\n  () => {\n    const getSnapshotsByVms = createGetObjectsOfType('VM-snapshot').filter(getPredicate).sort().groupBy('$snapshot_of')\n\n    const getVms = createGetObjectsOfType('VM').pick(createSelector(getSnapshotsByVms, keys)).sort()\n\n    return {\n      xoObjects: getSnapshotsByVms,\n      xoContainers: getVms,\n    }\n  },\n  { placeholder: _('selectVmSnapshots') }\n)\n\n// ===================================================================\n\nexport const SelectHostVm = makeStoreSelect(\n  () => {\n    const getHosts = createGetObjectsOfType('host').filter(getPredicate).sort()\n    const getVms = createGetObjectsOfType('VM').filter(getPredicate).sort()\n\n    const getObjects = createSelector(getHosts, getVms, (hosts, vms) => hosts.concat(vms))\n\n    return {\n      xoObjects: getObjects,\n    }\n  },\n  { placeholder: _('selectHostsVms') }\n)\n\n// ===================================================================\n\nexport const SelectVmTemplate = makeStoreSelect(\n  () => {\n    const getVmTemplatesByPool = createGetObjectsOfType('VM-template').filter(getPredicate).sort().groupBy('$pool')\n    const getPools = createGetObjectsOfType('pool')\n      .pick(createSelector(getVmTemplatesByPool, vmTemplatesByPool => keys(vmTemplatesByPool)))\n      .sort()\n\n    return {\n      xoObjects: getVmTemplatesByPool,\n      xoContainers: getPools,\n    }\n  },\n  { placeholder: _('selectVmTemplates') }\n)\n\n// ===================================================================\n\nexport const SelectNetwork = makeStoreSelect(\n  () => {\n    const getNetworksByPool = createGetObjectsOfType('network').filter(getPredicate).sort().groupBy('$pool')\n    const getPools = createGetObjectsOfType('pool')\n      .pick(createSelector(getNetworksByPool, networksByPool => keys(networksByPool)))\n      .sort()\n\n    return {\n      xoObjects: getNetworksByPool,\n      xoContainers: getPools,\n    }\n  },\n  { placeholder: _('selectNetworks') }\n)\n\n// ===================================================================\n\nexport const SelectPif = makeStoreSelect(\n  () => {\n    const getPifsByHost = createGetObjectsOfType('PIF').filter(getPredicate).sort().groupBy('$host')\n    const getHosts = createGetObjectsOfType('host')\n      .pick(createSelector(getPifsByHost, networksByPool => keys(networksByPool)))\n      .sort()\n\n    return {\n      xoObjects: getPifsByHost,\n      xoContainers: getHosts,\n    }\n  },\n  { placeholder: _('selectPifs') }\n)\n\n// ===================================================================\n\nexport const GenericSelectTag = makeStoreSelect(\n  (_, props) => ({\n    xoObjects: createSelector(\n      createGetTags('objects' in props ? (_, props) => props.objects : undefined)\n        .filter(getPredicate)\n        .sort(),\n      tags => map(tags, tag => ({ id: tag, type: 'tag', value: tag }))\n    ),\n  }),\n  { allowMissingObjects: true, placeholder: _('selectTags') }\n)\n\nexport const SelectTag = decorate([\n  provideState({\n    initialState: () => ({\n      editing: false,\n    }),\n    effects: {\n      addTag:\n        (effects, newTag) =>\n        ({ value }, { multi, onChange }) => {\n          if (newTag === value || (multi && includes(value, newTag))) {\n            return\n          }\n          const _newTag = { id: newTag, type: 'tag', value: newTag }\n          onChange(multi ? [...map(value, tag => ({ id: tag, type: 'tag', value: tag })), _newTag] : _newTag)\n        },\n      closeEdition: () => ({ editing: false }),\n      toggleState,\n    },\n    computed: {\n      value: createCollectionWrapper((_, { value }) => getIds(value)),\n    },\n  }),\n  injectState,\n  ({ state, effects, resetState, allowCustomTag, ...props }) => (\n    <span>\n      {allowCustomTag ? (\n        state.editing ? (\n          <EphemeralInput closeEdition={effects.closeEdition} onChange={effects.addTag} type='text' />\n        ) : (\n          <Tooltip content={_('customTag')}>\n            <Button name='editing' onClick={effects.toggleState} size='small'>\n              <Icon icon='edit' />\n            </Button>\n          </Tooltip>\n        )\n      ) : null}\n      <GenericSelectTag {...props} />\n    </span>\n  ),\n])\n\nSelectTag.propTypes = {\n  allowCustomTag: PropTypes.bool,\n}\n\nSelectTag.defaultProps = {\n  allowCustomTag: true,\n}\n\n// ===================================================================\n\nexport const SelectHighLevelObject = makeStoreSelect(\n  () => {\n    const getHosts = createGetObjectsOfType('host').filter(getPredicate)\n    const getNetworks = createGetObjectsOfType('network').filter(getPredicate)\n    const getPools = createGetObjectsOfType('pool').filter(getPredicate)\n    const getSrs = createGetObjectsOfType('SR').filter(getPredicate)\n    const getVms = createGetObjectsOfType('VM').filter(getPredicate)\n\n    const getHighLevelObjects = createSelector(\n      getHosts,\n      getNetworks,\n      getPools,\n      getSrs,\n      getVms,\n      (hosts, networks, pools, srs, vms) =>\n        sortBy(Object.assign({}, hosts, networks, pools, srs, vms), ['type', 'name_label'])\n    )\n\n    return { xoObjects: getHighLevelObjects }\n  },\n  { placeholder: _('selectObjects') }\n)\n\n// ===================================================================\n\nexport const SelectVdi = makeStoreSelect(\n  () => {\n    const getSrs = createGetObjectsOfType('SR').filter((_, props) => props.srPredicate)\n    const getVdis = createGetObjectsOfType('VDI')\n      .filter(\n        createSelector(getSrs, getPredicate, (srs, predicate) =>\n          predicate ? vdi => srs[vdi.$SR] && predicate(vdi) : vdi => srs[vdi.$SR]\n        )\n      )\n      .sort()\n      .groupBy('$SR')\n\n    return {\n      xoObjects: getVdis,\n      xoContainers: getSrs.sort(),\n    }\n  },\n  { placeholder: _('selectVdis') }\n)\nSelectVdi.propTypes = {\n  srPredicate: PropTypes.func,\n}\n\n// ===================================================================\n\nexport const SelectVgpuType = makeStoreSelect(\n  () => {\n    const getVgpuTypes = createSelector(createGetObjectsOfType('vgpuType').filter(getPredicate), vgpuTypes => {\n      const gpuGroups = {}\n      forEach(vgpuTypes, vgpuType => {\n        forEach(vgpuType.gpuGroups, gpuGroup => {\n          if (gpuGroups[gpuGroup] === undefined) {\n            gpuGroups[gpuGroup] = []\n          }\n          gpuGroups[gpuGroup].push({\n            ...vgpuType,\n            gpuGroup,\n          })\n        })\n      })\n\n      return gpuGroups\n    })\n\n    const getGpuGroups = createGetObjectsOfType('gpuGroup').pick(createSelector(getVgpuTypes, keys)).sort()\n\n    return {\n      xoObjects: getVgpuTypes,\n      xoContainers: getGpuGroups,\n    }\n  },\n  { placeholder: _('selectVgpuType') }\n)\n\n// ===================================================================\n// Objects from subscriptions.\n// ===================================================================\n\nexport const SelectSubject = makeSubscriptionSelect(\n  subscriber => {\n    let subjects = {}\n\n    let usersLoaded, groupsLoaded\n    const set = newSubjects => {\n      subjects = newSubjects\n      /* We must wait for groups AND users options to be loaded,\n       * or a previously set value belonging to one type or another might be discarded\n       * by the internal <GenericSelect>\n       */\n      if (usersLoaded && groupsLoaded) {\n        subscriber({\n          xoObjects: subjects,\n        })\n      }\n    }\n\n    const unsubscribeGroups = subscribeGroups(groups => {\n      groupsLoaded = true\n      set([...filter(subjects, subject => subject.type === 'user'), ...groups])\n    })\n\n    const unsubscribeUsers = subscribeUsers(users => {\n      usersLoaded = true\n      set([...filter(subjects, subject => subject.type === 'group'), ...users])\n    })\n\n    return () => {\n      unsubscribeGroups()\n      unsubscribeUsers()\n    }\n  },\n  { placeholder: _('selectSubjects') }\n)\n\nexport const SelectUser = makeSubscriptionSelect(\n  subscriber => {\n    const unsubscribeUsers = subscribeUsers(users => {\n      subscriber({\n        xoObjects: users,\n      })\n    })\n\n    return unsubscribeUsers\n  },\n  { placeholder: _('selectUser') }\n)\n\n// ===================================================================\n\nexport const SelectRole = makeSubscriptionSelect(\n  subscriber => {\n    const unsubscribeRoles = subscribeRoles(roles => {\n      const xoObjects = map(sortBy(roles, 'name'), role => ({\n        ...role,\n        type: 'role',\n      }))\n      subscriber({ xoObjects })\n    })\n    return unsubscribeRoles\n  },\n  { placeholder: _('selectRole') }\n)\n\n// ===================================================================\n\nexport const SelectRemote = makeSubscriptionSelect(\n  subscriber => {\n    const unsubscribeRemotes = subscribeRemotes(remotes => {\n      const xoObjects = groupBy(\n        map(sortBy(remotes, 'name'), remote => ({\n          id: remote.id,\n          type: 'remote',\n          value: { ...remote, ...parseRemote(remote.url) },\n        })).filter(r => !r.value.invalid),\n        remote => remote.value.type\n      )\n\n      subscriber({\n        xoObjects,\n        xoContainers: map(xoObjects, (remote, type) => ({\n          id: type,\n          label: type,\n        })),\n      })\n    })\n\n    return unsubscribeRemotes\n  },\n  { placeholder: _('selectRemotes') }\n)\n\n// ===================================================================\n\nexport const SelectProxy = makeSubscriptionSelect(\n  subscriber =>\n    subscribeProxies(proxies => {\n      subscriber({\n        xoObjects: sortBy(proxies, 'name').map(proxy => ({\n          ...proxy,\n          type: 'proxy',\n        })),\n      })\n    }),\n  { placeholderMulti: _('selectProxies'), placeholder: _('selectProxy') }\n)\n\n// ===================================================================\n\nexport const SelectResourceSet = makeSubscriptionSelect(\n  subscriber => {\n    const unsubscribeResourceSets = subscribeResourceSets(resourceSets => {\n      const xoObjects = map(sortBy(resolveResourceSets(resourceSets), 'name'), resourceSet => ({\n        ...resourceSet,\n        type: 'resourceSet',\n      }))\n\n      subscriber({ xoObjects })\n    })\n\n    return unsubscribeResourceSets\n  },\n  { placeholder: _('selectResourceSets') }\n)\n\n// ===================================================================\n\nexport class SelectResourceSetsVmTemplate extends React.PureComponent {\n  get value() {\n    return this.refs.select.value\n  }\n\n  set value(value) {\n    this.refs.select.value = value\n  }\n\n  _getTemplates = createSelector(\n    () => this.props.resourceSet,\n    ({ objectsByType }) => {\n      const { predicate } = this.props\n      const templates = objectsByType['VM-template']\n      return sortBy(predicate ? filter(templates, predicate) : templates, 'name_label')\n    }\n  )\n\n  render() {\n    return (\n      <GenericSelect\n        ref='select'\n        placeholder={_('selectResourceSetsVmTemplate')}\n        {...this.props}\n        xoObjects={this._getTemplates()}\n      />\n    )\n  }\n}\n\n// ===================================================================\n\nexport class SelectResourceSetsSr extends React.PureComponent {\n  get value() {\n    return this.refs.select.value\n  }\n\n  set value(value) {\n    this.refs.select.value = value\n  }\n\n  _getSrs = createSort(\n    createFilter(\n      () => this.props.resourceSet.objectsByType.SR,\n      createSelector(\n        () => this.props.predicate,\n        predicate => predicate || (() => true)\n      )\n    ),\n    'name_label'\n  )\n\n  render() {\n    return (\n      <GenericSelect ref='select' placeholder={_('selectResourceSetsSr')} {...this.props} xoObjects={this._getSrs()} />\n    )\n  }\n}\n\n// ===================================================================\n\nexport class SelectResourceSetsVdi extends React.PureComponent {\n  get value() {\n    return this.refs.select.value\n  }\n\n  set value(value) {\n    this.refs.select.value = value\n  }\n\n  _getObject(id) {\n    return getObject(store.getState(), id, true)\n  }\n\n  _getSrs = createSelector(\n    () => this.props.resourceSet,\n    ({ objectsByType }) => {\n      const { srPredicate } = this.props\n      const srs = objectsByType.SR\n      return srPredicate ? filter(srs, srPredicate) : srs\n    }\n  )\n\n  _getVdis = createSelector(this._getSrs, srs =>\n    sortBy(map(flatten(map(srs, sr => sr.VDIs)), this._getObject), 'name_label')\n  )\n\n  render() {\n    return (\n      <GenericSelect\n        ref='select'\n        placeholder={_('selectResourceSetsVdi')}\n        {...this.props}\n        xoObjects={this._getVdis()}\n      />\n    )\n  }\n}\n\n// ===================================================================\n\nexport class SelectResourceSetsNetwork extends React.PureComponent {\n  get value() {\n    return this.refs.select.value\n  }\n\n  set value(value) {\n    this.refs.select.value = value\n  }\n\n  _getNetworks = createSort(\n    createFilter(\n      () => this.props.resourceSet.objectsByType.network,\n      createSelector(\n        () => this.props.predicate,\n        predicate => predicate || (() => true)\n      )\n    ),\n    'name_label'\n  )\n\n  render() {\n    return (\n      <GenericSelect\n        ref='select'\n        placeholder={_('selectResourceSetsNetwork')}\n        {...this.props}\n        xoObjects={this._getNetworks()}\n      />\n    )\n  }\n}\n\n// ===================================================================\n\n// Pass a function to @addSubscriptions to ensure subscribeIpPools and subscribeResourceSets\n// are correctly imported before they are called\n@addSubscriptions(() => ({\n  ipPools: subscribeIpPools,\n  resourceSets: subscribeResourceSets,\n}))\nexport class SelectResourceSetIp extends React.Component {\n  static propTypes = {\n    containerPredicate: PropTypes.func,\n    predicate: PropTypes.func,\n    resourceSetId: PropTypes.string.isRequired,\n  }\n\n  get value() {\n    return this.refs.select.value\n  }\n\n  set value(value) {\n    this.refs.select.value = value\n  }\n\n  _getResourceSetIpPools = createSelector(\n    () => this.props.ipPools,\n    () => this.props.resourceSets,\n    () => this.props.resourceSetId,\n    (allIpPools, allResourceSets, resourceSetId) => {\n      const { ipPools } = allResourceSets[resourceSetId]\n      return filter(allIpPools, ({ id }) => includes(ipPools, id))\n    }\n  )\n\n  _getIpPools = createSelector(\n    () => this.props.ipPools,\n    () => this.props.containerPredicate,\n    (ipPools, predicate) => (predicate ? filter(ipPools, predicate) : ipPools)\n  )\n\n  _getIps = createSelector(\n    this._getIpPools,\n    () => this.props.predicate,\n    () => this.props.ipPools,\n    (ipPools, predicate, resolvedIpPools) => {\n      return flatten(\n        map(ipPools, ipPool => {\n          const poolIps = map(ipPool.addresses, (address, ip) => ({\n            ...address,\n            id: ip,\n            label: ip,\n            type: 'ipAddress',\n            used: !isEmpty(address.vifs),\n          }))\n          return predicate ? filter(poolIps, predicate) : poolIps\n        })\n      )\n    }\n  )\n\n  render() {\n    return <GenericSelect ref='select' placeholder={_('selectIpPool')} {...this.props} xoObjects={this._getIps()} />\n  }\n}\n\n// ===================================================================\n\nexport class SelectSshKey extends React.PureComponent {\n  state = {}\n\n  get value() {\n    return this.refs.select.value\n  }\n\n  set value(value) {\n    this.refs.select.value = value\n  }\n\n  componentWillMount() {\n    this.componentWillUnmount = subscribeCurrentUser(user => {\n      this.setState({\n        sshKeys:\n          user &&\n          user.preferences &&\n          map(user.preferences.sshKeys, (key, id) => ({\n            id,\n            label: key.title,\n            type: 'sshKey',\n          })),\n      })\n    })\n  }\n\n  render() {\n    return (\n      <GenericSelect\n        ref='select'\n        placeholder={_('selectSshKey')}\n        {...this.props}\n        xoObjects={this.state.sshKeys || []}\n      />\n    )\n  }\n}\n\n// ===================================================================\n\nexport const SelectIp = makeSubscriptionSelect(\n  subscriber => {\n    const unsubscribeIpPools = subscribeIpPools(ipPools => {\n      const sortedIpPools = sortBy(ipPools, 'name')\n      const xoObjects = mapValues(groupBy(sortedIpPools, 'id'), ipPools =>\n        map(ipPools[0].addresses, (address, ip) => ({\n          ...address,\n          id: ip,\n          label: ip,\n          type: 'ipAddress',\n          used: !isEmpty(address.vifs),\n        }))\n      )\n      const xoContainers = map(sortedIpPools, ipPool => ({\n        ...ipPool,\n        type: 'ipPool',\n      }))\n      subscriber({ xoObjects, xoContainers })\n    })\n\n    return unsubscribeIpPools\n  },\n  { placeholder: _('selectIp') }\n)\n\n// ===================================================================\n\nexport const SelectIpPool = makeSubscriptionSelect(\n  subscriber => {\n    const unsubscribeIpPools = subscribeIpPools(ipPools => {\n      subscriber({\n        xoObjects: map(sortBy(ipPools, 'name'), ipPool => ({\n          ...ipPool,\n          type: 'ipPool',\n        })),\n      })\n    })\n\n    return unsubscribeIpPools\n  },\n  { placeholder: _('selectIpPool') }\n)\n\n// ===================================================================\n\nexport const SelectCloudConfig = makeSubscriptionSelect(\n  subscriber =>\n    subscribeCloudConfigs(cloudConfigs => {\n      subscriber({\n        xoObjects: map(sortBy(cloudConfigs, 'name'), cloudConfig => ({\n          ...cloudConfig,\n          type: 'cloudConfig',\n        })),\n      })\n    }),\n  { placeholder: _('selectCloudConfigs') }\n)\n\nexport const SelectNetworkConfig = makeSubscriptionSelect(\n  subscriber =>\n    subscribeNetworkConfigs(networkConfigs => {\n      subscriber({\n        xoObjects: map(sortBy(networkConfigs, 'name'), networkConfigs => ({\n          ...networkConfigs,\n          type: 'cloudConfig',\n        })),\n      })\n    }),\n  { placeholder: _('selectNetworkConfigs') }\n)\n\n// ===================================================================\n\nexport const SelectXoCloudConfig = makeSubscriptionSelect(\n  subscriber =>\n    subscribeCloudXoConfigBackups(configs => {\n      const xoObjects = groupBy(\n        map(configs, config => ({ ...config, type: 'xoConfig' }))\n          // from newest to oldest\n          .sort((a, b) => b.createdAt - a.createdAt),\n        'xoaId'\n      )\n      subscriber({\n        xoObjects,\n        xoContainers: map(xoObjects, (configs, id) => ({ ...configs, id, type: 'VM' })),\n      })\n    }),\n  { placeholder: _('selectXoConfig') }\n)\n\n// ===================================================================\n\nexport const SelectSchedule = makeSubscriptionSelect(\n  subscriber => {\n    let schedules, jobs, backupJobs, mirrorJobs, metadataJobs\n    const updateData = () => {\n      if (\n        schedules !== undefined &&\n        jobs !== undefined &&\n        backupJobs !== undefined &&\n        mirrorJobs !== undefined &&\n        metadataJobs !== undefined\n      ) {\n        // everything is loaded\n        subscriber({\n          xoObjects: groupBy(schedules, 'jobId'),\n          xoContainers: [...jobs, ...backupJobs, ...mirrorJobs, ...metadataJobs],\n        })\n      }\n    }\n    const unsubscribeSchedules = subscribeSchedules(_schedules => {\n      schedules = _schedules.map(schedule => ({ ...schedule, type: 'schedule' }))\n      updateData()\n    })\n\n    const unsubscribeJobs = subscribeJobs(_jobs => {\n      jobs = _jobs.map(_job => ({ ..._job, type: 'job' }))\n      updateData()\n    })\n    const unsubscribeBackupJobs = subscribeBackupNgJobs(_jobs => {\n      backupJobs = _jobs.map(_job => ({ ..._job, type: 'job' }))\n      updateData()\n    })\n    const unsubscribeMirrorBackupJobs = subscribeMirrorBackupJobs(_jobs => {\n      mirrorJobs = _jobs.map(_job => ({ ..._job, type: 'job' }))\n      updateData()\n    })\n    const unsubscribeMetadataJobs = subscribeMetadataBackupJobs(_jobs => {\n      metadataJobs = _jobs.map(_job => ({ ..._job, type: 'job' }))\n      updateData()\n    })\n\n    return () => {\n      unsubscribeSchedules()\n      unsubscribeJobs()\n      unsubscribeBackupJobs()\n      unsubscribeMirrorBackupJobs()\n      unsubscribeMetadataJobs()\n    }\n  },\n  { placeholder: _('selectSchedule') }\n)\n","import _ from 'intl'\nimport React from 'react'\nimport defined, { get } from '@xen-orchestra/defined'\nimport { injectState, provideState } from 'reaclette'\n\nimport decorate from './apply-decorators'\nimport Icon from './icon'\nimport renderXoItem from './render-xo-item'\nimport { connectStore } from './utils'\nimport { createGetObject } from './selectors'\nimport { editVm, editPool, isSrWritable } from './xo'\nimport { XoSelect } from './editable'\n\nexport const SelectSuspendSr = decorate([\n  connectStore({\n    suspendSr: createGetObject((_, { pool, vm }) => (vm || pool).suspendSr),\n  }),\n  provideState({\n    effects: {\n      onChange(_, value) {\n        const { isVm } = this.state\n        const method = isVm ? editVm : editPool\n        method(isVm ? this.props.vm : this.props.pool, {\n          suspendSr: defined(\n            get(() => value.id),\n            null\n          ),\n        })\n      },\n    },\n    computed: {\n      isVm: (state, props) => props.vm !== undefined,\n      predicate: (state, props) => sr =>\n        isSrWritable(sr) && (state.isVm ? props.vm.$pool === sr.$pool : props.pool.id === sr.$pool),\n    },\n  }),\n  injectState,\n  ({ effects: { onChange }, state: { predicate }, suspendSr }) => (\n    <span>\n      <XoSelect onChange={onChange} predicate={predicate} value={suspendSr} xoType='SR'>\n        {suspendSr !== undefined ? renderXoItem(suspendSr) : _('noValue')}\n      </XoSelect>{' '}\n      {suspendSr !== undefined && (\n        <a role='button' onClick={onChange}>\n          <Icon icon='remove' />\n        </a>\n      )}\n    </span>\n  ),\n])\n","import add from 'lodash/add'\nimport defined from '@xen-orchestra/defined'\nimport { check as checkPermissions } from 'xo-acl-resolver'\nimport { createSelector as create } from 'reselect'\nimport {\n  difference,\n  filter,\n  find,\n  forEach,\n  forOwn,\n  groupBy,\n  identity,\n  isArrayLike,\n  isEmpty,\n  keyBy,\n  keys,\n  map,\n  orderBy,\n  pick,\n  pickBy,\n  size,\n  slice,\n  some,\n} from 'lodash'\n\nimport invoke from './invoke'\nimport shallowEqual from './shallow-equal'\nimport { EMPTY_ARRAY, EMPTY_OBJECT, getDetachedBackupsOrSnapshots } from './utils'\n\n// ===================================================================\n\nexport {\n  // That's usually the name we want to import.\n  createSelector,\n  // But selectors.create is nice too :)\n  createSelector as create,\n} from 'reselect'\n\n// -------------------------------------------------------------------\n\n// Wraps a function which returns a collection to returns the previous\n// result if the collection has not really changed (ie still has the\n// same items).\n//\n// Use case: in connect, to avoid rerendering a component where the\n// objects are still the same.\nconst _createCollectionWrapper = selector => {\n  let cache, previous\n\n  return (...args) => {\n    const value = selector(...args)\n    if (value !== previous) {\n      previous = value\n\n      if (!shallowEqual(value, cache)) {\n        cache = value\n      }\n    }\n    return cache\n  }\n}\nexport { _createCollectionWrapper as createCollectionWrapper }\n\nconst _SELECTOR_PLACEHOLDER = Symbol('selector placeholder')\n\n// Experimental!\n//\n// Similar to reselect's createSelector() but inputs can be either\n// selectors or plain values.\n//\n// To pass a function as a plain value, simply wrap it with an array.\nconst _create2 = (...inputs) => {\n  const resultFn = inputs.pop()\n\n  if (inputs.length === 1 && Array.isArray(inputs[0])) {\n    inputs = inputs[0]\n  }\n\n  const n = inputs.length\n\n  const inputSelectors = []\n  for (let i = 0; i < n; ++i) {\n    const input = inputs[i]\n\n    if (typeof input === 'function') {\n      inputSelectors.push(input)\n      inputs[i] = _SELECTOR_PLACEHOLDER\n    } else if (Array.isArray(input) && input.length === 1) {\n      inputs[i] = input[0]\n    }\n  }\n\n  if (!inputSelectors.length) {\n    throw new Error('no input selectors')\n  }\n\n  return create(inputSelectors, function () {\n    const args = new Array(n)\n    for (let i = 0, j = 0; i < n; ++i) {\n      const input = inputs[i]\n      args[i] = input === _SELECTOR_PLACEHOLDER ? arguments[j++] : input\n    }\n\n    return resultFn.apply(this, args)\n  })\n}\n\n// ===================================================================\n// Generic selector creators.\n\nexport const createCounter = (collection, predicate) =>\n  _create2(collection, predicate, (collection, predicate) => {\n    if (!predicate) {\n      return size(collection)\n    }\n\n    let count = 0\n    forEach(collection, item => {\n      if (predicate(item)) {\n        ++count\n      }\n    })\n    return count\n  })\n\n// Creates an object selector from an object selector and a properties\n// selector.\n//\n// Should only be used with a reasonable number of properties.\nexport const createPicker = (object, props) =>\n  _create2(\n    object,\n    props,\n    _createCollectionWrapper((object, props) => {\n      const values = {}\n      forEach(props, prop => {\n        const value = object[prop]\n        if (value) {\n          values[prop] = value\n        }\n      })\n      return values\n    })\n  )\n\n// Special cases:\n// - predicate == null → no filtering\n// - predicate === false → everything is filtered out\nexport const createFilter = (collection, predicate) =>\n  _create2(\n    collection,\n    predicate,\n    _createCollectionWrapper((collection, predicate) =>\n      predicate === false\n        ? isArrayLike(collection)\n          ? EMPTY_ARRAY\n          : EMPTY_OBJECT\n        : predicate\n          ? (isArrayLike(collection) ? filter : pickBy)(collection, predicate)\n          : collection\n    )\n  )\n\nexport const createFinder = (collection, predicate) => _create2(collection, predicate, find)\n\nexport const createGroupBy = (collection, getter) => _create2(collection, getter, groupBy)\n\nexport const createPager = (array, page, n = 25) =>\n  _create2(\n    array,\n    page,\n    n,\n    _createCollectionWrapper((array, page, n) => {\n      const start = (page - 1) * n\n      return slice(array, start, start + n)\n    })\n  )\n\nexport const createSort = (collection, getter = 'name_label', order = 'asc') =>\n  _create2(collection, getter, order, orderBy)\n\nexport const createSumBy = (itemsSelector, iterateeSelector) =>\n  _create2(itemsSelector, iterateeSelector, (items, iteratee) => map(items, iteratee).reduce(add, 0))\n\nexport const createTop = (collection, iteratee, n) =>\n  _create2(\n    collection,\n    iteratee,\n    n,\n    _createCollectionWrapper((objects, iteratee, n) => {\n      const results = orderBy(objects, iteratee, 'desc')\n      if (n < results.length) {\n        results.length = n\n      }\n      return results\n    })\n  )\n\n// ===================================================================\n// Root-ish selectors (no dependencies).\n\nexport const areObjectsFetched = state => state.objects.fetched\n\nconst _getId = (state, { routeParams, id }) => (routeParams ? routeParams.id : id)\n\nexport const getLang = state => state.lang\n\nexport const getStatus = state => state.status\n\nexport const getUser = state => state.user\n\nexport const getXoaState = state => state.xoaUpdaterState\n\nexport const getCheckPermissions = invoke(() => {\n  const getPredicate = create(\n    state => state.permissions,\n    state => state.objects,\n    (permissions, objects) => {\n      objects = objects.all\n      const getObject = id => objects[id] || EMPTY_OBJECT\n\n      return (id, permission) => checkPermissions(permissions, getObject, id, permission)\n    }\n  )\n\n  const isTrue = () => true\n  const isFalse = () => false\n\n  return state => {\n    const user = getUser(state)\n\n    if (!user) {\n      return isFalse\n    }\n\n    if (user.permission === 'admin') {\n      return isTrue\n    }\n\n    return getPredicate(state)\n  }\n})\n\nconst _getPermissionsPredicate = invoke(() => {\n  const getCache = create(identity, () => ({ __proto__: null }))\n\n  const getPredicate = create(\n    state => state.permissions,\n    state => state.objects,\n    (permissions, objects) => {\n      const cache = getCache(permissions)\n      objects = objects.all\n      const getObject = id => objects[id] || EMPTY_OBJECT\n\n      return id => {\n        if (typeof id !== 'string') {\n          id = id.id\n        }\n        let allowed = cache[id]\n        if (allowed === undefined) {\n          allowed = cache[id] = checkPermissions(permissions, getObject, id, 'view')\n        }\n        return allowed\n      }\n    }\n  )\n\n  return (state, props, useResourceSet) => {\n    const user = getUser(state)\n    if (!user) {\n      return false\n    }\n\n    if (user.permission === 'admin' || useResourceSet) {\n      return // No predicate means no filtering.\n    }\n\n    return getPredicate(state)\n  }\n})\n\nexport const isAdmin = (...args) => {\n  const user = getUser(...args)\n\n  return user && user.permission === 'admin'\n}\n\n// ===================================================================\n// Common selector creators.\n\n// Creates an object selector from an id selector.\nexport const createGetObject =\n  (idSelector = _getId) =>\n  (state, props, useResourceSet) => {\n    const object = state.objects.all[idSelector(state, props)]\n    if (!object) {\n      return\n    }\n\n    if (useResourceSet) {\n      return object\n    }\n\n    const predicate = _getPermissionsPredicate(state)\n\n    if (!predicate) {\n      if (predicate == null) {\n        return object // no filtering\n      }\n\n      // predicate is false.\n      return\n    }\n\n    if (predicate(object)) {\n      return object\n    }\n  }\n\n// Specialized createSort() configured for a given type.\nexport const createSortForType = invoke(() => {\n  const iterateesByType = {\n    message: message => message.time,\n    PIF: pif => pif.device,\n    patch: patch => patch.name,\n    pool: pool => pool.name_label,\n    tag: tag => tag,\n    VBD: vbd => vbd.position,\n    'VDI-snapshot': snapshot => snapshot.snapshot_time,\n    'VM-snapshot': snapshot => snapshot.snapshot_time,\n  }\n  const defaultIteratees = [object => object.$pool, object => object.name_label]\n  const getIteratees = type => iterateesByType[type] || defaultIteratees\n\n  const ordersByType = {\n    message: 'desc',\n    'VDI-snapshot': 'desc',\n    'VM-snapshot': 'desc',\n  }\n  const getOrders = type => ordersByType[type]\n\n  const autoSelector = (type, fn) =>\n    typeof type === 'function' ? (state, props) => fn(type(state, props)) : [fn(type)]\n\n  return (type, collection) => createSort(collection, autoSelector(type, getIteratees), autoSelector(type, getOrders))\n})\n\n// Add utility methods to a collection selector.\nconst _extendCollectionSelector = (selector, objectsType) => {\n  // Terminal methods.\n  const _addCount = selector => {\n    selector.count = predicate => createCounter(selector, predicate)\n    return selector\n  }\n  _addCount(selector)\n  const _addGroupBy = selector => {\n    selector.groupBy = getter => createGroupBy(selector, getter)\n    return selector\n  }\n  _addGroupBy(selector)\n  const _addFind = selector => {\n    selector.find = predicate => createFinder(selector, predicate)\n    return selector\n  }\n  _addFind(selector)\n\n  // groupBy can be chained.\n  const _addSort = selector => {\n    // TODO: maybe memoize when no idsSelector.\n    selector.sort = () => _addGroupBy(createSortForType(objectsType, selector))\n    return selector\n  }\n  _addSort(selector)\n\n  // count, groupBy and sort can be chained.\n  const _addFilter = selector => {\n    selector.filter = predicate => _addCount(_addGroupBy(_addSort(createFilter(selector, predicate))))\n    return selector\n  }\n  _addFilter(selector)\n\n  // filter, groupBy and sort can be chained.\n  selector.pick = idsSelector => _addFind(_addFilter(_addGroupBy(_addSort(createPicker(selector, idsSelector)))))\n\n  return selector\n}\n\n// Creates a collection selector which returns all objects of a given\n// type.\n//\n// The selector as the following methods:\n//\n// - count: returns a selector which returns the number of objects\n// - filter: returns a selector which returns the objects filtered by\n//           a predicate (count, groupBy and sort can be chained)\n// - find: returns a selector which returns the first object matching\n//         a predicate\n// - groupBy: returns a selector which returns the objects grouped by\n//            a value determined by a getter selector\n// - pick: returns a selector which returns only the objects with given\n//         ids (filter, find, groupBy and sort can be chained)\n// - sort: returns a selector which returns the objects appropriately\n//         sorted (groupBy can be chained)\nexport const createGetObjectsOfType = type => {\n  const getObjects =\n    typeof type === 'function'\n      ? (state, props) => state.objects.byType[type(state, props)] || EMPTY_OBJECT\n      : state => state.objects.byType[type] || EMPTY_OBJECT\n\n  return _extendCollectionSelector(createFilter(getObjects, _getPermissionsPredicate), type)\n}\n\nexport const createGetTags = collectionSelectors => {\n  if (!collectionSelectors) {\n    collectionSelectors = [\n      createGetObjectsOfType('host'),\n      createGetObjectsOfType('pool'),\n      createGetObjectsOfType('VM'),\n      createGetObjectsOfType('SR'),\n    ]\n  }\n\n  const getTags = create(collectionSelectors, (...collections) => {\n    const tags = {}\n\n    const addTag = tag => {\n      tags[tag] = null\n    }\n    const addItemTags = item => {\n      forEach(item.tags, addTag)\n    }\n    const addCollectionTags = collection => {\n      forEach(collection, addItemTags)\n    }\n    forEach(collections, addCollectionTags)\n\n    return keys(tags)\n  })\n\n  return _extendCollectionSelector(getTags, 'tag')\n}\n\nexport const createGetVmLastShutdownTime = (getVmId = (_, { vm }) => (vm != null ? vm.id : undefined)) =>\n  create(getVmId, createGetObjectsOfType('message'), (vmId, messages) => {\n    let max = null\n    forEach(messages, message => {\n      if (message.$object === vmId && message.name === 'VM_SHUTDOWN' && (max === null || message.time > max)) {\n        max = message.time\n      }\n    })\n    return max\n  })\n\nexport const createGetObjectMessages = objectSelector =>\n  createGetObjectsOfType('message')\n    .filter(\n      create(\n        (...args) => objectSelector(...args).id,\n        id => message => message.$object === id\n      )\n    )\n    .sort()\n\n// Example of use:\n// import store from 'store'\n// const object = getObject(store.getState(), objectId)\n// ...\nexport const getObject = createGetObject((_, id) => id)\n\nexport const createDoesHostNeedRestart = hostSelector => {\n  const patchRequiresReboot = createGetObjectsOfType('patch')\n    .pick(create(hostSelector, host => host.patches))\n    .find(\n      create(\n        hostSelector,\n        host =>\n          ({ guidance, time, upgrade }) =>\n            time > host.startTime &&\n            (upgrade || some(guidance, action => action === 'restartHost' || action === 'restartXapi'))\n      )\n    )\n\n  return create(\n    hostSelector,\n    (...args) => args,\n    (host, args) => host.rebootRequired || !!patchRequiresReboot(...args)\n  )\n}\n\nexport const createGetHostMetrics = hostSelector =>\n  create(\n    hostSelector,\n    _createCollectionWrapper(hosts => {\n      const metrics = {\n        count: 0,\n        cpus: 0,\n        memoryTotal: 0,\n        memoryUsage: 0,\n      }\n      forEach(hosts, host => {\n        metrics.count++\n        metrics.cpus += host.cpus.cores\n        metrics.memoryTotal += host.memory.size\n        metrics.memoryUsage += host.memory.usage\n      })\n      return metrics\n    })\n  )\n\nexport const createGetVmDisks = vmSelector =>\n  createGetObjectsOfType('VDI').pick(\n    create(\n      createGetObjectsOfType('VBD').pick((state, props) => vmSelector(state, props).$VBDs),\n      _createCollectionWrapper(vbds => map(vbds, vbd => (vbd.is_cd_drive ? undefined : vbd.VDI)))\n    )\n  )\n\nexport const getIsPoolAdmin = create(\n  create(createGetObjectsOfType('pool'), _createCollectionWrapper(Object.keys)),\n  getCheckPermissions,\n  (poolsIds, check) => some(poolsIds, poolId => check(poolId, 'administrate'))\n)\n\nexport const getLoneSnapshots = create(\n  create(\n    createFilter(createGetObjectsOfType('VM-snapshot'), [({ other }) => other['xo:backup:job'] !== undefined]),\n    backupSnapshots =>\n      map(backupSnapshots, snapshot => {\n        const other = snapshot.other\n        return {\n          ...snapshot,\n          jobId: other['xo:backup:job'],\n          vmId: other['xo:backup:vm'],\n          scheduleId: other['xo:backup:schedule'],\n        }\n      })\n  ),\n  _createCollectionWrapper((_, { jobs }) => (jobs === undefined ? undefined : keyBy(jobs, 'id'))),\n  _createCollectionWrapper((_, { schedules }) => (schedules === undefined ? undefined : keyBy(schedules, 'id'))),\n  createGetObjectsOfType('VM'),\n  _createCollectionWrapper((snapshots, jobs, schedules, vms) =>\n    getDetachedBackupsOrSnapshots(snapshots, { jobs, schedules, vms })\n  )\n)\n\nconst _getResolvedResourceSet = (resourceSet, networks, srs, vms) => {\n  if (resourceSet === undefined) {\n    return\n  }\n\n  const { objects, ...attrs } = resourceSet\n  const objectsByType = {}\n  const objectsFound = []\n\n  const resolve = (type, _objects) => {\n    const resolvedObjects = pick(_objects, objects)\n    if (!isEmpty(resolvedObjects)) {\n      objectsFound.push(...Object.keys(resolvedObjects))\n      objectsByType[type] = Object.values(resolvedObjects)\n    }\n  }\n  resolve('VM-template', vms)\n  resolve('SR', srs)\n  resolve('network', networks)\n\n  return {\n    ...attrs,\n    missingObjects: difference(objectsFound, objects),\n    objectsByType,\n  }\n}\n\nexport const getResolvedResourceSet = create(\n  (_, props) => props.resourceSet,\n  createGetObjectsOfType('network'),\n  createGetObjectsOfType('SR'),\n  createGetObjectsOfType('VM-template'),\n  _getResolvedResourceSet\n)\n\nexport const getResolvedResourceSets = create(\n  (_, props) => props.resourceSets,\n  createGetObjectsOfType('network'),\n  createGetObjectsOfType('SR'),\n  createGetObjectsOfType('VM-template'),\n  (resourceSets, networks, srs, vms) =>\n    map(resourceSets, resourceSet => _getResolvedResourceSet(resourceSet, networks, srs, vms))\n)\n\nexport const createGetHostState = getHost =>\n  create(\n    (state, props) => getHost(state, props).power_state,\n    (state, props) => getHost(state, props).enabled,\n    (state, props) => getHost(state, props).current_operations,\n    (powerState, enabled, operations) =>\n      powerState !== 'Running' ? powerState : !isEmpty(operations) ? 'Busy' : !enabled ? 'Disabled' : 'Running'\n  )\n\nconst taskPredicate = obj => !isEmpty(obj.current_operations)\nconst getLinkedObjectsByTaskRefOrId = create(\n  createGetObjectsOfType('pool').filter([taskPredicate]),\n  createGetObjectsOfType('host').filter([taskPredicate]),\n  createGetObjectsOfType('SR').filter([taskPredicate]),\n  createGetObjectsOfType('VDI').filter([taskPredicate]),\n  createGetObjectsOfType('VM').filter([taskPredicate]),\n  createGetObjectsOfType('network').filter([taskPredicate]),\n  getCheckPermissions,\n  (pools, hosts, srs, vdis, vms, networks, check) => {\n    const linkedObjectsByTaskRefOrId = {}\n    const resolveLinkedObjects = obj => {\n      if (!check(obj.id, 'view')) {\n        return\n      }\n\n      Object.keys(obj.current_operations).forEach(task => {\n        if (linkedObjectsByTaskRefOrId[task] === undefined) {\n          linkedObjectsByTaskRefOrId[task] = []\n        }\n        linkedObjectsByTaskRefOrId[task].push(obj)\n      })\n    }\n\n    forOwn(pools, resolveLinkedObjects)\n    forOwn(hosts, resolveLinkedObjects)\n    forOwn(srs, resolveLinkedObjects)\n    forOwn(vdis, resolveLinkedObjects)\n    forOwn(vms, resolveLinkedObjects)\n    forOwn(networks, resolveLinkedObjects)\n\n    return linkedObjectsByTaskRefOrId\n  }\n)\n\nexport const getResolvedPendingTasks = create(\n  createGetObjectsOfType('task').filter([task => task.status === 'pending']),\n  getLinkedObjectsByTaskRefOrId,\n  getCheckPermissions,\n  (tasks, linkedObjectsByTaskRefOrId, check) => {\n    const resolvedTasks = []\n    forEach(tasks, task => {\n      const objects = [\n        ...defined(linkedObjectsByTaskRefOrId[task.xapiRef], []),\n        // for VMs, the current_operations prop is\n        // { taskId → operation } map instead of { taskRef → operation } map\n        ...defined(linkedObjectsByTaskRefOrId[task.id], []),\n      ]\n\n      if (objects.length > 0 || check(task.$host, 'view')) {\n        resolvedTasks.push({\n          ...task,\n          objects,\n        })\n      }\n    })\n    return resolvedTasks\n  }\n)\n","import kindOf from 'kindof'\n\n// Tests that two collections (arrays, sets or objects) have strictly equals\n// values (items or properties)\nconst shallowEqual = (c1, c2) => {\n  if (c1 === c2) {\n    return true\n  }\n\n  const type = kindOf(c1)\n  if (type !== kindOf(c2)) {\n    return false\n  }\n\n  if (type === 'array') {\n    const { length } = c1\n    if (length !== c2.length) {\n      return false\n    }\n\n    for (let i = 0; i < length; ++i) {\n      if (c1[i] !== c2[i]) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  if (type === 'set') {\n    if (c1.size !== c2.size) {\n      return false\n    }\n\n    for (const v of c1) {\n      if (!c2.has(v)) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  if (type !== 'object') {\n    return false\n  }\n\n  let n = 0\n  // eslint-disable-next-line no-unused-vars\n  for (const _ in c2) {\n    ++n\n  }\n\n  for (const key in c1) {\n    if (c1[key] !== c2[key]) {\n      return false\n    }\n    --n\n  }\n\n  return !n\n}\nexport { shallowEqual as default }\n","import Component from 'base-component'\nimport React from 'react'\nimport { Shortcuts as ReactShortcuts } from 'react-shortcuts'\nimport { forEach, remove } from 'lodash'\n\nlet enabled = true\nconst instances = []\n\nconst updateInstances = () => {\n  forEach(instances, instance => instance.forceUpdate())\n}\n\nexport const enable = () => {\n  enabled = true\n  updateInstances()\n}\n\nexport const disable = () => {\n  enabled = false\n  updateInstances()\n}\n\nexport default class Shortcuts extends Component {\n  componentDidMount() {\n    instances.push(this)\n  }\n  componentWillUnmount() {\n    remove(instances, this)\n  }\n\n  _handler = (command, event) => {\n    // When an input is focused, shortcuts are disabled by default *except* for\n    // non-printable keys (Esc, Enter, ...) but we want to disable them as well\n    // https://github.com/avocode/react-shortcuts/issues/13#issuecomment-255868423\n    if (event.target.tagName === 'INPUT') {\n      return\n    }\n\n    this.props.handler(command, event)\n  }\n\n  render() {\n    return enabled ? <ReactShortcuts {...this.props} handler={this._handler} /> : null\n  }\n}\n","import PropTypes from 'prop-types'\nimport React, { cloneElement } from 'react'\n\nconst SINGLE_LINE_STYLE = { display: 'flex' }\nconst COL_STYLE = { marginTop: 'auto', marginBottom: 'auto' }\n\nconst SingleLineRow = ({ children, className }) => (\n  <div className={`${className || ''} row`} style={SINGLE_LINE_STYLE}>\n    {React.Children.map(\n      children,\n      child => child && cloneElement(child, { style: { ...child.props.style, ...COL_STYLE } })\n    )}\n  </div>\n)\n\nSingleLineRow.propTypes = {\n  className: PropTypes.string,\n}\n\nexport { SingleLineRow as default }\n","import { get, identity, isEmpty } from 'lodash'\n\nimport { EMPTY_OBJECT } from './../utils'\n\nexport const destructPattern = (pattern, valueTransform = identity) =>\n  pattern && {\n    not: !!pattern.__not,\n    values: valueTransform((pattern.__not || pattern).__or),\n  }\n\nexport const constructPattern = ({ not, values } = EMPTY_OBJECT, valueTransform = identity) => {\n  if (values == null || !values.length) {\n    return\n  }\n\n  const pattern = { __or: valueTransform(values) }\n  return not ? { __not: pattern } : pattern\n}\n\n// ===================================================================\n\nexport const destructSmartPattern = (pattern, valueTransform = identity) =>\n  pattern && {\n    values: valueTransform(pattern.__and !== undefined ? pattern.__and[0].__or : pattern.__or),\n    notValues: valueTransform(pattern.__and !== undefined ? pattern.__and[1].__not.__or : get(pattern, '__not.__or')),\n  }\n\nexport const constructSmartPattern = ({ values, notValues } = EMPTY_OBJECT, valueTransform = identity) => {\n  const valuesExist = !isEmpty(values)\n  const notValuesExist = !isEmpty(notValues)\n\n  if (!valuesExist && !notValuesExist) {\n    return\n  }\n\n  const valuesPattern = valuesExist && { __or: valueTransform(values) }\n  const notValuesPattern = notValuesExist && {\n    __not: { __or: valueTransform(notValues) },\n  }\n  return valuesPattern && notValuesPattern\n    ? { __and: [valuesPattern, notValuesPattern] }\n    : valuesPattern || notValuesPattern\n}\n\n// ===================================================================\n\nexport default from './preview'\n","import _ from 'intl'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { createSelector } from 'reselect'\nimport { filter, map } from 'lodash'\n\nimport Component from './../base-component'\nimport Icon from './../icon'\nimport Link from './../link'\nimport renderXoItem from './../render-xo-item'\nimport Tooltip from './../tooltip'\nimport { Card, CardBlock, CardHeader } from './../card'\nimport { smartModeToComplexMatcher } from '../smartModeToComplexMatcher'\n\nconst SAMPLE_SIZE_OF_MATCHING_VMS = 3\n\nexport default class SmartBackupPreview extends Component {\n  static propTypes = {\n    pattern: PropTypes.object.isRequired,\n    vms: PropTypes.object.isRequired,\n  }\n\n  // user pattern completed with support for `xo:no-bak` tag automatically\n  // ignored by xo-server\n  _getComplexMatcher = createSelector(() => this.props.pattern, smartModeToComplexMatcher)\n\n  _getMatchingVms = createSelector(\n    () => this.props.vms,\n    createSelector(this._getComplexMatcher, cm => cm.createPredicate()),\n    (vms, predicate) => filter(vms, predicate)\n  )\n\n  _getSampleOfMatchingVms = createSelector(this._getMatchingVms, vms => vms.slice(0, SAMPLE_SIZE_OF_MATCHING_VMS))\n\n  _getQueryString = createSelector(this._getComplexMatcher, cm => {\n    try {\n      return cm.toString()\n    } catch (error) {\n      console.error(error)\n      return ''\n    }\n  })\n\n  render() {\n    const nMatchingVms = this._getMatchingVms().length\n    const sampleOfMatchingVms = this._getSampleOfMatchingVms()\n    const queryString = this._getQueryString()\n\n    return (\n      <Card>\n        <CardHeader>{_('sampleOfMatchingVms')}</CardHeader>\n        <CardBlock>\n          {nMatchingVms === 0 ? (\n            <p className='text-xs-center'>{_('noMatchingVms')}</p>\n          ) : (\n            <div>\n              <ul className='list-group'>\n                {map(sampleOfMatchingVms, vm => (\n                  <li className='list-group-item' key={vm.id}>\n                    {renderXoItem(vm)}\n                  </li>\n                ))}\n              </ul>\n              <br />\n              <Tooltip content={_('redirectToMatchingVms')}>\n                <Link\n                  className='pull-right'\n                  target='_blank'\n                  to={{\n                    pathname: '/home',\n                    query: {\n                      t: 'VM',\n                      s: queryString,\n                    },\n                  }}\n                >\n                  {_('allMatchingVms', {\n                    icon: <Icon icon='preview' />,\n                    nMatchingVms,\n                  })}\n                </Link>\n              </Tooltip>\n            </div>\n          )}\n        </CardBlock>\n      </Card>\n    )\n  }\n}\n","import * as CM from 'complex-matcher'\nimport escapeRegExp from 'lodash/escapeRegExp.js'\n\n// compile a value-matcher like pattern (plus support for regexps) to a\n// complex-matcher pattern\nconst pseudoValueToComplexMatcher = pattern => {\n  if (typeof pattern === 'string') {\n    return new CM.RegExpNode(`^${escapeRegExp(pattern)}$`)\n  }\n\n  if (Array.isArray(pattern)) {\n    return new CM.And(pattern.map(pseudoValueToComplexMatcher))\n  }\n\n  if (pattern instanceof RegExp) {\n    return new CM.RegExpNode(pattern)\n  }\n\n  if (pattern !== null && typeof pattern === 'object') {\n    const keys = Object.keys(pattern)\n    const { length } = keys\n\n    if (length === 1) {\n      const [key] = keys\n      if (key === '__and') {\n        return new CM.And(pattern.__and.map(pseudoValueToComplexMatcher))\n      }\n      if (key === '__or') {\n        return new CM.Or(pattern.__or.map(pseudoValueToComplexMatcher))\n      }\n      if (key === '__not') {\n        return new CM.Not(pseudoValueToComplexMatcher(pattern.__not))\n      }\n    }\n\n    const children = []\n    Object.keys(pattern).forEach(property => {\n      const subpattern = pattern[property]\n      if (subpattern !== undefined) {\n        children.push(new CM.Property(property, pseudoValueToComplexMatcher(subpattern)))\n      }\n    })\n    return children.length === 0 ? new CM.Null() : new CM.And(children)\n  }\n\n  throw new Error('could not transform this pattern')\n}\n\nexport const smartModeToComplexMatcher = pattern => {\n  // don't mutate param\n  pattern = JSON.parse(JSON.stringify(pattern))\n\n  // if the pattern does not match expected entries, simply don't change it\n  const { tags } = pattern\n  if (tags !== undefined) {\n    ;(tags.__not ?? tags.__and?.[1]?.__not)?.__or?.push(/^xo:no-bak(?:=.*)?$/)\n  }\n\n  return pseudoValueToComplexMatcher(pattern)\n}\n","module.exports = {\n    \"clickableColumn\": \"mc5df48f8c_clickableColumn\",\n    \"clickableRow\": \"mc5df48f8c_clickableRow\",\n    \"highlight\": \"mc5df48f8c_highlight\"\n};","import * as CM from 'complex-matcher'\nimport _ from 'intl'\nimport classNames from 'classnames'\nimport cookies from 'js-cookie'\nimport defined, { ifDef } from '@xen-orchestra/defined'\nimport DropdownMenu from 'react-bootstrap-4/lib/DropdownMenu' // https://phabricator.babeljs.io/T6662 so Dropdown.Menu won't work like https://react-bootstrap.github.io/components.html#btn-dropdowns-custom\nimport DropdownToggle from 'react-bootstrap-4/lib/DropdownToggle' // https://phabricator.babeljs.io/T6662 so Dropdown.Toggle won't work https://react-bootstrap.github.io/components.html#btn-dropdowns-custom\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport Shortcuts from 'shortcuts'\nimport { Dropdown, DropdownButton, MenuItem } from 'react-bootstrap-4/lib'\nimport { Portal } from 'react-overlays'\nimport { Set } from 'immutable'\nimport { injectState, provideState } from 'reaclette'\nimport { withRouter } from 'react-router'\nimport { ceil, filter, findIndex, forEach, get as getProperty, groupBy, isEmpty, map, sortBy } from 'lodash'\n\nimport ActionRowButton from '../action-row-button'\nimport Button from '../button'\nimport ButtonGroup from '../button-group'\nimport Component from '../base-component'\nimport decorate from '../apply-decorators'\nimport Icon from '../icon'\nimport logError from '../log-error'\nimport Pagination from '../pagination'\nimport SingleLineRow from '../single-line-row'\nimport TableFilter from '../search-bar'\nimport UserError from '../user-error'\nimport { BlockLink } from '../link'\nimport { conditionalTooltip } from '../tooltip'\nimport { Container, Col } from '../grid'\nimport { error as _error } from '../notification'\nimport { generateId } from '../reaclette-utils'\nimport {\n  createCollectionWrapper,\n  createCounter,\n  createFilter,\n  createPager,\n  createSelector,\n  createSort,\n} from '../selectors'\nimport { ITEMS_PER_PAGE_OPTIONS } from '../xo'\n\nimport styles from './index.css'\n\nconst DEFAULT_ITEMS_PER_PAGE = 10\n\n// ===================================================================\n\nclass ColumnHead extends Component {\n  static propTypes = {\n    columnId: PropTypes.number.isRequired,\n    name: PropTypes.node,\n    sort: PropTypes.func,\n    sortIcon: PropTypes.string,\n    tooltip: PropTypes.node,\n  }\n\n  _sort = () => {\n    const { props } = this\n    props.sort(props.columnId)\n  }\n\n  render() {\n    const { name, sortIcon, textAlign, tooltip } = this.props\n\n    if (!this.props.sort) {\n      return conditionalTooltip(<th className={textAlign && `text-xs-${textAlign}`}>{name}</th>, tooltip)\n    }\n\n    const isSelected = sortIcon === 'asc' || sortIcon === 'desc'\n\n    return conditionalTooltip(\n      <th\n        className={classNames(\n          textAlign && `text-xs-${textAlign}`,\n          styles.clickableColumn,\n          isSelected && classNames('text-white', 'bg-info')\n        )}\n        onClick={this._sort}\n      >\n        {name}\n        <span className='pull-right'>\n          <Icon icon={sortIcon} />\n        </span>\n      </th>,\n      tooltip\n    )\n  }\n}\n\n// ===================================================================\n\nclass Checkbox extends Component {\n  static propTypes = {\n    indeterminate: PropTypes.bool.isRequired,\n  }\n\n  componentDidUpdate() {\n    const {\n      props: { indeterminate },\n      ref,\n    } = this\n    if (ref !== null) {\n      ref.indeterminate = indeterminate\n    }\n  }\n\n  _ref = ref => {\n    this.ref = ref\n    this.componentDidUpdate()\n  }\n\n  render() {\n    const { indeterminate, ...props } = this.props\n    props.ref = this._ref\n    props.type = 'checkbox'\n    return <input {...props} />\n  }\n}\n\n// ===================================================================\n\nconst actionsShape = PropTypes.arrayOf(\n  PropTypes.shape({\n    // groupedActions: the function will be called with an array of the selected items in parameters\n    // individualActions: the function will be called with the related item in parameters\n    collapsed: PropTypes.bool,\n    disabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\n    handler: PropTypes.func.isRequired,\n    icon: PropTypes.string.isRequired,\n    label: PropTypes.oneOfType([PropTypes.node, PropTypes.func]).isRequired,\n    level: PropTypes.oneOf(['primary', 'warning', 'danger']),\n    redirectOnSuccess: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  })\n)\n\nconst Action = decorate([\n  provideState({\n    computed: {\n      disabled: ({ items }, { disabled, userData }) =>\n        typeof disabled === 'function' ? disabled(items, userData) : disabled,\n      handler:\n        ({ items }, { handler, userData }) =>\n        () =>\n          handler(items, userData),\n      icon: ({ items }, { icon, userData }) => (typeof icon === 'function' ? icon(items, userData) : icon),\n      items: (_, { items, grouped }) => (Array.isArray(items) || !grouped ? items : [items]),\n      label: ({ items }, { label, userData }) => (typeof label === 'function' ? label(items, userData) : label),\n      level: ({ items }, { level, userData }) => (typeof level === 'function' ? level(items, userData) : level),\n    },\n  }),\n  injectState,\n  ({ state, redirectOnSuccess, userData }) => (\n    <ActionRowButton\n      btnStyle={state.level}\n      disabled={state.disabled}\n      handler={state.handler}\n      icon={state.icon}\n      redirectOnSuccess={redirectOnSuccess}\n      tooltip={state.label}\n    />\n  ),\n])\n\nconst handleFnProps = (prop, items, userData) => (typeof prop === 'function' ? prop(items, userData) : prop)\n\nconst CollapsedActions = decorate([\n  withRouter,\n  provideState({\n    initialState: () => ({\n      runningActions: [],\n    }),\n    effects: {\n      async execute(state, { handler, label, redirectOnSuccess }) {\n        this.state.runningActions = [...this.state.runningActions, label]\n        try {\n          await handler()\n          ifDef(redirectOnSuccess, this.props.router.push)\n        } catch (error) {\n          // ignore when undefined because it usually means that the action has been canceled\n          if (error !== undefined) {\n            if (error instanceof UserError) {\n              _error(error.title, error.body)\n            } else {\n              logError(error)\n              _error(label, defined(error.message, String(error)))\n            }\n          }\n        } finally {\n          this.state.runningActions = this.state.runningActions.filter(action => action !== label)\n        }\n      },\n    },\n    computed: {\n      wrappedActions: ({ runningActions }, { actions }) =>\n        actions.map(action => {\n          action.isRunning = runningActions.includes(action.label)\n          return action\n        }),\n      dropdownId: generateId,\n      actions: ({ wrappedActions: actions }, { items, userData }) =>\n        actions.map(({ disabled, grouped, handler, icon, isRunning, label, level, redirectOnSuccess }) => {\n          const actionItems = Array.isArray(items) || !grouped ? items : [items]\n          return {\n            disabled: isRunning || handleFnProps(disabled, actionItems, userData),\n            handler: () => handler(actionItems, userData),\n            icon: isRunning ? 'loading' : handleFnProps(icon, actionItems, userData),\n            label: handleFnProps(label, actionItems, userData),\n            level: handleFnProps(level, actionItems, userData),\n            redirectOnSuccess: handleFnProps(redirectOnSuccess, actionItems, userData),\n          }\n        }),\n    },\n  }),\n  injectState,\n  ({ state, effects }) => (\n    <Dropdown id={state.dropdownId}>\n      <DropdownToggle bsSize='small' bsStyle='secondary' />\n      <DropdownMenu className='dropdown-menu-right'>\n        {state.actions.map((action, key) => (\n          <MenuItem\n            className={action.level !== undefined ? `text-${action.level}` : ''}\n            disabled={action.disabled}\n            key={key}\n            onClick={action.disabled ? undefined : () => effects.execute(action)}\n          >\n            <Icon icon={action.icon} /> {action.label}\n          </MenuItem>\n        ))}\n      </DropdownMenu>\n    </Dropdown>\n  ),\n])\n\nCollapsedActions.propTypes = {\n  actions: PropTypes.shape({\n    ...actionsShape,\n    grouped: PropTypes.bool,\n  }),\n  items: PropTypes.any,\n  userData: PropTypes.any,\n}\n\nconst LEVELS = [undefined, 'primary', 'warning', 'danger']\n// page number and sort info are optional for backward compatibility\nconst URL_STATE_RE = /^(?:(\\d+)(?:_(\\d+)(?:_(desc|asc))?)?-)?(.*)$/\n\nclass SortedTable extends Component {\n  static propTypes = {\n    defaultColumn: PropTypes.number,\n    defaultFilter: PropTypes.string,\n    collection: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired,\n    columns: PropTypes.arrayOf(\n      PropTypes.shape({\n        default: PropTypes.bool,\n        name: PropTypes.node,\n        sortCriteria: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n        sortOrder: PropTypes.string,\n        textAlign: PropTypes.string,\n\n        // for the cell render, you can use component or itemRenderer or valuePath\n        //\n        // item and userData will be injected in the component as props\n        // component: <Component />\n        component: PropTypes.func,\n\n        // itemRenderer: (item, userData) => <span />\n        itemRenderer: PropTypes.func,\n\n        // the path to the value, it's also the sort criteria default value\n        // valuePath: 'a.b.c'\n        valuePath: PropTypes.string,\n      })\n    ).isRequired,\n    filterContainer: PropTypes.func,\n    filters: PropTypes.object,\n    actions: PropTypes.arrayOf(\n      PropTypes.shape({\n        // regroup individual actions and grouped actions\n        collapsed: PropTypes.bool,\n        disabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\n        handler: PropTypes.func.isRequired,\n        icon: PropTypes.string.isRequired,\n        individualDisabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\n        individualHandler: PropTypes.func,\n        individualLabel: PropTypes.node,\n        label: PropTypes.node.isRequired,\n        level: PropTypes.oneOf(['primary', 'warning', 'danger']),\n        redirectOnSuccess: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n      })\n    ),\n    groupedActions: actionsShape,\n    individualActions: actionsShape,\n    itemsPerPageContainer: PropTypes.func,\n    onSelect: PropTypes.func,\n    paginationContainer: PropTypes.func,\n    rowAction: PropTypes.func,\n    rowLink: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n    rowTransform: PropTypes.func,\n    // DOM node selector like body or .my-class\n    // The shortcuts will be enabled when the node is focused\n    shortcutsTarget: PropTypes.string,\n    stateUrlParam: PropTypes.string.isRequired,\n\n    // @deprecated, use `data-${key}` instead\n    userData: PropTypes.any,\n  }\n\n  constructor(props, context) {\n    super(props, context)\n\n    this._getUserData =\n      'userData' in props\n        ? () => this.props.userData\n        : createCollectionWrapper(() => {\n            const { props } = this\n            const userData = {}\n            Object.keys(props).forEach(key => {\n              if (key.startsWith('data-')) {\n                userData[key.slice(5)] = props[key]\n              }\n            })\n            return isEmpty(userData) ? undefined : userData\n          })\n\n    const state = (this.state = {\n      all: false, // whether all items are selected (across pages)\n      itemsPerPage: +defined(cookies.get(`${props.location.pathname}-${props.stateUrlParam}`), DEFAULT_ITEMS_PER_PAGE),\n    })\n\n    this._getSelectedColumn = () => this.props.columns[this._getSelectedColumnId()]\n\n    let getAllItems = () => this.props.collection\n    if ('rowTransform' in props) {\n      getAllItems = createSelector(\n        getAllItems,\n        this._getUserData,\n        () => this.props.rowTransform,\n        (items, userData, rowTransform) => map(items, item => rowTransform(item, userData))\n      )\n    }\n    this._getTotalNumberOfItems = createCounter(getAllItems)\n\n    this._getItems = createSort(\n      createFilter(\n        getAllItems,\n        createSelector(this._getFilter, filter => {\n          try {\n            return CM.parse(filter).createPredicate()\n          } catch (_) {}\n        })\n      ),\n      createSelector(\n        () => this._getSelectedColumn().valuePath,\n        () => this._getSelectedColumn().sortCriteria,\n        this._getUserData,\n        (valuePath, sortCriteria = valuePath, userData) =>\n          typeof sortCriteria === 'function' ? object => sortCriteria(object, userData) : sortCriteria\n      ),\n      this._getSortOrder\n    )\n\n    this._getVisibleItems = createPager(this._getItems, this._getPage, () => this.state.itemsPerPage)\n\n    state.selectedItemsIds = new Set()\n\n    this._getSelectedItems = createSelector(\n      () => this.state.all,\n      () => this.state.selectedItemsIds,\n      this._getItems,\n      (all, selectedItemsIds, items) => (all ? items : filter(items, item => selectedItemsIds.has(item.id)))\n    )\n\n    this._hasGroupedActions = createSelector(this._getGroupedActions, actions => !isEmpty(actions))\n\n    this._getShortcutsHandler = createSelector(\n      this._getVisibleItems,\n      this._hasGroupedActions,\n      () => this.state.highlighted,\n      () => this.props.rowLink,\n      () => this.props.rowAction,\n      this._getUserData,\n      (visibleItems, hasGroupedActions, itemIndex, rowLink, rowAction, userData) => (command, event) => {\n        event.preventDefault()\n        const item = itemIndex !== undefined ? visibleItems[itemIndex] : undefined\n\n        switch (command) {\n          case 'SEARCH':\n            this.refs.filterInput.focus()\n            break\n          case 'NAV_DOWN':\n            if (hasGroupedActions || rowAction !== undefined || rowLink !== undefined) {\n              this.setState({\n                highlighted: (itemIndex + visibleItems.length + 1) % visibleItems.length || 0,\n              })\n            }\n            break\n          case 'NAV_UP':\n            if (hasGroupedActions || rowAction !== undefined || rowLink !== undefined) {\n              this.setState({\n                highlighted: (itemIndex + visibleItems.length - 1) % visibleItems.length || 0,\n              })\n            }\n            break\n          case 'SELECT':\n            if (itemIndex !== undefined && hasGroupedActions) {\n              this._selectItem(itemIndex)\n            }\n            break\n          case 'ROW_ACTION':\n            if (item !== undefined) {\n              if (rowLink !== undefined) {\n                this.props.router.push(typeof rowLink === 'function' ? rowLink(item, userData) : rowLink)\n              } else if (rowAction !== undefined) {\n                rowAction(item, userData)\n              }\n            }\n            break\n        }\n      }\n    )\n  }\n\n  componentDidMount() {\n    // Force one Portal refresh.\n    // Because Portal cannot see the container reference at first rendering.\n    if (this.props.paginationContainer) {\n      this.forceUpdate()\n    }\n  }\n\n  _sort = columnId => {\n    this._updateQueryString({\n      selectedColumn: columnId,\n      sortOrder:\n        this._getSelectedColumnId() === columnId\n          ? this._getSortOrder() === 'desc'\n            ? 'asc'\n            : 'desc'\n          : defined(this.props.columns[columnId].sortOrder, 'asc'),\n    })\n  }\n\n  componentDidUpdate() {\n    const { selectedItemsIds } = this.state\n\n    // Unselect items that are no longer visible\n    if (\n      (this._visibleItemsRecomputations || 0) <\n      (this._visibleItemsRecomputations = this._getVisibleItems.recomputations())\n    ) {\n      const newSelectedItems = selectedItemsIds.intersect(map(this._getVisibleItems(), 'id'))\n      if (newSelectedItems.size < selectedItemsIds.size) {\n        this.setState({ selectedItemsIds: newSelectedItems })\n      }\n    }\n  }\n\n  _updateQueryString({\n    filter = this._getFilter(),\n    page = this._getPage(),\n    selectedColumn = this._getSelectedColumnId(),\n    sortOrder = this._getSortOrder(),\n  }) {\n    const { location, router } = this.props\n    router.replace({\n      ...location,\n      query: {\n        ...location.query,\n        [this.props.stateUrlParam]: `${page}_${selectedColumn}_${sortOrder}-${filter}`,\n      },\n    })\n  }\n\n  _setFilter = filter => {\n    this.setState({\n      highlighted: undefined,\n    })\n    this._updateQueryString({\n      filter,\n      page: 1,\n    })\n  }\n\n  _setPage(page) {\n    this._updateQueryString({ page })\n  }\n  _setPage = this._setPage.bind(this)\n\n  goTo(id) {\n    this._setPage(Math.floor(this._getItems().findIndex(item => item.id === id) / this.state.itemsPerPage) + 1)\n  }\n\n  _selectAllVisibleItems = event => {\n    const { checked } = event.target\n    const { onSelect } = this.props\n    if (onSelect !== undefined) {\n      onSelect(checked ? map(this._getVisibleItems(), 'id') : [])\n    }\n\n    this.setState({\n      all: false,\n      selectedItemsIds: checked\n        ? this.state.selectedItemsIds.union(map(this._getVisibleItems(), 'id'))\n        : this.state.selectedItemsIds.clear(),\n    })\n  }\n\n  // TODO: figure out why it's necessary\n  _toggleNestedCheckboxGuard = false\n\n  _toggleNestedCheckbox = event => {\n    const child = event.target.firstElementChild\n    if (child != null && child.tagName === 'INPUT') {\n      if (this._toggleNestedCheckboxGuard) {\n        return\n      }\n      this._toggleNestedCheckboxGuard = true\n      child.dispatchEvent(new window.MouseEvent('click', event.nativeEvent))\n      this._toggleNestedCheckboxGuard = false\n    }\n  }\n\n  _selectAll = () => {\n    const { onSelect } = this.props\n    if (onSelect !== undefined) {\n      onSelect(map(this._getItems(), 'id'))\n    }\n    this.setState({ all: true })\n  }\n\n  _selectItem(current, selected, range = false) {\n    const { onSelect } = this.props\n    const { all, selectedItemsIds } = this.state\n    const visibleItems = this._getVisibleItems()\n    const item = visibleItems[current]\n    let _selectedItemsIds\n\n    if (all) {\n      _selectedItemsIds = new Set().withMutations(selectedItemsIds => {\n        forEach(visibleItems, item => {\n          selectedItemsIds.add(item.id)\n        })\n        selectedItemsIds.delete(item.id)\n      })\n    } else {\n      const method = (selected === undefined ? !selectedItemsIds.has(item.id) : selected) ? 'add' : 'delete'\n\n      let previous\n      _selectedItemsIds =\n        range && (previous = this._previous) !== undefined\n          ? selectedItemsIds.withMutations(selectedItemsIds => {\n              let i = previous\n              let end = current\n              if (previous > current) {\n                i = current\n                end = previous\n              }\n              for (; i <= end; ++i) {\n                selectedItemsIds[method](visibleItems[i].id)\n              }\n            })\n          : selectedItemsIds[method](item.id)\n      this._previous = current\n    }\n\n    if (onSelect !== undefined) {\n      onSelect(_selectedItemsIds.toArray())\n    }\n\n    this.setState({\n      all: false,\n      selectedItemsIds: _selectedItemsIds,\n    })\n  }\n\n  _onSelectItemCheckbox = event => {\n    const { target } = event\n    this._selectItem(+target.name, target.checked, event.nativeEvent.shiftKey)\n  }\n\n  _getParsedQueryString = createSelector(\n    () => this.props.router.location.query[this.props.stateUrlParam],\n    urlState => {\n      if (urlState === undefined) {\n        return {}\n      }\n      const [, page, selectedColumnId, sortOrder, filter] = URL_STATE_RE.exec(urlState) || []\n      return {\n        filter,\n        page,\n        selectedColumnId,\n        sortOrder,\n      }\n    }\n  )\n\n  _getFilter = createSelector(\n    () => this._getParsedQueryString().filter,\n    () => this.props.filters,\n    () => this.props.defaultFilter,\n    (filter, filters, defaultFilter) => defined(filter, () => filters[defaultFilter], '')\n  )\n\n  _getNPages = createSelector(\n    () => this._getItems().length,\n    () => this.state.itemsPerPage,\n    (nItems, itemsPerPage) => ceil(nItems / itemsPerPage)\n  )\n\n  _getPage = createSelector(\n    () => this._getParsedQueryString().page,\n    this._getNPages,\n    (page = 1, lastPage) => Math.min(+page, lastPage)\n  )\n\n  _getSelectedColumnId = createSelector(\n    () => this._getParsedQueryString().selectedColumnId,\n    () => this.props.columns,\n    () => this.props.defaultColumn,\n    (columnIndex, columns, defaultColumnIndex) =>\n      columnIndex !== undefined && (columnIndex = +columnIndex) < columns.length\n        ? columnIndex\n        : defined(defaultColumnIndex, (columnIndex = findIndex(columns, 'default')) !== -1 ? columnIndex : 0)\n  )\n\n  _getSortOrder = createSelector(\n    () => this._getParsedQueryString().sortOrder,\n    this._getSelectedColumnId,\n    () => this.props.columns,\n    (sortOrder, selectedColumnIndex, columns) => defined(sortOrder, columns[selectedColumnIndex].sortOrder, 'asc')\n  )\n\n  _getGroupedActions = createSelector(\n    () => this.props.groupedActions,\n    () => this.props.actions,\n    (groupedActions, actions) =>\n      groupBy(\n        sortBy(\n          groupedActions !== undefined && actions !== undefined\n            ? groupedActions.concat(actions)\n            : groupedActions || actions,\n          action => LEVELS.indexOf(action.level)\n        ),\n        action => (action.collapsed ? 'secondary' : 'primary')\n      )\n  )\n\n  _getIndividualActions = createSelector(\n    () => this.props.individualActions,\n    () => this.props.actions,\n    (individualActions, actions) => {\n      const normalizedActions = map(actions, a => ({\n        collapsed: a.collapsed,\n        disabled: a.individualDisabled !== undefined ? a.individualDisabled : a.disabled,\n        grouped: a.individualHandler === undefined,\n        handler: a.individualHandler !== undefined ? a.individualHandler : a.handler,\n        icon: a.icon,\n        label: a.individualLabel !== undefined ? a.individualLabel : a.label,\n        level: a.level,\n        redirectOnSuccess: a.redirectOnSuccess,\n      }))\n\n      return groupBy(\n        sortBy(\n          individualActions !== undefined && actions !== undefined\n            ? individualActions.concat(normalizedActions)\n            : individualActions || normalizedActions,\n          action => LEVELS.indexOf(action.level)\n        ),\n        action => (action.collapsed ? 'secondary' : 'primary')\n      )\n    }\n  )\n\n  _renderItem = (item, i) => {\n    const { props, state } = this\n    const { actions, individualActions, onSelect, rowAction, rowLink } = props\n    const userData = this._getUserData()\n\n    const hasGroupedActions = this._hasGroupedActions()\n    const hasIndividualActions = !isEmpty(individualActions) || !isEmpty(actions)\n\n    const columns = map(props.columns, ({ component: Component, itemRenderer, valuePath, textAlign }, key) => (\n      <td className={textAlign && `text-xs-${textAlign}`} key={key}>\n        {Component !== undefined ? (\n          <Component item={item} userData={userData} />\n        ) : valuePath !== undefined ? (\n          getProperty(item, valuePath)\n        ) : (\n          itemRenderer(item, userData)\n        )}\n      </td>\n    ))\n\n    const { id = i } = item\n\n    const selectionColumn = (hasGroupedActions || onSelect !== undefined) && (\n      <td className='text-xs-center' onClick={this._toggleNestedCheckbox}>\n        <input\n          checked={state.all || state.selectedItemsIds.has(id)}\n          name={i} // position in visible items\n          onChange={this._onSelectItemCheckbox}\n          type='checkbox'\n        />\n      </td>\n    )\n\n    let actionsColumn\n    if (hasIndividualActions) {\n      const { primary, secondary } = this._getIndividualActions()\n      actionsColumn = (\n        <td>\n          <div className='pull-right'>\n            <ButtonGroup>\n              {map(primary, (props, key) => (\n                <Action {...props} items={item} key={key} userData={userData} />\n              ))}\n              {secondary !== undefined && <CollapsedActions actions={secondary} items={item} userData={userData} />}\n            </ButtonGroup>\n          </div>\n        </td>\n      )\n    }\n\n    return rowLink != null ? (\n      <BlockLink\n        className={state.highlighted === i ? styles.highlight : undefined}\n        key={id}\n        tagName='tr'\n        to={typeof rowLink === 'function' ? rowLink(item, userData) : rowLink}\n      >\n        {selectionColumn}\n        {columns}\n        {actionsColumn}\n      </BlockLink>\n    ) : (\n      <tr\n        className={classNames(rowAction && styles.clickableRow, state.highlighted === i && styles.highlight)}\n        key={id}\n        onClick={rowAction && (() => rowAction(item, userData))}\n      >\n        {selectionColumn}\n        {columns}\n        {actionsColumn}\n      </tr>\n    )\n  }\n\n  _setNItemsPerPage = itemsPerPage => {\n    const { location, stateUrlParam } = this.props\n    this.setState({ itemsPerPage })\n    cookies.set(`${location.pathname}-${stateUrlParam}`, itemsPerPage)\n\n    // changing the number of items per page should send back to the first page\n    //\n    // see https://github.com/vatesfr/xen-orchestra/issues/7350\n    this._setPage(1)\n  }\n\n  render() {\n    const { props, state } = this\n    const {\n      actions,\n      filterContainer,\n      individualActions,\n      itemsPerPageContainer,\n      onSelect,\n      paginationContainer,\n      shortcutsTarget,\n      stateUrlParam,\n    } = props\n    const { all, itemsPerPage } = state\n    const groupedActions = this._getGroupedActions()\n\n    const nAllItems = this._getTotalNumberOfItems()\n    const nItems = this._getItems().length\n    const nSelectedItems = state.selectedItemsIds.size\n    const nVisibleItems = this._getVisibleItems().length\n\n    const hasGroupedActions = this._hasGroupedActions()\n    const hasIndividualActions = !isEmpty(individualActions) || !isEmpty(actions)\n\n    const nColumns = props.columns.length + (hasIndividualActions ? 2 : 1)\n\n    const displayPagination = paginationContainer === undefined && itemsPerPage < nAllItems\n\n    const paginationInstance = displayPagination && (\n      <Pagination pages={this._getNPages()} onChange={this._setPage} value={this._getPage()} />\n    )\n\n    const filterInstance = (\n      <TableFilter filters={props.filters} onChange={this._setFilter} ref='filterInput' value={this._getFilter()} />\n    )\n\n    const dropdownItemsPerPage = (\n      <DropdownButton bsStyle='info' id={stateUrlParam} title={itemsPerPage}>\n        {ITEMS_PER_PAGE_OPTIONS.map(nItems => (\n          <MenuItem key={nItems} onClick={() => this._setNItemsPerPage(nItems)}>\n            {nItems}\n          </MenuItem>\n        ))}\n      </DropdownButton>\n    )\n\n    const userData = this._getUserData()\n\n    return (\n      <div className={props.className}>\n        {shortcutsTarget !== undefined && (\n          <Shortcuts\n            handler={this._getShortcutsHandler()}\n            isolate\n            name='SortedTable'\n            targetNodeSelector={shortcutsTarget}\n          />\n        )}\n        <Container className='mb-1 p-0'>\n          <SingleLineRow>\n            <Col mediumSize={7}>\n              {displayPagination &&\n                (paginationContainer !== undefined ? (\n                  // Rebuild container function to refresh Portal component.\n                  <Portal container={() => paginationContainer()}>{paginationInstance}</Portal>\n                ) : (\n                  paginationInstance\n                ))}\n            </Col>\n            <Col mediumSize={4}>\n              {filterContainer ? <Portal container={() => filterContainer()}>{filterInstance}</Portal> : filterInstance}\n            </Col>\n            <Col mediumSize={1} style={{ justifyContent: 'end', display: 'flex' }}>\n              {itemsPerPageContainer !== undefined ? (\n                <Portal container={() => itemsPerPageContainer()}>{dropdownItemsPerPage}</Portal>\n              ) : (\n                dropdownItemsPerPage\n              )}\n            </Col>\n          </SingleLineRow>\n        </Container>\n        <table className='table'>\n          <thead className='thead-default'>\n            <tr>\n              <th colSpan={nColumns}>\n                {nItems === nAllItems\n                  ? _('sortedTableNumberOfItems', { nTotal: nItems })\n                  : _('sortedTableNumberOfFilteredItems', {\n                      nFiltered: nItems,\n                      nTotal: nAllItems,\n                    })}\n                {all ? (\n                  <span>\n                    {' '}\n                    - <span className='text-danger'>{_('sortedTableAllItemsSelected', { nItems })}</span>\n                  </span>\n                ) : (\n                  nSelectedItems !== 0 && (\n                    <span>\n                      {' '}\n                      -{' '}\n                      {_('sortedTableNumberOfSelectedItems', {\n                        nSelected: nSelectedItems,\n                      })}\n                      {nSelectedItems === nVisibleItems && nSelectedItems < nItems && (\n                        <Button btnStyle='info' className='ml-1' onClick={this._selectAll} size='small'>\n                          {_('sortedTableSelectAllItems')}\n                        </Button>\n                      )}\n                    </span>\n                  )\n                )}\n                {(nSelectedItems !== 0 || all) && (\n                  <div className='pull-right'>\n                    <ButtonGroup>\n                      {map(groupedActions.primary, (props, key) => (\n                        <Action {...props} key={key} items={this._getSelectedItems()} userData={userData} />\n                      ))}\n                      {groupedActions.secondary !== undefined && (\n                        <CollapsedActions\n                          actions={groupedActions.secondary}\n                          items={this._getSelectedItems()}\n                          userData={userData}\n                        />\n                      )}\n                    </ButtonGroup>\n                  </div>\n                )}\n              </th>\n            </tr>\n            <tr>\n              {(hasGroupedActions || onSelect !== undefined) && (\n                <th className='text-xs-center' onClick={this._toggleNestedCheckbox}>\n                  <Checkbox\n                    onChange={this._selectAllVisibleItems}\n                    checked={all || nSelectedItems !== 0}\n                    indeterminate={!all && nSelectedItems !== 0 && nSelectedItems !== nVisibleItems}\n                  />\n                </th>\n              )}\n              {map(props.columns, (column, key) => (\n                <ColumnHead\n                  textAlign={column.textAlign}\n                  columnId={key}\n                  key={key}\n                  name={column.name}\n                  sort={(column.sortCriteria !== undefined || column.valuePath !== undefined) && this._sort}\n                  sortIcon={this._getSelectedColumnId() === key ? this._getSortOrder() : 'sort'}\n                  tooltip={column.tooltip}\n                />\n              ))}\n              {hasIndividualActions && <th />}\n            </tr>\n          </thead>\n          <tbody>\n            {nVisibleItems !== 0 ? (\n              map(this._getVisibleItems(), this._renderItem)\n            ) : (\n              <tr>\n                <td className='text-info text-xs-center' colSpan={nColumns}>\n                  {_('sortedTableNoItems')}\n                </td>\n              </tr>\n            )}\n          </tbody>\n        </table>\n      </div>\n    )\n  }\n}\n\n// withRouter is needed to trigger a render on filtering/sorting items\nexport default withRouter(SortedTable, { withRef: true })\n","import _ from 'intl'\nimport ActionRowButton from 'action-row-button'\nimport BaseComponent from 'base-component'\nimport Button from 'button'\nimport ButtonGroup from 'button-group'\nimport Icon from 'icon'\nimport map from 'lodash/map'\nimport React, { Component } from 'react'\nimport Tooltip from 'tooltip'\nimport { connectStore } from 'utils'\nimport { createGetObject, createGetObjectsOfType, createSelector } from 'selectors'\nimport { connectPif, disconnectPif } from 'xo'\n\n@connectStore(() => {\n  const pif = createGetObject()\n  const host = createGetObject(createSelector(pif, pif => pif?.$host))\n  const disableUnplug = createSelector(\n    pif,\n    pif => pif?.attached && !pif?.isBondMaster && (pif?.management || pif?.disallowUnplug)\n  )\n\n  const bonds = createGetObjectsOfType('bond')\n  const bond = createSelector(pif, bonds, (pif, bonds) => Object.values(bonds).find(bond => bond.master === pif.id))\n\n  return { host, pif, disableUnplug, bond }\n})\nclass PifItem extends Component {\n  render() {\n    const { pif, host, disableUnplug, bond } = this.props\n\n    return (\n      <tr>\n        <td>{pif?.device ?? _('unknown')}</td>\n        <td>{host?.name_label ?? _('unknown')}</td>\n        <td>{pif?.ip ?? _('unknown')}</td>\n        <td>{pif?.mac ?? _('unknown')}</td>\n        <td>{bond?.mode ?? '-'}</td>\n        <td>\n          {pif?.carrier === undefined ? (\n            <span className='tag tag-warning'>{_('unknown')}</span>\n          ) : pif.carrier ? (\n            <span className='tag tag-success'>{_('poolNetworkPifAttached')}</span>\n          ) : (\n            <span className='tag tag-default'>{_('poolNetworkPifDetached')}</span>\n          )}\n        </td>\n        <td className='text-xs-right'>\n          {pif !== undefined && (\n            <ButtonGroup>\n              <ActionRowButton\n                disabled={disableUnplug}\n                handler={pif.attached ? disconnectPif : connectPif}\n                handlerParam={pif}\n                icon={pif.attached ? 'disconnect' : 'connect'}\n                tooltip={pif.attached ? _('disconnectPif') : _('connectPif')}\n              />\n            </ButtonGroup>\n          )}\n        </td>\n      </tr>\n    )\n  }\n}\n\nexport default class PifsColumn extends BaseComponent {\n  render() {\n    const { network, pifs } = this.props\n    const { showPifs } = this.state\n\n    return (\n      <div>\n        <Tooltip content={showPifs ? _('hidePifs') : _('showPifs')}>\n          <Button size='small' className='mb-1 pull-right' onClick={this.toggleState('showPifs')}>\n            <Icon icon={showPifs ? 'hidden' : 'shown'} />\n          </Button>\n        </Tooltip>\n        {showPifs && (\n          <table className='table'>\n            <thead className='thead-default'>\n              <tr>\n                <th>{_('pifDeviceLabel')}</th>\n                <th>{_('homeTypeHost')}</th>\n                <th>{_('pifAddressLabel')}</th>\n                <th>{_('pifMacLabel')}</th>\n                <th>{_('bondMode')}</th>\n                <th>{_('pifStatusLabel')}</th>\n                <th />\n              </tr>\n            </thead>\n            <tbody>\n              {map(network?.PIFs ?? pifs, (pifId, index) => (\n                <PifItem key={pifId ?? index} id={pifId} />\n              ))}\n            </tbody>\n          </table>\n        )}\n      </div>\n    )\n  }\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport styled from 'styled-components'\nimport omit from 'lodash/omit.js'\n\nimport ActionButton from './action-button'\n\n// do not forward `state` to ActionButton\nconst Button = styled(p => <ActionButton {...omit(p, 'state')} />)`\n  background-color: ${p => p.theme[`${p.state ? 'enabled' : 'disabled'}StateBg`]};\n  border: 2px solid ${p => p.theme[`${p.state ? 'enabled' : 'disabled'}StateColor`]};\n  color: ${p => p.theme[`${p.state ? 'enabled' : 'disabled'}StateColor`]};\n`\n\nconst StateButton = ({\n  disabledHandler,\n  disabledHandlerParam,\n  disabledLabel,\n  disabledTooltip,\n\n  enabledLabel,\n  enabledTooltip,\n  enabledHandler,\n  enabledHandlerParam,\n\n  state,\n  ...props\n}) => (\n  <Button\n    handler={state ? enabledHandler : disabledHandler}\n    handlerParam={state ? enabledHandlerParam : disabledHandlerParam}\n    tooltip={state ? enabledTooltip : disabledTooltip}\n    {...props}\n    icon={state ? 'running' : 'halted'}\n    size='small'\n    state={state}\n  >\n    {state ? enabledLabel : disabledLabel}\n  </Button>\n)\n\nStateButton.propTypes = {\n  state: PropTypes.bool.isRequired,\n}\n\nexport { StateButton as default }\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport forOwn from 'lodash/forOwn.js'\n\nimport _ from './intl'\nimport { fetchHostStats, fetchSrStats, fetchVmStats } from './xo'\nimport { Select } from './form'\n\nexport const DEFAULT_GRANULARITY = {\n  granularity: 'seconds',\n  label: _('statLastTenMinutes'),\n  value: 'lastTenMinutes',\n}\n\nexport const INTERVAL_BY_GRANULARITY = {\n  seconds: 5,\n  minutes: 60,\n  hours: 3600,\n  days: 86400,\n}\n\nconst OPTIONS = [\n  DEFAULT_GRANULARITY,\n  {\n    granularity: 'minutes',\n    label: _('statLastTwoHours'),\n    value: 'lastTwoHours',\n  },\n  {\n    granularity: 'hours',\n    keep: 24,\n    label: _('statLastDay'),\n    value: 'lastDay',\n  },\n  {\n    granularity: 'hours',\n    label: _('statLastWeek'),\n    value: 'lastWeek',\n  },\n  {\n    granularity: 'days',\n    label: _('statLastYear'),\n    value: 'lastYear',\n  },\n]\n\nexport const SelectGranularity = ({ onChange, value, ...props }) => (\n  <Select {...props} onChange={onChange} options={OPTIONS} value={value} />\n)\n\nSelectGranularity.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  value: PropTypes.object.isRequired,\n}\n\n// ===================================================================\n\nconst FETCH_FN_BY_TYPE = {\n  host: fetchHostStats,\n  sr: fetchSrStats,\n  vm: fetchVmStats,\n}\n\nconst keepNLastItems = (stats, n) =>\n  Array.isArray(stats) ? stats.splice(0, stats.length - n) : forOwn(stats, metrics => keepNLastItems(metrics, n))\n\nexport const fetchStats = async (objOrId, type, { granularity, keep }) => {\n  const stats = await FETCH_FN_BY_TYPE[type](objOrId, granularity)\n  if (keep !== undefined) {\n    keepNLastItems(stats, keep)\n  }\n  return stats\n}\n","const createAction = (() => {\n  const { defineProperty } = Object\n\n  return (type, payloadCreator) =>\n    defineProperty(\n      payloadCreator\n        ? (...args) => ({\n            type,\n            payload: payloadCreator(...args),\n          })\n        : (action =>\n            function () {\n              if (arguments.length) {\n                throw new Error('this action expects no payload!')\n              }\n\n              return action\n            })({ type }),\n      'toString',\n      { value: () => type }\n    )\n})()\n\n// ===================================================================\n\nexport const selectLang = createAction('SELECT_LANG', lang => lang)\n\n// ===================================================================\n\nexport const connected = createAction('CONNECTED')\nexport const disconnected = createAction('DISCONNECTED')\n\nexport const markObjectsFetched = createAction('OBJECTS_FETCHED')\nexport const updateObjects = createAction('UPDATE_OBJECTS', updates => updates)\nexport const updatePermissions = createAction('UPDATE_PERMISSIONS', permissions => permissions)\n\nexport const signedIn = createAction('SIGNED_IN', user => user)\nexport const signedOut = createAction('SIGNED_OUT')\n\nexport const setXoaUpdaterState = createAction('XOA_UPDATER_STATE', state => state)\nexport const setXoaTrialState = createAction('XOA_TRIAL_STATE', state => state)\nexport const setXoaUpdaterLog = createAction('XOA_UPDATER_LOG', log => log)\nexport const setXoaRegisterState = createAction('XOA_REGISTER_STATE', registration => registration)\nexport const setXoaConfiguration = createAction('XOA_CONFIGURATION', configuration => configuration)\nexport const setHomeVmIdsSelection = createAction('SET_HOME_VM_IDS_SELECTION', homeVmIdsSelection => homeVmIdsSelection)\nexport const markHubResourceAsInstalling = createAction('MARK_HUB_RESOURCE_AS_INSTALLING', id => id)\nexport const markHubResourceAsInstalled = createAction('MARK_HUB_RESOURCE_AS_INSTALLED', id => id)\nexport const markRecipeAsCreating = createAction('MARK_RECIPE_AS_CREATING', id => id)\nexport const markRecipeAsDone = createAction('MARK_RECIPE_AS_DONE', id => id)\n","import reduxThunk from 'redux-thunk'\nimport { applyMiddleware, combineReducers, createStore } from 'redux'\n\nimport { connectStore as connectXo } from '../xo'\n\nimport reducer from './reducer'\n\n// ===================================================================\n\nconst store = createStore(combineReducers(reducer), applyMiddleware(reduxThunk))\n\nconnectXo(store)\n\nif (process.env.XOA_PLAN < 5) {\n  require('xoa-updater').connectStore(store)\n}\n\nexport default store\n","import cookies from 'js-cookie'\nimport omit from 'lodash/omit.js'\n\nimport invoke from '../invoke'\n\nimport * as actions from './actions'\n\n// ===================================================================\n\nconst createAsyncHandler =\n  ({ error, next }) =>\n  (state, payload, action) => {\n    if (action.error) {\n      if (error) {\n        return error(state, payload, action)\n      }\n    } else {\n      if (next) {\n        return next(state, payload, action)\n      }\n    }\n\n    return state\n  }\n\n// Action handlers are reducers but bound to a specific action.\nconst combineActionHandlers = invoke(\n  Object.hasOwnProperty,\n  obj => {\n    for (const prop in obj) {\n      return prop\n    }\n  },\n  (has, firstProp) => (initialState, handlers) => {\n    let n = 0\n    for (const actionType in handlers) {\n      if (has.call(handlers, actionType)) {\n        if (actionType === 'undefined') {\n          throw new Error('invalid action type: undefined')\n        }\n\n        ++n\n\n        const handler = handlers[actionType]\n        if (typeof handler === 'object') {\n          handlers[actionType] = createAsyncHandler(handler)\n        }\n      }\n    }\n\n    if (!n) {\n      throw new Error('no action handlers declared')\n    }\n\n    // Optimization for this special case.\n    if (n === 1) {\n      const actionType = firstProp(handlers)\n      const handler = handlers[actionType]\n\n      return (state = initialState, action) =>\n        action.type === actionType ? handler(state, action.payload, action) : state\n    }\n\n    return (state = initialState, action) => {\n      const handler = handlers[action.type]\n\n      return handler ? handler(state, action.payload, action) : state\n    }\n  }\n)\n\n// ===================================================================\n\nexport default {\n  lang: combineActionHandlers(cookies.get('lang') || 'en', {\n    [actions.selectLang]: (_, lang) => {\n      cookies.set('lang', lang)\n\n      return lang\n    },\n  }),\n\n  permissions: combineActionHandlers(\n    {},\n    {\n      [actions.updatePermissions]: (_, permissions) => permissions,\n    }\n  ),\n\n  // These IDs are used temporarily to be preselected in backup/new/vms\n  homeVmIdsSelection: combineActionHandlers([], {\n    [actions.setHomeVmIdsSelection]: (_, homeVmIdsSelection) => homeVmIdsSelection,\n  }),\n\n  // whether a resource is currently being installed: `hubInstallingResources[<template id>]`\n  hubInstallingResources: combineActionHandlers(\n    {},\n    {\n      [actions.markHubResourceAsInstalling]: (prevHubInstallingResources, id) => ({\n        ...prevHubInstallingResources,\n        [id]: true,\n      }),\n      [actions.markHubResourceAsInstalled]: (prevHubInstallingResources, id) => omit(prevHubInstallingResources, id),\n    }\n  ),\n\n  // whether a resource is currently being created: `recipeCreatingResources[<recipe id>]`\n  recipeCreatingResources: combineActionHandlers(\n    {},\n    {\n      [actions.markRecipeAsCreating]: (prevRecipeCreatingResources, id) => ({\n        ...prevRecipeCreatingResources,\n        [id]: true,\n      }),\n      [actions.markRecipeAsDone]: (prevRecipeCreatedResources, id) => omit(prevRecipeCreatedResources, id),\n    }\n  ),\n\n  objects: combineActionHandlers(\n    {\n      all: {}, // Mutable for performance!\n      byRef: new Map(), // Mutable for performance!\n      byType: {},\n      fetched: false,\n    },\n    {\n      [actions.updateObjects]: ({ all, byRef, byType: prevByType, fetched }, updates) => {\n        const byType = { ...prevByType }\n        const get = type => {\n          const curr = byType[type]\n          const prev = prevByType[type]\n          return curr === prev ? (byType[type] = { ...prev }) : curr\n        }\n\n        for (const id in updates) {\n          const object = updates[id]\n          const previous = all[id]\n\n          if (object) {\n            const { type } = object\n\n            all[id] = object\n            byRef.set(object._xapiRef, object)\n            get(type)[id] = object\n\n            if (previous && previous.type !== type) {\n              delete get(previous.type)[id]\n            }\n          } else if (previous) {\n            delete all[id]\n            delete get(previous.type)[id]\n            byRef.delete(previous._xapiRef)\n          }\n        }\n\n        return { all, byRef, byType, fetched }\n      },\n      [actions.markObjectsFetched]: state => ({\n        ...state,\n        fetched: true,\n      }),\n    }\n  ),\n\n  user: combineActionHandlers(null, {\n    [actions.signedIn]: {\n      next: (_, user) => user,\n    },\n  }),\n\n  status: combineActionHandlers('disconnected', {\n    [actions.connected]: () => 'connected',\n    [actions.disconnected]: () => 'disconnected',\n  }),\n\n  xoaUpdaterState: combineActionHandlers('disconnected', {\n    [actions.setXoaUpdaterState]: (_, state) => state,\n  }),\n  xoaTrialState: combineActionHandlers(\n    {},\n    {\n      [actions.setXoaTrialState]: (_, state) => state,\n    }\n  ),\n  xoaUpdaterLog: combineActionHandlers([], {\n    [actions.setXoaUpdaterLog]: (_, log) => log,\n  }),\n  xoaRegisterState: combineActionHandlers(\n    { state: '?' },\n    {\n      [actions.setXoaRegisterState]: (_, registration) => registration,\n    }\n  ),\n  xoaConfiguration: combineActionHandlers(\n    { proxyHost: '', proxyPort: '', proxyUser: '' },\n    {\n      // defined values for controlled inputs\n      [actions.setXoaConfiguration]: (_, configuration) => {\n        delete configuration.password\n        return configuration\n      },\n    }\n  ),\n}\n","import React from 'react'\n\nimport _ from './intl'\nimport ActionButton from './action-button'\nimport Icon from './icon'\nimport Link from './link'\n\nconst STYLE = {\n  marginBottom: '1em',\n  marginLeft: '1em',\n}\n\nconst TabButton = ({ labelId, ...props }) => (\n  <ActionButton {...props} size='large' style={STYLE}>\n    {labelId !== undefined && <span className='hidden-md-down'>{_(labelId)}</span>}\n  </ActionButton>\n)\nexport { TabButton as default }\n\nexport const TabButtonLink = ({ labelId, icon, ...props }) => (\n  <Link {...props} className='btn btn-lg btn-primary' style={STYLE}>\n    {icon && (\n      <span>\n        <Icon icon={icon} />{' '}\n      </span>\n    )}\n    <span className='hidden-md-down'>{_(labelId)}</span>\n  </Link>\n)\n","import _ from 'intl'\nimport filter from 'lodash/filter'\nimport includes from 'lodash/includes'\nimport keyBy from 'lodash/keyBy'\nimport map from 'lodash/map'\nimport pFinally from 'promise-toolbox/finally'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport relativeLuminance from 'relative-luminance'\nimport { addSubscriptions, connectStore } from 'utils'\nimport { setTag, subscribeConfiguredTags } from 'xo'\nimport { Col, Container, Row } from 'grid'\nimport { isAdmin } from 'selectors'\n\nimport ActionButton from './action-button'\nimport Button from './button'\nimport Component from './base-component'\nimport getEventValue from './get-event-value'\nimport Icon from './icon'\nimport Tooltip from './tooltip'\nimport { confirm } from './modal'\nimport { SelectTag } from './select-objects'\n\nconst noop = Function.prototype\n\nconst DEFAULT_TAG_COLOR = '#2598d9'\n\nconst INPUT_STYLE = {\n  maxWidth: '8em',\n  margin: 'auto',\n}\n\nconst MARGIN_AUTO = {\n  margin: 'auto',\n}\n\nconst INHERIT_STYLE = {\n  display: 'inherit',\n  width: 'inherit',\n}\n\nconst ADD_TAG_STYLE = {\n  cursor: 'pointer',\n  display: 'inline-block',\n  fontSize: '0.8em',\n  marginLeft: '0.2em',\n  verticalAlign: 'middle',\n}\n\nconst Fragment = ({ children }) => <div style={INHERIT_STYLE}>{children}</div>\n\nclass AdvancedTagCreation extends Component {\n  state = {\n    tags: this.props.defaultTags.map(tag => ({ id: tag, value: tag })),\n    tagConfigurations: this.props.tagConfigurations ?? {},\n  }\n\n  get value() {\n    return { ...this.state, tags: this.state.tags.map(_ => _.value) }\n  }\n\n  onChangeTagConfiguration(tagId, key, value) {\n    this.setState({\n      tagConfigurations: {\n        ...this.state.tagConfigurations,\n        [tagId]: {\n          ...this.state.tagConfigurations[tagId],\n          [key]: value,\n        },\n      },\n    })\n  }\n\n  render() {\n    return (\n      <Container>\n        <Row className='d-flex'>\n          <Col>\n            <SelectTag multi onChange={this.linkState('tags')} value={this.state.tags} />\n          </Col>\n        </Row>\n        {this.props.isAdmin && (\n          <ul className='list-group'>\n            {this.state.tags.map(tag => {\n              const _onAddTagColor = () => this.onChangeTagConfiguration(tag.id, 'color', DEFAULT_TAG_COLOR)\n              const _onRemoveTagColor = () => this.onChangeTagConfiguration(tag.id, 'color', null)\n              const _onChangeTagColor = event => this.onChangeTagConfiguration(tag.id, 'color', getEventValue(event))\n\n              const tagConfiguration = this.state.tagConfigurations[tag.id]\n              return (\n                <li className='list-group-item' key={tag.id}>\n                  <Container>\n                    <Row className='d-flex'>\n                      <Col style={MARGIN_AUTO}>{tag.value}</Col>\n                      <Col className='d-flex justify-content-end'>\n                        {tagConfiguration?.color == null ? (\n                          <Button onClick={_onAddTagColor} size='small'>\n                            {_('addColor')}\n                          </Button>\n                        ) : (\n                          <Fragment>\n                            <input\n                              className='form-control mr-1'\n                              style={INPUT_STYLE}\n                              type='color'\n                              onChange={_onChangeTagColor}\n                              value={tagConfiguration.color}\n                            />\n                            <Button onClick={_onRemoveTagColor} size='small'>\n                              {_('removeColor')}\n                            </Button>\n                          </Fragment>\n                        )}\n                      </Col>\n                    </Row>\n                  </Container>\n                </li>\n              )\n            })}\n          </ul>\n        )}\n      </Container>\n    )\n  }\n}\n\n@addSubscriptions({\n  configuredTags: cb => subscribeConfiguredTags(tags => cb(keyBy(tags, 'id'))),\n})\n@connectStore({\n  isAdmin,\n})\nexport default class Tags extends Component {\n  static propTypes = {\n    labels: PropTypes.arrayOf(PropTypes.string).isRequired,\n    onAdd: PropTypes.func,\n    onChange: PropTypes.func,\n    onClick: PropTypes.func,\n    onDelete: PropTypes.func,\n  }\n\n  componentWillMount() {\n    this.setState({ editing: false })\n  }\n\n  _startEdit = () => {\n    this.setState({ editing: true })\n  }\n  _stopEdit = () => {\n    this.setState({ editing: false })\n  }\n\n  _addTag = newTag => {\n    const { labels, onAdd, onChange } = this.props\n\n    if (!includes(labels, newTag)) {\n      onAdd && onAdd(newTag)\n      onChange && onChange([...labels, newTag])\n    }\n  }\n  _deleteTag = tag => {\n    const { onChange, onDelete } = this.props\n\n    onDelete && onDelete(tag)\n    onChange && onChange(filter(this.props.labels, t => t !== tag))\n  }\n\n  _onKeyDown = event => {\n    const { keyCode, target } = event\n\n    if (keyCode === 13) {\n      if (target.value) {\n        this._addTag(target.value)\n        target.value = ''\n      }\n    } else if (keyCode === 27) {\n      this._stopEdit()\n    } else {\n      return\n    }\n\n    event.preventDefault()\n  }\n\n  _advancedTagCreation = () =>\n    confirm({\n      body: (\n        <AdvancedTagCreation\n          isAdmin={this.props.isAdmin}\n          tagConfigurations={this.props.configuredTags}\n          defaultTags={this.props.labels}\n        />\n      ),\n      icon: 'add',\n      title: _('advancedTagCreation'),\n    })\n      ::pFinally(this._stopEdit)\n      .then(({ tags, tagConfigurations }) =>\n        Promise.all(\n          tags.map(async tag => {\n            await this._addTag(tag)\n            const tagConfiguration = tagConfigurations[tag]\n            return this.props.isAdmin && tagConfiguration !== undefined ? setTag(tag, tagConfiguration) : noop()\n          })\n        )\n      )\n\n  _focus = () => {\n    this._focused = true\n  }\n\n  _closeEditionIfUnfocused = () => {\n    this._focused = false\n    setTimeout(() => {\n      !this._focused && this._stopEdit()\n    }, 10)\n  }\n\n  render() {\n    const { labels, onAdd, onChange, onClick, onDelete } = this.props\n\n    const deleteTag = (onDelete || onChange) && this._deleteTag\n\n    return (\n      <div style={{ color: '#999', display: 'inline-block' }}>\n        <div style={{ display: 'inline-block', verticalAlign: 'middle' }}>\n          <Icon icon='tags' />\n        </div>\n        <div style={{ display: 'inline-block', fontSize: '0.6em', verticalAlign: 'middle' }}>\n          {map(labels.sort(), (label, index) => (\n            <Tag label={label} onDelete={deleteTag} key={index} onClick={onClick} />\n          ))}\n        </div>\n        {(onAdd || onChange) && !this.state.editing ? (\n          <div onClick={this._startEdit} style={ADD_TAG_STYLE}>\n            <Icon icon='add-tag' />\n          </div>\n        ) : (\n          <div\n            style={{ display: 'inline-block', verticalAlign: 'middle' }}\n            className='form-inline'\n            onBlur={this._closeEditionIfUnfocused}\n            onFocus={this._focus}\n          >\n            <span className='input-group'>\n              <input autoFocus className='form-control' onKeyDown={this._onKeyDown} style={INPUT_STYLE} type='text' />\n              <span className='input-group-btn'>\n                <Tooltip content={_('advancedTagCreation')}>\n                  <ActionButton handler={this._advancedTagCreation} icon='add' />\n                </Tooltip>\n              </span>\n            </span>\n          </div>\n        )}\n      </div>\n    )\n  }\n}\n\nconst TAG_TO_MESSAGE_ID = {\n  'xo:no-bak': 'tagNoBak',\n  'xo:notify-on-snapshot': 'tagNotifyOnSnapshot',\n  'xo:no-health-check': 'tagNoHealthCheck',\n}\n\n@addSubscriptions({\n  configuredTags: cb => subscribeConfiguredTags(tags => cb(keyBy(tags, 'id'))),\n})\nexport class Tag extends Component {\n  render() {\n    const { label, onDelete, onClick, configuredTags } = this.props\n    const color = configuredTags?.[label]?.color ?? DEFAULT_TAG_COLOR\n    const borderSize = '0.2em'\n    const padding = '0.2em'\n\n    const isLight =\n      relativeLuminance(\n        Array.from({ length: 3 }, (_, i) => {\n          const j = i * 2 + 1\n          return parseInt(color.slice(j, j + 2), 16)\n        })\n      ) > 0.5\n\n    const i = label.indexOf('=')\n    const isScoped = i !== -1\n\n    const scope = isScoped ? label.slice(0, i) : label\n    const reason = isScoped ? label.slice(i + 1) : null\n\n    const messageId = TAG_TO_MESSAGE_ID[scope]\n\n    return (\n      <div\n        style={{\n          background: color,\n          border: borderSize + ' solid ' + color,\n          borderRadius: '0.5em',\n          color: isLight ? '#000' : '#fff',\n          display: 'inline-block',\n          margin: '0.2em',\n\n          // prevent value background from breaking border radius\n          overflow: 'clip',\n        }}\n      >\n        {messageId && (\n          <div\n            style={{\n              cursor: 'help',\n              display: 'inline-block',\n              padding,\n            }}\n          >\n            <Tooltip content={_(messageId, { reason })}>\n              <Icon icon='info' />\n            </Tooltip>\n          </div>\n        )}\n        <div\n          onClick={onClick && (() => onClick(label))}\n          style={{\n            cursor: onClick && 'pointer',\n            display: 'inline-block',\n          }}\n        >\n          <div\n            style={{\n              display: 'inline-block',\n              padding,\n            }}\n          >\n            {scope}\n          </div>\n          {isScoped && (\n            <div\n              style={{\n                background: '#fff',\n                color: '#000',\n                display: 'inline-block',\n                padding,\n              }}\n            >\n              {reason || <i>N/A</i>}\n            </div>\n          )}\n        </div>\n        {onDelete && (\n          <div\n            onClick={onDelete && (() => onDelete(label))}\n            style={{\n              cursor: 'pointer',\n              display: 'inline-block',\n              padding,\n\n              // if isScoped, the display is a bit different\n              background: isScoped && '#fff',\n              color: isScoped && (isLight ? '#000' : color),\n            }}\n          >\n            <Icon icon='remove-tag' />\n          </div>\n        )}\n      </div>\n    )\n  }\n}\nTag.propTypes = {\n  label: PropTypes.string.isRequired,\n  onDelete: PropTypes.func,\n  onClick: PropTypes.func,\n}\n","export default {\n  failure: {\n    icon: 'halted',\n    label: 'taskFailed',\n  },\n  skipped: {\n    icon: 'skipped',\n    label: 'taskSkipped',\n  },\n  success: {\n    icon: 'running',\n    label: 'taskSuccess',\n  },\n  pending: {\n    icon: 'busy',\n    label: 'taskStarted',\n  },\n  interrupted: {\n    icon: 'halted',\n    label: 'taskInterrupted',\n  },\n  unknown: {\n    icon: 'unknown',\n    label: 'unknown',\n  },\n}\n","export default {\n  disabledStateBg: '#fff',\n  disabledStateColor: '#c0392b',\n  enabledStateBg: '#fff',\n  enabledStateColor: '#27ae60',\n}\n","//\n// This file has been generated by [index-modules](https://npmjs.com/index-modules)\n//\n\nconst properties = {}\n\nimport * as _base from \"./base.js\"\nif (\"default\" in _base) properties.base = { enumerable: true, get: () => _base.default }\nexport { _base as base }\n\nexport default Object.create(null, properties)\n","import ActionButton from 'action-button'\nimport map from 'lodash/map'\nimport moment from 'moment-timezone'\nimport PropTypes from 'prop-types'\nimport React from 'react'\n\nimport _ from './intl'\nimport Component from './base-component'\nimport { getXoServerTimezone } from './xo'\nimport { Select } from './form'\n\nconst SERVER_TIMEZONE_TAG = 'server'\nconst LOCAL_TIMEZONE = moment.tz.guess()\n\nexport default class TimezonePicker extends Component {\n  static propTypes = {\n    defaultValue: PropTypes.string,\n    onChange: PropTypes.func.isRequired,\n    required: PropTypes.bool,\n    value: PropTypes.string,\n  }\n\n  componentDidMount() {\n    getXoServerTimezone.then(serverTimezone => {\n      this.setState({\n        timezone: this.props.value || this.props.defaultValue || SERVER_TIMEZONE_TAG,\n        options: [\n          ...map(moment.tz.names(), value => ({ label: value, value })),\n          {\n            label: _('serverTimezoneOption', {\n              value: serverTimezone,\n            }),\n            value: SERVER_TIMEZONE_TAG,\n          },\n        ],\n      })\n    })\n  }\n\n  componentWillReceiveProps(props) {\n    if (props.value !== this.props.value) {\n      this.setState({ timezone: props.value || SERVER_TIMEZONE_TAG })\n    }\n  }\n\n  get value() {\n    return this.state.timezone === SERVER_TIMEZONE_TAG ? null : this.state.timezone\n  }\n\n  set value(value) {\n    this.setState({ timezone: value || SERVER_TIMEZONE_TAG })\n  }\n\n  _onChange = option => {\n    if (option && option.value === this.state.timezone) {\n      return\n    }\n\n    this.setState(\n      {\n        timezone: (option != null && option.value) || SERVER_TIMEZONE_TAG,\n      },\n      () => this.props.onChange(this.state.timezone === SERVER_TIMEZONE_TAG ? null : this.state.timezone)\n    )\n  }\n\n  _useLocalTime = () => {\n    this._onChange({ value: LOCAL_TIMEZONE })\n  }\n\n  render() {\n    const { timezone, options } = this.state\n\n    return (\n      <div>\n        <Select\n          className='mb-1'\n          onChange={this._onChange}\n          options={options}\n          placeholder={_('selectTimezone')}\n          required={this.props.required}\n          value={timezone}\n        />\n        <div className='pull-right'>\n          <ActionButton handler={this._useLocalTime} icon='time'>\n            {_('timezonePickerUseLocalTime')}\n          </ActionButton>\n        </div>\n      </div>\n    )\n  }\n}\n","// Source: https://github.com/wwayne/react-tooltip/blob/master/src/utils/getPosition.js\n\n/**\n * Calculate the position of tooltip\n *\n * @params\n * - `e` {Event} the event of current mouse\n * - `target` {Element} the currentTarget of the event\n * - `node` {DOM} the react-tooltip object\n * - `place` {String} top / right / bottom / left\n * - `effect` {String} float / solid\n * - `offset` {Object} the offset to default position\n *\n * @return {Object\n * - `isNewState` {Bool} required\n * - `newState` {Object}\n * - `position` {OBject} {left: {Number}, top: {Number}}\n */\nexport default function (e, target, node, place, effect, offset) {\n  const tipWidth = node.clientWidth\n  const tipHeight = node.clientHeight\n  const { mouseX, mouseY } = getCurrentOffset(e, target, effect)\n  const defaultOffset = getDefaultPosition(effect, target.clientWidth, target.clientHeight, tipWidth, tipHeight)\n  const { extraOffsetX, extraOffsetY } = calculateOffset(offset)\n\n  const windowWidth = window.innerWidth\n  const windowHeight = window.innerHeight\n\n  const { parentTop, parentLeft } = getParent(target)\n\n  // Get the edge offset of the tooltip\n  const getTipOffsetLeft = place => {\n    const offsetX = defaultOffset[place].l\n    return mouseX + offsetX + extraOffsetX\n  }\n  const getTipOffsetRight = place => {\n    const offsetX = defaultOffset[place].r\n    return mouseX + offsetX + extraOffsetX\n  }\n  const getTipOffsetTop = place => {\n    const offsetY = defaultOffset[place].t\n    return mouseY + offsetY + extraOffsetY\n  }\n  const getTipOffsetBottom = place => {\n    const offsetY = defaultOffset[place].b\n    return mouseY + offsetY + extraOffsetY\n  }\n\n  // Judge if the tooltip has over the window(screen)\n  const outsideVertical = () => {\n    let result = false\n    let newPlace\n    if (\n      getTipOffsetTop('left') < 0 &&\n      getTipOffsetBottom('left') <= windowHeight &&\n      getTipOffsetBottom('bottom') <= windowHeight\n    ) {\n      result = true\n      newPlace = 'bottom'\n    } else if (\n      getTipOffsetBottom('left') > windowHeight &&\n      getTipOffsetTop('left') >= 0 &&\n      getTipOffsetTop('top') >= 0\n    ) {\n      result = true\n      newPlace = 'top'\n    }\n    return { result, newPlace }\n  }\n  const outsideLeft = () => {\n    let { result, newPlace } = outsideVertical() // Deal with vertical as first priority\n    if (result && outsideHorizontal().result) {\n      return { result: false } // No need to change, if change to vertical will out of space\n    }\n    if (!result && getTipOffsetLeft('left') < 0 && getTipOffsetRight('right') <= windowWidth) {\n      result = true // If vertical ok, but let out of side and right won't out of side\n      newPlace = 'right'\n    }\n    return { result, newPlace }\n  }\n  const outsideRight = () => {\n    let { result, newPlace } = outsideVertical()\n    if (result && outsideHorizontal().result) {\n      return { result: false } // No need to change, if change to vertical will out of space\n    }\n    if (!result && getTipOffsetRight('right') > windowWidth && getTipOffsetLeft('left') >= 0) {\n      result = true\n      newPlace = 'left'\n    }\n    return { result, newPlace }\n  }\n\n  const outsideHorizontal = () => {\n    let result = false\n    let newPlace\n    if (\n      getTipOffsetLeft('top') < 0 &&\n      getTipOffsetRight('top') <= windowWidth &&\n      getTipOffsetRight('right') <= windowWidth\n    ) {\n      result = true\n      newPlace = 'right'\n    } else if (\n      getTipOffsetRight('top') > windowWidth &&\n      getTipOffsetLeft('top') >= 0 &&\n      getTipOffsetLeft('left') >= 0\n    ) {\n      result = true\n      newPlace = 'left'\n    }\n    return { result, newPlace }\n  }\n  const outsideTop = () => {\n    let { result, newPlace } = outsideHorizontal()\n    if (result && outsideVertical().result) {\n      return { result: false }\n    }\n    if (!result && getTipOffsetTop('top') < 0 && getTipOffsetBottom('bottom') <= windowHeight) {\n      result = true\n      newPlace = 'bottom'\n    }\n    return { result, newPlace }\n  }\n  const outsideBottom = () => {\n    let { result, newPlace } = outsideHorizontal()\n    if (result && outsideVertical().result) {\n      return { result: false }\n    }\n    if (!result && getTipOffsetBottom('bottom') > windowHeight && getTipOffsetTop('top') >= 0) {\n      result = true\n      newPlace = 'top'\n    }\n    return { result, newPlace }\n  }\n\n  // Return new state to change the placement to the reverse if possible\n  const outsideLeftResult = outsideLeft()\n  const outsideRightResult = outsideRight()\n  const outsideTopResult = outsideTop()\n  const outsideBottomResult = outsideBottom()\n\n  if (place === 'left' && outsideLeftResult.result) {\n    return {\n      isNewState: true,\n      newState: { place: outsideLeftResult.newPlace },\n    }\n  } else if (place === 'right' && outsideRightResult.result) {\n    return {\n      isNewState: true,\n      newState: { place: outsideRightResult.newPlace },\n    }\n  } else if (place === 'top' && outsideTopResult.result) {\n    return {\n      isNewState: true,\n      newState: { place: outsideTopResult.newPlace },\n    }\n  } else if (place === 'bottom' && outsideBottomResult.result) {\n    return {\n      isNewState: true,\n      newState: { place: outsideBottomResult.newPlace },\n    }\n  }\n\n  // Return tooltip offset position\n  return {\n    isNewState: false,\n    position: {\n      left: getTipOffsetLeft(place) - parentLeft,\n      top: getTipOffsetTop(place) - parentTop,\n    },\n  }\n}\n\n// Get current mouse offset\nconst getCurrentOffset = (e, currentTarget, effect) => {\n  const boundingClientRect = currentTarget.getBoundingClientRect()\n  const targetTop = boundingClientRect.top\n  const targetLeft = boundingC