From ae624d2908a6f22c78f6671bd3aad3a0d47cb0cf Mon Sep 17 00:00:00 2001 From: Boris Vasilenko Date: Wed, 23 Aug 2023 21:13:19 +0300 Subject: [PATCH 01/12] NAS-123494 / 24.04 / Add integration test for apps (#8611) * NAS-123494: Add tests for apps * NAS-123494: Add tests for finding app * NAS-123494: Add tests for redirect to available apps * NAS-123494: Fix tests after merge * Remove `Redirect to available apps` test --------- Co-authored-by: Boris Vasilenko --- .../installed-apps.component.spec.ts | 766 ++++++++++++++++++ 1 file changed, 766 insertions(+) create mode 100644 src/app/pages/apps/components/installed-apps/installed-apps.component.spec.ts diff --git a/src/app/pages/apps/components/installed-apps/installed-apps.component.spec.ts b/src/app/pages/apps/components/installed-apps/installed-apps.component.spec.ts new file mode 100644 index 00000000000..f5b6d15d2e5 --- /dev/null +++ b/src/app/pages/apps/components/installed-apps/installed-apps.component.spec.ts @@ -0,0 +1,766 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { MatDialog } from '@angular/material/dialog'; +import { MatInputHarness } from '@angular/material/input/testing'; +import { ActivatedRoute, Router } from '@angular/router'; +import { + Spectator, createComponentFactory, createRoutingFactory, mockProvider, +} from '@ngneat/spectator/jest'; +import { MockComponents } from 'ng-mocks'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; +import { of } from 'rxjs'; +import { mockEntityJobComponentRef } from 'app/core/testing/utils/mock-entity-job-component-ref.utils'; +import { mockCall, mockJob, mockWebsocket } from 'app/core/testing/utils/mock-websocket.utils'; +import { AvailableApp } from 'app/interfaces/available-app.interface'; +import { CatalogApp } from 'app/interfaces/catalog.interface'; +import { ChartFormValue, ChartRelease } from 'app/interfaces/chart-release.interface'; +import { KubernetesConfig } from 'app/interfaces/kubernetes-config.interface'; +import { IxDynamicFormModule } from 'app/modules/ix-dynamic-form/ix-dynamic-form.module'; +import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; +import { IxFormHarness } from 'app/modules/ix-forms/testing/ix-form.harness'; +import { AppCardLogoComponent } from 'app/pages/apps/components/app-card-logo/app-card-logo.component'; +import { AppAvailableInfoCardComponent } from 'app/pages/apps/components/app-detail-view/app-available-info-card/app-available-info-card.component'; +import { AppDetailViewComponent } from 'app/pages/apps/components/app-detail-view/app-detail-view.component'; +import { AppDetailsHeaderComponent } from 'app/pages/apps/components/app-detail-view/app-details-header/app-details-header.component'; +import { AppDetailsSimilarComponent } from 'app/pages/apps/components/app-detail-view/app-details-similar/app-details-similar.component'; +import { AppHelmChartCardComponent } from 'app/pages/apps/components/app-detail-view/app-helm-chart-card/app-helm-chart-card.component'; +import { AppResourcesCardComponent } from 'app/pages/apps/components/app-detail-view/app-resources-card/app-resources-card.component'; +import { AppCardComponent } from 'app/pages/apps/components/available-apps/app-card/app-card.component'; +import { AvailableAppsHeaderComponent } from 'app/pages/apps/components/available-apps/available-apps-header/available-apps-header.component'; +import { AvailableAppsComponent } from 'app/pages/apps/components/available-apps/available-apps.component'; +import { ChartWizardComponent } from 'app/pages/apps/components/chart-wizard/chart-wizard.component'; +import { AppsFilterStore } from 'app/pages/apps/store/apps-filter-store.service'; +import { AppsStore } from 'app/pages/apps/store/apps-store.service'; +import { InstalledAppsStore } from 'app/pages/apps/store/installed-apps-store.service'; +import { KubernetesStore } from 'app/pages/apps/store/kubernetes-store.service'; +import { AppCatalogPipe } from 'app/pages/apps/utils/app-catalog.pipe'; +import { AuthService } from 'app/services/auth/auth.service'; + +const existingCatalogApp = { + name: 'webdav', + versions: { + ['1.0.9' as string]: { + healthy: true, + schema: { + groups: [ + { + name: 'WebDAV Configuration', + description: 'Configure WebDAV', + }, + { + name: 'User and Group Configuration', + description: 'Configure User and Group for WebDAV', + }, + { + name: 'Network Configuration', + description: 'Configure Network for WebDAV', + }, + { + name: 'Storage Configuration', + description: 'Configure Storage for WebDAV', + }, + { + name: 'Resources Configuration', + description: 'Configure Resources for WebDAV', + }, + ], + questions: [ + { + variable: 'webdavConfig', + label: '', + group: 'WebDAV Configuration', + schema: { + type: 'dict', + attrs: [ + { + variable: 'authType', + label: 'Authentication Type', + description: 'Select the authentication type for WebDAV.', + schema: { + type: 'string', + default: 'none', + enum: [ + { + value: 'none', + description: 'No Authentication', + }, + { + value: 'basic', + description: 'Basic Authentication', + }, + ], + }, + }, + { + variable: 'username', + label: 'Username', + description: 'The username for basic authentication.', + schema: { + type: 'string', + show_if: [ + [ + 'authType', + '=', + 'basic', + ], + ], + required: true, + }, + }, + { + variable: 'password', + label: 'Password', + description: 'The password for basic authentication.', + schema: { + type: 'string', + show_if: [ + [ + 'authType', + '=', + 'basic', + ], + ], + private: true, + required: true, + }, + }, + { + variable: 'additionalEnvs', + label: 'Additional Environment Variables', + description: 'Configure additional environment variables for WebDAV.', + schema: { + type: 'list', + default: [], + items: [ + { + variable: 'env', + label: 'Environment Variable', + schema: { + type: 'dict', + attrs: [ + { + variable: 'name', + label: 'Name', + schema: { + type: 'string', + required: true, + }, + }, + { + variable: 'value', + label: 'Value', + schema: { + type: 'string', + required: true, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + variable: 'webdavRunAs', + label: '', + group: 'User and Group Configuration', + schema: { + type: 'dict', + attrs: [ + { + variable: 'user', + label: 'User ID', + description: 'The user id that WebDAV will run as.', + schema: { + type: 'int', + min: 2, + default: 666, + required: true, + }, + }, + { + variable: 'group', + label: 'Group ID', + description: 'The group id that WebDAV will run as.', + schema: { + type: 'int', + min: 2, + default: 666, + required: true, + }, + }, + ], + }, + }, + { + variable: 'webdavNetwork', + label: '', + group: 'Network Configuration', + schema: { + type: 'dict', + attrs: [ + { + variable: 'http', + label: 'Enable HTTP', + description: 'Enable HTTP for WebDAV.', + schema: { + type: 'boolean', + default: true, + show_subquestions_if: true, + subquestions: [ + { + variable: 'httpPort', + label: 'HTTP Port', + description: 'The port for HTTP WebDAV.', + schema: { + type: 'int', + default: 30034, + min: 9000, + max: 65535, + required: true, + }, + }, + ], + }, + }, + { + variable: 'https', + label: 'Enable HTTPS', + description: 'Enable HTTPS for WebDAV.', + schema: { + type: 'boolean', + default: false, + show_subquestions_if: true, + subquestions: [ + { + variable: 'httpsPort', + label: 'HTTPS Port', + description: 'The port for HTTPS WebDAV.', + schema: { + type: 'int', + default: 30035, + min: 9000, + max: 65535, + required: true, + }, + }, + { + variable: 'certificateID', + label: 'Certificate', + description: 'The certificate to use for HTTPS WebDAV.', + schema: { + type: 'int', + null: true, + $ref: [ + 'definitions/certificate', + ], + enum: [ + { + value: null, + description: 'No Certificate', + }, + { + value: 1, + description: "'truenas_default' Certificate", + }, + ], + default: null, + }, + }, + ], + }, + }, + { + variable: 'hostNetwork', + label: 'Host Network', + description: "Bind to the host network. It's recommended to keep this disabled.
\n", + schema: { + type: 'boolean', + default: false, + }, + }, + ], + }, + }, + { + variable: 'webdavStorage', + label: '', + group: 'Storage Configuration', + schema: { + type: 'dict', + attrs: [ + { + variable: 'shares', + label: 'Shares', + description: 'Shares for WebDAV.', + schema: { + type: 'list', + empty: false, + required: true, + default: [], + items: [ + { + variable: 'shareEntry', + label: 'Share Entry', + schema: { + type: 'dict', + attrs: [ + { + variable: 'enabled', + label: 'Enable the share', + description: 'Enable the share.', + schema: { + type: 'boolean', + default: true, + }, + }, + { + variable: 'name', + label: 'Share Name', + description: 'The name of the share.
\nAlso serves as the endpoint for the share.
\nExample: [share1] will be available at [http://:/share1]\n', + schema: { + type: 'string', + valid_chars: '^[a-zA-Z0-9_-]+$', + valid_chars_error: 'Share name can only consist of [Letters(a-z, A-Z), Numbers(0-9), Underscores(_), Dashes(-)]', + required: true, + }, + }, + { + variable: 'description', + label: 'Description', + description: 'Share description. Only used for documentation.', + schema: { + type: 'string', + }, + }, + { + variable: 'hostPath', + label: 'Host Path', + description: 'The host path to use for the share.', + schema: { + type: 'hostpath', + required: true, + }, + }, + { + variable: 'readOnly', + label: 'Read Only', + description: 'Enable read only access to the share.
\nThis will disable write access to the share.
\nData will be mounted as read only.\n', + schema: { + type: 'boolean', + default: false, + }, + }, + { + variable: 'fixPermissions', + label: 'Fix Permissions', + description: 'Enable permission fix for the share.
\nThis will fix the permissions of the share on startup.
\nThis will change the owner of the share to the user and group specified in [User and Group Configuration].
\nNote: This will still change permissions even if [Read Only] for the share is enabled.\n', + schema: { + type: 'boolean', + default: false, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + variable: 'resources', + group: 'Resources Configuration', + label: '', + schema: { + type: 'dict', + attrs: [ + { + variable: 'limits', + label: 'Limits', + schema: { + type: 'dict', + attrs: [ + { + variable: 'cpu', + label: 'CPU', + description: 'CPU limit for WebDAV.', + schema: { + type: 'string', + max_length: 6, + valid_chars: '^(0\\.[1-9]|[1-9][0-9]*)(\\.[0-9]|m?)$', + valid_chars_error: 'Valid CPU limit formats are
\n- Plain Integer - eg. 1
\n- Float - eg. 0.5
\n- Milicpu - eg. 500m\n', + default: '4000m', + required: true, + }, + }, + { + variable: 'memory', + label: 'Memory', + description: 'Memory limit for WebDAV.', + schema: { + type: 'string', + max_length: 12, + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$', + valid_chars_error: 'Valid Memory limit formats are
\n- Suffixed with E/P/T/G/M/K - eg. 1G
\n- Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
\n- Plain Integer in bytes - eg. 1024
\n- Exponent - eg. 134e6\n', + default: '8Gi', + required: true, + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + app_readme: '

WebDAV

\n

When application is installed and is selected on at least 1 share\na container will be launched with root privileges. This is required in order to apply\nthe correct permissions to the WebDAV shares/directories.\nAfterward, the WebDAV container will run as a non-root user (Default: 666).\nChown will only apply if the parent directory does not match the configured user and group.

\n', + detailed_readme: '

WebDAV

\n

WebDAV is a set of extensions to the HTTP protocol which allows users to collaboratively edit and manage files on remote web servers.

\n
\n

When application is installed and Fix Permissions is selected on at least 1 share\na container will be launched with root privileges. This is required in order to apply\nthe correct permissions to the selected WebDAV shares/directories.\nAfterward, the WebDAV container will run as a non-root user (Default: 666).\nNote that chown will only apply if the parent directory does not match the configured user and group.

\n
', + changelog: null, + }, + }, + latest_version: '1.0.9', +} as CatalogApp; + +const existingChartEdit = { + name: 'tftpd-hpa', + id: 'tftpd-hpa', + config: { + TZ: 'America/Los_Angeles', + global: { + ixChartContext: { + addNvidiaRuntimeClass: false, + isInstall: true, + isUpdate: false, + isUpgrade: false, + kubernetes_config: { + cluster_cidr: '172.16.0.0/16', + cluster_dns_ip: '172.17.0.10', + service_cidr: '172.17.0.0/16', + }, + nvidiaRuntimeClassName: 'nvidia', + operation: 'INSTALL', + storageClassName: 'ix-storage-class-tftpd-hpa', + upgradeMetadata: {}, + }, + }, + image: { + pullPolicy: 'IfNotPresent', + repository: 'ixsystems/tftpd-hpa', + tag: '1.0.0', + }, + ixCertificateAuthorities: {}, + ixCertificates: {}, + ixChartContext: { + addNvidiaRuntimeClass: false, + isInstall: true, + isUpdate: false, + isUpgrade: false, + kubernetes_config: { + cluster_cidr: '172.16.0.0/16', + cluster_dns_ip: '172.17.0.10', + service_cidr: '172.17.0.0/16', + }, + nvidiaRuntimeClassName: 'nvidia', + operation: 'INSTALL', + storageClassName: 'ix-storage-class-tftpd-hpa', + upgradeMetadata: {}, + }, + ixExternalInterfacesConfiguration: [], + ixExternalInterfacesConfigurationNames: [], + ixVolumes: [ + { + hostPath: '/mnt/my pool/ix-applications/releases/tftpd-hpa/volumes/ix_volumes/tftpboot', + }, + ], + release_name: 'tftpd-hpa', + resources: { + limits: { + cpu: '4000m', + memory: '8Gi', + }, + }, + tftpConfig: { + additionalEnvs: [], + allowCreate: false, + }, + tftpNetwork: { + hostNetwork: true, + tftpPort: 30031, + }, + tftpStorage: { + tftpboot: { + datasetName: 'tftpboot', + type: 'ixVolume', + }, + }, + } as { [key: string]: ChartFormValue }, +} as ChartRelease; + +const appsResponse = [{ + name: 'webdav', + catalog: 'TRUENAS', + train: 'community', + description: 'webdav', + app_readme: '

WebDAV

\n

When application ...

', + last_update: { $date: 452 }, +}] as AvailableApp[]; + +describe('Finding app', () => { + let spectator: Spectator; + let loader: HarnessLoader; + let searchInput: MatInputHarness; + + const createComponent = createComponentFactory({ + component: AvailableAppsComponent, + imports: [ + IxFormsModule, + ReactiveFormsModule, + AppCatalogPipe, + ], + declarations: [ + AvailableAppsHeaderComponent, + AppCardComponent, + AppCardLogoComponent, + ], + providers: [ + KubernetesStore, + InstalledAppsStore, + mockWebsocket([]), + mockProvider(AppsStore, { + isLoading$: of(false), + availableApps$: of([]), + catalogs$: of([]), + }), + mockProvider(AppsFilterStore, { + isFilterApplied$: of(false), + filterValues$: of({}), + applySearchQuery: jest.fn(), + searchedApps$: of([{ apps: appsResponse }]), + searchQuery$: of('webdav'), + }), + ], + }); + + beforeEach(async () => { + spectator = createComponent(); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + searchInput = await loader.getHarness(MatInputHarness.with({ placeholder: 'Search' })); + }); + + it('find app', async () => { + await searchInput.setValue('webdav'); + expect(spectator.inject(AppsFilterStore).applySearchQuery).toHaveBeenLastCalledWith('webdav'); + + expect(spectator.query('.section-title').textContent.trim()).toBe('Search Results for «webdav»'); + }); + + it('redirect to details app when app card is pressed', () => { + const href = spectator.query('ix-app-card').getAttribute('ng-reflect-router-link').replace(/,/g, '/'); + const appPath = '/apps/available/TRUENAS/community/webdav'; + expect(appPath.startsWith(href)).toBeTruthy(); + }); +}); + +describe('Redirect to install app', () => { + let spectator: Spectator; + let loader: HarnessLoader; + + const createComponent = createRoutingFactory({ + component: AppDetailViewComponent, + imports: [ + NgxSkeletonLoaderModule, + AppCatalogPipe, + ], + declarations: [ + AppDetailsHeaderComponent, + MockComponents( + AppResourcesCardComponent, + AppAvailableInfoCardComponent, + AppHelmChartCardComponent, + AppCardLogoComponent, + AppDetailsSimilarComponent, + ), + ], + providers: [ + KubernetesStore, + InstalledAppsStore, + mockWebsocket([ + mockJob('chart.release.create'), + mockJob('chart.release.update'), + mockCall('catalog.get_item_details', existingCatalogApp), + mockCall('chart.release.query', [existingChartEdit]), + mockCall('service.started', true), + mockCall('kubernetes.config', { + pool: 'my pool', + node_ip: '10.123.45.67', + route_v4_interface: 'enp0s7', + route_v4_gateway: '10.123.45.1', + configure_gpus: true, + servicelb: true, + cluster_cidr: '172.16.0.0/16', + service_cidr: '172.17.0.0/16', + cluster_dns_ip: '172.17.0.1', + } as KubernetesConfig), + ]), + mockProvider(AuthService, { + user$: of({ attributes: { appsAgreement: true } }), + }), + mockProvider(AppsStore, { + availableApps$: of(appsResponse), + isLoading$: of(false), + }), + ], + params: { appId: 'webdav', catalog: 'TRUENAS', train: 'community' }, + }); + + beforeEach(() => { + spectator = createComponent(); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + }); + + it('redirect to install app when Install button is pressed', async () => { + const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Install' })); + await saveButton.click(); + expect(spectator.inject(Router).navigate).toHaveBeenCalledWith(['/apps', 'available', 'TRUENAS', 'community', 'webdav', 'install']); + }); +}); + +describe('Install app', () => { + let spectator: Spectator; + let loader: HarnessLoader; + + const createComponent = createComponentFactory({ + component: ChartWizardComponent, + imports: [ + IxFormsModule, + ReactiveFormsModule, + IxDynamicFormModule, + ], + providers: [ + KubernetesStore, + mockWebsocket([ + mockJob('chart.release.create'), + mockJob('chart.release.update'), + mockCall('catalog.get_item_details', existingCatalogApp), + mockCall('chart.release.query', [existingChartEdit]), + mockCall('service.started', true), + mockCall('kubernetes.config', { + pool: 'my pool', + node_ip: '10.123.45.67', + route_v4_interface: 'enp0s7', + route_v4_gateway: '10.123.45.1', + configure_gpus: true, + servicelb: true, + cluster_cidr: '172.16.0.0/16', + service_cidr: '172.17.0.0/16', + cluster_dns_ip: '172.17.0.1', + } as KubernetesConfig), + ]), + mockProvider(MatDialog, { + open: jest.fn(() => mockEntityJobComponentRef), + }), + { + provide: ActivatedRoute, + useValue: { + parent: { params: of({ appId: 'webdav', catalog: 'TRUENAS', train: 'community' }) }, + routeConfig: { path: 'install' }, + }, + }, + ], + }); + + beforeEach(() => { + spectator = createComponent(); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + }); + + it('shows values for app when form is opened for create', async () => { + const form = await loader.getHarness(IxFormHarness); + const values = await form.getValues(); + + expect(values).toEqual({ + 'Application Name': 'webdav', + 'Authentication Type': 'No Authentication', + CPU: '4000m', + 'Enable HTTP': true, + 'Enable HTTPS': false, + 'Group ID': '666', + 'HTTP Port': '30034', + 'Host Network': false, + Memory: '8Gi', + 'User ID': '666', + Version: '1.0.9', + }); + }); + + it('creating when form is submitted', async () => { + const form = await loader.getHarness(IxFormHarness); + await form.fillForm({ + 'Application Name': 'appname', + }); + + const values = await form.getValues(); + + expect(values).toEqual({ + 'Application Name': 'appname', + 'Authentication Type': 'No Authentication', + CPU: '4000m', + 'Enable HTTP': true, + 'Enable HTTPS': false, + 'Group ID': '666', + 'HTTP Port': '30034', + 'Host Network': false, + Memory: '8Gi', + 'User ID': '666', + Version: '1.0.9', + }); + + const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Install' })); + await saveButton.click(); + + expect(mockEntityJobComponentRef.componentInstance.setCall).toHaveBeenCalledWith( + 'chart.release.create', [{ + catalog: 'TRUENAS', + item: 'webdav', + release_name: 'appname', + train: 'community', + values: { + release_name: 'appname', + resources: { + limits: { + cpu: '4000m', + memory: '8Gi', + }, + }, + webdavConfig: { + additionalEnvs: [], + authType: 'none', + }, + webdavNetwork: { + hostNetwork: false, + http: true, + httpPort: 30034, + https: false, + }, + webdavRunAs: { + group: 666, + user: 666, + }, + webdavStorage: { + shares: [], + }, + }, + version: '1.0.9', + }], + ); + expect(mockEntityJobComponentRef.componentInstance.submit).toHaveBeenCalled(); + }); +}); From 339557d2e1637a9e01a753210bca76795e98eb5d Mon Sep 17 00:00:00 2001 From: Jonathan Heindl Date: Thu, 24 Aug 2023 11:28:34 +0200 Subject: [PATCH 02/12] fixed typo in translation (#8662) --- src/assets/i18n/de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 4a3f853f4d6..f7ce19c12ff 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -3079,7 +3079,7 @@ "Block size": "Blockgröße", "Boot Environments": "Boot Umgebungen", "Boot Loader Type": "Bootloadertyp", - "Boot Method": "Moot Methode", + "Boot Method": "Boot Methode", "Boot environment name. Alphanumeric characters, dashes (-), underscores (_), and periods (.) are allowed.": "Name der Boot-Umgebung. Alphanumerische Zeichen, Bindestriche (-), Unterstriche (_) und Punkte (.) sind zulässig.", "Boot environment to be cloned.": "Boot-Umgebung, die geklont werden soll.", "Bridge Members": "Bridge-Mitglieder", @@ -4206,4 +4206,4 @@ "overview": "Überblick", "total available": "insgesamt verfügbar", "was successfully attached.": "wurde erfolgreich hinzugefügt." -} \ No newline at end of file +} From 53e184eca8910ec0f0c700d88d5af92df69e1042 Mon Sep 17 00:00:00 2001 From: Alex Karpov Date: Thu, 24 Aug 2023 07:03:07 -0400 Subject: [PATCH 03/12] NAS-123634: Logs/Shell button is missing for apps that are in "Deploying" state (#8643) --- .../app-containers-card/app-containers-card.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/pages/apps/components/installed-apps/app-containers-card/app-containers-card.component.html b/src/app/pages/apps/components/installed-apps/app-containers-card/app-containers-card.component.html index 04396252560..fab0840e8b7 100644 --- a/src/app/pages/apps/components/installed-apps/app-containers-card/app-containers-card.component.html +++ b/src/app/pages/apps/components/installed-apps/app-containers-card/app-containers-card.component.html @@ -56,7 +56,7 @@

{{ 'Containers' | translate }}

- - - -
diff --git a/src/app/pages/services/components/service-lldp/service-lldp.component.scss b/src/app/pages/services/components/service-lldp/service-lldp.component.scss index c0c1e368b6e..e44f3d0b297 100644 --- a/src/app/pages/services/components/service-lldp/service-lldp.component.scss +++ b/src/app/pages/services/components/service-lldp/service-lldp.component.scss @@ -1,6 +1,5 @@ .form-actions { - border-top: 1px solid var(--lines); - padding: 16px 11px; + padding: 0 11px; button { margin-right: 5px; diff --git a/src/app/pages/services/components/service-lldp/service-lldp.component.spec.ts b/src/app/pages/services/components/service-lldp/service-lldp.component.spec.ts index 5b16e4e3510..973b1783dc9 100644 --- a/src/app/pages/services/components/service-lldp/service-lldp.component.spec.ts +++ b/src/app/pages/services/components/service-lldp/service-lldp.component.spec.ts @@ -6,6 +6,8 @@ import { ActivatedRoute, Router } from '@angular/router'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; import { mockCall, mockWebsocket } from 'app/core/testing/utils/mock-websocket.utils'; import { LldpConfig } from 'app/interfaces/lldp-config.interface'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; +import { SLIDE_IN_DATA } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in.token'; import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { IxFormHarness } from 'app/modules/ix-forms/testing/ix-form.harness'; @@ -40,6 +42,8 @@ describe('ServiceLldpComponent', () => { mockProvider(ActivatedRoute), mockProvider(DialogService), mockProvider(FormErrorHandlerService), + mockProvider(IxSlideInRef), + { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/services/components/service-lldp/service-lldp.component.ts b/src/app/pages/services/components/service-lldp/service-lldp.component.ts index fe15989d0cc..9cfac6287af 100644 --- a/src/app/pages/services/components/service-lldp/service-lldp.component.ts +++ b/src/app/pages/services/components/service-lldp/service-lldp.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; import { choicesToOptions } from 'app/helpers/operators/options.operators'; @@ -10,6 +10,7 @@ import helptext from 'app/helptext/services/components/service-lldp'; import { LldpConfigUpdate } from 'app/interfaces/lldp-config.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; import { SimpleAsyncComboboxProvider } from 'app/modules/ix-forms/classes/simple-async-combobox-provider'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { DialogService } from 'app/services/dialog.service'; @@ -64,7 +65,6 @@ export class ServiceLldpComponent implements OnInit { locationProvider = new SimpleAsyncComboboxProvider(this.ws.call('lldp.country_choices').pipe(choicesToOptions())); constructor( - protected router: Router, protected route: ActivatedRoute, protected ws: WebSocketService, private errorHandler: ErrorHandlerService, @@ -74,6 +74,7 @@ export class ServiceLldpComponent implements OnInit { private translate: TranslateService, private dialogService: DialogService, private formErrorHandler: FormErrorHandlerService, + private slideInRef: IxSlideInRef, ) { } ngOnInit(): void { @@ -105,7 +106,7 @@ export class ServiceLldpComponent implements OnInit { next: () => { this.isFormLoading = false; this.snackbar.success(this.translate.instant('Service configuration saved')); - this.router.navigate(['/services']); + this.slideInRef.close(); this.cdr.markForCheck(); }, error: (error) => { diff --git a/src/app/pages/services/components/service-nfs/service-nfs.component.html b/src/app/pages/services/components/service-nfs/service-nfs.component.html index 54cf8b0caaf..d1427cb14a9 100644 --- a/src/app/pages/services/components/service-nfs/service-nfs.component.html +++ b/src/app/pages/services/components/service-nfs/service-nfs.component.html @@ -1,10 +1,7 @@ + + - -
{{ 'Save' | translate }} - -
{ afterClosed: () => of(), })), }), + mockProvider(IxSlideInRef), + { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/services/components/service-nfs/service-nfs.component.ts b/src/app/pages/services/components/service-nfs/service-nfs.component.ts index 8dfd4bb6442..6b8b1004ea4 100644 --- a/src/app/pages/services/components/service-nfs/service-nfs.component.ts +++ b/src/app/pages/services/components/service-nfs/service-nfs.component.ts @@ -3,7 +3,6 @@ import { } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; -import { Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; import { forkJoin, of } from 'rxjs'; @@ -13,6 +12,7 @@ import { choicesToOptions } from 'app/helpers/operators/options.operators'; import { mapToOptions } from 'app/helpers/options.helper'; import helptext from 'app/helptext/services/components/service-nfs'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { rangeValidator, portRangeValidator } from 'app/modules/ix-forms/validators/range-validation/range-validation'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; @@ -71,9 +71,9 @@ export class ServiceNfsComponent implements OnInit { private fb: FormBuilder, private translate: TranslateService, private dialogService: DialogService, - private router: Router, private snackbar: SnackbarService, private matDialog: MatDialog, + private slideInRef: IxSlideInRef, ) {} ngOnInit(): void { @@ -93,8 +93,8 @@ export class ServiceNfsComponent implements OnInit { next: () => { this.isFormLoading = false; this.snackbar.success(this.translate.instant('Service configuration saved')); + this.slideInRef.close(); this.cdr.markForCheck(); - this.router.navigate(['/services']); }, error: (error) => { this.isFormLoading = false; @@ -111,7 +111,6 @@ export class ServiceNfsComponent implements OnInit { next: (config) => { this.isAddSpnDisabled = !config.v4_krb; this.form.patchValue(config); - this.snackbar.success(this.translate.instant('Service configuration saved')); this.isFormLoading = false; this.cdr.markForCheck(); }, diff --git a/src/app/pages/services/components/service-smart/service-smart.component.html b/src/app/pages/services/components/service-smart/service-smart.component.html index e8925a1023e..1cd27581659 100644 --- a/src/app/pages/services/components/service-smart/service-smart.component.html +++ b/src/app/pages/services/components/service-smart/service-smart.component.html @@ -1,10 +1,7 @@ + + - - { mockProvider(FormErrorHandlerService), mockProvider(DialogService), mockProvider(Router), + mockProvider(IxSlideInRef), + { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/services/components/service-smart/service-smart.component.ts b/src/app/pages/services/components/service-smart/service-smart.component.ts index 35a9f74e004..342f24a594f 100644 --- a/src/app/pages/services/components/service-smart/service-smart.component.ts +++ b/src/app/pages/services/components/service-smart/service-smart.component.ts @@ -2,7 +2,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; import { of } from 'rxjs'; @@ -10,6 +9,7 @@ import { SmartPowerMode } from 'app/enums/smart-power.mode'; import helptext from 'app/helptext/services/components/service-smart'; import { SmartConfigUpdate } from 'app/interfaces/smart-test.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { DialogService } from 'app/services/dialog.service'; @@ -56,8 +56,8 @@ export class ServiceSmartComponent implements OnInit { private fb: FormBuilder, private translate: TranslateService, private dialogService: DialogService, - private router: Router, private snackbar: SnackbarService, + private slideInRef: IxSlideInRef, ) {} ngOnInit(): void { @@ -88,8 +88,8 @@ export class ServiceSmartComponent implements OnInit { next: () => { this.isFormLoading = false; this.snackbar.success(this.translate.instant('Service configuration saved')); + this.slideInRef.close(); this.cdr.markForCheck(); - this.router.navigate(['/services']); }, error: (error) => { this.isFormLoading = false; diff --git a/src/app/pages/services/components/service-smb/service-smb.component.html b/src/app/pages/services/components/service-smb/service-smb.component.html index 1c44f1533f0..d21ae830769 100644 --- a/src/app/pages/services/components/service-smb/service-smb.component.html +++ b/src/app/pages/services/components/service-smb/service-smb.component.html @@ -1,10 +1,7 @@ + + - - - - - -
diff --git a/src/app/pages/services/components/service-snmp/service-snmp.component.scss b/src/app/pages/services/components/service-snmp/service-snmp.component.scss index bd90f42a925..147f42341f0 100644 --- a/src/app/pages/services/components/service-snmp/service-snmp.component.scss +++ b/src/app/pages/services/components/service-snmp/service-snmp.component.scss @@ -1,6 +1,5 @@ .form-actions { - border-top: 1px solid var(--lines); - padding: 16px 11px; + padding: 0 11px; button { margin-right: 5px; diff --git a/src/app/pages/services/components/service-snmp/service-snmp.component.spec.ts b/src/app/pages/services/components/service-snmp/service-snmp.component.spec.ts index 746da9eb152..c86a90a7063 100644 --- a/src/app/pages/services/components/service-snmp/service-snmp.component.spec.ts +++ b/src/app/pages/services/components/service-snmp/service-snmp.component.spec.ts @@ -5,6 +5,8 @@ import { MatButtonHarness } from '@angular/material/button/testing'; import { createRoutingFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; import { mockCall, mockWebsocket } from 'app/core/testing/utils/mock-websocket.utils'; import { SnmpConfig } from 'app/interfaces/snmp-config.interface'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; +import { SLIDE_IN_DATA } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in.token'; import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; import { IxFormHarness } from 'app/modules/ix-forms/testing/ix-form.harness'; import { DialogService } from 'app/services/dialog.service'; @@ -41,6 +43,8 @@ describe('ServiceSnmpComponent', () => { loglevel: 4, } as SnmpConfig), ]), + mockProvider(IxSlideInRef), + { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/services/components/service-snmp/service-snmp.component.ts b/src/app/pages/services/components/service-snmp/service-snmp.component.ts index 016b315e074..7350cd1b85b 100644 --- a/src/app/pages/services/components/service-snmp/service-snmp.component.ts +++ b/src/app/pages/services/components/service-snmp/service-snmp.component.ts @@ -2,13 +2,13 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; import { of } from 'rxjs'; import helptext from 'app/helptext/services/components/service-snmp'; import { SnmpConfigUpdate } from 'app/interfaces/snmp-config.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { IxValidatorsService } from 'app/modules/ix-forms/services/ix-validators.service'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; @@ -76,11 +76,11 @@ export class ServiceSnmpComponent implements OnInit { private dialogService: DialogService, private errorHandler: ErrorHandlerService, private cdr: ChangeDetectorRef, - private router: Router, private formErrorHandler: FormErrorHandlerService, private validation: IxValidatorsService, private snackbar: SnackbarService, private translate: TranslateService, + private slideInRef: IxSlideInRef, ) {} ngOnInit(): void { @@ -101,8 +101,9 @@ export class ServiceSnmpComponent implements OnInit { this.ws.call('snmp.update', [values as SnmpConfigUpdate]).pipe(untilDestroyed(this)).subscribe({ next: () => { this.isFormLoading = false; + this.snackbar.success(this.translate.instant('Service configuration saved')); + this.slideInRef.close(); this.cdr.markForCheck(); - this.router.navigate(['/services']); }, error: (error) => { this.isFormLoading = false; @@ -117,7 +118,6 @@ export class ServiceSnmpComponent implements OnInit { this.ws.call('snmp.config').pipe(untilDestroyed(this)).subscribe({ next: (config) => { this.isFormLoading = false; - this.snackbar.success(this.translate.instant('Service configuration saved')); this.form.patchValue(config); this.cdr.markForCheck(); }, diff --git a/src/app/pages/services/components/service-ssh/service-ssh.component.html b/src/app/pages/services/components/service-ssh/service-ssh.component.html index 1b50a1f3176..09291dc4425 100644 --- a/src/app/pages/services/components/service-ssh/service-ssh.component.html +++ b/src/app/pages/services/components/service-ssh/service-ssh.component.html @@ -1,10 +1,7 @@ + + - -
- - - -
diff --git a/src/app/pages/services/components/service-ups/service-ups.component.scss b/src/app/pages/services/components/service-ups/service-ups.component.scss index 1eef6416f6c..90e68c02f0f 100644 --- a/src/app/pages/services/components/service-ups/service-ups.component.scss +++ b/src/app/pages/services/components/service-ups/service-ups.component.scss @@ -1,6 +1,5 @@ .form-actions { - border-top: 1px solid var(--lines); - padding: 16px 11px; + padding: 0 11px; button { margin-right: 5px; @@ -8,7 +7,6 @@ } .two-columns { - border-top: 1px solid var(--lines); display: flex; > * { diff --git a/src/app/pages/services/components/service-ups/service-ups.component.spec.ts b/src/app/pages/services/components/service-ups/service-ups.component.spec.ts index 0e9073500d9..b680d765fa4 100644 --- a/src/app/pages/services/components/service-ups/service-ups.component.spec.ts +++ b/src/app/pages/services/components/service-ups/service-ups.component.spec.ts @@ -6,6 +6,8 @@ import { createRoutingFactory, mockProvider, Spectator } from '@ngneat/spectator import { mockCall, mockWebsocket } from 'app/core/testing/utils/mock-websocket.utils'; import { UpsConfig, UpsConfigUpdate } from 'app/interfaces/ups-config.interface'; import { IxComboboxHarness } from 'app/modules/ix-forms/components/ix-combobox/ix-combobox.harness'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; +import { SLIDE_IN_DATA } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in.token'; import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { IxFormHarness } from 'app/modules/ix-forms/testing/ix-form.harness'; @@ -62,6 +64,8 @@ describe('ServiceUpsComponent', () => { ]), mockProvider(FormErrorHandlerService), mockProvider(DialogService), + mockProvider(IxSlideInRef), + { provide: SLIDE_IN_DATA, useValue: undefined }, ], }); diff --git a/src/app/pages/services/components/service-ups/service-ups.component.ts b/src/app/pages/services/components/service-ups/service-ups.component.ts index 41802f45f01..a520222a9c0 100644 --- a/src/app/pages/services/components/service-ups/service-ups.component.ts +++ b/src/app/pages/services/components/service-ups/service-ups.component.ts @@ -2,7 +2,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; import { of } from 'rxjs'; @@ -12,6 +11,7 @@ import helptext from 'app/helptext/services/components/service-ups'; import { UpsConfigUpdate } from 'app/interfaces/ups-config.interface'; import { SimpleAsyncComboboxProvider } from 'app/modules/ix-forms/classes/simple-async-combobox-provider'; import { IxComboboxProvider } from 'app/modules/ix-forms/components/ix-combobox/ix-combobox-provider'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; import { FormErrorHandlerService } from 'app/modules/ix-forms/services/form-error-handler.service'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { DialogService } from 'app/services/dialog.service'; @@ -116,9 +116,9 @@ export class ServiceUpsComponent implements OnInit { private errorHandler: ErrorHandlerService, private fb: FormBuilder, private dialogService: DialogService, - private router: Router, private translate: TranslateService, private snackbar: SnackbarService, + private slideInRef: IxSlideInRef, ) {} ngOnInit(): void { @@ -178,8 +178,8 @@ export class ServiceUpsComponent implements OnInit { next: () => { this.isFormLoading = false; this.snackbar.success(this.translate.instant('Service configuration saved')); + this.slideInRef.close(); this.cdr.markForCheck(); - this.router.navigate(['/services']); }, error: (error) => { this.isFormLoading = false; diff --git a/src/app/pages/services/services.component.html b/src/app/pages/services/services.component.html index c54174cbad2..5e89c4a545d 100644 --- a/src/app/pages/services/services.component.html +++ b/src/app/pages/services/services.component.html @@ -31,11 +31,9 @@ [diameter]="30" [matTooltip]=" (service.state === ServiceStatus.Running - ? 'Stopping' - : 'Starting' + ? ('Stopping' | uppercase | translate) + : ('Starting' | uppercase | translate) ) - | uppercase - | translate " > @@ -75,6 +73,7 @@ matTooltipPosition="left" [ixTest]="[service.service, 'edit']" [attr.aria-label]="'Edit' | translate" + [attr.name]="service.name" [matTooltip]="'Configure' | translate" (click)="configureService(service)" > @@ -93,6 +92,5 @@ mat-row [ixTest]="service.service" > -
diff --git a/src/app/pages/services/services.component.spec.ts b/src/app/pages/services/services.component.spec.ts index 47e0a59c137..f765bc97069 100644 --- a/src/app/pages/services/services.component.spec.ts +++ b/src/app/pages/services/services.component.spec.ts @@ -17,6 +17,14 @@ import { ServiceRow } from 'app/interfaces/service.interface'; import { EntityModule } from 'app/modules/entity/entity.module'; import { IxTableModule } from 'app/modules/ix-tables/ix-table.module'; import { IxTableHarness } from 'app/modules/ix-tables/testing/ix-table.harness'; +import { ServiceFtpComponent } from 'app/pages/services/components/service-ftp/service-ftp.component'; +import { ServiceLldpComponent } from 'app/pages/services/components/service-lldp/service-lldp.component'; +import { ServiceNfsComponent } from 'app/pages/services/components/service-nfs/service-nfs.component'; +import { ServiceSmartComponent } from 'app/pages/services/components/service-smart/service-smart.component'; +import { ServiceSmbComponent } from 'app/pages/services/components/service-smb/service-smb.component'; +import { ServiceSnmpComponent } from 'app/pages/services/components/service-snmp/service-snmp.component'; +import { ServiceSshComponent } from 'app/pages/services/components/service-ssh/service-ssh.component'; +import { ServiceUpsComponent } from 'app/pages/services/components/service-ups/service-ups.component'; import { ServicesComponent } from 'app/pages/services/services.component'; import { DialogService } from 'app/services/dialog.service'; import { IscsiService } from 'app/services/iscsi.service'; @@ -83,15 +91,68 @@ describe('ServicesComponent', () => { expect(cells).toEqual(expectedRows); }); - it('should redirect to configure service page when edit button is pressed', async () => { + it('should redirect to configure iSCSI service page when edit button is pressed', async () => { const table = await loader.getHarness(IxTableHarness); - const firstRow = await table.getFirstRow(); - const serviceKey = [...serviceNames.entries()].find(([, value]) => value === firstRow.name)[0]; + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="iSCSI"]' })); + await editButton.click(); + + expect(spectator.inject(Router).navigate).toHaveBeenCalledWith(['/sharing', 'iscsi']); + }); - const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[aria-label="Edit"]' })); + it('should open FTP configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="FTP"]' })); await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceFtpComponent, { wide: true }); + }); - expect(spectator.inject(Router).navigate).toHaveBeenCalledWith(['/services', serviceKey]); + it('should open NFS configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="NFS"]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceNfsComponent, { wide: true }); + }); + + it('should open SNMP configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="SNMP"]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceSnmpComponent, { wide: true }); + }); + + it('should open UPS configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="UPS"]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceUpsComponent, { wide: true }); + }); + + it('should open SSH configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="SSH"]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceSshComponent); + }); + + it('should open SMB configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="SMB"]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceSmbComponent); + }); + + it('should open S.M.A.R.T. configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="S.M.A.R.T."]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceSmartComponent); + }); + + it('should open LLDP configuration when edit button is pressed', async () => { + const table = await loader.getHarness(IxTableHarness); + const editButton = await table.getHarness(MatButtonHarness.with({ selector: '[name="LLDP"]' })); + await editButton.click(); + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(ServiceLldpComponent); }); it('should change service enable state when slide is checked', async () => { diff --git a/src/app/pages/services/services.component.ts b/src/app/pages/services/services.component.ts index 3788244fbd9..1fba8a556bf 100644 --- a/src/app/pages/services/services.component.ts +++ b/src/app/pages/services/services.component.ts @@ -14,8 +14,17 @@ import { ServiceStatus } from 'app/enums/service-status.enum'; import { Service, ServiceRow } from 'app/interfaces/service.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; import { EmptyService } from 'app/modules/ix-tables/services/empty.service'; +import { ServiceFtpComponent } from 'app/pages/services/components/service-ftp/service-ftp.component'; +import { ServiceLldpComponent } from 'app/pages/services/components/service-lldp/service-lldp.component'; +import { ServiceNfsComponent } from 'app/pages/services/components/service-nfs/service-nfs.component'; +import { ServiceSmartComponent } from 'app/pages/services/components/service-smart/service-smart.component'; +import { ServiceSmbComponent } from 'app/pages/services/components/service-smb/service-smb.component'; +import { ServiceSnmpComponent } from 'app/pages/services/components/service-snmp/service-snmp.component'; +import { ServiceSshComponent } from 'app/pages/services/components/service-ssh/service-ssh.component'; +import { ServiceUpsComponent } from 'app/pages/services/components/service-ups/service-ups.component'; import { DialogService } from 'app/services/dialog.service'; import { IscsiService } from 'app/services/iscsi.service'; +import { IxSlideInService } from 'app/services/ix-slide-in.service'; import { WebSocketService } from 'app/services/ws.service'; @UntilDestroy() @@ -49,6 +58,7 @@ export class ServicesComponent implements OnInit { private iscsiService: IscsiService, private cdr: ChangeDetectorRef, private emptyService: EmptyService, + private slideInService: IxSlideInService, ) {} ngOnInit(): void { @@ -226,11 +236,31 @@ export class ServicesComponent implements OnInit { case ServiceName.Iscsi: this.router.navigate(['/sharing', 'iscsi']); break; + case ServiceName.Ftp: + this.slideInService.open(ServiceFtpComponent, { wide: true }); + break; + case ServiceName.Nfs: + this.slideInService.open(ServiceNfsComponent, { wide: true }); + break; + case ServiceName.Snmp: + this.slideInService.open(ServiceSnmpComponent, { wide: true }); + break; + case ServiceName.Ups: + this.slideInService.open(ServiceUpsComponent, { wide: true }); + break; + case ServiceName.Ssh: + this.slideInService.open(ServiceSshComponent); + break; case ServiceName.Cifs: - this.router.navigate(['/services', 'smb']); + this.slideInService.open(ServiceSmbComponent); + break; + case ServiceName.Smart: + this.slideInService.open(ServiceSmartComponent); + break; + case ServiceName.Lldp: + this.slideInService.open(ServiceLldpComponent); break; default: - this.router.navigate(['/services', row.service]); break; } } diff --git a/src/app/pages/services/services.routing.ts b/src/app/pages/services/services.routing.ts index 5f583e3d4aa..439b16b04d6 100644 --- a/src/app/pages/services/services.routing.ts +++ b/src/app/pages/services/services.routing.ts @@ -1,13 +1,5 @@ import { ModuleWithProviders } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { ServiceNfsComponent } from 'app/pages/services/components/service-nfs/service-nfs.component'; -import { ServiceSshComponent } from 'app/pages/services/components/service-ssh/service-ssh.component'; -import { ServiceFtpComponent } from './components/service-ftp/service-ftp.component'; -import { ServiceLldpComponent } from './components/service-lldp/service-lldp.component'; -import { ServiceSmartComponent } from './components/service-smart/service-smart.component'; -import { ServiceSmbComponent } from './components/service-smb/service-smb.component'; -import { ServiceSnmpComponent } from './components/service-snmp/service-snmp.component'; -import { ServiceUpsComponent } from './components/service-ups/service-ups.component'; import { ServicesComponent } from './services.component'; export const routes: Routes = [ @@ -16,46 +8,6 @@ export const routes: Routes = [ pathMatch: 'full', component: ServicesComponent, }, - { - data: { title: 'SSH', breadcrumb: 'SSH' }, - path: 'ssh', - component: ServiceSshComponent, - }, - { - data: { title: 'FTP', breadcrumb: 'FTP' }, - path: 'ftp', - component: ServiceFtpComponent, - }, - { - data: { title: 'LLDP', breadcrumb: 'LLDP' }, - path: 'lldp', - component: ServiceLldpComponent, - }, - { - data: { title: 'S.M.A.R.T.', breadcrumb: 'S.M.A.R.T.' }, - path: 'smartd', - component: ServiceSmartComponent, - }, - { - data: { title: 'NFS', breadcrumb: 'NFS' }, - path: 'nfs', - component: ServiceNfsComponent, - }, - { - data: { title: 'UPS', breadcrumb: 'UPS' }, - path: 'ups', - component: ServiceUpsComponent, - }, - { - data: { title: 'SMB', breadcrumb: 'SMB' }, - path: 'smb', - component: ServiceSmbComponent, - }, - { - data: { title: 'SNMP', breadcrumb: 'SNMP' }, - path: 'snmp', - component: ServiceSnmpComponent, - }, ]; export const routing: ModuleWithProviders = RouterModule.forChild(routes); diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index 32f71b71e3a..b4057cf5c11 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -1308,6 +1308,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed Disks": "", @@ -1670,6 +1671,7 @@ "LDAP is disabled.": "", "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2457,6 +2459,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2490,6 +2493,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMPv3 Security Model": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index f7ce19c12ff..669fb64b3da 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -979,6 +979,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed Disks": "", @@ -1314,6 +1315,7 @@ "LDAP is disabled.": "", "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -1968,6 +1970,7 @@ "Run Once": "", "Run job": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -1993,6 +1996,7 @@ "SMB multichannel allows servers to use multiple network connections simultaneously by combining the bandwidth of several network interface cards (NICs) for better performance. SMB multichannel does not function if you combine NICs into a LAGG. Read more in docs": "", "SMB/NFSv4": "", "SMTP Authentication": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Support": "", "SSH": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index bd71a85a548..bce315e36c4 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -413,6 +413,7 @@ "Export/disconnect pool: {pool}": "", "Exported": "", "Extend session": "", + "FTP": "", "Failed S.M.A.R.T. Tests": "", "Faulted": "", "Fenced is not running.": "", @@ -570,6 +571,7 @@ "LACPDU Rate": "", "LDAP": "", "LDAP Timeout": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -979,6 +981,7 @@ "Run As Context": "", "Run Manual Test": "", "Run job": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", "S.M.A.R.T. Tasks": "", @@ -1001,6 +1004,7 @@ "SMB multichannel allows servers to use multiple network connections simultaneously by combining the bandwidth of several network interface cards (NICs) for better performance. SMB multichannel does not function if you combine NICs into a LAGG. Read more in docs": "", "SMB/NFSv4": "", "SMTP Authentication": "", + "SNMP": "", "SSH": "", "SSH Connection saved": "", "SSH Connections": "", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 60c6b79cb97..a8577be3328 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -1358,6 +1358,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1778,6 +1779,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2629,6 +2631,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2660,6 +2663,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 6930f6ace85..00fd0d0cb16 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -42,6 +42,7 @@ "Enter a password for the virtual machine.": "", "Enter a unique name for the dataset. The dataset name length is calculated by adding the length of this field's value and the length of the parent path field value. The length of 'Parent Path' and 'Name' added together cannot exceed 200 characters. Because of this length validation on this field accounts for the parent path as well. Furthermore, the maximum nested directory levels allowed is 50. You can't create a dataset that's at the 51st level in the directory hierarchy after you account for the nested levels in the parent path.": "", "Error In Apps Service": "", + "FTP": "", "Filesystem": "", "Flash Identify Light": "", "FreeBSD": "", @@ -67,6 +68,7 @@ "It is not recommended to create a pool with VDEVs containing different numbers of disks. Continue?": "", "It is not recommended to extend a pool with one or more VDEVs containing different numbers of disks. Continue?": "", "KMIP": "", + "LLDP": "", "Last Resilver": "", "Last Scrub": "", "Layout": "", @@ -103,7 +105,9 @@ "Resilvering:": "", "Restart is recommended after changing this setting": "", "Restart is recommended for new FIPS setting to take effect. Would you like to restart now?“": "", + "S.M.A.R.T.": "", "SMB": "", + "SNMP": "", "SSH": "", "SSH Connections": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index aade613dcc3..4183eb4703d 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -1268,6 +1268,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1707,6 +1708,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2600,6 +2602,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2633,6 +2636,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index ef55e601fff..c306aa3cc58 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -1187,6 +1187,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1595,6 +1596,7 @@ "LDAP is disabled.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2408,6 +2410,7 @@ "Run this cloud sync now?": "", "Run this job now?": "", "Run this rsync now?": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2439,6 +2442,7 @@ "SMB multichannel allows servers to use multiple network connections simultaneously by combining the bandwidth of several network interface cards (NICs) for better performance. SMB multichannel does not function if you combine NICs into a LAGG. Read more in docs": "", "SMB/NFSv4": "", "SMTP Authentication": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index c6296dfbd4c..1dd991dca95 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -992,6 +992,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1431,6 +1432,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2324,6 +2326,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2357,6 +2360,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 8362d386a85..91c5574251f 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -1488,6 +1488,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1927,6 +1928,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2820,6 +2822,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2853,6 +2856,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index 4870b6dda8e..7bc5ad8bed2 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -79,6 +79,7 @@ "Enter a unique name for the dataset. The dataset name length is calculated by adding the length of this field's value and the length of the parent path field value. The length of 'Parent Path' and 'Name' added together cannot exceed 200 characters. Because of this length validation on this field accounts for the parent path as well. Furthermore, the maximum nested directory levels allowed is 50. You can't create a dataset that's at the 51st level in the directory hierarchy after you account for the nested levels in the parent path.": "", "Error In Apps Service": "", "Est. Usable Raw Capacity": "", + "FTP": "", "Filesystem": "", "For example if you set this value to 5, system will renew certificates that expire in 5 days or less.": "", "Global 2FA": "", @@ -105,6 +106,7 @@ "Items per page": "", "KMIP": "", "Keep the name short and only lowercase. Using a name longer than 63 characters can prevent accessing the block device. Allowed characters: letters, numbers, period (.), dash (-), and colon (:).": "", + "LLDP": "", "Last Resilver": "", "Last Scrub": "", "Layout": "", @@ -157,6 +159,8 @@ "Restart is recommended for new FIPS setting to take effect. Would you like to restart now?“": "", "Resume Scrub": "", "Run As Context": "", + "S.M.A.R.T.": "", + "SNMP": "", "SSH": "", "SSH Connections": "", "Save And Go To Review": "", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index c5ca3184c74..d33e32946d9 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -1431,6 +1431,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1869,6 +1870,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2738,6 +2740,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2771,6 +2774,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index e673ef7bf85..e933d47d720 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -1428,6 +1428,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1866,6 +1867,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2759,6 +2761,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2792,6 +2795,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index eb38cc9afb3..03295ebdadd 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -1015,6 +1015,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1348,6 +1349,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2045,6 +2047,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Tasks": "", "S.M.A.R.T./SED": "", @@ -2069,6 +2072,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMPv3 Security Model": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 5d6e0626ac6..dd23c07a763 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -676,6 +676,7 @@ "Extra Constraints": "", "FAULT": "", "FRONT": "", + "FTP": "", "Failed Disks": "", "Failed S.M.A.R.T. Tests": "", "Faulted": "", @@ -870,6 +871,7 @@ "LDAP Timeout": "", "LDAP User DN": "", "LDAP is disabled.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -1420,6 +1422,7 @@ "Run As Context": "", "Run Manual Test": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -1448,6 +1451,7 @@ "SMB multichannel allows servers to use multiple network connections simultaneously by combining the bandwidth of several network interface cards (NICs) for better performance. SMB multichannel does not function if you combine NICs into a LAGG. Read more in docs": "", "SMB/NFSv4": "", "SMTP Authentication": "", + "SNMP": "", "SNMP v3 Options": "", "SSH": "", "SSH Connection saved": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index 13875844b6d..43a1f68f447 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -99,6 +99,7 @@ "Error In Apps Service": "", "Error counting eligible snapshots.": "", "Est. Usable Raw Capacity": "", + "FTP": "", "Filesystem": "", "For example if you set this value to 5, system will renew certificates that expire in 5 days or less.": "", "Global 2FA": "", @@ -134,6 +135,7 @@ "Items per page": "", "KMIP": "", "Keep the name short and only lowercase. Using a name longer than 63 characters can prevent accessing the block device. Allowed characters: letters, numbers, period (.), dash (-), and colon (:).": "", + "LLDP": "", "Last 24 hours": "", "Last 3 days": "", "Last Resilver": "", @@ -206,7 +208,9 @@ "Restart is recommended for new FIPS setting to take effect. Would you like to restart now?“": "", "Resume Scrub": "", "Run As Context": "", + "S.M.A.R.T.": "", "SMB": "", + "SNMP": "", "SSH": "", "SSH Connection saved": "", "SSH Connections": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 06bc0baa0fd..9d0f4b3f078 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -1494,6 +1494,7 @@ "Extra Users": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed": "", @@ -1933,6 +1934,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2826,6 +2828,7 @@ "Run this job now?": "", "Run this rsync now?": "", "Running": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2859,6 +2862,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMP v3 Support": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index df5f3597ea2..c4d1a656258 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -130,6 +130,7 @@ "Error counting eligible snapshots.": "", "Est. Usable Raw Capacity": "", "Extend session": "", + "FTP": "", "Faulted": "", "Filesystem": "", "Filter by Disk Size": "", @@ -170,6 +171,7 @@ "It is not recommended to extend a pool with one or more VDEVs containing different numbers of disks. Continue?": "", "Items per page": "", "KMIP": "", + "LLDP": "", "Last Resilver": "", "Last Scrub": "", "Leave Feedback": "", @@ -236,8 +238,10 @@ "Resume Scrub": "", "Review": "", "Run As Context": "", + "S.M.A.R.T.": "", "SMB": "", "SMB multichannel allows servers to use multiple network connections simultaneously by combining the bandwidth of several network interface cards (NICs) for better performance. SMB multichannel does not function if you combine NICs into a LAGG. Read more in docs": "", + "SNMP": "", "SSH": "", "SSH Connections": "", "Save And Go To Review": "", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 99620351ef8..248050e5e48 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -1111,6 +1111,7 @@ "Extra Constraints": "", "FAULT": "", "FRONT": "", + "FTP": "", "FTP Host to connect to. Example: ftp.example.com.": "", "FTP Port number. Leave blank to use the default port 21.": "", "Failed Disks": "", @@ -1439,6 +1440,7 @@ "LDAP server hostnames or IP addresses. Separate entries with an empty space. Multiple hostnames or IP addresses can be entered to create an LDAP failover priority list. If a host does not respond, the next host in the list is tried until a new connection is established.": "", "LDAP server to use for SID/uid/gid map entries. When undefined, idmap_ldap uses *ldap://localhost/*. Example: ldap://ldap.netscape.com/o=Airius.com.": "", "LDAP timeout in seconds. Increase this value if a Kerberos ticket timeout occurs.": "", + "LLDP": "", "LOCAL": "", "LONG": "", "LUN ID": "", @@ -2134,6 +2136,7 @@ "Run Manual Test": "", "Run On a Schedule": "", "Run job": "", + "S.M.A.R.T.": "", "S.M.A.R.T. Enabled": "", "S.M.A.R.T. Extra Options": "", "S.M.A.R.T. Info for {disk}": "", @@ -2164,6 +2167,7 @@ "SMB/NFSv4": "", "SMTP Authentication": "", "SMTP port number. Typically 25,465 (secure SMTP), or 587 (submission).": "", + "SNMP": "", "SNMP Community": "", "SNMP v3 Options": "", "SNMPv3 Security Model": "", From 0157749a52f74874cb4a09e0de1e384882f63b78 Mon Sep 17 00:00:00 2001 From: Alex Karpov Date: Fri, 25 Aug 2023 11:39:01 -0400 Subject: [PATCH 07/12] NAS-123469 / 24.04 / Refactor CronCardComponent to ix-table2 (#8673) --- .../cron/cron-card/cron-card.component.html | 61 +++++- .../cron/cron-card/cron-card.component.scss | 13 ++ .../cron-card/cron-card.component.spec.ts | 124 ++++++++++++ .../cron/cron-card/cron-card.component.ts | 185 ++++++++++-------- .../cron-delete-dialog.component.ts | 2 - src/assets/i18n/af.json | 1 - src/assets/i18n/ar.json | 1 - src/assets/i18n/ast.json | 1 - src/assets/i18n/az.json | 1 - src/assets/i18n/be.json | 1 - src/assets/i18n/bg.json | 1 - src/assets/i18n/bn.json | 1 - src/assets/i18n/br.json | 1 - src/assets/i18n/bs.json | 1 - src/assets/i18n/ca.json | 1 - src/assets/i18n/cs.json | 1 - src/assets/i18n/cy.json | 1 - src/assets/i18n/da.json | 1 - src/assets/i18n/de.json | 3 +- src/assets/i18n/dsb.json | 1 - src/assets/i18n/el.json | 1 - src/assets/i18n/en-au.json | 1 - src/assets/i18n/en-gb.json | 1 - src/assets/i18n/en.json | 1 - src/assets/i18n/eo.json | 1 - src/assets/i18n/es-ar.json | 1 - src/assets/i18n/es-co.json | 1 - src/assets/i18n/es-mx.json | 1 - src/assets/i18n/es-ni.json | 1 - src/assets/i18n/es-ve.json | 1 - src/assets/i18n/es.json | 1 - src/assets/i18n/et.json | 1 - src/assets/i18n/eu.json | 1 - src/assets/i18n/fa.json | 1 - src/assets/i18n/fi.json | 1 - src/assets/i18n/fr.json | 1 - src/assets/i18n/fy.json | 1 - src/assets/i18n/ga.json | 1 - src/assets/i18n/gd.json | 1 - src/assets/i18n/gl.json | 1 - src/assets/i18n/he.json | 1 - src/assets/i18n/hi.json | 1 - src/assets/i18n/hr.json | 1 - src/assets/i18n/hsb.json | 1 - src/assets/i18n/hu.json | 1 - src/assets/i18n/ia.json | 1 - src/assets/i18n/id.json | 1 - src/assets/i18n/io.json | 1 - src/assets/i18n/is.json | 1 - src/assets/i18n/it.json | 1 - src/assets/i18n/ja.json | 1 - src/assets/i18n/ka.json | 1 - src/assets/i18n/kk.json | 1 - src/assets/i18n/km.json | 1 - src/assets/i18n/kn.json | 1 - src/assets/i18n/ko.json | 1 - src/assets/i18n/lb.json | 1 - src/assets/i18n/lt.json | 1 - src/assets/i18n/lv.json | 1 - src/assets/i18n/mk.json | 1 - src/assets/i18n/ml.json | 1 - src/assets/i18n/mn.json | 1 - src/assets/i18n/mr.json | 1 - src/assets/i18n/my.json | 1 - src/assets/i18n/nb.json | 1 - src/assets/i18n/ne.json | 1 - src/assets/i18n/nl.json | 1 - src/assets/i18n/nn.json | 1 - src/assets/i18n/os.json | 1 - src/assets/i18n/pa.json | 1 - src/assets/i18n/pl.json | 1 - src/assets/i18n/pt-br.json | 1 - src/assets/i18n/pt.json | 1 - src/assets/i18n/ro.json | 1 - src/assets/i18n/ru.json | 1 - src/assets/i18n/sk.json | 1 - src/assets/i18n/sl.json | 1 - src/assets/i18n/sq.json | 1 - src/assets/i18n/sr-latn.json | 1 - src/assets/i18n/sr.json | 1 - src/assets/i18n/strings.json | 1 - src/assets/i18n/sv.json | 1 - src/assets/i18n/sw.json | 1 - src/assets/i18n/ta.json | 1 - src/assets/i18n/te.json | 1 - src/assets/i18n/th.json | 1 - src/assets/i18n/tr.json | 1 - src/assets/i18n/tt.json | 1 - src/assets/i18n/udm.json | 1 - src/assets/i18n/uk.json | 1 - src/assets/i18n/vi.json | 1 - src/assets/i18n/zh-hans.json | 1 - src/assets/i18n/zh-hant.json | 1 - 93 files changed, 302 insertions(+), 173 deletions(-) create mode 100644 src/app/pages/system/advanced/cron/cron-card/cron-card.component.scss create mode 100644 src/app/pages/system/advanced/cron/cron-card/cron-card.component.spec.ts diff --git a/src/app/pages/system/advanced/cron/cron-card/cron-card.component.html b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.html index 693c14a33a5..d6e8e8ca31d 100644 --- a/src/app/pages/system/advanced/cron/cron-card/cron-card.component.html +++ b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.html @@ -1,3 +1,58 @@ - + + + +

+ {{ title | translate }} + +

+
+
+ + + + + +
+ + + +
+
+ +
+
diff --git a/src/app/pages/system/advanced/cron/cron-card/cron-card.component.scss b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.scss new file mode 100644 index 00000000000..38517058f61 --- /dev/null +++ b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.scss @@ -0,0 +1,13 @@ +.card-title { + align-items: center; + display: flex; + + ix-icon { + margin-left: 5px; + } +} + +.buttons { + display: flex; + justify-content: flex-end; +} diff --git a/src/app/pages/system/advanced/cron/cron-card/cron-card.component.spec.ts b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.spec.ts new file mode 100644 index 00000000000..e5372ad4092 --- /dev/null +++ b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.spec.ts @@ -0,0 +1,124 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { MatDialog } from '@angular/material/dialog'; +import { Spectator } from '@ngneat/spectator'; +import { createComponentFactory, mockProvider } from '@ngneat/spectator/jest'; +import { of } from 'rxjs'; +import { mockWebsocket, mockCall } from 'app/core/testing/utils/mock-websocket.utils'; +import { EntityModule } from 'app/modules/entity/entity.module'; +import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; +import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; +import { IxTable2Harness } from 'app/modules/ix-table2/components/ix-table2/ix-table2.harness'; +import { IxTable2Module } from 'app/modules/ix-table2/ix-table2.module'; +import { AppLoaderModule } from 'app/modules/loader/app-loader.module'; +import { CronCardComponent } from 'app/pages/system/advanced/cron/cron-card/cron-card.component'; +import { CronDeleteDialogComponent } from 'app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component'; +import { CronFormComponent } from 'app/pages/system/advanced/cron/cron-form/cron-form.component'; +import { DialogService } from 'app/services/dialog.service'; +import { IxSlideInService } from 'app/services/ix-slide-in.service'; +import { LocaleService } from 'app/services/locale.service'; +import { TaskService } from 'app/services/task.service'; + +describe('CronCardComponent', () => { + let spectator: Spectator; + let loader: HarnessLoader; + let table: IxTable2Harness; + + const cronJobs = [ + { + id: 1, + user: 'root', + command: "echo 'Hello World'", + description: 'test', + enabled: true, + stdout: true, + stderr: false, + schedule: { + minute: '0', + hour: '0', + dom: '*', + month: '*', + dow: '*', + }, + }, + ]; + + const createComponent = createComponentFactory({ + component: CronCardComponent, + imports: [ + AppLoaderModule, + EntityModule, + IxTable2Module, + ], + providers: [ + mockWebsocket([ + mockCall('cronjob.query', cronJobs), + mockCall('cronjob.run'), + ]), + mockProvider(DialogService, { + confirm: jest.fn(() => of(true)), + }), + mockProvider(IxSlideInService, { + open: jest.fn(() => { + return { slideInClosed$: of() }; + }), + }), + mockProvider(IxSlideInRef), + mockProvider(MatDialog, { + open: jest.fn(() => ({ + afterClosed: () => of(true), + })), + }), + mockProvider(LocaleService), + mockProvider(TaskService, { + getTaskNextRun: jest.fn(() => 'in about 10 hours'), + }), + ], + }); + + beforeEach(async () => { + spectator = createComponent(); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + table = await loader.getHarness(IxTable2Harness); + }); + + it('should show table rows', async () => { + const expectedRows = [ + ['Users', 'Command', 'Description', 'Schedule', 'Enabled', ''], + ['root', "echo 'Hello World'", 'test', '0 0 * * *', 'Yes', ''], + ]; + + const cells = await table.getCellTexts(); + expect(cells).toEqual(expectedRows); + }); + + it('shows confirmation dialog when Run Now button is pressed', async () => { + jest.spyOn(spectator.inject(DialogService), 'confirm'); + const runNowButton = await table.getHarnessInCell(IxIconHarness.with({ name: 'play_arrow' }), 1, 5); + await runNowButton.click(); + + expect(spectator.inject(DialogService).confirm).toHaveBeenCalledWith({ + title: 'Run Now', + message: 'Run this job now?', + hideCheckbox: true, + }); + }); + + it('shows form to edit an existing interface when Edit button is pressed', async () => { + const editButton = await table.getHarnessInCell(IxIconHarness.with({ name: 'edit' }), 1, 5); + await editButton.click(); + + expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(CronFormComponent, { + data: expect.objectContaining(cronJobs[0]), + }); + }); + + it('deletes a cronjob with confirmation when Delete button is pressed', async () => { + const deleteIcon = await table.getHarnessInCell(IxIconHarness.with({ name: 'delete' }), 1, 5); + await deleteIcon.click(); + + expect(spectator.inject(MatDialog).open).toHaveBeenCalledWith(CronDeleteDialogComponent, { + data: expect.objectContaining({ id: 1 }), + }); + }); +}); diff --git a/src/app/pages/system/advanced/cron/cron-card/cron-card.component.ts b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.ts index cc78461dd23..fbf3e4ebd9c 100644 --- a/src/app/pages/system/advanced/cron/cron-card/cron-card.component.ts +++ b/src/app/pages/system/advanced/cron/cron-card/cron-card.component.ts @@ -1,90 +1,65 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; -import * as cronParser from 'cron-parser'; -import { formatDistanceToNowStrict } from 'date-fns'; -import { filter, switchMap } from 'rxjs/operators'; +import { filter, map, switchMap } from 'rxjs'; import { helptextSystemAdvanced } from 'app/helptext/system/advanced'; import { Cronjob } from 'app/interfaces/cronjob.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; -import { AppTableAction, AppTableConfig } from 'app/modules/entity/table/table.component'; -import { AdvancedSettingsService } from 'app/pages/system/advanced/advanced-settings.service'; +import { ArrayDataProvider } from 'app/modules/ix-table2/array-data-provider'; +import { scheduleColumn } from 'app/modules/ix-table2/components/ix-table-body/cells/ix-cell-schedule/ix-cell-schedule.component'; +import { textColumn } from 'app/modules/ix-table2/components/ix-table-body/cells/ix-cell-text/ix-cell-text.component'; +import { yesNoColumn } from 'app/modules/ix-table2/components/ix-table-body/cells/ix-cell-yesno/ix-cell-yesno.component'; +import { createTable } from 'app/modules/ix-table2/utils'; +import { scheduleToCrontab } from 'app/modules/scheduler/utils/schedule-to-crontab.utils'; +import { CronDeleteDialogComponent } from 'app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component'; import { CronFormComponent } from 'app/pages/system/advanced/cron/cron-form/cron-form.component'; import { CronjobRow } from 'app/pages/system/advanced/cron/cron-list/cronjob-row.interface'; import { DialogService } from 'app/services/dialog.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { IxSlideInService } from 'app/services/ix-slide-in.service'; +import { TaskService } from 'app/services/task.service'; import { WebSocketService } from 'app/services/ws.service'; @UntilDestroy() @Component({ selector: 'ix-cron-card', templateUrl: './cron-card.component.html', + styleUrls: ['./cron-card.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class CronCardComponent { - readonly tableConfig: AppTableConfig = { - title: helptextSystemAdvanced.fieldset_cron, - titleHref: '/system/cron', - queryCall: 'cronjob.query', - deleteCall: 'cronjob.delete', - deleteMsg: { - title: this.translate.instant('Cron Job'), - key_props: ['user', 'command', 'description'], - }, - getActions: (): AppTableAction[] => { - return [ - { - name: 'play', - icon: 'play_arrow', - matTooltip: this.translate.instant('Run job'), - onClick: (row: CronjobRow): void => { - this.dialog - .confirm({ title: this.translate.instant('Run Now'), message: this.translate.instant('Run this job now?'), hideCheckbox: true }) - .pipe( - filter((run) => !!run), - switchMap(() => this.ws.call('cronjob.run', [row.id])), - ) - .pipe(untilDestroyed(this)).subscribe({ - next: () => { - const message = row.enabled - ? this.translate.instant('This job is scheduled to run again {nextRun}.', { nextRun: row.next_run }) - : this.translate.instant('This job will not run again until it is enabled.'); - this.dialog.info( - this.translate.instant('Job {job} Completed Successfully', { job: row.description }), - message, - true, - ); - }, - error: (error: WebsocketError) => this.dialog.error(this.errorHandler.parseWsError(error)), - }); - }, - }, - ]; - }, - emptyEntityLarge: false, - dataSourceHelper: this.cronDataSourceHelper, - columns: [ - { name: this.translate.instant('Users'), prop: 'user' }, - { name: this.translate.instant('Command'), prop: 'command' }, - { name: this.translate.instant('Description'), prop: 'description' }, - { name: this.translate.instant('Schedule'), prop: 'cron_schedule' }, - { name: this.translate.instant('Enabled'), prop: 'enabled' }, - { name: this.translate.instant('Next Run'), prop: 'next_run' }, - ], - add: async () => { - await this.advancedSettings.showFirstTimeWarningIfNeeded(); +export class CronCardComponent implements OnInit { + title = helptextSystemAdvanced.fieldset_cron; + cronjobs: CronjobRow[] = []; + dataProvider = new ArrayDataProvider(); - const slideInRef = this.slideInService.open(CronFormComponent); - slideInRef.slideInClosed$.pipe(untilDestroyed(this)).subscribe(() => this.tableConfig.tableComponent?.getData()); - }, - edit: async (cron: CronjobRow) => { - await this.advancedSettings.showFirstTimeWarningIfNeeded(); + columns = createTable([ + textColumn({ + title: this.translate.instant('Users'), + propertyName: 'user', + }), + textColumn({ + title: this.translate.instant('Command'), + propertyName: 'command', + }), + textColumn({ + title: this.translate.instant('Description'), + propertyName: 'description', + }), + scheduleColumn({ + title: this.translate.instant('Schedule'), + propertyName: 'schedule', + }), + yesNoColumn({ + title: this.translate.instant('Enabled'), + propertyName: 'enabled', + }), + textColumn({ + propertyName: 'id', + }), + ]); - const slideInRef = this.slideInService.open(CronFormComponent, { data: cron }); - slideInRef.slideInClosed$.pipe(untilDestroyed(this)).subscribe(() => this.tableConfig.tableComponent?.getData()); - }, - }; + isLoading = false; constructor( private slideInService: IxSlideInService, @@ -92,21 +67,73 @@ export class CronCardComponent { private errorHandler: ErrorHandlerService, private ws: WebSocketService, private dialog: DialogService, - private advancedSettings: AdvancedSettingsService, + private taskService: TaskService, + private cdr: ChangeDetectorRef, + private matDialog: MatDialog, ) {} - private cronDataSourceHelper(data: Cronjob[]): CronjobRow[] { - return data.map((job) => { - const schedule = `${job.schedule.minute} ${job.schedule.hour} ${job.schedule.dom} ${job.schedule.month} ${job.schedule.dow}`; - return { - ...job, - cron_schedule: schedule, + ngOnInit(): void { + this.getCronJobs(); + } + + getCronJobs(): void { + this.isLoading = true; + this.ws.call('cronjob.query').pipe( + map((cronjobs) => { + return cronjobs.map((job: Cronjob): CronjobRow => ({ + ...job, + cron_schedule: scheduleToCrontab(job.schedule), + next_run: this.taskService.getTaskNextRun(scheduleToCrontab(job.schedule)), + })); + }), + untilDestroyed(this), + ).subscribe((cronjobs) => { + this.cronjobs = cronjobs; + this.dataProvider.setRows(cronjobs); + this.isLoading = false; + this.cdr.markForCheck(); + }); + } - next_run: formatDistanceToNowStrict( - cronParser.parseExpression(schedule, { iterator: true }).next().value.toDate(), - { addSuffix: true }, - ), - }; + runNow(row: CronjobRow): void { + this.dialog.confirm({ + title: this.translate.instant('Run Now'), + message: this.translate.instant('Run this job now?'), + hideCheckbox: true, + }).pipe( + filter(Boolean), + switchMap(() => this.ws.call('cronjob.run', [row.id])), + untilDestroyed(this), + ).subscribe({ + next: () => { + const message = row.enabled + ? this.translate.instant('This job is scheduled to run again {nextRun}.', { nextRun: row.next_run }) + : this.translate.instant('This job will not run again until it is enabled.'); + this.dialog.info( + this.translate.instant('Job {job} Completed Successfully', { job: row.description }), + message, + ); + }, + error: (error: WebsocketError) => this.dialog.error(this.errorHandler.parseWsError(error)), }); } + + doDelete(row: CronjobRow): void { + this.matDialog.open(CronDeleteDialogComponent, { + data: row, + }).afterClosed() + .pipe(filter(Boolean), untilDestroyed(this)) + .subscribe(() => { + this.getCronJobs(); + }); + } + + doEdit(row: CronjobRow): void { + const slideInRef = this.slideInService.open(CronFormComponent, { data: row }); + slideInRef.slideInClosed$ + .pipe(filter(Boolean), untilDestroyed(this)) + .subscribe(() => { + this.getCronJobs(); + }); + } } diff --git a/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts b/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts index 3868e23adca..0cb193d0bec 100644 --- a/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts +++ b/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts @@ -8,7 +8,6 @@ import { TranslateService } from '@ngx-translate/core'; import { AppLoaderService } from 'app/modules/loader/app-loader.service'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { CronjobRow } from 'app/pages/system/advanced/cron/cron-list/cronjob-row.interface'; -import { DialogService } from 'app/services/dialog.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { WebSocketService } from 'app/services/ws.service'; @@ -25,7 +24,6 @@ export class CronDeleteDialogComponent { private ws: WebSocketService, private snackbar: SnackbarService, private translate: TranslateService, - private dialogService: DialogService, private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public cronjob: CronjobRow, private errorHandler: ErrorHandlerService, diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index b4057cf5c11..28f57453377 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -774,7 +774,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 669fb64b3da..2b20cfb065c 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -576,7 +576,6 @@ "Create pool": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", @@ -4210,4 +4209,4 @@ "overview": "Überblick", "total available": "insgesamt verfügbar", "was successfully attached.": "wurde erfolgreich hinzugefügt." -} +} \ No newline at end of file diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index bce315e36c4..bd91379c63b 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -242,7 +242,6 @@ "Create a recommended formation of VDEVs in a pool.": "", "Create empty source dirs on destination after sync": "", "Create more data VDEVs like the first.": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index a8577be3328..1704f865da1 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -749,7 +749,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 00fd0d0cb16..8b9bf4a9e0c 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -974,7 +974,6 @@ "Critical Extension": "Extension critique", "Critical applications": "Applications critiques", "Criticality": "Criticité", - "Cron Job": "Job Cron", "Cron Jobs": "Tâches Cron", "Cron job created": "Tâche Cron créée", "Cron job updated": "Tâche Cron mise à jour", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 4183eb4703d..16f7bea897d 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -691,7 +691,6 @@ "Credentials": "", "Critical Extension": "", "Critical applications": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index c306aa3cc58..7e00f54d1d4 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -3819,7 +3819,6 @@ "Create new disk image": "新しいディスクイメージの作成", "Created Date": "作成日", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "sysctlを作成または編集すると、すぐに変数が設定された値に更新されます。loaderまたはrc.conf調整パラメータを適用するには、再起動が必要です。構成された調整可能パラメータは、削除されるか有効が設定解除されるまで有効です。", - "Cron Job": "Cron ジョブ", "Current Password": "現在のパスワード", "Current Train:": "現在のトレイン:", "Dashboard": "ダッシュボード", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 1dd991dca95..f0e5100d306 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -341,7 +341,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 91c5574251f..a6be4fea385 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -837,7 +837,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index 7bc5ad8bed2..9b909bddc33 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -1042,7 +1042,6 @@ "Critical Extension": "Kritieke extensie", "Critical applications": "Kritieke toepassing", "Criticality": "Kritiek", - "Cron Job": "Cronjob", "Cron Jobs": "Cronjobs", "Cron job created": "Cron-job is aangemaakt", "Cron job updated": "Cron-job is geüpdatet", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index d33e32946d9..812f96ced5c 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -784,7 +784,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index e933d47d720..a967974e4f6 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -777,7 +777,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index 03295ebdadd..068f80e9404 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -491,7 +491,6 @@ "Created Date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index dd23c07a763..37186e73490 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -2716,7 +2716,6 @@ "Critical Extension": "Критическое расширение", "Critical applications": "Критические приложения", "Criticality": "Критичность", - "Cron Job": "Задание Cron", "Cryptographic protocols for securing client/server connections. Select which Transport Layer Security (TLS) versions TrueNAS can use for connection security.": "Криптографические протоколы для защиты клиент-серверных соединений. Выберите, какие версии транспортного уровня (TLS) TrueNAS может использовать для обеспечения безопасности соединения.", "Current Password": "Текущий пароль", "Current Train:": "Текущий поезд:", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index 43a1f68f447..e5cb63e778a 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -1110,7 +1110,6 @@ "Critical Extension": "Критичне розширення", "Critical applications": "Критичні програми", "Criticality": "Критичність", - "Cron Job": "Завдання Cron", "Cron Jobs": "Роботи Cron", "Cryptographic protocols for securing client/server connections. Select which Transport Layer Security (TLS) versions TrueNAS can use for connection security.": "Криптографічні протоколи захисту клієнт-серверних з'єднань. Виберіть, які версії транспортного рівня (TLS) TrueNAS може використовуватись для забезпечення безпеки з'єднання.", "Current Password": "Поточний пароль", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 9d0f4b3f078..6d0f9db7416 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -843,7 +843,6 @@ "Critical Extension": "", "Critical applications": "", "Criticality": "", - "Cron Job": "", "Cron Jobs": "", "Cron job created": "", "Cron job updated": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index c4d1a656258..9ddf97b2f52 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -1119,7 +1119,6 @@ "Critical Extension": "关键扩展", "Critical applications": "关键应用", "Criticality": "关键性", - "Cron Job": "计划任务", "Cron Jobs": "定时任务", "Cron job created": "计划任务已创建", "Cron job updated": "计划任务已更新", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 248050e5e48..953bc6c9cd7 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -3489,7 +3489,6 @@ "Credential": "憑證", "Credentials": " 認證", "Critical": "嚴重", - "Cron Job": "排程工作", "Cron Jobs": "排程工作", "Current Password": "現行密碼", "DNS Timeout": "DNS 逾時", From a06d144fa89e580056c2c56188f79b85a2589b81 Mon Sep 17 00:00:00 2001 From: bugclerk <40872210+bugclerk@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:57:23 -0300 Subject: [PATCH 08/12] NAS-123283 / 24.04 / dRAID support (by undsoft) (#8675) --- src/app/enums/v-dev-type.enum.ts | 1 + src/app/helpers/options.helper.spec.ts | 12 +- src/app/helpers/options.helper.ts | 7 + .../storage/volumes/manager/manager.ts | 4 +- src/app/interfaces/pool.interface.ts | 11 +- .../topology-card/topology-card.component.ts | 10 +- .../store/add-vdevs-store.service.ts | 1 + ...xisting-configuration-preview.component.ts | 2 + .../automated-disk-selection.component.html | 84 ++-- .../automated-disk-selection.component.scss | 22 +- ...automated-disk-selection.component.spec.ts | 365 +++--------------- .../automated-disk-selection.component.ts | 329 ++-------------- .../disk-size-selects.component.html | 15 + .../disk-size-selects.component.spec.ts | 143 +++++++ .../disk-size-selects.component.ts | 149 +++++++ .../draid-selection.component.html | 50 +++ .../draid-selection.component.scss | 25 ++ .../draid-selection.component.spec.ts | 235 +++++++++++ .../draid-selection.component.ts | 260 +++++++++++++ .../normal-selection.component.html | 43 +++ .../normal-selection.component.scss | 21 + .../normal-selection.component.spec.ts | 250 ++++++++++++ .../normal-selection.component.ts | 165 ++++++++ .../layout-step/layout-step.component.ts | 1 - .../pool-manager-wizard.component.html | 1 + .../pool-manager-wizard.component.ts | 5 + .../data-wizard-step.component.ts | 20 +- .../pool-manager/pool-manager.component.ts | 1 + .../pool-manager/pool-manager.module.ts | 6 + .../pool-manager-validation.service.spec.ts | 101 ++++- .../store/pool-manager-validation.service.ts | 78 +++- .../store/pool-manager.store.spec.ts | 8 +- .../pool-manager/store/pool-manager.store.ts | 63 ++- .../pool-manager/utils/capacity.utils.spec.ts | 12 +- .../pool-manager/utils/capacity.utils.ts | 62 ++- .../modules/pool-manager/utils/form.utils.ts | 34 ++ .../pool-manager/utils/topology.utils.spec.ts | 41 ++ .../pool-manager/utils/topology.utils.ts | 64 ++- src/assets/i18n/af.json | 8 +- src/assets/i18n/ar.json | 8 +- src/assets/i18n/ast.json | 8 +- src/assets/i18n/az.json | 8 +- src/assets/i18n/be.json | 8 +- src/assets/i18n/bg.json | 8 +- src/assets/i18n/bn.json | 8 +- src/assets/i18n/br.json | 8 +- src/assets/i18n/bs.json | 8 +- src/assets/i18n/ca.json | 8 +- src/assets/i18n/cs.json | 8 +- src/assets/i18n/cy.json | 8 +- src/assets/i18n/da.json | 8 +- src/assets/i18n/de.json | 8 +- src/assets/i18n/dsb.json | 8 +- src/assets/i18n/el.json | 8 +- src/assets/i18n/en-au.json | 8 +- src/assets/i18n/en-gb.json | 8 +- src/assets/i18n/en.json | 8 +- src/assets/i18n/eo.json | 8 +- src/assets/i18n/es-ar.json | 8 +- src/assets/i18n/es-co.json | 8 +- src/assets/i18n/es-mx.json | 8 +- src/assets/i18n/es-ni.json | 8 +- src/assets/i18n/es-ve.json | 8 +- src/assets/i18n/es.json | 8 +- src/assets/i18n/et.json | 8 +- src/assets/i18n/eu.json | 8 +- src/assets/i18n/fa.json | 8 +- src/assets/i18n/fi.json | 8 +- src/assets/i18n/fr.json | 8 +- src/assets/i18n/fy.json | 8 +- src/assets/i18n/ga.json | 8 +- src/assets/i18n/gd.json | 8 +- src/assets/i18n/gl.json | 8 +- src/assets/i18n/he.json | 8 +- src/assets/i18n/hi.json | 8 +- src/assets/i18n/hr.json | 8 +- src/assets/i18n/hsb.json | 8 +- src/assets/i18n/hu.json | 8 +- src/assets/i18n/ia.json | 8 +- src/assets/i18n/id.json | 8 +- src/assets/i18n/io.json | 8 +- src/assets/i18n/is.json | 8 +- src/assets/i18n/it.json | 8 +- src/assets/i18n/ja.json | 8 +- src/assets/i18n/ka.json | 8 +- src/assets/i18n/kk.json | 8 +- src/assets/i18n/km.json | 8 +- src/assets/i18n/kn.json | 8 +- src/assets/i18n/ko.json | 8 +- src/assets/i18n/lb.json | 8 +- src/assets/i18n/lt.json | 8 +- src/assets/i18n/lv.json | 8 +- src/assets/i18n/mk.json | 8 +- src/assets/i18n/ml.json | 8 +- src/assets/i18n/mn.json | 8 +- src/assets/i18n/mr.json | 8 +- src/assets/i18n/my.json | 8 +- src/assets/i18n/nb.json | 8 +- src/assets/i18n/ne.json | 8 +- src/assets/i18n/nl.json | 8 +- src/assets/i18n/nn.json | 8 +- src/assets/i18n/os.json | 8 +- src/assets/i18n/pa.json | 8 +- src/assets/i18n/pl.json | 8 +- src/assets/i18n/pt-br.json | 8 +- src/assets/i18n/pt.json | 8 +- src/assets/i18n/ro.json | 8 +- src/assets/i18n/ru.json | 8 +- src/assets/i18n/sk.json | 8 +- src/assets/i18n/sl.json | 8 +- src/assets/i18n/sq.json | 8 +- src/assets/i18n/sr-latn.json | 8 +- src/assets/i18n/sr.json | 8 +- src/assets/i18n/strings.json | 8 +- src/assets/i18n/sv.json | 8 +- src/assets/i18n/sw.json | 8 +- src/assets/i18n/ta.json | 8 +- src/assets/i18n/te.json | 8 +- src/assets/i18n/th.json | 8 +- src/assets/i18n/tr.json | 8 +- src/assets/i18n/tt.json | 8 +- src/assets/i18n/udm.json | 8 +- src/assets/i18n/uk.json | 8 +- src/assets/i18n/vi.json | 8 +- src/assets/i18n/zh-hans.json | 8 +- src/assets/i18n/zh-hant.json | 8 +- 126 files changed, 2562 insertions(+), 843 deletions(-) create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.html create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.spec.ts create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.ts create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.html create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.scss create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.spec.ts create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.ts create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.html create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.scss create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.spec.ts create mode 100644 src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.ts create mode 100644 src/app/pages/storage/modules/pool-manager/utils/form.utils.ts diff --git a/src/app/enums/v-dev-type.enum.ts b/src/app/enums/v-dev-type.enum.ts index 9e652b0f1f3..abda22f4445 100644 --- a/src/app/enums/v-dev-type.enum.ts +++ b/src/app/enums/v-dev-type.enum.ts @@ -16,6 +16,7 @@ export enum TopologyItemType { Raidz1 = 'RAIDZ1', Raidz2 = 'RAIDZ2', Raidz3 = 'RAIDZ3', + Draid = 'DRAID', L2Cache = 'L2CACHE', Replacing = 'REPLACING', } diff --git a/src/app/helpers/options.helper.spec.ts b/src/app/helpers/options.helper.spec.ts index 3addccd70d4..9603effba7d 100644 --- a/src/app/helpers/options.helper.spec.ts +++ b/src/app/helpers/options.helper.spec.ts @@ -1,5 +1,15 @@ import { TranslateService } from '@ngx-translate/core'; -import { mapToOptions } from 'app/helpers/options.helper'; +import { generateOptionsRange, mapToOptions } from 'app/helpers/options.helper'; + +describe('generateOptionsRange', () => { + it('generates a range of options based on range of numbers', () => { + expect(generateOptionsRange(1, 3)).toStrictEqual([ + { label: '1', value: 1 }, + { label: '2', value: 2 }, + { label: '3', value: 3 }, + ]); + }); +}); describe('mapToOptions', () => { it('converts JS Map to an array of options while invoking translation on labels', () => { diff --git a/src/app/helpers/options.helper.ts b/src/app/helpers/options.helper.ts index 7003e3ff14b..fcce06a2237 100644 --- a/src/app/helpers/options.helper.ts +++ b/src/app/helpers/options.helper.ts @@ -15,3 +15,10 @@ export function findLabelsByValue(options: Option[]): (value: string) => string return selectedOption?.label; }; } + +export function generateOptionsRange(start: number, end: number): Option[] { + return Array.from({ length: end - start + 1 }, (_, index) => { + const value = start + index; + return { label: String(value), value }; + }); +} diff --git a/src/app/helptext/storage/volumes/manager/manager.ts b/src/app/helptext/storage/volumes/manager/manager.ts index 001d5af6831..0ad4d5cad07 100644 --- a/src/app/helptext/storage/volumes/manager/manager.ts +++ b/src/app/helptext/storage/volumes/manager/manager.ts @@ -81,10 +81,12 @@ export default { be sized to X GiB for each X TiB of general storage.'), exported_pool_warning: T('This disk is part of the exported pool {pool}. Adding this disk to a new or other existing pools will make {pool} unable to import. You will lose any and all data in {pool}. Please make sure you have backed up any sensitive data in {pool} before reusing/repurposing this disk.'), - dRaidTooltip: T('dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.'), + dRaidTooltip: T('dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.'), stripeTooltip: T('Each disk stores data. A stripe requires at least one disk and has no data redundancy.'), mirrorTooltip: T('Data is identical in each disk. A mirror requires at least two disks, provides the most redundancy, and has the least capacity.'), raidz1Tooltip: T('Uses one disk for parity while all other disks store data. RAIDZ1 requires at least three disks. RAIDZ is a traditional ZFS data protection scheme. \nChoose RAIDZ over dRAID when managing a smaller set of drives, where simplicity of setup and predictable disk usage are primary considerations.'), raidz2Tooltip: T('Uses two disks for parity while all other disks store data. RAIDZ2 requires at least four disks. RAIDZ is a traditional ZFS data protection scheme. \nChoose RAIDZ over dRAID when managing a smaller set of drives, where simplicity of setup and predictable disk usage are primary considerations.'), raidz3Tooltip: T('Uses three disks for parity while all other disks store data. RAIDZ3 requires at least five disks. RAIDZ is a traditional ZFS data protection scheme. \nChoose RAIDZ over dRAID when managing a smaller set of drives, where simplicity of setup and predictable disk usage are primary considerations.'), + + dRaidChildrenExplanation: T('The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.'), }; diff --git a/src/app/interfaces/pool.interface.ts b/src/app/interfaces/pool.interface.ts index e722c04e20a..34e2dddda1b 100644 --- a/src/app/interfaces/pool.interface.ts +++ b/src/app/interfaces/pool.interface.ts @@ -89,7 +89,7 @@ export interface UpdatePool { // TODO: Maybe replace first 5 keys with VdevType enum once old pool manager is removed. export interface UpdatePoolTopology { - data?: { type: CreateVdevLayout; disks: string[] }[]; + data?: DataPoolTopologyUpdate[]; special?: { type: CreateVdevLayout; disks: string[] }[]; dedup?: { type: CreateVdevLayout; disks: string[] }[]; cache?: { type: CreateVdevLayout; disks: string[] }[]; @@ -98,6 +98,15 @@ export interface UpdatePoolTopology { spares?: string[]; } +export interface DataPoolTopologyUpdate { + type: CreateVdevLayout; + disks: string[]; + draid_data_disks?: number; + draid_spare_disks?: number; +} + +export type UpdatePoolTopologyGroup = keyof UpdatePoolTopology; + export interface PoolAttachParams { target_vdev?: string; new_disk?: string; diff --git a/src/app/pages/storage/components/dashboard-pool/topology-card/topology-card.component.ts b/src/app/pages/storage/components/dashboard-pool/topology-card/topology-card.component.ts index 9187b033b7e..c7cfc97e1ac 100644 --- a/src/app/pages/storage/components/dashboard-pool/topology-card/topology-card.component.ts +++ b/src/app/pages/storage/components/dashboard-pool/topology-card/topology-card.component.ts @@ -17,6 +17,7 @@ import { TopologyDisk, TopologyItem, } from 'app/interfaces/storage.interface'; +import { isDraidLayout } from 'app/pages/storage/modules/pool-manager/utils/topology.utils'; import { StorageService } from 'app/services/storage.service'; interface TopologyState { @@ -141,7 +142,14 @@ export class TopologyCardComponent implements OnInit, OnChanges { : this.disks?.find((disk) => disk.name === (vdevs[0] as TopologyDisk)?.disk)?.size; outputString = `${vdevs.length} x `; - outputString += vdevWidth ? `${type} | ${vdevWidth} wide | ` : ''; + // TODO: Needs to be translated. + if (vdevWidth) { + if (isDraidLayout(type)) { + outputString += `${type} | ${vdevWidth} children | `; + } else { + outputString += `${type} | ${vdevWidth} wide | `; + } + } if (size) { outputString += filesize(size, { standard: 'iec' }); diff --git a/src/app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service.ts b/src/app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service.ts index bf4cd7bb130..c9bb7a0891e 100644 --- a/src/app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service.ts +++ b/src/app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service.ts @@ -26,6 +26,7 @@ const initialState: AddVdevsState = { @Injectable() export class AddVdevsStore extends ComponentStore { readonly isLoading$ = this.select((state) => state.isLoading); + // TODO: Remove clone deep. readonly pool$ = this.select((state) => _.cloneDeep(state.pool)); readonly poolDisks$ = this.select((state) => state.poolDisks); diff --git a/src/app/pages/storage/modules/pool-manager/components/existing-configuration-preview/existing-configuration-preview.component.ts b/src/app/pages/storage/modules/pool-manager/components/existing-configuration-preview/existing-configuration-preview.component.ts index 9634eed966b..0beb88b864f 100644 --- a/src/app/pages/storage/modules/pool-manager/components/existing-configuration-preview/existing-configuration-preview.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/existing-configuration-preview/existing-configuration-preview.component.ts @@ -24,6 +24,8 @@ const defaultCategory: PoolManagerTopologyCategory = { treatDiskSizeAsMinimum: false, vdevs: [], hasCustomDiskSelection: false, + draidSpareDisks: null, + draidDataDisks: null, }; @UntilDestroy() @Component({ diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.html b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.html index 9e2e461d5b2..0dc93fde758 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.html +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.html @@ -1,61 +1,27 @@ - -
- -
-
-
-

{{ 'Automated Disk Selection' | translate }}

- +
+ +
- + - - - - - -
-
-

{{ 'Advanced Options' | translate }}

- -

{{ 'Manual disk selection allows you to create VDEVs and add disks to those VDEVs individually.' | translate }}

- - -
-
-
+ + + diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.scss b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.scss index 51fbaa8e4a9..b58eba77230 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.scss +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.scss @@ -1,26 +1,8 @@ -.content-container { - border: 1px solid var(--lines); - display: flex; - margin: 20px 0; - padding: 20px 0; - - .automated-disk-selection-container { - border-right: 1px solid var(--lines); - padding: 0 30px; - width: 100%; - } - - .advanced-options-container { - padding: 0 30px; - width: 100%; - } -} - .layout-container { max-width: 50%; padding: 0 30px; } -.manual-disk-selection { - margin-top: 25px; +.required-disks-hint { + padding-left: 30px; } diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.spec.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.spec.ts index f388365d70a..ba5d0a4c50f 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.spec.ts +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.spec.ts @@ -1,20 +1,22 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { NgControl, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonHarness } from '@angular/material/button/testing'; -import { FormBuilder } from '@ngneat/reactive-forms'; +import { ReactiveFormsModule } from '@angular/forms'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; -import { Subject, of } from 'rxjs'; -import { TiB } from 'app/constants/bytes.constant'; -import { DiskType } from 'app/enums/disk-type.enum'; +import { MockComponents } from 'ng-mocks'; +import { Subject } from 'rxjs'; import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; import { UnusedDisk } from 'app/interfaces/storage.interface'; -import { IxCheckboxHarness } from 'app/modules/ix-forms/components/ix-checkbox/ix-checkbox.harness'; import { IxSelectHarness } from 'app/modules/ix-forms/components/ix-select/ix-select.harness'; import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; import { AutomatedDiskSelectionComponent, } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component'; +import { + DraidSelectionComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component'; +import { + NormalSelectionComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component'; import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; describe('AutomatedDiskSelection', () => { @@ -25,62 +27,8 @@ describe('AutomatedDiskSelection', () => { const resetStep$ = new Subject(); let layoutSelect: IxSelectHarness; - let widthSelect: IxSelectHarness; - let vdevsSelect: IxSelectHarness; - let sizeSelect: IxSelectHarness; - const unusedDisks: UnusedDisk[] = [ - { - devname: 'sdo', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdr', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdq', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdw', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdt', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdu', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdh', - size: 12 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdg', - size: 14 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdj', - size: 14 * TiB, - type: DiskType.Hdd, - }, - { - devname: 'sdk', - size: 1 * TiB, - type: DiskType.Hdd, - }, - ] as UnusedDisk[]; + const inventory: UnusedDisk[] = [] as UnusedDisk[]; const createComponent = createComponentFactory({ component: AutomatedDiskSelectionComponent, @@ -88,28 +36,16 @@ describe('AutomatedDiskSelection', () => { ReactiveFormsModule, IxFormsModule, ], + declarations: [ + MockComponents( + NormalSelectionComponent, + DraidSelectionComponent, + ), + ], providers: [ - mockProvider(NgControl), - mockProvider(FormBuilder), mockProvider(PoolManagerStore, { startOver$, resetStep$, - getLayoutsForVdevType: jest.fn((vdevType: VdevType) => { - switch (vdevType) { - case VdevType.Cache: - return of([CreateVdevLayout.Stripe]); - case VdevType.Dedup: - return of([CreateVdevLayout.Mirror]); - case VdevType.Log: - return of([CreateVdevLayout.Mirror, CreateVdevLayout.Stripe]); - case VdevType.Spare: - return of([CreateVdevLayout.Stripe]); - case VdevType.Special: - return of([CreateVdevLayout.Mirror]); - default: - return of([...Object.values(CreateVdevLayout)]); - } - }), }), ], }); @@ -117,270 +53,67 @@ describe('AutomatedDiskSelection', () => { beforeEach(async () => { spectator = createComponent({ props: { + inventory, canChangeLayout: true, type: VdevType.Data, - inventory: [...unusedDisks], limitLayouts: Object.values(CreateVdevLayout), + isStepActive: false, }, }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - layoutSelect = await loader.getHarnessOrNull(IxSelectHarness.with({ label: 'Layout' })); - widthSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Width' })); - vdevsSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Number of VDEVs' })); - sizeSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Disk Size' })); - }); - - it('updates width and vdev options when layout changes to mirror', async () => { - await layoutSelect.setValue('Mirror'); - await sizeSelect.setValue('12 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['2', '3', '4', '5', '6', '7']); - - await widthSelect.setValue('2'); - - expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1', '2', '3']); }); - it('updates width and vdev options when layout changes to Raidz1', async () => { - await layoutSelect.setValue('RAIDZ1'); - await sizeSelect.setValue('12 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['3', '4', '5', '6', '7']); - - await widthSelect.setValue('3'); - - expect(await vdevsSelect.getOptionLabels()) - .toStrictEqual(['1', '2']); - }); + it('shows NormalSelectionComponent for non-dRAID layouts', async () => { + let normalSelection = spectator.query(NormalSelectionComponent); + expect(normalSelection).not.toBeNull(); + expect(normalSelection.type).toBe(VdevType.Data); + expect(normalSelection.inventory).toBe(inventory); + expect(normalSelection.isStepActive).toBe(false); - it('updates width and vdev options when layout changes to Raidz2', async () => { - await layoutSelect.setValue('RAIDZ2'); - await sizeSelect.setValue('12 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['4', '5', '6', '7']); + await layoutSelect.setValue('Mirror'); - await widthSelect.setValue('4'); + normalSelection = spectator.query(NormalSelectionComponent); + expect(normalSelection).not.toBeNull(); + expect(normalSelection.layout).toBe(CreateVdevLayout.Mirror); - expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1']); + expect(spectator.query(DraidSelectionComponent)).toBeNull(); }); - it('updates width and vdev options when layout changes to Raidz3', async () => { - await layoutSelect.setValue('RAIDZ3'); - await sizeSelect.setValue('12 TiB (HDD)'); + it('shows DraidSelectionComponent for dRAID layouts', async () => { + await layoutSelect.setValue('dRAID2'); - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['5', '6', '7']); + const draidSelection = spectator.query(DraidSelectionComponent); + expect(draidSelection).not.toBeNull(); + expect(draidSelection.layout).toBe(CreateVdevLayout.Draid2); + expect(draidSelection.inventory).toBe(inventory); + expect(draidSelection.type).toBe(VdevType.Data); + expect(draidSelection.isStepActive).toBe(false); - await widthSelect.setValue('5'); - - expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1']); + expect(spectator.query(NormalSelectionComponent)).toBeNull(); }); - it('updates width and vdev options when layout changes to Stripe', async () => { - await layoutSelect.setValue('Stripe'); - await sizeSelect.setValue('12 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); - - await widthSelect.setValue('1'); + it('doesnt let the layout change when canChangeLayout is false', async () => { + spectator.setInput('canChangeLayout', false); - expect(await vdevsSelect.getOptionLabels()) - .toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); + layoutSelect = await loader.getHarnessOrNull(IxSelectHarness.with({ label: 'Layout' })); + expect(layoutSelect).toBeNull(); }); - it('updates the width options when layout changes after already selecting values', async () => { - await layoutSelect.setValue('Stripe'); - await sizeSelect.setValue('12 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); - - await widthSelect.setValue('1'); - - expect(await vdevsSelect.getOptionLabels()) - .toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); - + it('resets to default values when store emits a reset event', async () => { await layoutSelect.setValue('Mirror'); - expect(await widthSelect.getValue()).toBe(''); - expect(await widthSelect.getOptionLabels()) - .toStrictEqual(['2', '3', '4', '5', '6', '7']); - }); - - it('auto fills select when only one value is available', async () => { - spectator.component.isStepActive = true; - spectator.fixture.detectChanges(); - await layoutSelect.setValue('Stripe'); - await sizeSelect.setValue('1 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()).toStrictEqual(['1']); - - const widthValue = await widthSelect.getValue(); - expect(widthValue).toBe('1'); - - expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1']); - - const vdevsValue = await widthSelect.getValue(); - expect(vdevsValue).toBe('1'); - }); - - it('doesnt let the layout change', async () => { - spectator.setInput('canChangeLayout', false); - - const layout = await loader.getHarnessOrNull(IxSelectHarness.with({ label: 'Layout' })); - expect(layout).toBeNull(); - }); + startOver$.next(); - it('disables dependent fields until they are valid', async () => { - expect(await widthSelect.isDisabled()).toBeTruthy(); - expect(await vdevsSelect.isDisabled()).toBeTruthy(); - await layoutSelect.setValue('Mirror'); - expect(await vdevsSelect.isDisabled()).toBeTruthy(); - expect(await widthSelect.isDisabled()).toBeTruthy(); - await sizeSelect.setValue('12 TiB (HDD)'); - expect(await widthSelect.isDisabled()).toBeFalsy(); - expect(await vdevsSelect.isDisabled()).toBeTruthy(); - await widthSelect.setValue('2'); - expect(await widthSelect.isDisabled()).toBeFalsy(); - expect(await vdevsSelect.isDisabled()).toBeFalsy(); + expect(await layoutSelect.getValue()).toBe(''); }); - it('saves the topology layout on form updates', async () => { - const poolManagerStore = spectator.inject(PoolManagerStore); - + it('updates layout in store when it is changed', async () => { await layoutSelect.setValue('Mirror'); - expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, { - layout: CreateVdevLayout.Mirror, - diskSize: null, - diskType: null, - width: undefined, - vdevsNumber: undefined, - treatDiskSizeAsMinimum: undefined, - }); - - await sizeSelect.setValue('12 TiB (HDD)'); - const checkValues = { - layout: CreateVdevLayout.Mirror, - diskSize: 12 * TiB, - diskType: DiskType.Hdd, - width: null as number, - vdevsNumber: undefined as number, - treatDiskSizeAsMinimum: false, - }; - - expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, checkValues); - - await widthSelect.setValue('2'); - expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, { - layout: CreateVdevLayout.Mirror, - diskSize: 12 * TiB, - diskType: DiskType.Hdd, - width: 2, - vdevsNumber: null, - treatDiskSizeAsMinimum: false, - }); - - await vdevsSelect.setValue('2'); - expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, { - layout: CreateVdevLayout.Mirror, - diskSize: 12 * TiB, - diskType: DiskType.Hdd, - width: 2, - vdevsNumber: 2, - treatDiskSizeAsMinimum: false, - }); - const treatDiskSizeAsMinimumCheckbox = await loader.getHarness( - IxCheckboxHarness.with({ label: 'Treat Disk Size as Minimum' }), + expect(spectator.inject(PoolManagerStore).setTopologyCategoryLayout).toHaveBeenCalledWith( + VdevType.Data, + CreateVdevLayout.Mirror, ); - - await treatDiskSizeAsMinimumCheckbox.setValue(true); - expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, { - layout: CreateVdevLayout.Mirror, - diskSize: 12 * TiB, - diskType: DiskType.Hdd, - width: 2, - vdevsNumber: 2, - treatDiskSizeAsMinimum: true, - }); - }); - - it('opens manual disk selection modal', async () => { - jest.spyOn(spectator.component.manualSelectionClicked, 'emit'); - const manualSelectionButton = await loader.getHarness(MatButtonHarness.with({ text: 'Manual Disk Selection' })); - await manualSelectionButton.click(); - expect(spectator.component.manualSelectionClicked.emit).toHaveBeenCalled(); - }); - - describe('treat Disk Size as minimum', () => { - it('updates width dropdown to include disks with larger size when checkbox is ticked', async () => { - await layoutSelect.setValue('Stripe'); - await sizeSelect.setValue('12 TiB (HDD)'); - - expect(await widthSelect.getOptionLabels()).toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); - - const treatDiskSizeAsMinimumCheckbox = await loader.getHarness( - IxCheckboxHarness.with({ label: 'Treat Disk Size as Minimum' }), - ); - await treatDiskSizeAsMinimumCheckbox.setValue(true); - - expect(await widthSelect.getOptionLabels()).toStrictEqual(['1', '2', '3', '4', '5', '6', '7', '8', '9']); - }); - }); - - it('resets form if Start Over confirmed', async () => { - await layoutSelect.setValue('Stripe'); - await sizeSelect.setValue('12 TiB (HDD)'); - - const form = spectator.component.form; - - form.patchValue({ treatDiskSizeAsMinimum: true }); - - expect(form.value).toStrictEqual({ - layout: CreateVdevLayout.Stripe, - sizeAndType: [13194139533312, DiskType.Hdd], - treatDiskSizeAsMinimum: true, - width: null, - }); - - const store = spectator.inject(PoolManagerStore); - store.startOver$.next(); - - expect(form.value).toStrictEqual({ - layout: null, - sizeAndType: [null, null], - treatDiskSizeAsMinimum: false, - width: null, - }); - }); - - it('resets step if Reset Step message received from store', async () => { - await layoutSelect.setValue('Stripe'); - await sizeSelect.setValue('12 TiB (HDD)'); - - const form = spectator.component.form; - form.patchValue({ treatDiskSizeAsMinimum: true }); - - expect(form.value).toStrictEqual({ - layout: CreateVdevLayout.Stripe, - sizeAndType: [13194139533312, DiskType.Hdd], - treatDiskSizeAsMinimum: true, - width: null, - }); - - const store = spectator.inject(PoolManagerStore); - store.resetStep$.next(spectator.component.type); - - expect(form.value).toStrictEqual({ - layout: null, - sizeAndType: [null, null], - treatDiskSizeAsMinimum: false, - width: null, - }); }); }); diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.ts index 5d2e94c22cb..ebb623dc859 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component.ts @@ -4,26 +4,19 @@ import { EventEmitter, Input, OnChanges, - OnInit, Output, } from '@angular/core'; -import { FormBuilder, Validators } from '@angular/forms'; +import { FormControl, Validators } from '@angular/forms'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import filesize from 'filesize'; -import _ from 'lodash'; -import { - distinctUntilChanged, of, take, -} from 'rxjs'; -import { DiskType } from 'app/enums/disk-type.enum'; +import { merge, of } from 'rxjs'; +import { filter } from 'rxjs/operators'; import { CreateVdevLayout, vdevLayoutOptions, VdevType } from 'app/enums/v-dev-type.enum'; -import { Option, SelectOption } from 'app/interfaces/option.interface'; +import { SelectOption } from 'app/interfaces/option.interface'; import { IxSimpleChanges } from 'app/interfaces/simple-changes.interface'; import { UnusedDisk } from 'app/interfaces/storage.interface'; -import { DiskTypeSizeMap } from 'app/pages/storage/modules/pool-manager/interfaces/disk-type-size-map.interface'; -import { SizeAndType } from 'app/pages/storage/modules/pool-manager/interfaces/size-and-type.interface'; import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; -import { getDiskTypeSizeMap } from 'app/pages/storage/modules/pool-manager/utils/get-disk-type-size-map.utils'; -import { minDisksPerLayout } from 'app/pages/storage/modules/pool-manager/utils/min-disks-per-layout.constant'; +import { hasDeepChanges, setValueIfNotSame } from 'app/pages/storage/modules/pool-manager/utils/form.utils'; +import { isDraidLayout } from 'app/pages/storage/modules/pool-manager/utils/topology.utils'; @UntilDestroy() @Component({ @@ -32,7 +25,7 @@ import { minDisksPerLayout } from 'app/pages/storage/modules/pool-manager/utils/ styleUrls: ['./automated-disk-selection.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class AutomatedDiskSelectionComponent implements OnInit, OnChanges { +export class AutomatedDiskSelectionComponent implements OnChanges { @Input() isStepActive: boolean; @Input() type: VdevType; @Input() inventory: UnusedDisk[] = []; @@ -41,309 +34,51 @@ export class AutomatedDiskSelectionComponent implements OnInit, OnChanges { @Output() manualSelectionClicked = new EventEmitter(); - form = this.formBuilder.group({ - layout: [CreateVdevLayout.Stripe, Validators.required], - sizeAndType: [[null, null] as SizeAndType, Validators.required], - width: [{ value: null as number, disabled: true }, Validators.required], - treatDiskSizeAsMinimum: [{ value: false, disabled: true }], - vdevsNumber: [{ value: null as number, disabled: true }, Validators.required], - }); - - protected compareSizeAndTypeWith = _.isEqual; + readonly layoutControl = new FormControl(null as CreateVdevLayout, Validators.required); protected vdevLayoutOptions$ = of[]>([]); - protected diskSizeAndTypeOptions$ = of([]); - protected widthOptions$ = of([]); - protected numberOptions$ = of([]); - - private minDisks = minDisksPerLayout; - private sizeDisksMap: DiskTypeSizeMap = { [DiskType.Hdd]: {}, [DiskType.Ssd]: {} }; constructor( - private formBuilder: FormBuilder, protected store: PoolManagerStore, - ) {} - - get selectedDiskSize(): number { - return this.form.controls.sizeAndType.value?.[0]; - } - - get isSizeSelected(): boolean { - return !!this.form.value.sizeAndType?.length - && !!this.form.value.sizeAndType[0] - && !!this.form.value.sizeAndType[1]; - } - - get isLayoutSelected(): boolean { - return !!this.form.value.layout; - } - - get isWidthSelected(): boolean { - return !!this.form.value.width; - } - - get selectedDiskType(): DiskType { - return this.form.controls.sizeAndType.value?.[1]; - } - - ngOnInit(): void { - this.initControls(); - - this.store.startOver$.pipe(untilDestroyed(this)).subscribe(() => { - this.resetToDefaults(); - }); - - this.store.resetStep$.pipe(untilDestroyed(this)).subscribe((vdevType: VdevType) => { - if (vdevType === this.type) { - this.resetToDefaults(); - } - }); - } - - resetToDefaults(): void { - this.form.reset({ - layout: this.canChangeLayout ? null : this.limitLayouts[0], - sizeAndType: [null, null], - width: null, - treatDiskSizeAsMinimum: false, - vdevsNumber: null, - }); + ) { + this.updateStoreOnChanges(); + this.listenForResetEvents(); } ngOnChanges(changes: IxSimpleChanges): void { - if ( - changes.inventory?.currentValue - && !_.isEqual(changes.inventory.currentValue, changes.inventory.previousValue) - ) { - this.updateLayoutOptionsFromLimitedLayouts(this.limitLayouts); - this.updateDiskSizeOptions(); - return; - } - if ( - changes.limitLayouts?.currentValue - && !_.isEqual(changes.limitLayouts.currentValue, changes.limitLayouts.previousValue) - ) { + if (hasDeepChanges(changes, 'limitLayouts')) { this.updateLayoutOptionsFromLimitedLayouts(changes.limitLayouts.currentValue); } } - updateLayoutOptionsFromLimitedLayouts(limitLayouts: CreateVdevLayout[]): void { - this.vdevLayoutOptions$ = of( - limitLayouts.map( - (layout) => ({ - label: Object.keys(CreateVdevLayout)[Object.values(CreateVdevLayout).indexOf(layout)], - value: layout, - }), - ), - ); - const isChangeLayoutFalse = this.canChangeLayout !== null - && this.canChangeLayout !== undefined - && !this.canChangeLayout; - const isValueSame = limitLayouts[0] === this.form.controls.layout.value; - if (isChangeLayoutFalse && limitLayouts.length && !isValueSame) { - this.form.controls.layout.setValue(limitLayouts[0]); - } - this.updateWidthOptions(); + protected get usesDraidLayout(): boolean { + return isDraidLayout(this.layoutControl.value); } - openManualDiskSelection(): void { - this.manualSelectionClicked.emit(); - } - - /** - * Dependency between selects as follows: - * size -> layout -> width -> number - */ - private initControls(): void { - this.form.controls.layout.valueChanges.pipe( - distinctUntilChanged(), - untilDestroyed(this), - ).subscribe((layout) => { - if (this.isSizeSelected && !!layout) { - if (this.form.controls.width.disabled) { - this.form.controls.width.enable(); - } - if (this.form.controls.treatDiskSizeAsMinimum.disabled) { - this.form.controls.treatDiskSizeAsMinimum.enable(); - } - if (this.isWidthSelected && this.form.controls.vdevsNumber.disabled) { - this.form.controls.vdevsNumber.enable(); - } - } - - this.updateWidthOptions(); - }); - - this.form.controls.sizeAndType.valueChanges.pipe( - distinctUntilChanged(), - untilDestroyed(this), - ).subscribe((sizeAndType) => { - if (sizeAndType?.length && this.isLayoutSelected) { - if (this.form.controls.width.disabled) { - this.form.controls.width.enable(); - } - if (this.form.controls.treatDiskSizeAsMinimum.disabled) { - this.form.controls.treatDiskSizeAsMinimum.enable(); - } - if (this.isWidthSelected && this.form.controls.vdevsNumber.disabled) { - this.form.controls.vdevsNumber.enable(); - } - } - - this.updateLayoutOptions(); - }); - - this.form.controls.width.valueChanges.pipe( - distinctUntilChanged(), - untilDestroyed(this), - ).subscribe((width) => { - if (this.isSizeSelected && this.isLayoutSelected && !!width && this.form.controls.vdevsNumber.disabled) { - this.form.controls.vdevsNumber.enable(); - } - this.updateNumberOptions(); - }); - - this.form.controls.treatDiskSizeAsMinimum.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { - this.updateWidthOptions(); - }); - - this.form.valueChanges.pipe( - distinctUntilChanged(), - untilDestroyed(this), - ).subscribe(() => { - this.updateLayout(); + private updateStoreOnChanges(): void { + this.layoutControl.valueChanges.pipe(untilDestroyed(this)).subscribe((layout) => { + this.store.setTopologyCategoryLayout(this.type, layout); }); } - private updateLayout(): void { - const values = this.form.value; - this.store.setAutomaticTopologyCategory(this.type, { - layout: values.layout, - diskSize: this.selectedDiskSize, - diskType: this.selectedDiskType, - width: values.width, - vdevsNumber: values.vdevsNumber, - treatDiskSizeAsMinimum: values.treatDiskSizeAsMinimum, - }); - } - - private updateLayoutOptions(): void { - const layoutOptions = vdevLayoutOptions.filter((option) => { - return this.inventory.length >= this.minDisks[option.value]; - }); - - const isValueNull = this.form.controls.layout.value === null; - if (!isValueNull && !layoutOptions.some((option) => option.value === this.form.controls.layout.value)) { - this.form.controls.layout.setValue(this.canChangeLayout ? null : this.limitLayouts[0], { emitEvent: false }); - } - this.store.getLayoutsForVdevType(this.type) - .pipe( - take(1), - untilDestroyed(this), - ) - .subscribe({ - next: (allowedVdevTypes) => { - this.vdevLayoutOptions$ = of(layoutOptions.filter( - (layout) => !!allowedVdevTypes.includes(layout.value), - )); - this.updateWidthOptions(); - }, + private listenForResetEvents(): void { + merge( + this.store.startOver$, + this.store.resetStep$.pipe(filter((vdevType) => vdevType === this.type)), + ) + .pipe(untilDestroyed(this)) + .subscribe(() => { + this.layoutControl.setValue(this.canChangeLayout ? null : this.limitLayouts[0]); }); } - private updateDiskSizeOptions(): void { - this.sizeDisksMap = getDiskTypeSizeMap(this.inventory); - - const hddOptions = Object.keys(this.sizeDisksMap[DiskType.Hdd]) - .map((size): SelectOption => ({ - label: `${filesize(Number(size), { standard: 'iec' })} (HDD)`, - value: [Number(size), DiskType.Hdd], - })); - - const ssdOptions = Object.keys(this.sizeDisksMap[DiskType.Ssd]) - .map((size): SelectOption => ({ - label: `${filesize(Number(size), { standard: 'iec' })} (SSD)`, - value: [Number(size), DiskType.Ssd], - })); - - const options = [...hddOptions, ...ssdOptions].sort((a, b) => a.value[0] - b.value[0]); - - this.diskSizeAndTypeOptions$ = of(options); - - if (options.length === 1 && this.isStepActive) { - this.form.controls.sizeAndType.setValue(options[0].value, { emitEvent: false }); - } - - this.updateLayoutOptions(); - } - - private getNumberOfSuitableDisks(): number { - if (!this.form.controls.treatDiskSizeAsMinimum.value) { - return this.sizeDisksMap[this.selectedDiskType][this.selectedDiskSize]?.length; - } - - return this.inventory.filter((disk) => disk.size >= this.selectedDiskSize).length; - } - - private updateWidthOptions(): void { - if (!this.selectedDiskType || !this.selectedDiskSize) { - return; - } - const length = this.getNumberOfSuitableDisks(); - const minRequired = this.minDisks[this.form.controls.layout.value]; - let widthOptions: Option[]; - - if (length && minRequired && length >= minRequired) { - widthOptions = _.range(minRequired, length + 1).map((item) => ({ - label: `${item}`, - value: item, - })); - } else { - widthOptions = []; - } - - this.widthOptions$ = of(widthOptions); - const isValueNull = this.form.controls.width.value === null; - - if (!isValueNull && !widthOptions.some((option) => option.value === this.form.controls.width.value)) { - this.form.controls.width.setValue(null, { emitEvent: false }); - } - - if (widthOptions.length === 1 && this.isStepActive) { - this.form.controls.width.setValue(+widthOptions[0].value, { emitEvent: false }); - } - - this.updateNumberOptions(); - } - - private updateNumberOptions(): void { - if (!this.selectedDiskType || !this.selectedDiskSize) { - return; - } - - const width = this.form.controls.width.value; - const length = this.getNumberOfSuitableDisks(); - let nextNumberOptions: SelectOption[] = []; - - if (width && length) { - const maxNumber = Math.floor(length / width); - nextNumberOptions = Array.from({ length: maxNumber }).map((value, index) => ({ - label: `${index + 1}`, - value: index + 1, - })); - } else { - nextNumberOptions = []; - } - - this.numberOptions$ = of(nextNumberOptions); - const isValueNull = this.form.controls.vdevsNumber.value === null; - - if (!isValueNull && !nextNumberOptions.some((option) => option.value === this.form.controls.vdevsNumber.value)) { - this.form.controls.vdevsNumber.setValue(null, { emitEvent: false }); - } - - if (nextNumberOptions.length === 1 && this.isStepActive) { - this.form.controls.vdevsNumber.setValue(+nextNumberOptions[0].value, { emitEvent: false }); + private updateLayoutOptionsFromLimitedLayouts(limitLayouts: CreateVdevLayout[]): void { + const allowedLayouts = vdevLayoutOptions.filter((option) => limitLayouts.includes(option.value)); + this.vdevLayoutOptions$ = of(allowedLayouts); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare + const cannotChangeLayout = this.canChangeLayout === false; + if (cannotChangeLayout && limitLayouts.length) { + setValueIfNotSame(this.layoutControl, limitLayouts[0]); } } } diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.html b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.html new file mode 100644 index 00000000000..59fbff9f536 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.html @@ -0,0 +1,15 @@ + + + + + diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.spec.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.spec.ts new file mode 100644 index 00000000000..8177996bcbe --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.spec.ts @@ -0,0 +1,143 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { ReactiveFormsModule } from '@angular/forms'; +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { Subject } from 'rxjs'; +import { GiB } from 'app/constants/bytes.constant'; +import { DiskType } from 'app/enums/disk-type.enum'; +import { VdevType } from 'app/enums/v-dev-type.enum'; +import { UnusedDisk } from 'app/interfaces/storage.interface'; +import { IxCheckboxHarness } from 'app/modules/ix-forms/components/ix-checkbox/ix-checkbox.harness'; +import { IxSelectHarness } from 'app/modules/ix-forms/components/ix-select/ix-select.harness'; +import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; +import { + DiskSizeSelectsComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component'; +import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; + +describe('DiskSizeSelectsComponent', () => { + let spectator: Spectator; + let loader: HarnessLoader; + let diskSizeSelect: IxSelectHarness; + let minimumCheckbox: IxCheckboxHarness; + const startOver$ = new Subject(); + const resetStep$ = new Subject(); + + const inventoryDisks = [ + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk1' }, + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk2' }, + { type: DiskType.Hdd, size: 20 * GiB, name: 'disk3' }, + { type: DiskType.Ssd, size: 20 * GiB, name: 'disk4' }, + ] as UnusedDisk[]; + + const createComponent = createComponentFactory({ + component: DiskSizeSelectsComponent, + imports: [ + IxFormsModule, + ReactiveFormsModule, + ], + providers: [ + mockProvider(PoolManagerStore, { + startOver$, + resetStep$, + }), + ], + }); + + beforeEach(async () => { + spectator = createComponent({ + props: { + type: VdevType.Spare, + inventory: inventoryDisks, + isStepActive: true, + }, + }); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + diskSizeSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Disk Size' })); + minimumCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'Treat Disk Size as Minimum' })); + + jest.spyOn(spectator.component.disksSelected, 'emit'); + }); + + describe('disk type and size', () => { + it('shows dropdown with disk types and sizes', async () => { + const options = await diskSizeSelect.getOptionLabels(); + expect(options).toEqual(['10 GiB (HDD)', '20 GiB (HDD)', '20 GiB (SSD)']); + }); + + it('updates value in store when disk type/size is selected', async () => { + await diskSizeSelect.setValue('20 GiB (HDD)'); + + expect(spectator.inject(PoolManagerStore).setTopologyCategoryDiskSizes).toHaveBeenCalledWith( + VdevType.Spare, + { + diskType: DiskType.Hdd, + diskSize: 20 * GiB, + treatDiskSizeAsMinimum: false, + }, + ); + }); + + it('emits (disksSelected) when dropdown is updated', async () => { + await diskSizeSelect.setValue('10 GiB (HDD)'); + + expect(spectator.component.disksSelected.emit).toHaveBeenLastCalledWith([ + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk1' }, + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk2' }, + ]); + }); + }); + + describe('treat disk size as minimum', () => { + it('shows Treat disk size as minimum checkbox', () => { + expect(minimumCheckbox).toBeTruthy(); + }); + + it('updates value in store when Treat as minimum is changed', async () => { + await diskSizeSelect.setValue('20 GiB (HDD)'); + await minimumCheckbox.setValue(true); + + expect(spectator.inject(PoolManagerStore).setTopologyCategoryDiskSizes).toHaveBeenLastCalledWith( + VdevType.Spare, + { + diskSize: 20 * GiB, + diskType: DiskType.Hdd, + treatDiskSizeAsMinimum: true, + }, + ); + }); + + it('emits (disksSelected) when checkbox is ticked', async () => { + await diskSizeSelect.setValue('10 GiB (HDD)'); + await minimumCheckbox.setValue(true); + + expect(spectator.component.disksSelected.emit).toHaveBeenCalledWith(inventoryDisks); + }); + }); + + it('selects disk size and type if there only one option available', async () => { + const singleDisk = { type: DiskType.Hdd, size: 10 * GiB, name: 'disk1' } as UnusedDisk; + spectator.setInput('inventory', [singleDisk]); + + expect(await diskSizeSelect.getValue()).toBe('10 GiB (HDD)'); + expect(spectator.inject(PoolManagerStore).setTopologyCategoryDiskSizes).toHaveBeenCalledWith( + VdevType.Spare, + { + diskType: DiskType.Hdd, + diskSize: 10 * GiB, + treatDiskSizeAsMinimum: false, + }, + ); + expect(spectator.component.disksSelected.emit).toHaveBeenCalledWith([singleDisk]); + }); + + it('resets to default values when store emits a reset event', async () => { + await diskSizeSelect.setValue('10 GiB (HDD)'); + await minimumCheckbox.setValue(true); + + startOver$.next(); + + expect(await diskSizeSelect.getValue()).toBe(''); + expect(await minimumCheckbox.getValue()).toBe(false); + }); +}); diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.ts new file mode 100644 index 00000000000..5d883edfb53 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component.ts @@ -0,0 +1,149 @@ +import { + ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, +} from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import filesize from 'filesize'; +import _, { isEqual } from 'lodash'; +import { merge, of } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import { DiskType } from 'app/enums/disk-type.enum'; +import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; +import { SelectOption } from 'app/interfaces/option.interface'; +import { IxSimpleChanges } from 'app/interfaces/simple-changes.interface'; +import { UnusedDisk } from 'app/interfaces/storage.interface'; +import { DiskTypeSizeMap } from 'app/pages/storage/modules/pool-manager/interfaces/disk-type-size-map.interface'; +import { SizeAndType } from 'app/pages/storage/modules/pool-manager/interfaces/size-and-type.interface'; +import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; +import { hasDeepChanges, setValueIfNotSame } from 'app/pages/storage/modules/pool-manager/utils/form.utils'; +import { getDiskTypeSizeMap } from 'app/pages/storage/modules/pool-manager/utils/get-disk-type-size-map.utils'; + +@UntilDestroy() +@Component({ + selector: 'ix-disk-size-dropdowns', + templateUrl: './disk-size-selects.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DiskSizeSelectsComponent implements OnChanges { + @Input({ required: true }) layout: CreateVdevLayout; + @Input({ required: true }) type: VdevType; + @Input({ required: true }) inventory: UnusedDisk[]; + @Input() isStepActive = false; + @Output() disksSelected = new EventEmitter(); + + protected diskSizeAndTypeOptions$ = of([]); + + protected sizeDisksMap: DiskTypeSizeMap = { [DiskType.Hdd]: {}, [DiskType.Ssd]: {} }; + protected compareSizeAndTypeWith = _.isEqual; + + protected form = this.formBuilder.group({ + sizeAndType: [[null, null] as SizeAndType, Validators.required], + treatDiskSizeAsMinimum: [{ value: false, disabled: true }], + }); + + constructor( + private formBuilder: FormBuilder, + private store: PoolManagerStore, + ) { + this.setControlRelations(); + this.updateStoreOnChanges(); + this.emitUpdatesOnChanges(); + this.listenForResetEvents(); + } + + get selectedDiskSize(): number { + return this.form.controls.sizeAndType.value?.[0]; + } + + get selectedDiskType(): DiskType { + return this.form.controls.sizeAndType.value?.[1]; + } + + ngOnChanges(changes: IxSimpleChanges): void { + if (hasDeepChanges(changes, 'inventory') || hasDeepChanges(changes, 'layout')) { + this.updateOptions(); + } + } + + private listenForResetEvents(): void { + merge( + this.store.startOver$, + this.store.resetStep$.pipe(filter((vdevType) => vdevType === this.type)), + ) + .pipe(untilDestroyed(this)) + .subscribe(() => { + this.form.setValue({ + sizeAndType: [null, null], + treatDiskSizeAsMinimum: false, + }); + }); + } + + private setControlRelations(): void { + this.form.controls.sizeAndType + .valueChanges + .pipe(filter(Boolean), untilDestroyed(this)) + .subscribe(() => { + this.form.controls.treatDiskSizeAsMinimum.enable(); + }); + } + + private updateStoreOnChanges(): void { + this.form.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + const values = this.form.value; + + this.store.setTopologyCategoryDiskSizes(this.type, { + diskSize: this.selectedDiskSize, + diskType: this.selectedDiskType, + treatDiskSizeAsMinimum: values.treatDiskSizeAsMinimum, + }); + }); + } + + private updateOptions(): void { + this.sizeDisksMap = getDiskTypeSizeMap(this.inventory); + + const hddOptions = Object.keys(this.sizeDisksMap[DiskType.Hdd]) + .map((size): SelectOption => ({ + label: `${filesize(Number(size), { standard: 'iec' })} (HDD)`, + value: [Number(size), DiskType.Hdd], + })); + + const ssdOptions = Object.keys(this.sizeDisksMap[DiskType.Ssd]) + .map((size): SelectOption => ({ + label: `${filesize(Number(size), { standard: 'iec' })} (SSD)`, + value: [Number(size), DiskType.Ssd], + })); + + const nextOptions = [...hddOptions, ...ssdOptions].sort((a, b) => a.value[0] - b.value[0]); + + this.diskSizeAndTypeOptions$ = of(nextOptions); + + if (!nextOptions.some((option) => isEqual(option.value, this.form.controls.sizeAndType.value))) { + setValueIfNotSame(this.form.controls.sizeAndType, [null, null]); + } + + if (nextOptions.length === 1 && this.isStepActive) { + setValueIfNotSame(this.form.controls.sizeAndType, nextOptions[0].value); + } + } + + private emitUpdatesOnChanges(): void { + this.form.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + const suitableDisks = this.getSuitableDisks(); + this.disksSelected.emit(suitableDisks); + }); + } + + private getSuitableDisks(): UnusedDisk[] { + if (!this.selectedDiskSize) { + return []; + } + + if (!this.form.controls.treatDiskSizeAsMinimum.value) { + return this.sizeDisksMap[this.selectedDiskType][this.selectedDiskSize]; + } + + return this.inventory.filter((disk) => disk.size >= this.selectedDiskSize); + } +} diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.html b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.html new file mode 100644 index 00000000000..fbf665a7fc5 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.html @@ -0,0 +1,50 @@ +
+

{{ 'Automated Disk Selection' | translate }}

+
+
+ + + + + +
+ +
+ + +
+ {{ helptext.dRaidChildrenExplanation | translate }} +
+ + +
+
+
diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.scss b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.scss new file mode 100644 index 00000000000..025244805b3 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.scss @@ -0,0 +1,25 @@ +.content-container { + border: 1px solid var(--lines); + margin: 20px 0; + padding: 20px 30px; +} + +.columns { + display: flex; + + .column { + border-right: 1px solid var(--lines); + flex: 1; + padding-right: 30px; + + &:last-of-type { + border-right-width: 0; + padding-left: 30px; + padding-right: 0; + } + } +} + +.explanation { + color: var(--fg2); +} diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.spec.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.spec.ts new file mode 100644 index 00000000000..d430bb98bbe --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.spec.ts @@ -0,0 +1,235 @@ +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { ReactiveFormsModule } from '@angular/forms'; +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { Subject } from 'rxjs'; +import { GiB } from 'app/constants/bytes.constant'; +import { DiskType } from 'app/enums/disk-type.enum'; +import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; +import { UnusedDisk } from 'app/interfaces/storage.interface'; +import { IxSelectHarness } from 'app/modules/ix-forms/components/ix-select/ix-select.harness'; +import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; +import { IxFormHarness } from 'app/modules/ix-forms/testing/ix-form.harness'; +import { + DiskSizeSelectsComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component'; +import { + DraidSelectionComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component'; +import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; + +describe('DraidSelectionComponent', () => { + let spectator: Spectator; + let form: IxFormHarness; + + const startOver$ = new Subject(); + const resetStep$ = new Subject(); + + const createComponent = createComponentFactory({ + component: DraidSelectionComponent, + imports: [ + ReactiveFormsModule, + IxFormsModule, + ], + declarations: [ + DiskSizeSelectsComponent, + ], + providers: [ + mockProvider(PoolManagerStore, { + startOver$, + resetStep$, + }), + ], + }); + + beforeEach(async () => { + spectator = createComponent({ + props: { + type: VdevType.Spare, + layout: CreateVdevLayout.Draid1, + inventory: [ + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk1' }, + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk2' }, + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk3' }, + { type: DiskType.Hdd, size: 10 * GiB, name: 'disk4' }, + { type: DiskType.Hdd, size: 20 * GiB, name: 'disk5' }, + { type: DiskType.Ssd, size: 20 * GiB, name: 'disk6' }, + { type: DiskType.Ssd, size: 30 * GiB, name: 'disk7' }, + { type: DiskType.Ssd, size: 30 * GiB, name: 'disk8' }, + ] as UnusedDisk[], + isStepActive: true, + }, + }); + form = await TestbedHarnessEnvironment.harnessForFixture(spectator.fixture, IxFormHarness); + }); + + it('keeps inputs disabled until disks are selected', async () => { + expect(await form.getDisabledState()).toEqual({ + 'Disk Size': false, + 'Treat Disk Size as Minimum': false, + Children: true, + 'Data Devices': true, + 'Distributed Hot Spares': true, + 'Number of VDEVs': true, + }); + + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + + expect(await form.getDisabledState()).toEqual({ + 'Disk Size': false, + 'Treat Disk Size as Minimum': false, + Children: false, + 'Data Devices': false, + 'Distributed Hot Spares': false, + 'Number of VDEVs': false, + }); + }); + + it('updates options in Data Devices dropdown when disks are selected', async () => { + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + + const dataDevices = await form.getControl('Data Devices') as IxSelectHarness; + expect(await dataDevices.getOptionLabels()).toEqual(['1', '2', '3']); + }); + + it('updates Spares and Children options when Data Devices are selected', async () => { + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + await form.fillForm({ + 'Data Devices': '2', + }); + + const spares = await form.getControl('Distributed Hot Spares') as IxSelectHarness; + expect(await spares.getOptionLabels()).toEqual(['0', '1']); + expect(await spares.getValue()).toBe('0'); + + const children = await form.getControl('Children') as IxSelectHarness; + expect(await children.getOptionLabels()).toEqual(['3', '4']); + }); + + it('updates Children when Spares are selected', async () => { + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + await form.fillForm({ + 'Data Devices': '2', + 'Distributed Hot Spares': '1', + }); + + const children = await form.getControl('Children') as IxSelectHarness; + expect(await children.getOptionLabels()).toEqual(['4']); + }); + + it('defaults Children to optimal number, but only once', async () => { + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + + await form.fillForm({ + 'Data Devices': '2', + }); + + const children = await form.getControl('Children') as IxSelectHarness; + expect(await children.getValue()).toBe('3'); + + await form.fillForm({ + 'Treat Disk Size as Minimum': true, + }); + expect(await children.getValue()).toBe('6'); + }); + + it('updates number of vdevs when Children are selected', async () => { + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + + await form.fillForm({ + 'Treat Disk Size as Minimum': true, + 'Data Devices': '2', + }); + + const vdevs = await form.getControl('Number of VDEVs') as IxSelectHarness; + expect(await vdevs.getOptionLabels()).toEqual(['1']); + + await form.fillForm({ + Children: '3', + }); + + expect(await vdevs.getOptionLabels()).toEqual(['1', '2']); + }); + + it('updates value in store when controls are updated', async () => { + await form.fillForm({ + 'Disk Size': '10 GiB (HDD)', + }); + + await form.fillForm({ + 'Treat Disk Size as Minimum': true, + 'Data Devices': '2', + 'Distributed Hot Spares': '1', + Children: '4', + 'Number of VDEVs': '2', + }); + + const store = spectator.inject(PoolManagerStore); + expect(store.setAutomaticTopologyCategory).toHaveBeenLastCalledWith( + VdevType.Spare, + { + draidDataDisks: 2, + draidSpareDisks: 1, + vdevsNumber: 2, + width: 4, + }, + ); + }); + + it('selects options in controls automatically when only one option is available', async () => { + await form.fillForm({ + 'Disk Size': '30 GiB (SSD)', + }); + + expect(await form.getValues()).toMatchObject({ + 'Data Devices': '1', + Children: '2', + 'Distributed Hot Spares': '0', + 'Number of VDEVs': '1', + }); + + const store = spectator.inject(PoolManagerStore); + expect(store.setAutomaticTopologyCategory).toHaveBeenLastCalledWith( + VdevType.Spare, + { + draidDataDisks: 1, + draidSpareDisks: 0, + vdevsNumber: 1, + width: 2, + }, + ); + }); + + it('resets to default values when store emits a reset event', async () => { + await form.fillForm({ + 'Disk Size': '30 GiB (SSD)', + }); + + expect(await form.getValues()).toMatchObject({ + 'Data Devices': '1', + Children: '2', + 'Distributed Hot Spares': '0', + 'Number of VDEVs': '1', + }); + + startOver$.next(); + + expect(await form.getValues()).toMatchObject({ + 'Data Devices': '', + Children: '', + 'Distributed Hot Spares': '', + 'Number of VDEVs': '', + }); + }); +}); diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.ts new file mode 100644 index 00000000000..dae8e47fa9b --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component.ts @@ -0,0 +1,260 @@ +import { + ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, +} from '@angular/core'; +import { FormBuilder } from '@angular/forms'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import _ from 'lodash'; +import { merge, of } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; +import { generateOptionsRange } from 'app/helpers/options.helper'; +import helptext from 'app/helptext/storage/volumes/manager/manager'; +import { Option, SelectOption } from 'app/interfaces/option.interface'; +import { IxSimpleChanges } from 'app/interfaces/simple-changes.interface'; +import { UnusedDisk } from 'app/interfaces/storage.interface'; +import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; +import { + hasDeepChanges, + setValueIfNotSame, + unsetControlIfNoMatchingOption, +} from 'app/pages/storage/modules/pool-manager/utils/form.utils'; + +const parityDisksPerGroup = { + [CreateVdevLayout.Draid1]: 1, + [CreateVdevLayout.Draid2]: 2, + [CreateVdevLayout.Draid3]: 3, +}; + +const maxDisksInDraidGroup = 255; + +@UntilDestroy() +@Component({ + selector: 'ix-draid-selection', + templateUrl: './draid-selection.component.html', + styleUrls: ['./draid-selection.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DraidSelectionComponent implements OnInit, OnChanges { + @Input() type: VdevType; + @Input() layout: CreateVdevLayout.Draid1 | CreateVdevLayout.Draid2 | CreateVdevLayout.Draid3; + @Input() inventory: UnusedDisk[]; + @Input() isStepActive: boolean; + + readonly defaultDataDevicesPerGroup = 8; + + form = this.formBuilder.group({ + children: [null as number], + dataDevicesPerGroup: [this.defaultDataDevicesPerGroup], + spares: [0], + + vdevsNumber: [1], + }); + + protected dataDevicesPerGroupOptions$ = of([]); + protected sparesOptions$ = of([]); + protected vdevsNumberOptions$ = of([]); + protected widthOptions$ = of([]); + + /** + * Total number of disks to work with. + */ + private selectedDisks: UnusedDisk[] = []; + + readonly helptext = helptext; + + constructor( + private formBuilder: FormBuilder, + private store: PoolManagerStore, + ) {} + + get parityDevices(): number { + return parityDisksPerGroup[this.layout]; + } + + ngOnInit(): void { + this.updateControlOptionsOnChanges(); + this.updateStoreOnChanges(); + this.listenForResetEvents(); + } + + ngOnChanges(changes: IxSimpleChanges): void { + if (hasDeepChanges(changes, 'layout') || hasDeepChanges(changes, 'inventory')) { + this.updateDataDevicesOptions(); + this.updateDisabledStatuses(); + } + } + + protected onDisksSelected(disks: UnusedDisk[]): void { + this.selectedDisks = disks; + this.updateDataDevicesOptions(); + this.updateChildrenOptions(); + this.updateDisabledStatuses(); + } + + private listenForResetEvents(): void { + merge( + this.store.startOver$, + this.store.resetStep$.pipe(filter((vdevType) => vdevType === this.type)), + ) + .pipe(untilDestroyed(this)) + .subscribe(() => { + this.form.setValue({ + children: null, + dataDevicesPerGroup: this.defaultDataDevicesPerGroup, + spares: 0, + vdevsNumber: 1, + }); + }); + } + + private updateDisabledStatuses(): void { + const fields = ['dataDevicesPerGroup', 'children', 'spares', 'vdevsNumber'] as const; + fields.forEach((field) => { + if (this.selectedDisks.length) { + this.form.controls[field].enable({ emitEvent: false }); + } else { + this.form.controls[field].disable({ emitEvent: false }); + } + }); + } + + private updateControlOptionsOnChanges(): void { + this.form.controls.dataDevicesPerGroup.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + this.updateSparesOptions(); + }); + + this.form.controls.spares.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + this.updateChildrenOptions(); + }); + + this.form.controls.children.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + this.updateVdevsNumberOptions(); + }); + } + + private updateStoreOnChanges(): void { + this.form.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + const values = this.form.value; + + this.store.setAutomaticTopologyCategory(this.type, { + width: values.children, + draidDataDisks: values.dataDevicesPerGroup, + draidSpareDisks: values.spares, + vdevsNumber: values.vdevsNumber, + }); + }); + } + + private updateDataDevicesOptions(): void { + const maxPossibleGroups = this.selectedDisks.length - this.parityDevices; + let nextOptions: Option[] = []; + if (maxPossibleGroups) { + nextOptions = generateOptionsRange(1, maxPossibleGroups); + } + + unsetControlIfNoMatchingOption(this.form.controls.dataDevicesPerGroup, nextOptions); + + if (nextOptions.length === 1 && this.isStepActive) { + setValueIfNotSame( + this.form.controls.dataDevicesPerGroup, + Number(nextOptions[0].value), + ); + } + + this.dataDevicesPerGroupOptions$ = of(nextOptions); + this.updateSparesOptions(); + } + + private updateSparesOptions(): void { + const dataDevices = this.form.controls.dataDevicesPerGroup.value; + const maxPossibleSpares = this.selectedDisks.length - dataDevices - this.parityDevices; + let nextOptions: Option[] = []; + if (maxPossibleSpares >= 0) { + nextOptions = generateOptionsRange(0, maxPossibleSpares); + } + + if (!nextOptions.some((option) => option.value === this.form.controls.spares.value)) { + setValueIfNotSame( + this.form.controls.spares, + 0, + ); + } + + this.sparesOptions$ = of(nextOptions); + + this.updateChildrenOptions(); + } + + private updateChildrenOptions(): void { + const maxPossibleWidth = this.selectedDisks.length; + const dataDevices = this.form.controls.dataDevicesPerGroup.value; + const hotSpares = this.form.controls.spares.value; + const groupSize = Math.min(dataDevices + this.parityDevices, maxDisksInDraidGroup); + const maxGroups = Math.floor((maxPossibleWidth - hotSpares) / groupSize); + const optimalMaximum = maxGroups * groupSize + hotSpares; + + let nextOptions: Option[] = []; + if ((groupSize + hotSpares) <= maxPossibleWidth && dataDevices) { + nextOptions = _.range(1, maxGroups + 1).map((i) => { + const disks = i * groupSize + hotSpares; + return { + label: String(disks), + value: disks, + }; + }); + + if (maxPossibleWidth > optimalMaximum) { + nextOptions.push({ + label: String(maxPossibleWidth), + value: maxPossibleWidth, + }); + } + } + + unsetControlIfNoMatchingOption(this.form.controls.children, nextOptions); + + if (this.isStepActive) { + const hasOptimalOption = nextOptions.some((option) => option.value === optimalMaximum); + if (nextOptions.length === 1) { + // If there is one option, pick it. + setValueIfNotSame( + this.form.controls.children, + Number(nextOptions[0].value), + ); + } else if (hasOptimalOption) { + // Or try to default to normal maximum number of groups and spares. + setValueIfNotSame( + this.form.controls.children, + optimalMaximum, + ); + } + } + + this.widthOptions$ = of(nextOptions); + this.updateVdevsNumberOptions(); + } + + private updateVdevsNumberOptions(): void { + const width = this.form.controls.children.value; + let maxPossibleVdevs = 0; + if (width > 0) { + maxPossibleVdevs = Math.floor(this.selectedDisks.length / width); + } + + let nextOptions: Option[] = []; + if (maxPossibleVdevs > 0) { + nextOptions = generateOptionsRange(1, maxPossibleVdevs); + } + + unsetControlIfNoMatchingOption(this.form.controls.vdevsNumber, nextOptions); + + if (nextOptions.length === 1 && this.isStepActive) { + setValueIfNotSame( + this.form.controls.vdevsNumber, + Number(nextOptions[0].value), + ); + } + + this.vdevsNumberOptions$ = of(nextOptions); + } +} diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.html b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.html new file mode 100644 index 00000000000..72540dc4cfc --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.html @@ -0,0 +1,43 @@ +
+
+

{{ 'Automated Disk Selection' | translate }}

+ + + + + +
+
+

{{ 'Advanced Options' | translate }}

+ +

{{ 'Manual disk selection allows you to create VDEVs and add disks to those VDEVs individually.' | translate }}

+ + +
+
diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.scss b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.scss new file mode 100644 index 00000000000..8b7df160356 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.scss @@ -0,0 +1,21 @@ +.content-container { + border: 1px solid var(--lines); + display: flex; + margin: 20px 0; + padding: 20px 0; + + .automated-disk-selection-container { + border-right: 1px solid var(--lines); + padding: 0 30px; + width: 100%; + } + + .advanced-options-container { + padding: 0 30px; + width: 100%; + } +} + +.manual-disk-selection { + margin-top: 25px; +} diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.spec.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.spec.ts new file mode 100644 index 00000000000..620695a52c9 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.spec.ts @@ -0,0 +1,250 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { ReactiveFormsModule } from '@angular/forms'; +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { of, Subject } from 'rxjs'; +import { TiB } from 'app/constants/bytes.constant'; +import { DiskType } from 'app/enums/disk-type.enum'; +import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; +import { UnusedDisk } from 'app/interfaces/storage.interface'; +import { IxSelectHarness } from 'app/modules/ix-forms/components/ix-select/ix-select.harness'; +import { IxFormsModule } from 'app/modules/ix-forms/ix-forms.module'; +import { + DiskSizeSelectsComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component'; +import { + NormalSelectionComponent, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component'; +import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; + +describe('NormalSelectionComponent', () => { + let spectator: Spectator; + let loader: HarnessLoader; + + let widthSelect: IxSelectHarness; + let vdevsSelect: IxSelectHarness; + let sizeSelect: IxSelectHarness; + + const unusedDisks: UnusedDisk[] = [ + { + devname: 'sdo', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdr', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdq', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdw', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdt', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdu', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdh', + size: 12 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdg', + size: 14 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdj', + size: 14 * TiB, + type: DiskType.Hdd, + }, + { + devname: 'sdk', + size: TiB, + type: DiskType.Hdd, + }, + ] as UnusedDisk[]; + const startOver$ = new Subject(); + const resetStep$ = new Subject(); + + const createComponent = createComponentFactory({ + component: NormalSelectionComponent, + imports: [ + ReactiveFormsModule, + IxFormsModule, + ], + declarations: [ + DiskSizeSelectsComponent, + ], + providers: [ + mockProvider(PoolManagerStore, { + getLayoutsForVdevType: jest.fn((vdevType: VdevType) => { + switch (vdevType) { + case VdevType.Cache: + return of([CreateVdevLayout.Stripe]); + case VdevType.Dedup: + return of([CreateVdevLayout.Mirror]); + case VdevType.Log: + return of([CreateVdevLayout.Mirror, CreateVdevLayout.Stripe]); + case VdevType.Spare: + return of([CreateVdevLayout.Stripe]); + case VdevType.Special: + return of([CreateVdevLayout.Mirror]); + default: + return of([...Object.values(CreateVdevLayout)]); + } + }), + startOver$, + resetStep$, + }), + ], + }); + + beforeEach(async () => { + spectator = createComponent({ + props: { + layout: CreateVdevLayout.Stripe, + type: VdevType.Data, + inventory: [...unusedDisks], + }, + }); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + + widthSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Width' })); + vdevsSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Number of VDEVs' })); + sizeSelect = await loader.getHarness(IxSelectHarness.with({ label: 'Disk Size' })); + }); + + it('updates width and vdev options when layout is mirror', async () => { + spectator.setInput('layout', CreateVdevLayout.Mirror); + await sizeSelect.setValue('12 TiB (HDD)'); + + expect(await widthSelect.getOptionLabels()) + .toStrictEqual(['2', '3', '4', '5', '6', '7']); + + await widthSelect.setValue('2'); + + expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1', '2', '3']); + }); + + it('updates width and vdev options when layout changes to Raidz1', async () => { + spectator.setInput('layout', CreateVdevLayout.Raidz1); + await sizeSelect.setValue('12 TiB (HDD)'); + + expect(await widthSelect.getOptionLabels()) + .toStrictEqual(['3', '4', '5', '6', '7']); + + await widthSelect.setValue('3'); + + expect(await vdevsSelect.getOptionLabels()) + .toStrictEqual(['1', '2']); + }); + + it('updates width and vdev options when layout changes to Raidz2', async () => { + spectator.setInput('layout', CreateVdevLayout.Raidz2); + await sizeSelect.setValue('12 TiB (HDD)'); + + expect(await widthSelect.getOptionLabels()) + .toStrictEqual(['4', '5', '6', '7']); + + await widthSelect.setValue('4'); + + expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1']); + }); + + it('updates width and vdev options when layout changes to Raidz3', async () => { + spectator.setInput('layout', CreateVdevLayout.Raidz3); + await sizeSelect.setValue('12 TiB (HDD)'); + + expect(await widthSelect.getOptionLabels()) + .toStrictEqual(['5', '6', '7']); + + await widthSelect.setValue('5'); + + expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1']); + }); + + it('updates width and vdev options when layout changes to Stripe', async () => { + spectator.setInput('layout', CreateVdevLayout.Stripe); + await sizeSelect.setValue('12 TiB (HDD)'); + + expect(await widthSelect.getOptionLabels()) + .toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); + + await widthSelect.setValue('1'); + + expect(await vdevsSelect.getOptionLabels()) + .toStrictEqual(['1', '2', '3', '4', '5', '6', '7']); + }); + + it('auto fills select when only one value is available', async () => { + spectator.setInput('isStepActive', true); + spectator.setInput('layout', CreateVdevLayout.Stripe); + await sizeSelect.setValue('1 TiB (HDD)'); + + expect(await widthSelect.getOptionLabels()).toStrictEqual(['1']); + + const widthValue = await widthSelect.getValue(); + expect(widthValue).toBe('1'); + + expect(await vdevsSelect.getOptionLabels()).toStrictEqual(['1']); + + const vdevsValue = await widthSelect.getValue(); + expect(vdevsValue).toBe('1'); + }); + + it('saves the topology layout on form updates', async () => { + const poolManagerStore = spectator.inject(PoolManagerStore); + + spectator.setInput('layout', CreateVdevLayout.Mirror); + await sizeSelect.setValue('12 TiB (HDD)'); + + await widthSelect.setValue('2'); + expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, { + width: 2, + vdevsNumber: null, + }); + + await vdevsSelect.setValue('2'); + expect(poolManagerStore.setAutomaticTopologyCategory).toHaveBeenLastCalledWith(VdevType.Data, { + width: 2, + vdevsNumber: 2, + }); + }); + + it('disables dependent fields until they are valid', async () => { + expect(await widthSelect.isDisabled()).toBeTruthy(); + expect(await vdevsSelect.isDisabled()).toBeTruthy(); + spectator.setInput('layout', CreateVdevLayout.Mirror); + expect(await vdevsSelect.isDisabled()).toBeTruthy(); + expect(await widthSelect.isDisabled()).toBeTruthy(); + await sizeSelect.setValue('12 TiB (HDD)'); + expect(await widthSelect.isDisabled()).toBeFalsy(); + expect(await vdevsSelect.isDisabled()).toBeFalsy(); + }); + + it('resets to default values when store emits a reset event', async () => { + spectator.setInput('layout', CreateVdevLayout.Mirror); + await sizeSelect.setValue('12 TiB (HDD)'); + await widthSelect.setValue('2'); + await vdevsSelect.setValue('2'); + + startOver$.next(); + + expect(await widthSelect.getValue()).toBe(''); + expect(await vdevsSelect.getValue()).toBe(''); + }); +}); diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.ts new file mode 100644 index 00000000000..431fcb6c716 --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component.ts @@ -0,0 +1,165 @@ +import { + ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, +} from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { merge, of } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; +import { generateOptionsRange } from 'app/helpers/options.helper'; +import { Option, SelectOption } from 'app/interfaces/option.interface'; +import { IxSimpleChanges } from 'app/interfaces/simple-changes.interface'; +import { UnusedDisk } from 'app/interfaces/storage.interface'; +import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; +import { + hasDeepChanges, + setValueIfNotSame, + unsetControlIfNoMatchingOption, +} from 'app/pages/storage/modules/pool-manager/utils/form.utils'; +import { minDisksPerLayout } from 'app/pages/storage/modules/pool-manager/utils/min-disks-per-layout.constant'; + +@UntilDestroy() +@Component({ + selector: 'ix-normal-selection', + templateUrl: './normal-selection.component.html', + styleUrls: ['./normal-selection.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class NormalSelectionComponent implements OnInit, OnChanges { + @Input() type: VdevType; + @Input() layout: CreateVdevLayout; + @Input() isStepActive: boolean; + @Input() inventory: UnusedDisk[]; + + // TODO: Consider moving to a service. + @Output() manualSelectionClicked = new EventEmitter(); + + form = this.formBuilder.group({ + width: [{ value: null as number, disabled: true }, Validators.required], + vdevsNumber: [{ value: null as number, disabled: true }, Validators.required], + }); + + protected widthOptions$ = of([]); + protected numberOptions$ = of([]); + + private selectedDisks: UnusedDisk[] = []; + + constructor( + private formBuilder: FormBuilder, + private store: PoolManagerStore, + ) {} + + openManualDiskSelection(): void { + this.manualSelectionClicked.emit(); + } + + ngOnInit(): void { + this.updateControlOptionsOnChanges(); + this.updateStoreOnChanges(); + this.listenForResetEvents(); + } + + ngOnChanges(changes: IxSimpleChanges): void { + if (hasDeepChanges(changes, 'inventory') || hasDeepChanges(changes, 'layout')) { + this.updateWidthOptions(); + } + } + + get isSpareVdev(): boolean { + return this.type === VdevType.Spare; + } + + protected onDisksSelected(disks: UnusedDisk[]): void { + this.selectedDisks = disks; + this.updateWidthOptions(); + this.updateDisabledStatuses(); + } + + private listenForResetEvents(): void { + merge( + this.store.startOver$, + this.store.resetStep$.pipe(filter((vdevType) => vdevType === this.type)), + ) + .pipe(untilDestroyed(this)) + .subscribe(() => { + this.form.setValue({ + width: null, + vdevsNumber: null, + }); + }); + } + + private updateDisabledStatuses(): void { + const fields = ['width', 'vdevsNumber'] as const; + fields.forEach((field) => { + if (this.selectedDisks.length) { + this.form.controls[field].enable({ emitEvent: false }); + } else { + this.form.controls[field].disable({ emitEvent: false }); + } + }); + } + + private updateControlOptionsOnChanges(): void { + this.form.controls.width.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + this.updateNumberOptions(); + }); + } + + private updateStoreOnChanges(): void { + this.form.valueChanges.pipe(untilDestroyed(this)).subscribe(() => { + const values = this.form.value; + + this.store.setAutomaticTopologyCategory(this.type, { + width: values.width, + vdevsNumber: this.isSpareVdev ? 1 : values.vdevsNumber, + }); + }); + } + + private updateWidthOptions(): void { + const availableDisks = this.selectedDisks.length; + if (!availableDisks) { + return; + } + const minRequired = minDisksPerLayout[this.layout]; + let nextOptions: Option[] = []; + + if (availableDisks && minRequired && availableDisks >= minRequired) { + nextOptions = generateOptionsRange(minRequired, availableDisks); + } + + this.widthOptions$ = of(nextOptions); + + unsetControlIfNoMatchingOption(this.form.controls.width, nextOptions); + + if (nextOptions.length === 1 && this.isStepActive) { + setValueIfNotSame(this.form.controls.width, Number(nextOptions[0].value)); + } + + this.updateNumberOptions(); + } + + private updateNumberOptions(): void { + const availableDisks = this.selectedDisks.length; + if (!availableDisks) { + return; + } + + const width = this.form.controls.width.value; + let nextOptions: Option[] = []; + + if (width) { + const maxNumber = Math.floor(availableDisks / width); + nextOptions = generateOptionsRange(1, maxNumber); + } + + this.numberOptions$ = of(nextOptions); + + unsetControlIfNoMatchingOption(this.form.controls.vdevsNumber, nextOptions); + + if (nextOptions.length === 1 && this.isStepActive) { + setValueIfNotSame(this.form.controls.vdevsNumber, Number(nextOptions[0].value)); + } + } +} diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/layout-step.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/layout-step.component.ts index 3ff3ad5fb7c..eef74e5d180 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/layout-step.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/layout-step.component.ts @@ -33,7 +33,6 @@ export class LayoutStepComponent implements OnInit { @Input() canChangeLayout = false; @Input() limitLayouts: CreateVdevLayout[]; - // TODO: Limit to certain disks for certain vdev types. @Input() inventory: UnusedDisk[]; protected topologyCategory: PoolManagerTopologyCategory; diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.html b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.html index 1db542123bf..46b57be49bb 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.html +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.html @@ -99,6 +99,7 @@ storeLoading || secondaryLoading), ); + usesDraidLayout$ = this.store.usesDraidLayout$; activeStep: PoolCreationWizardStep; hasEnclosureStep = false; @@ -60,6 +61,10 @@ export class PoolManagerWizardComponent implements OnInit, OnDestroy { return Boolean(this.state.encryption); } + get alreadyHasSpare(): boolean { + return Boolean(this.existingPool?.topology?.spare?.length); + } + constructor( private store: PoolManagerStore, private systemStore$: Store, diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/3-data-wizard-step/data-wizard-step.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/3-data-wizard-step/data-wizard-step.component.ts index c6d70a91e42..563d3e9cf4a 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/3-data-wizard-step/data-wizard-step.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/3-data-wizard-step/data-wizard-step.component.ts @@ -1,13 +1,21 @@ import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnInit, + Output, } from '@angular/core'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { map } from 'rxjs'; import { CreateVdevLayout, TopologyItemType, VdevType } from 'app/enums/v-dev-type.enum'; import helptext from 'app/helptext/storage/volumes/manager/manager'; -import { PoolTopology } from 'app/interfaces/pool.interface'; -import { AddVdevsStore } from 'app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service'; +import { + AddVdevsStore, +} from 'app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service'; import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; +import { parseDraidVdevName } from 'app/pages/storage/modules/pool-manager/utils/topology.utils'; @UntilDestroy() @Component({ @@ -26,8 +34,6 @@ export class DataWizardStepComponent implements OnInit { readonly helptext = helptext; canChangeLayout = true; - existingDataTopology: PoolTopology; - constructor( private store: PoolManagerStore, private addVdevsStore: AddVdevsStore, @@ -42,9 +48,13 @@ export class DataWizardStepComponent implements OnInit { if (!dataTopology?.length) { return; } + // TODO: Similar code in poolTopologyToStoreTopology let type = dataTopology[0].type; if (type === TopologyItemType.Disk && !dataTopology[0].children.length) { type = TopologyItemType.Stripe; + } else if (type === TopologyItemType.Draid) { + const parsedVdevName = parseDraidVdevName(dataTopology[0].name); + type = parsedVdevName.layout as unknown as TopologyItemType; } this.allowedLayouts = [type] as unknown as CreateVdevLayout[]; this.canChangeLayout = false; diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager/pool-manager.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager/pool-manager.component.ts index f2cc31336ea..19f11286711 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager/pool-manager.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager/pool-manager.component.ts @@ -26,6 +26,7 @@ export class PoolManagerComponent implements OnInit { ngOnInit(): void { this.addVdevsStore.pool$.pipe( tap((pool) => { + // TODO: Figure out why cloning is here and remove. this.existingPool = _.cloneDeep(pool); }), untilDestroyed(this), diff --git a/src/app/pages/storage/modules/pool-manager/pool-manager.module.ts b/src/app/pages/storage/modules/pool-manager/pool-manager.module.ts index 11ec2742b67..9ee0662943f 100644 --- a/src/app/pages/storage/modules/pool-manager/pool-manager.module.ts +++ b/src/app/pages/storage/modules/pool-manager/pool-manager.module.ts @@ -38,6 +38,7 @@ import { ManualDiskDragToggleStore } from 'app/pages/storage/modules/pool-manage import { ManualDiskSelectionStore } from 'app/pages/storage/modules/pool-manager/components/manual-disk-selection/store/manual-disk-selection.store'; import { NewDevicesPreviewComponent } from 'app/pages/storage/modules/pool-manager/components/new-devices/new-devices-preview.component'; import { PoolManagerComponent } from 'app/pages/storage/modules/pool-manager/components/pool-manager/pool-manager.component'; +import { DiskSizeSelectsComponent } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/layout-step/automated-disk-selection/disk-size-selects/disk-size-selects.component'; import { PoolManagerWizardComponent } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component'; import { GeneralWizardStepComponent } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/1-general-wizard-step/general-wizard-step.component'; import { LogWizardStepComponent } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/4-log-wizard-step/log-wizard-step.component'; @@ -58,6 +59,8 @@ import { InspectVdevsDialogComponent } from './components/inspect-vdevs-dialog/i import { ManualSelectionDiskFiltersComponent } from './components/manual-disk-selection/components/manual-selection-disks/manual-selection-disk-filters/manual-selection-disk-filters.component'; import { ManualSelectionDisksComponent } from './components/manual-disk-selection/components/manual-selection-disks/manual-selection-disks.component'; import { AutomatedDiskSelectionComponent } from './components/pool-manager-wizard/components/layout-step/automated-disk-selection/automated-disk-selection.component'; +import { DraidSelectionComponent } from './components/pool-manager-wizard/components/layout-step/automated-disk-selection/draid-selection/draid-selection.component'; +import { NormalSelectionComponent } from './components/pool-manager-wizard/components/layout-step/automated-disk-selection/normal-selection/normal-selection.component'; import { CustomLayoutAppliedComponent } from './components/pool-manager-wizard/components/layout-step/custom-layout-applied/custom-layout-applied.component'; import { LayoutStepComponent } from './components/pool-manager-wizard/components/layout-step/layout-step.component'; import { PoolWarningsComponent } from './components/pool-manager-wizard/components/pool-warnings/pool-warnings.component'; @@ -124,6 +127,9 @@ import { DataWizardStepComponent } from './components/pool-manager-wizard/steps/ DownloadKeyDialogComponent, InspectVdevsDialogComponent, TopologyCategoryDescriptionPipe, + DiskSizeSelectsComponent, + DraidSelectionComponent, + NormalSelectionComponent, ], providers: [ PoolManagerStore, diff --git a/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.spec.ts b/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.spec.ts index e46d67e7af7..91be16d1196 100644 --- a/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.spec.ts +++ b/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.spec.ts @@ -1,14 +1,25 @@ import { createServiceFactory, mockProvider, SpectatorService } from '@ngneat/spectator/jest'; import { provideMockStore } from '@ngrx/store/testing'; -import { of } from 'rxjs'; +import { firstValueFrom, of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { getTestScheduler } from 'app/core/testing/utils/get-test-scheduler.utils'; -import { VdevType } from 'app/enums/v-dev-type.enum'; +import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; import { Pool } from 'app/interfaces/pool.interface'; -import { AddVdevsStore } from 'app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service'; -import { DispersalStrategy } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/2-enclosure-wizard-step/enclosure-wizard-step.component'; -import { PoolManagerValidationService } from 'app/pages/storage/modules/pool-manager/store/pool-manager-validation.service'; -import { PoolManagerStore } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; +import { + AddVdevsStore, +} from 'app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service'; +import { + DispersalStrategy, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/2-enclosure-wizard-step/enclosure-wizard-step.component'; +import { PoolCreationSeverity } from 'app/pages/storage/modules/pool-manager/enums/pool-creation-severity'; +import { PoolCreationWizardStep } from 'app/pages/storage/modules/pool-manager/enums/pool-creation-wizard-step.enum'; +import { + PoolManagerValidationService, +} from 'app/pages/storage/modules/pool-manager/store/pool-manager-validation.service'; +import { + PoolManagerStore, + PoolManagerTopologyCategory, +} from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; import { selectSystemFeatures } from 'app/store/system-info/system-info.selectors'; describe('PoolManagerValidationService', () => { @@ -399,4 +410,82 @@ describe('PoolManagerValidationService', () => { }); }); }); + + describe('dRAID validation', () => { + let spectator: SpectatorService; + + const mockName$ = of('Pool'); + const mockTopology$ = of({ + [VdevType.Data]: { + hasCustomDiskSelection: false, + layout: CreateVdevLayout.Draid1, + vdevs: [[{}]], + draidDataDisks: 1, + draidSpareDisks: 0, + width: 9, + } as PoolManagerTopologyCategory, + }); + const mockEnclosureSettings$ = of({ + limitToSingleEnclosure: null, + dispersalStrategy: DispersalStrategy.None, + }); + const mockHasMultipleEnclosuresAfterFirstStep$ = of(true); + + const createService = createServiceFactory({ + service: PoolManagerValidationService, + providers: [ + mockProvider(PoolManagerStore, { + name$: mockName$, + enclosureSettings$: mockEnclosureSettings$, + topology$: mockTopology$, + hasMultipleEnclosuresAfterFirstStep$: mockHasMultipleEnclosuresAfterFirstStep$, + }), + mockProvider(AddVdevsStore, { + pool$: of(null), + }), + provideMockStore({ + selectors: [ + { + selector: selectSystemFeatures, + value: { + enclosure: true, + }, + }, + ], + }), + ], + }); + + beforeEach(() => { + spectator = createService(); + }); + + // TODO: Spit apart and add more boundary checks. + it('adds a warning when dRAID data disk is not a power of two', async () => { + const errors = await firstValueFrom(spectator.service.getPoolCreationErrors()); + expect(errors).toContainEqual({ + text: 'Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).', + severity: PoolCreationSeverity.Warning, + step: PoolCreationWizardStep.Data, + }); + }); + + it('adds a warning when dRAID children is less than 10', async () => { + const errors = await firstValueFrom(spectator.service.getPoolCreationErrors()); + expect(errors).toContainEqual({ + text: 'In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.', + severity: PoolCreationSeverity.Warning, + step: PoolCreationWizardStep.Data, + }); + }); + + it('adds a warning when dRAID does not have spares added', async () => { + const errors = await firstValueFrom(spectator.service.getPoolCreationErrors()); + expect(errors).toContainEqual({ + text: 'At least one spare is recommended for dRAID. Spares cannot be added later.', + severity: PoolCreationSeverity.Warning, + step: PoolCreationWizardStep.Data, + }); + }); + }); }); diff --git a/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.ts b/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.ts index 0ed5e16ca54..9ff17fc5503 100644 --- a/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.ts +++ b/src/app/pages/storage/modules/pool-manager/store/pool-manager-validation.service.ts @@ -2,19 +2,28 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; import _ from 'lodash'; -import { - Observable, combineLatest, map, -} from 'rxjs'; +import { combineLatest, map, Observable } from 'rxjs'; import { CreateVdevLayout, TopologyItemType, VdevType } from 'app/enums/v-dev-type.enum'; import helptext from 'app/helptext/storage/volumes/manager/manager'; -import { AddVdevsStore } from 'app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service'; -import { getNonUniqueSerialDisksWarning } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/pool-warnings/get-non-unique-serial-disks'; -import { DispersalStrategy } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/2-enclosure-wizard-step/enclosure-wizard-step.component'; +import { + AddVdevsStore, +} from 'app/pages/storage/modules/pool-manager/components/add-vdevs/store/add-vdevs-store.service'; +import { + getNonUniqueSerialDisksWarning, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/components/pool-warnings/get-non-unique-serial-disks'; +import { + DispersalStrategy, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/2-enclosure-wizard-step/enclosure-wizard-step.component'; import { PoolCreationSeverity } from 'app/pages/storage/modules/pool-manager/enums/pool-creation-severity'; import { PoolCreationWizardStep } from 'app/pages/storage/modules/pool-manager/enums/pool-creation-wizard-step.enum'; import { PoolCreationError } from 'app/pages/storage/modules/pool-manager/interfaces/pool-creation-error'; -import { PoolManagerStore, PoolManagerTopology, PoolManagerTopologyCategory } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; +import { + PoolManagerStore, + PoolManagerTopology, + PoolManagerTopologyCategory, +} from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; import { hasExportedPool, hasNonUniqueSerial } from 'app/pages/storage/modules/pool-manager/utils/disk.utils'; +import { isDraidLayout } from 'app/pages/storage/modules/pool-manager/utils/topology.utils'; import { AppState } from 'app/store'; import { waitForSystemFeatures } from 'app/store/system-info/system-info.selectors'; @@ -72,7 +81,12 @@ export class PoolManagerValidationService { oldDataLayoutType = TopologyItemType.Stripe; } - if (hasDataVdevs && topology[VdevType.Data].layout !== oldDataLayoutType as unknown as CreateVdevLayout) { + // TODO: How is this even possible? + if ( + hasDataVdevs + && topology[VdevType.Data].layout !== oldDataLayoutType as unknown as CreateVdevLayout + && !isDraidLayout(oldDataLayoutType) + ) { errors.push({ text: this.translate.instant( 'Mixing Vdev layout types is not allowed. This pool already has some {type} Data Vdevs. You can only add vdevs of {type} type.', @@ -100,23 +114,27 @@ export class PoolManagerValidationService { const nonEmptyTopologyCategories = this.filterNonEmptyCategories(topology); - nonEmptyTopologyCategories.forEach(([typologyCategoryType, typologyCategory]) => { + nonEmptyTopologyCategories.forEach(([topologyCategoryType, topologyCategory]) => { if (existingPool) { return; } + if (topologyCategoryType === VdevType.Data && isDraidLayout(topologyCategory.layout)) { + errors.push(...this.validateDraid(topologyCategory)); + } + if ( - [VdevType.Dedup, VdevType.Log, VdevType.Special, VdevType.Data].includes(typologyCategoryType) - && typologyCategory.vdevs.length >= 1 && typologyCategory.layout === CreateVdevLayout.Stripe + [VdevType.Dedup, VdevType.Log, VdevType.Special, VdevType.Data].includes(topologyCategoryType) + && topologyCategory.vdevs.length >= 1 && topologyCategory.layout === CreateVdevLayout.Stripe ) { - if (typologyCategoryType === VdevType.Log) { + if (topologyCategoryType === VdevType.Log) { errors.push({ text: this.translate.instant('A stripe log VDEV may result in data loss if it fails combined with a power outage.'), severity: PoolCreationSeverity.Warning, step: PoolCreationWizardStep.Log, }); } else { - const vdevType = typologyCategoryType === 'special' ? 'metadata' : typologyCategoryType; + const vdevType = topologyCategoryType === 'special' ? 'metadata' : topologyCategoryType; errors.push({ text: this.translate.instant('A stripe {vdevType} VDEV is highly discouraged and will result in data loss if it fails', { vdevType }), @@ -126,7 +144,7 @@ export class PoolManagerValidationService { } } - const nonUniqueSerialDisks = typologyCategory.vdevs.flat().filter(hasNonUniqueSerial); + const nonUniqueSerialDisks = topologyCategory.vdevs.flat().filter(hasNonUniqueSerial); if (nonUniqueSerialDisks?.length) { errors.push({ @@ -136,7 +154,7 @@ export class PoolManagerValidationService { }); } - const disksWithExportedPools = typologyCategory.vdevs.flat().filter(hasExportedPool); + const disksWithExportedPools = topologyCategory.vdevs.flat().filter(hasExportedPool); if (disksWithExportedPools?.length) { errors.push({ @@ -205,4 +223,34 @@ export class PoolManagerValidationService { return acc; }, [] as [VdevType, PoolManagerTopologyCategory][]); } + + private validateDraid(topologyCategory: PoolManagerTopologyCategory): PoolCreationError[] { + const errors: PoolCreationError[] = []; + const powerOfTwo = Math.log2(topologyCategory.draidDataDisks); + if (powerOfTwo < 1 || !Number.isInteger(powerOfTwo)) { + errors.push({ + text: this.translate.instant('Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).'), + severity: PoolCreationSeverity.Warning, + step: PoolCreationWizardStep.Data, + }); + } + + if (topologyCategory.width < 10) { + errors.push({ + text: this.translate.instant('In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.'), + severity: PoolCreationSeverity.Warning, + step: PoolCreationWizardStep.Data, + }); + } + + if (!topologyCategory.draidSpareDisks) { + errors.push({ + text: this.translate.instant('At least one spare is recommended for dRAID. Spares cannot be added later.'), + severity: PoolCreationSeverity.Warning, + step: PoolCreationWizardStep.Data, + }); + } + + return errors; + } } diff --git a/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.spec.ts b/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.spec.ts index 41c15729e5f..8072897f612 100644 --- a/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.spec.ts +++ b/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.spec.ts @@ -32,7 +32,7 @@ describe('PoolManagerStore', () => { type: DiskType.Ssd, enclosure: { number: 1, - slot: 1, + slot: 2, }, }, { @@ -98,9 +98,9 @@ describe('PoolManagerStore', () => { spectator.service.setManualTopologyCategory(VdevType.Data, [[disks[0]]]); const inventory = await firstValueFrom(spectator.service.getInventoryForStep(VdevType.Data)); - expect(inventory).toHaveLength(3); + expect(inventory).toHaveLength(2); const diskNames = inventory.map((disk) => disk.devname).sort(); - expect(diskNames).toEqual(['sda', 'sdb', 'sdc']); + expect(diskNames).toEqual(['sdb', 'sdc']); }); }); @@ -217,6 +217,8 @@ describe('PoolManagerStore', () => { vdevsNumber: 1, width: 1, vdevs: [[disks[2]]], + draidDataDisks: 0, + draidSpareDisks: 0, }); }); diff --git a/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.ts b/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.ts index e6423b5875a..1e3f8d5fd63 100644 --- a/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.ts +++ b/src/app/pages/storage/modules/pool-manager/store/pool-manager.store.ts @@ -14,13 +14,16 @@ import { CreateVdevLayout, VdevType } from 'app/enums/v-dev-type.enum'; import { Enclosure } from 'app/interfaces/enclosure.interface'; import { UnusedDisk } from 'app/interfaces/storage.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; -import { DispersalStrategy } from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/2-enclosure-wizard-step/enclosure-wizard-step.component'; +import { + DispersalStrategy, +} from 'app/pages/storage/modules/pool-manager/components/pool-manager-wizard/steps/2-enclosure-wizard-step/enclosure-wizard-step.component'; import { categoryCapacity } from 'app/pages/storage/modules/pool-manager/utils/capacity.utils'; import { filterAllowedDisks } from 'app/pages/storage/modules/pool-manager/utils/disk.utils'; import { GenerateVdevsService, } from 'app/pages/storage/modules/pool-manager/utils/generate-vdevs/generate-vdevs.service'; import { + isDraidLayout, topologyCategoryToDisks, topologyToDisks, } from 'app/pages/storage/modules/pool-manager/utils/topology.utils'; @@ -39,6 +42,10 @@ export interface PoolManagerTopologyCategory { treatDiskSizeAsMinimum: boolean; vdevs: UnusedDisk[][]; hasCustomDiskSelection: boolean; + + // Only used for data step when dRAID is selected. + draidDataDisks: number; + draidSpareDisks: number; } export type PoolManagerTopology = { @@ -67,6 +74,8 @@ export interface PoolManagerState { topology: PoolManagerTopology; } +type TopologyCategoryUpdate = Partial>; + const initialTopology = Object.values(VdevType).reduce((topology, value) => { return { ...topology, @@ -78,6 +87,9 @@ const initialTopology = Object.values(VdevType).reduce((topology, value) => { treatDiskSizeAsMinimum: false, vdevs: [], hasCustomDiskSelection: false, + + draidDataDisks: 0, + draidSpareDisks: 0, } as PoolManagerTopologyCategory, }; }, {} as PoolManagerTopology); @@ -143,6 +155,14 @@ export class PoolManagerStore extends ComponentStore { }, ); + readonly usesDraidLayout$ = this.select( + this.topology$, + (topology) => { + const dataCategory = topology[VdevType.Data]; + return [CreateVdevLayout.Draid1, CreateVdevLayout.Draid2, CreateVdevLayout.Draid3].includes(dataCategory.layout); + }, + ); + getLayoutsForVdevType(vdevType: VdevType): Observable { switch (vdevType) { case VdevType.Cache: @@ -172,11 +192,16 @@ export class PoolManagerStore extends ComponentStore { // TODO: Check if this needs to be optimized getInventoryForStep(type: VdevType): Observable { return this.select( - this.inventory$, + this.allowedDisks$, this.topology$, - (inventory, topology) => { - const disksUsedInCategory = topologyCategoryToDisks(topology[type]); - return [...inventory, ...disksUsedInCategory]; + (allowedDisks, topology) => { + const disksUsedInOtherCategories = Object.values(topology).flatMap((category) => { + if (category === topology[type]) { + return []; + } + return topologyCategoryToDisks(category); + }); + return _.differenceBy(allowedDisks, disksUsedInOtherCategories, (disk) => disk.devname); }, ); } @@ -202,8 +227,8 @@ export class PoolManagerStore extends ComponentStore { } resetStep(vdevType: VdevType): void { + this.resetTopologyCategory(vdevType); this.resetStep$.next(vdevType); - this.updateTopologyCategory(vdevType, initialTopology[vdevType]); } readonly initialize = this.effect((trigger$) => { @@ -272,7 +297,31 @@ export class PoolManagerStore extends ComponentStore { this.resetTopologyIfNotEnoughDisks(); } - setAutomaticTopologyCategory(type: VdevType, updates: Omit): void { + setTopologyCategoryDiskSizes( + type: VdevType, + updates: Pick, + ): void { + this.updateTopologyCategory(type, updates); + } + + setTopologyCategoryLayout( + type: VdevType, + newLayout: CreateVdevLayout, + ): void { + const isNewLayoutDraid = isDraidLayout(newLayout); + const isOldLayoutDraid = isDraidLayout(this.get().topology[type].layout); + if (isNewLayoutDraid !== isOldLayoutDraid) { + this.resetTopologyCategory(type); + } + + this.updateTopologyCategory(type, { layout: newLayout }); + + if (isDraidLayout(newLayout)) { + this.resetTopologyCategory(VdevType.Spare); + } + } + + setAutomaticTopologyCategory(type: VdevType, updates: TopologyCategoryUpdate): void { this.updateTopologyCategory(type, updates); this.regenerateVdevs(); diff --git a/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.spec.ts b/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.spec.ts index f3d7f48e08e..dd44cf11390 100644 --- a/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.spec.ts +++ b/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.spec.ts @@ -72,7 +72,9 @@ describe('vdevCapacity', () => { vdev, layout: CreateVdevLayout.Draid1, swapOnDrive: 2 * GiB, - })).toBe(4 * GiB); + draidDataDisks: 2, + draidSpareDisks: 1, + }) / GiB).toBeCloseTo(2.67); }); it('draid2 layout', () => { @@ -80,7 +82,9 @@ describe('vdevCapacity', () => { vdev, layout: CreateVdevLayout.Draid2, swapOnDrive: 2 * GiB, - })).toBe(3 * GiB); + draidDataDisks: 2, + draidSpareDisks: 1, + }) / GiB).toBeCloseTo(2); }); it('draid3 layout', () => { @@ -88,6 +92,8 @@ describe('vdevCapacity', () => { vdev, layout: CreateVdevLayout.Draid3, swapOnDrive: 2 * GiB, - })).toBe(2 * GiB); + draidDataDisks: 2, + draidSpareDisks: 1, + }) / GiB).toBeCloseTo(1.6); }); }); diff --git a/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.ts b/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.ts index e47d897f888..0a75bc8f9dd 100644 --- a/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.ts +++ b/src/app/pages/storage/modules/pool-manager/utils/capacity.utils.ts @@ -9,14 +9,20 @@ export function categoryCapacity(topologyCategory: PoolManagerTopologyCategory, vdev, layout: topologyCategory.layout, swapOnDrive, + draidDataDisks: topologyCategory.draidDataDisks, + draidSpareDisks: topologyCategory.draidSpareDisks, }); }, 0); } -export function vdevCapacity({ vdev, layout, swapOnDrive }: { +export function vdevCapacity({ + vdev, layout, swapOnDrive, draidDataDisks, draidSpareDisks, +}: { vdev: UnusedDisk[]; layout: CreateVdevLayout; swapOnDrive: number; + draidDataDisks?: number; + draidSpareDisks?: number; }): number { if (!vdev.length) { return 0; @@ -27,7 +33,6 @@ export function vdevCapacity({ vdev, layout, swapOnDrive }: { }).size - swapOnDrive; const totalSize = smallestDiskSize * vdev.length; - const defaultDraidDataPerGroup = 8; switch (layout) { case CreateVdevLayout.Mirror: @@ -38,20 +43,30 @@ export function vdevCapacity({ vdev, layout, swapOnDrive }: { return totalSize - smallestDiskSize * 2; case CreateVdevLayout.Raidz3: return totalSize - smallestDiskSize * 3; - - // https://openzfs.github.io/openzfs-docs/man/7/zpoolconcepts.7.html#draid - case CreateVdevLayout.Draid1: { - const dataPerGroup = Math.min(defaultDraidDataPerGroup, vdev.length - 1); - return vdev.length * (dataPerGroup / (dataPerGroup + 1)) * smallestDiskSize; - } - case CreateVdevLayout.Draid2: { - const dataPerGroup = Math.min(defaultDraidDataPerGroup, vdev.length - 2); - return vdev.length * (dataPerGroup / (dataPerGroup + 2)) * smallestDiskSize; - } - case CreateVdevLayout.Draid3: { - const dataPerGroup = Math.min(defaultDraidDataPerGroup, vdev.length - 3); - return vdev.length * (dataPerGroup / (dataPerGroup + 3)) * smallestDiskSize; - } + case CreateVdevLayout.Draid1: + return dRaidCapacity({ + children: vdev.length, + dataPerGroup: draidDataDisks, + parity: 1, + spares: draidSpareDisks, + size: smallestDiskSize, + }); + case CreateVdevLayout.Draid2: + return dRaidCapacity({ + children: vdev.length, + dataPerGroup: draidDataDisks, + parity: 2, + spares: draidSpareDisks, + size: smallestDiskSize, + }); + case CreateVdevLayout.Draid3: + return dRaidCapacity({ + children: vdev.length, + dataPerGroup: draidDataDisks, + parity: 3, + spares: draidSpareDisks, + size: smallestDiskSize, + }); case CreateVdevLayout.Stripe: return vdev.reduce((sum, disk) => sum + disk.size - swapOnDrive, 0); default: @@ -59,3 +74,18 @@ export function vdevCapacity({ vdev, layout, swapOnDrive }: { throw new Error(`Unknown layout: ${layout}`); } } + +/** + * https://openzfs.github.io/openzfs-docs/man/7/zpoolconcepts.7.html#draid + */ +function dRaidCapacity(values: { + children: number; + dataPerGroup: number; + parity: number; + size: number; + spares: number; +}): number { + return (values.children - values.spares) + * (values.dataPerGroup / (values.dataPerGroup + values.parity)) + * values.size; +} diff --git a/src/app/pages/storage/modules/pool-manager/utils/form.utils.ts b/src/app/pages/storage/modules/pool-manager/utils/form.utils.ts new file mode 100644 index 00000000000..897e57484cb --- /dev/null +++ b/src/app/pages/storage/modules/pool-manager/utils/form.utils.ts @@ -0,0 +1,34 @@ +import { FormControl } from '@angular/forms'; +import _ from 'lodash'; +import { Option } from 'app/interfaces/option.interface'; +import { IxSimpleChanges } from 'app/interfaces/simple-changes.interface'; + +export function unsetControlIfNoMatchingOption( + control: FormControl, + options: Option[], +): void { + const currentValue = control.value; + const hasMatchingOption = options.some((option) => option.value === currentValue); + if (!hasMatchingOption) { + setValueIfNotSame(control, null); + } +} + +export function setValueIfNotSame( + control: FormControl, + value: unknown, +): void { + if (control.value === value) { + return; + } + + control.setValue(value); +} + +export function hasDeepChanges( + changes: IxSimpleChanges, + key: keyof T, +): boolean { + return changes[key]?.currentValue + && !_.isEqual(changes[key].currentValue, changes[key].previousValue); +} diff --git a/src/app/pages/storage/modules/pool-manager/utils/topology.utils.spec.ts b/src/app/pages/storage/modules/pool-manager/utils/topology.utils.spec.ts index 53cf9bd841b..8e9d9d9542a 100644 --- a/src/app/pages/storage/modules/pool-manager/utils/topology.utils.spec.ts +++ b/src/app/pages/storage/modules/pool-manager/utils/topology.utils.spec.ts @@ -5,6 +5,7 @@ import { PoolManagerTopologyCategory, } from 'app/pages/storage/modules/pool-manager/store/pool-manager.store'; import { + parseDraidVdevName, topologyCategoryToDisks, topologyToDisks, topologyToPayload, } from 'app/pages/storage/modules/pool-manager/utils/topology.utils'; @@ -97,4 +98,44 @@ describe('topologyToPayload', () => { spares: ['ada7'], }); }); + + it('converts dRAID layout to websocket payload', () => { + const disk1 = { devname: 'ada1' } as UnusedDisk; + const disk2 = { devname: 'ada2' } as UnusedDisk; + const disk3 = { devname: 'ada3' } as UnusedDisk; + const disk4 = { devname: 'ada4' } as UnusedDisk; + + const topology = { + [VdevType.Data]: { + layout: CreateVdevLayout.Draid1, + vdevs: [ + [disk1, disk2], + [disk3, disk4], + ], + draidSpareDisks: 1, + draidDataDisks: 1, + }, + } as PoolManagerTopology; + + expect(topologyToPayload(topology)).toEqual({ + data: [ + { + type: CreateVdevLayout.Draid1, disks: ['ada1', 'ada2'], draid_data_disks: 1, draid_spare_disks: 1, + }, + { + type: CreateVdevLayout.Draid1, disks: ['ada3', 'ada4'], draid_data_disks: 1, draid_spare_disks: 1, + }, + ], + }); + }); +}); + +describe('parseDraidVdevName', () => { + it('parses dRAID vdev name into layout, data disks and spare', () => { + expect(parseDraidVdevName('draid3:1d:6c:2s-0')).toEqual({ + layout: CreateVdevLayout.Draid3, + dataDisks: 1, + spareDisks: 2, + }); + }); }); diff --git a/src/app/pages/storage/modules/pool-manager/utils/topology.utils.ts b/src/app/pages/storage/modules/pool-manager/utils/topology.utils.ts index 1185bdc8a21..14da7188b8f 100644 --- a/src/app/pages/storage/modules/pool-manager/utils/topology.utils.ts +++ b/src/app/pages/storage/modules/pool-manager/utils/topology.utils.ts @@ -1,6 +1,6 @@ import { DiskType } from 'app/enums/disk-type.enum'; import { CreateVdevLayout, TopologyItemType, VdevType } from 'app/enums/v-dev-type.enum'; -import { PoolTopology, UpdatePoolTopology } from 'app/interfaces/pool.interface'; +import { DataPoolTopologyUpdate, PoolTopology, UpdatePoolTopology } from 'app/interfaces/pool.interface'; import { Disk, UnusedDisk } from 'app/interfaces/storage.interface'; import { PoolManagerTopology, @@ -27,10 +27,20 @@ export function topologyToPayload(topology: PoolManagerTopology): UpdatePoolTopo } payload[vdevType] = category.vdevs.map((vdev) => { - return { + let typePayload = { type: category.layout, disks: vdev.map((disk) => disk.devname), }; + + if (isDraidLayout(category.layout)) { + typePayload = { + ...typePayload, + draid_data_disks: category.draidDataDisks, + draid_spare_disks: category.draidSpareDisks, + } as DataPoolTopologyUpdate; + } + + return typePayload; }); }); @@ -69,13 +79,23 @@ export function poolTopologyToStoreTopology(topology: PoolTopology, disks: Disk[ } const minSize = Math.min(...(disks.map((disk) => disk.size))); + let draidDataDisks: number = null; + let draidSpareDisks: number = null; + + if (vdevs[0].type === TopologyItemType.Draid) { + const parsedDraidInfo = parseDraidVdevName(vdevs[0].name); + draidDataDisks = parsedDraidInfo.dataDisks; + draidSpareDisks = parsedDraidInfo.spareDisks; + layoutType = parsedDraidInfo.layout as unknown as TopologyItemType; + } + poolManagerTopology[category as VdevType] = { diskType: disks[0].type, diskSize: minSize, layout: layoutType as unknown as CreateVdevLayout, vdevsNumber: vdevs.length, width, - hasCustomDiskSelection: vdevs.some((vdev2) => vdevs[0].children.length !== vdev2.children.length), + hasCustomDiskSelection: vdevs.some((vdev) => vdevs[0].children.length !== vdev.children.length), vdevs: topology[category as VdevType].map( (topologyItem) => { if (topologyItem.children.length) { @@ -94,7 +114,45 @@ export function poolTopologyToStoreTopology(topology: PoolTopology, disks: Disk[ }, ), treatDiskSizeAsMinimum: false, + draidDataDisks, + draidSpareDisks, }; } return poolManagerTopology; } + +export function isDraidLayout(layout: CreateVdevLayout | TopologyItemType): boolean { + return [ + CreateVdevLayout.Draid1, + CreateVdevLayout.Draid2, + CreateVdevLayout.Draid3, + TopologyItemType.Draid, + ].includes(layout); +} + +export function parseDraidVdevName( + vdevName: string, +): { layout: CreateVdevLayout; dataDisks: number; spareDisks: number } { + const regex = /draid(\d+):(\d)d:\dc:(\d)s/; + const match = vdevName.match(regex); + + if (!match) { + throw new Error('Invalid dRAID vdev name'); + } + + const [, parityLevelNumber, dataDisks, spareDisk] = match; + let parityLevel = CreateVdevLayout.Draid1; + if (parityLevelNumber === '2') { + parityLevel = CreateVdevLayout.Draid2; + } else if (parityLevelNumber === '3') { + parityLevel = CreateVdevLayout.Draid3; + } else { + parityLevel = CreateVdevLayout.Draid1; + } + + return { + layout: parityLevel, + dataDisks: Number(dataDisks), + spareDisks: Number(spareDisk), + }; +} diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index 28f57453377..bd65db2c178 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -392,6 +392,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -808,6 +809,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1009,6 +1011,7 @@ "Display Port": "", "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1547,6 +1550,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2300,6 +2304,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3100,6 +3105,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3624,7 +3630,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 2b20cfb065c..cc60db08e99 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -304,6 +304,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach image (optional)": "", "Attach screenshots": "", @@ -602,6 +603,7 @@ "Dashboard Configure": "", "Dashboard is Empty!": "", "Dashboard settings saved": "", + "Data Devices": "", "Data Protection": "", "Data VDEVs": "", "Data Written": "", @@ -744,6 +746,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1200,6 +1203,7 @@ "Importing Pool...": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -1869,6 +1873,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", "Record Size": "", @@ -2422,6 +2427,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", "The path {path} is in a locked dataset.": "", @@ -2847,7 +2853,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index bd91379c63b..828a1cf34e8 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -143,6 +143,7 @@ "At least 1 GPU is required by the host for its functions.": "", "At least 1 data VDEV is required.": "", "At least 1 vdev is required to make an update to the pool.": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach image (optional)": "", "AuthVersion": "", @@ -255,6 +256,7 @@ "DEBUG": "", "DHCP": "", "Dashboard settings saved": "", + "Data Devices": "", "Data VDEVs": "", "Data Written": "", "Data is identical in each disk. A mirror requires at least two disks, provides the most redundancy, and has the least capacity.": "", @@ -324,6 +326,7 @@ "Display Device": "", "Display Port": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", + "Distributed Hot Spares": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", "Do you want to configure the ACL?": "", @@ -500,6 +503,7 @@ "Import CA": "", "Import Pool": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include snapshots with the name": "", "Incorrect crontab value.": "", @@ -911,6 +915,7 @@ "Reboot": "", "Reboot standby TrueNAS controller": "", "Recommended Apps": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Referenced": "", "Refresh All": "", "Refresh Charts": "", @@ -1245,6 +1250,7 @@ "The length of {field} should be no more than {maxLength}": "", "The list is empty.": "", "The name \"{value}\" is already in use.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The path {path} is in a locked dataset.": "", "The pool {pool}is in the database but not connected to the machine. If it was exported by mistake, reconnect the hardware and use Import Pool.

": "", "The product of vCPUs, cores and threads must not exceed {maxVcpus} on this system.": "", @@ -1522,7 +1528,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 1704f865da1..9cec1180964 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -390,6 +390,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach Debug": "", "Attach NIC": "", @@ -783,6 +784,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -979,6 +981,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1634,6 +1637,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2466,6 +2470,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3313,6 +3318,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3838,7 +3844,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 8b9bf4a9e0c..de4693912f9 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -12,6 +12,7 @@ "Are you sure you want to delete the {name} DNS Authenticator?": "", "Are you sure you want to delete the {name} certificate authority?": "", "Are you sure you want to delete the {name}?": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Bucket Name": "", "Config-Reset": "", "Confirmation": "", @@ -20,6 +21,7 @@ "Cronjob deleted": "", "Current Configuration": "", "Current Default Gateway": "", + "Data Devices": "", "Dataset": "", "Datasets": "", "De-duplication tables are stored on this special VDEV type. These VDEVs must be sized to X GiB for each X TiB of general storage.": "", @@ -31,6 +33,7 @@ "Delete SSH Keypair": "", "Delete Static Route": "", "Delete Sysctl": "", + "Distributed Hot Spares": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Drive reserved for inserting into DATA pool VDEVs when an active drive has failed.": "", "Editing interface will result in default gateway being removed, which may result in TrueNAS being inaccessible. You can provide new default gateway now:": "", @@ -55,6 +58,7 @@ "Host Passthrough": "", "IPMI Events": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "Information": "", "Inherit ({value})": "", "Inherit Encryption": "", @@ -99,6 +103,7 @@ "RAIDZ1": "", "RAIDZ2": "", "RAIDZ3": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Renew 2FA Secret": "", "Renew 2FA secret": "", "Resetting interfaces while HA is enabled is not allowed.": "", @@ -120,10 +125,12 @@ "Sysctl \"{name}\" deleted": "", "System Security": "", "System Security Settings Updated.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "VDEVs": "", "Windows": "", "Wizard iSCSI": "", "Workloads": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", @@ -4145,7 +4152,6 @@ "[Use fewer transactions in exchange for more RAM.](https://rclone.org/docs/#fast-list) This can also speed up or slow down the transfer.": "[Utilisez moins de transactions en échange de plus de RAM](https://rclone.org/docs/\\#fast-list) Cela peut aussi accélérer ou ralentir le transfert.", "by ancestor": "par ancêtre", "cores": "cœurs", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "dRAID est une fonctionnalité ZFS qui augmente la vitesse de réargenture, la répartition de la charge et l'efficacité de l'espace disque. \nOptez pour dRAID plutôt que RAID-Z lors de la gestion de disques de grande capacité et d'environnements de disques étendus pour des performances améliorées.", "details": "détails", "everyone@": "tous@", "expires in {n, plural, one {# day} other {# days} }": "Expire dans {n, plural, one {# jour} other {# jours} }", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 16f7bea897d..38ef8bf2931 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -367,6 +367,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach NIC": "", "Attach image (optional)": "", @@ -723,6 +724,7 @@ "Dashboard Configure": "", "Dashboard is Empty!": "", "Dashboard settings saved": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -902,6 +904,7 @@ "Display Port": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1563,6 +1566,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2427,6 +2431,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3308,6 +3313,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3869,7 +3875,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index 7e00f54d1d4..2d05b665c9e 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -333,6 +333,7 @@ "At least 1 vdev is required to make an update to the pool.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -673,6 +674,7 @@ "Dashboard Configure": "", "Dashboard is Empty!": "", "Dashboard settings saved": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -859,6 +861,7 @@ "Display Login": "", "Display Port": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1459,6 +1462,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2264,6 +2268,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", "Record Size": "", @@ -3011,6 +3016,7 @@ "The list is empty.": "", "The maximum number of simultaneous clients.": "", "The name \"{value}\" is already in use.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3531,7 +3537,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index f0e5100d306..9eddee6695e 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -38,6 +38,7 @@ "Asymmetric Logical Unit Access (ALUA)": "", "At least 1 data VDEV is required.": "", "At least 1 vdev is required to make an update to the pool.": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach image (optional)": "", "Back to Discover Page": "", @@ -377,6 +378,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -599,6 +601,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1287,6 +1290,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2151,6 +2155,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3032,6 +3037,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3593,7 +3599,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index a6be4fea385..974589b81ed 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -416,6 +416,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -873,6 +874,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1095,6 +1097,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1783,6 +1786,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2647,6 +2651,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3528,6 +3533,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4078,7 +4084,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index 9b909bddc33..cf76052ea1a 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -30,6 +30,7 @@ "Asymmetric Logical Unit Access (ALUA)": "", "At least 1 data VDEV is required.": "", "At least 1 vdev is required to make an update to the pool.": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Attach image (optional)": "", "Back to Discover Page": "", "Bucket Name": "", @@ -51,6 +52,7 @@ "Cronjob deleted": "", "Current Configuration": "", "Current Default Gateway": "", + "Data Devices": "", "Data is identical in each disk. A mirror requires at least two disks, provides the most redundancy, and has the least capacity.": "", "De-duplication tables are stored on this special VDEV type. These VDEVs must be sized to X GiB for each X TiB of general storage.": "", "Delete Catalog": "", @@ -64,6 +66,7 @@ "Discover": "", "Discover Apps": "", "Dispersal Strategy": "", + "Distributed Hot Spares": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Drive reserved for inserting into DATA pool VDEVs when an active drive has failed.": "", "Each disk stores data. A stripe requires at least one disk and has no data redundancy.": "", @@ -93,6 +96,7 @@ "IPMI Events": "", "If checked, disks of the selected size or larger will be used. If unchecked, only disks of the selected size will be used.": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "Incorrect or expired OTP. Please try again.": "", "Information": "", "Inherit Encryption": "", @@ -147,6 +151,7 @@ "RAIDZ1": "", "RAIDZ2": "", "RAIDZ3": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Renew 2FA Secret": "", "Renew 2FA secret": "", "Renew Certificate Days Before Expiry": "", @@ -199,6 +204,7 @@ "Thank you for sharing your feedback with us! Your insights are valuable in helping us improve our product.": "", "The domain for local users is the NetBIOS name of the TrueNAS server.": "", "The following disks have exported pools on them.\n Using those disks will make existing pools on them unable to be imported.\n You will lose any and all data in selected disks.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "This information is provided by the catalog maintainer.": "", "Topology Summary": "", "Total Capacity": "", @@ -227,7 +233,7 @@ "Wrong username or password. Please try again.": "", "You are using an insecure connection. Switch to HTTPS for secure access.": "", "ZFS L2ARC read-cache that can be used with fast devices to accelerate read operations.": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 812f96ced5c..06b900a1375 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -367,6 +367,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -819,6 +820,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1039,6 +1041,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1725,6 +1728,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2587,6 +2591,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3445,6 +3450,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4004,7 +4010,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index a967974e4f6..f2af4b4df81 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -356,6 +356,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -813,6 +814,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1035,6 +1037,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1722,6 +1725,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2586,6 +2590,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3467,6 +3472,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4028,7 +4034,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index 068f80e9404..c994f5cda10 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -208,6 +208,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Attach Debug": "", "Attach image (optional)": "", "Auth Token": "", @@ -519,6 +520,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -659,6 +661,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not set this if the Serial Port is disabled.": "", @@ -1242,6 +1245,7 @@ "Importing pools.": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -1907,6 +1911,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -2641,6 +2646,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3107,7 +3113,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 37186e73490..be4e48c64a6 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -222,6 +222,7 @@ "At least 1 vdev is required to make an update to the pool.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach image (optional)": "", "Attach screenshots": "", @@ -403,6 +404,7 @@ "DQ Used": "", "Dashboard Configure": "", "Dashboard settings saved": "", + "Data Devices": "", "Data VDEVs": "", "Data Written": "", "Data is identical in each disk. A mirror requires at least two disks, provides the most redundancy, and has the least capacity.": "", @@ -509,6 +511,7 @@ "Display Device": "", "Display Port": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", + "Distributed Hot Spares": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", "Do you want to configure the ACL?": "", @@ -797,6 +800,7 @@ "Importing Pool": "", "Importing Pool...": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Incorrect crontab value.": "", "Incorrect or expired OTP. Please try again.": "", @@ -1321,6 +1325,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", "Referenced": "", @@ -1790,6 +1795,7 @@ "The lifespan (in seconds) of each One-Time Password. Default is 30 seconds. The minimum lifetime is 5 seconds.": "", "The list is empty.": "", "The name \"{value}\" is already in use.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", "The pasted string ends with a space": "", @@ -2174,7 +2180,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index e5cb63e778a..a87b1e170ec 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -36,6 +36,7 @@ "Asymmetric Logical Unit Access (ALUA)": "", "At least 1 data VDEV is required.": "", "At least 1 vdev is required to make an update to the pool.": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach image (optional)": "", "Back to Discover Page": "", @@ -64,6 +65,7 @@ "Current Configuration": "", "Current Default Gateway": "", "Dashboard settings saved": "", + "Data Devices": "", "Data is identical in each disk. A mirror requires at least two disks, provides the most redundancy, and has the least capacity.": "", "Dataset locked": "", "Dataset «{name}» updated.": "", @@ -81,6 +83,7 @@ "Discover": "", "Discover Apps": "", "Dispersal Strategy": "", + "Distributed Hot Spares": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Drive reserved for inserting into DATA pool VDEVs when an active drive has failed.": "", "Each disk stores data. A stripe requires at least one disk and has no data redundancy.": "", @@ -116,6 +119,7 @@ "IPMI Events": "", "If checked, disks of the selected size or larger will be used. If unchecked, only disks of the selected size will be used.": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "Incorrect or expired OTP. Please try again.": "", "Information": "", "Inherit ({value})": "", @@ -192,6 +196,7 @@ "RAIDZ1": "", "RAIDZ2": "", "RAIDZ3": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Renew 2FA Secret": "", "Renew 2FA secret": "", "Renew Certificate Days Before Expiry": "", @@ -265,6 +270,7 @@ "Thank you for sharing your feedback with us! Your insights are valuable in helping us improve our product.": "", "The domain for local users is the NetBIOS name of the TrueNAS server.": "", "The following disks have exported pools on them.\n Using those disks will make existing pools on them unable to be imported.\n You will lose any and all data in selected disks.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "This information is provided by the catalog maintainer.": "", "Topology Summary": "", "Total Capacity": "", @@ -300,7 +306,7 @@ "You are using an insecure connection. Switch to HTTPS for secure access.": "", "ZFS L2ARC read-cache that can be used with fast devices to accelerate read operations.": "", "Zvol «{name}» updated.": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 6d0f9db7416..6ff08e81b7e 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -421,6 +421,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach Debug": "", @@ -879,6 +880,7 @@ "Dashboard is Empty!": "", "Dashboard settings saved": "", "Data": "", + "Data Devices": "", "Data Encipherment": "", "Data Protection": "", "Data Quota": "", @@ -1101,6 +1103,7 @@ "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", "Distinguished Name": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1789,6 +1792,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2653,6 +2657,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Recommended when Max. Poll is greater than 10. Only use on personal NTP servers or those under direct control. Do not enable when using public NTP servers.": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", @@ -3534,6 +3539,7 @@ "The minimum polling interval, in seconds, as a power of 2. For example, 6 means 2^6, or 64 seconds. The default is 6, minimum value is 4.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -4095,7 +4101,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index 9ddf97b2f52..070b5968f9a 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -43,6 +43,7 @@ "At least 1 GPU is required by the host for its functions.": "", "At least 1 data VDEV is required.": "", "At least 1 vdev is required to make an update to the pool.": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach image (optional)": "", "Automated Disk Selection": "", @@ -87,6 +88,7 @@ "Custom App": "", "Custom Transfers": "", "Dashboard settings saved": "", + "Data Devices": "", "Data is identical in each disk. A mirror requires at least two disks, provides the most redundancy, and has the least capacity.": "", "Dataset locked": "", "Dataset «{name}» updated.": "", @@ -109,6 +111,7 @@ "Discover": "", "Discover Apps": "", "Dispersal Strategy": "", + "Distributed Hot Spares": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Don't Allow": "", "Drag & drop disks to add or remove them": "", @@ -156,6 +159,7 @@ "If checked, disks of the selected size or larger will be used. If unchecked, only disks of the selected size will be used.": "", "If downloading a file returns the error \"This file has been identified as malware or spam and cannot be downloaded\" with the error code \"cannotDownloadAbusiveFile\" then enable this flag to indicate you acknowledge the risks of downloading the file and TrueNAS will download it anyway.": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "Incorrect or expired OTP. Please try again.": "", "Information": "", "Inherit ({value})": "", @@ -223,6 +227,7 @@ "RAIDZ1": "", "RAIDZ2": "", "RAIDZ3": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Refresh Charts": "", "Renew 2FA Secret": "", "Renew 2FA secret": "", @@ -289,6 +294,7 @@ "Thank you for sharing your feedback with us! Your insights are valuable in helping us improve our product.": "", "The domain for local users is the NetBIOS name of the TrueNAS server.": "", "The following disks have exported pools on them.\n Using those disks will make existing pools on them unable to be imported.\n You will lose any and all data in selected disks.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "This information is provided by the catalog maintainer.": "", "Topology Summary": "", "Total Capacity": "", @@ -328,7 +334,7 @@ "Wrong username or password. Please try again.": "", "You are using an insecure connection. Switch to HTTPS for secure access.": "", "ZFS L2ARC read-cache that can be used with fast devices to accelerate read operations.": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 953bc6c9cd7..0b6ebbe4883 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -328,6 +328,7 @@ "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", "At least one pod must be available": "", "At least one pool must be available to use apps": "", + "At least one spare is recommended for dRAID. Spares cannot be added later.": "", "Atleast {min} disk(s) are required for {vdevType} vdevs": "", "Attach": "", "Attach image (optional)": "", @@ -639,6 +640,7 @@ "Daily time range for the specific periodic snapshots to replicate, in 15 minute increments. Snapshots created after the End time will not be included in the replication.": "", "Dashboard is Empty!": "", "Dashboard settings saved": "", + "Data Devices": "", "Data Encipherment": "", "Data Quota": "", "Data VDEVs": "", @@ -811,6 +813,7 @@ "Display Port": "", "Display console messages in real time at the bottom of the browser.": "", "Display network interface IP address. The primary interface IP address is the default. A different interface IP address can be chosen.": "", + "Distributed Hot Spares": "", "Do NOT change this setting when using Windows as the initiator. Only needs to be changed in large environments where the number of systems using a specific RPM is needed for accurate reporting statistics.": "", "Do not enable ALUA on TrueNAS unless it is also supported by and enabled on the client computers. ALUA only works when enabled on both the client and server.": "", "Do not save": "", @@ -1325,6 +1328,7 @@ "In": "", "In KiBs or greater. A default of 0 KiB means unlimited. ": "", "In Progress": "", + "In order for dRAID to overweight its benefits over RaidZ the minimum recommended number of disks per dRAID vdev is 10.": "", "In some cases it's possible that the provided key/passphrase is valid but the path where the dataset is supposed to be mounted after being unlocked already exists and is not empty. In this case, unlock operation would fail. This can be overridden by Force flag. When it is set, system will rename the existing directory/file path where the dataset should be mounted resulting in successful unlock of the dataset.": "", "Include Dataset Properties": "", "Include dataset properties with the replicated snapshots.": "", @@ -2004,6 +2008,7 @@ "Received": "", "Recommended Apps": "", "Recommended block size based on pool topology:": "", + "Recommended number of data disks for optimal space allocation should be power of 2 (2, 4, 8, 16...).": "", "Reconnect": "", "Record SMB service messages up to the specified log level. By default, error and warning level messages are logged.": "", "Record Size": "", @@ -2707,6 +2712,7 @@ "The message to show when a user logs in with SSH.": "", "The name \"{value}\" is already in use.": "", "The number of bits in the key used by the cryptographic algorithm. For security reasons, a minimum key length of 2048 is recommended.": "", + "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "The number of digits in the One-Time Password. The default value is 6, which is the length of the standard OTP from Google. Check the settings of your app or device before selecting this.": "", "The operation timed out. The requested resource might be offline. Check the network connection.": "", "The parent of this dataset has an Access Control List (ACL). Do you want to set an ACL for this dataset using the ACL Manager? ": "", @@ -3170,7 +3176,7 @@ "Zvol «{name}» updated.": "", "by ancestor": "", "cores": "", - "dRAID is a ZFS feature that boosts resilver speed, load distribution, and disk space efficiency. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed strip width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "", "dRAID1": "", "dRAID2": "", "dRAID3": "", From dbd2d0f1974f9c1bb1ee6cbcbb413fdfd5a33d9f Mon Sep 17 00:00:00 2001 From: Boris Vasilenko Date: Sun, 27 Aug 2023 14:56:59 +0300 Subject: [PATCH 09/12] NAS-123648: Fix styles (#8670) Co-authored-by: Boris Vasilenko --- .../components/scheduler-modal/scheduler-modal.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/modules/scheduler/components/scheduler-modal/scheduler-modal.component.scss b/src/app/modules/scheduler/components/scheduler-modal/scheduler-modal.component.scss index e39f75a4f5d..ee609fe1bc5 100644 --- a/src/app/modules/scheduler/components/scheduler-modal/scheduler-modal.component.scss +++ b/src/app/modules/scheduler/components/scheduler-modal/scheduler-modal.component.scss @@ -10,6 +10,7 @@ .settings-column { margin-bottom: 10px; margin-top: 19px; + width: 100%; .no-spaces-hint { font-size: 85%; From 41f7faff37b7f21db7f7117b38880ca90b94fe5a Mon Sep 17 00:00:00 2001 From: Denys Butenko Date: Mon, 28 Aug 2023 13:15:42 +0700 Subject: [PATCH 10/12] NAS-123666 / 24.04 / Add placeholder when image failed to load on Apps (#8660) * NAS-123666: Add fallback image directive * NAS-123666: Update image fallback on apps --- .../app-detail-view/app-detail-view.component.html | 2 +- .../app-info-card/app-info-card.component.html | 2 +- .../installed-apps/app-info-card/app-info-card.component.ts | 2 ++ .../components/installed-apps/app-row/app-row.component.html | 2 +- .../components/installed-apps/app-row/app-row.component.ts | 3 +++ .../app-upgrade-dialog/app-upgrade-dialog.component.html | 5 +---- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/app/pages/apps/components/app-detail-view/app-detail-view.component.html b/src/app/pages/apps/components/app-detail-view/app-detail-view.component.html index 85fe15b24b1..02dc3fbfd36 100644 --- a/src/app/pages/apps/components/app-detail-view/app-detail-view.component.html +++ b/src/app/pages/apps/components/app-detail-view/app-detail-view.component.html @@ -27,7 +27,7 @@

{{ 'Screenshots' | translate }}

- +
diff --git a/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.html b/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.html index 78b0efb22ec..87afe7d0ac5 100644 --- a/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.html +++ b/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.html @@ -26,7 +26,7 @@

diff --git a/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts b/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts index ed7eb555def..8717a6039d9 100644 --- a/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts @@ -7,6 +7,7 @@ import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy'; import { TranslateService } from '@ngx-translate/core'; import { startCase, isEmpty } from 'lodash'; import { filter, map, take } from 'rxjs'; +import { appImagePlaceholder } from 'app/constants/catalog.constants'; import helptext from 'app/helptext/apps/apps'; import { UpgradeSummary } from 'app/interfaces/application.interface'; import { ChartRelease } from 'app/interfaces/chart-release.interface'; @@ -31,6 +32,7 @@ import { RedirectService } from 'app/services/redirect.service'; export class AppInfoCardComponent { @Input() app: ChartRelease; + readonly imagePlaceholder = appImagePlaceholder; readonly isEmpty = isEmpty; constructor( diff --git a/src/app/pages/apps/components/installed-apps/app-row/app-row.component.html b/src/app/pages/apps/components/installed-apps/app-row/app-row.component.html index 1375cdd5405..08f7f2b3c41 100644 --- a/src/app/pages/apps/components/installed-apps/app-row/app-row.component.html +++ b/src/app/pages/apps/components/installed-apps/app-row/app-row.component.html @@ -9,7 +9,7 @@ >
diff --git a/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts b/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts index f9ad65752db..ef9abdcf251 100644 --- a/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core'; +import { appImagePlaceholder } from 'app/constants/catalog.constants'; import { ChartReleaseStatus } from 'app/enums/chart-release-status.enum'; import { JobState } from 'app/enums/job-state.enum'; import { ChartScaleQueryParams, ChartScaleResult } from 'app/interfaces/chart-release-event.interface'; @@ -23,6 +24,8 @@ export class AppRowComponent { @Output() stopApp = new EventEmitter(); @Output() clickStatus = new EventEmitter(); + readonly imagePlaceholder = appImagePlaceholder; + get hasUpdates(): boolean { return this.app.update_available || this.app.container_images_update_available; } diff --git a/src/app/pages/apps/components/installed-apps/app-upgrade-dialog/app-upgrade-dialog.component.html b/src/app/pages/apps/components/installed-apps/app-upgrade-dialog/app-upgrade-dialog.component.html index 6e5c0cc64ff..516f1784a51 100644 --- a/src/app/pages/apps/components/installed-apps/app-upgrade-dialog/app-upgrade-dialog.component.html +++ b/src/app/pages/apps/components/installed-apps/app-upgrade-dialog/app-upgrade-dialog.component.html @@ -1,10 +1,7 @@
{{ dialogConfig.appInfo.name }} From 1898996c3bc86b1f1295b00c472e938511d6b757 Mon Sep 17 00:00:00 2001 From: Denys Butenko Date: Mon, 28 Aug 2023 14:02:47 +0700 Subject: [PATCH 11/12] NAS-123680 / 24.04 / Update date time format on sessions card (#8666) * NAS-123680: Update date time format on sessions card * NAS-123680: Update ix-table-pager-show-more * NAS-123680: Add explanation tooltip for disabled button * NAS-123680: Update tests --- .../ix-cell-date/ix-cell-date.component.html | 2 +- .../ix-cell-date.component.spec.ts | 8 --- .../ix-cell-date/ix-cell-date.component.ts | 7 ++- .../ix-table-pager-show-more.component.scss | 6 +- .../ix-table-pager-show-more.component.ts | 4 +- .../sessions-card.component.html | 16 +++-- .../sessions-card.component.scss | 4 -- .../sessions-card.component.spec.ts | 59 ++++++++++++++++--- .../sessions-card/sessions-card.component.ts | 9 +-- src/assets/i18n/af.json | 1 + src/assets/i18n/ar.json | 1 + src/assets/i18n/ast.json | 1 + src/assets/i18n/az.json | 1 + src/assets/i18n/be.json | 1 + src/assets/i18n/bg.json | 1 + src/assets/i18n/bn.json | 1 + src/assets/i18n/br.json | 1 + src/assets/i18n/bs.json | 1 + src/assets/i18n/ca.json | 1 + src/assets/i18n/cs.json | 1 + src/assets/i18n/cy.json | 1 + src/assets/i18n/da.json | 1 + src/assets/i18n/de.json | 1 + src/assets/i18n/dsb.json | 1 + src/assets/i18n/el.json | 1 + src/assets/i18n/en-au.json | 1 + src/assets/i18n/en-gb.json | 1 + src/assets/i18n/en.json | 1 + src/assets/i18n/eo.json | 1 + src/assets/i18n/es-ar.json | 1 + src/assets/i18n/es-co.json | 1 + src/assets/i18n/es-mx.json | 1 + src/assets/i18n/es-ni.json | 1 + src/assets/i18n/es-ve.json | 1 + src/assets/i18n/es.json | 1 + src/assets/i18n/et.json | 1 + src/assets/i18n/eu.json | 1 + src/assets/i18n/fa.json | 1 + src/assets/i18n/fi.json | 1 + src/assets/i18n/fr.json | 1 + src/assets/i18n/fy.json | 1 + src/assets/i18n/ga.json | 1 + src/assets/i18n/gd.json | 1 + src/assets/i18n/gl.json | 1 + src/assets/i18n/he.json | 1 + src/assets/i18n/hi.json | 1 + src/assets/i18n/hr.json | 1 + src/assets/i18n/hsb.json | 1 + src/assets/i18n/hu.json | 1 + src/assets/i18n/ia.json | 1 + src/assets/i18n/id.json | 1 + src/assets/i18n/io.json | 1 + src/assets/i18n/is.json | 1 + src/assets/i18n/it.json | 1 + src/assets/i18n/ja.json | 1 + src/assets/i18n/ka.json | 1 + src/assets/i18n/kk.json | 1 + src/assets/i18n/km.json | 1 + src/assets/i18n/kn.json | 1 + src/assets/i18n/ko.json | 1 + src/assets/i18n/lb.json | 1 + src/assets/i18n/lt.json | 1 + src/assets/i18n/lv.json | 1 + src/assets/i18n/mk.json | 1 + src/assets/i18n/ml.json | 1 + src/assets/i18n/mn.json | 1 + src/assets/i18n/mr.json | 1 + src/assets/i18n/my.json | 1 + src/assets/i18n/nb.json | 1 + src/assets/i18n/ne.json | 1 + src/assets/i18n/nl.json | 1 + src/assets/i18n/nn.json | 1 + src/assets/i18n/os.json | 1 + src/assets/i18n/pa.json | 1 + src/assets/i18n/pl.json | 1 + src/assets/i18n/pt-br.json | 1 + src/assets/i18n/pt.json | 1 + src/assets/i18n/ro.json | 1 + src/assets/i18n/ru.json | 1 + src/assets/i18n/sk.json | 1 + src/assets/i18n/sl.json | 1 + src/assets/i18n/sq.json | 1 + src/assets/i18n/sr-latn.json | 1 + src/assets/i18n/sr.json | 1 + src/assets/i18n/strings.json | 1 + src/assets/i18n/sv.json | 1 + src/assets/i18n/sw.json | 1 + src/assets/i18n/ta.json | 1 + src/assets/i18n/te.json | 1 + src/assets/i18n/th.json | 1 + src/assets/i18n/tr.json | 1 + src/assets/i18n/tt.json | 1 + src/assets/i18n/udm.json | 1 + src/assets/i18n/uk.json | 1 + src/assets/i18n/vi.json | 1 + src/assets/i18n/zh-hans.json | 1 + src/assets/i18n/zh-hant.json | 1 + 97 files changed, 162 insertions(+), 41 deletions(-) diff --git a/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.html b/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.html index d3645a7af3b..976843b0c53 100644 --- a/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.html +++ b/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.html @@ -1 +1 @@ -{{ value | formatDateTime:undefined:formatDate:formatTime }} +{{ value | formatDateTime }} diff --git a/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.spec.ts b/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.spec.ts index 2a5c5d49497..1d9d2d0aef0 100644 --- a/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.spec.ts +++ b/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.spec.ts @@ -32,12 +32,4 @@ describe('IxCellDateComponent', () => { it('shows default format datetime in template', () => { expect(spectator.element.textContent.trim()).toBe('2023-07-12 09:10:00'); }); - - it('shows custom format datetime in template', () => { - spectator.component.formatDate = 'yyyy/MM/dd'; - spectator.component.formatTime = 'HH.mm.ss'; - spectator.fixture.detectChanges(); - - expect(spectator.element.textContent.trim()).toBe('2023/07/12 09.10.00'); - }); }); diff --git a/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.ts b/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.ts index c774e286348..9f89e2f61fc 100644 --- a/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.ts +++ b/src/app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component.ts @@ -1,14 +1,15 @@ import { Component } from '@angular/core'; +import { ApiTimestamp } from 'app/interfaces/api-date.interface'; import { Column, ColumnComponent } from 'app/modules/ix-table2/interfaces/table-column.interface'; @Component({ templateUrl: './ix-cell-date.component.html', }) export class IxCellDateComponent extends ColumnComponent { - formatDate: string = undefined; - formatTime: string = undefined; - get value(): number | Date { + if ((this.row[this.propertyName] as ApiTimestamp)?.$date) { + return (this.row[this.propertyName] as ApiTimestamp).$date; + } return this.row[this.propertyName] as number | Date; } } diff --git a/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.scss b/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.scss index c901e68a282..8b3cce9f141 100644 --- a/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.scss +++ b/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.scss @@ -1,4 +1,8 @@ -:host { +:host:not(.collapsible) { + display: none; +} + +:host.collapsible { align-items: center; display: flex; justify-content: center; diff --git a/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.ts b/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.ts index 676a81ab1e7..a3ae304410d 100644 --- a/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.ts +++ b/src/app/modules/ix-table2/components/ix-table-pager-show-more/ix-table-pager-show-more.component.ts @@ -1,5 +1,5 @@ import { - AfterContentChecked, ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, + AfterContentChecked, ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, Input, OnInit, } from '@angular/core'; import { UntilDestroy } from '@ngneat/until-destroy'; import { ArrayDataProvider } from 'app/modules/ix-table2/array-data-provider'; @@ -19,7 +19,7 @@ export class IxTablePagerShowMoreComponent implements OnInit, AfterContentChe totalItems = 0; expanded = false; - get collapsible(): boolean { + @HostBinding('class.collapsible') get collapsible(): boolean { return this.totalItems > this.pageSize; } diff --git a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.html b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.html index e17d81e2ea5..3d01cc3a3a8 100644 --- a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.html +++ b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.html @@ -51,23 +51,20 @@

{{ 'Sessions' | translate }}

> {{ getUsername(session) }} - - {{ getDate(session.created_at.$date) }} - -
+

+
diff --git a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.scss b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.scss index fae1a9918f1..4ac2a324e2f 100644 --- a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.scss +++ b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.scss @@ -1,7 +1,3 @@ -.table { - margin: 4px; -} - .actions { display: flex; place-content: center flex-end; diff --git a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.spec.ts b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.spec.ts index 9ec44c1475f..cd2d4cf015d 100644 --- a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.spec.ts +++ b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.spec.ts @@ -5,9 +5,12 @@ import { MatListItemHarness } from '@angular/material/list/testing'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; import { provideMockStore } from '@ngrx/store/testing'; import { of } from 'rxjs'; +import { FakeFormatDateTimePipe } from 'app/core/testing/classes/fake-format-datetime.pipe'; import { mockCall, mockWebsocket } from 'app/core/testing/utils/mock-websocket.utils'; import { EntityModule } from 'app/modules/entity/entity.module'; import { IxSlideInRef } from 'app/modules/ix-forms/components/ix-slide-in/ix-slide-in-ref'; +import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; +import { IxTable2Harness } from 'app/modules/ix-table2/components/ix-table2/ix-table2.harness'; import { IxTable2Module } from 'app/modules/ix-table2/ix-table2.module'; import { AppLoaderModule } from 'app/modules/loader/app-loader.module'; import { AdvancedSettingsService } from 'app/pages/system/advanced/advanced-settings.service'; @@ -21,17 +24,33 @@ import { selectPreferences } from 'app/store/preferences/preferences.selectors'; describe('SessionsCardComponent', () => { let spectator: Spectator; let loader: HarnessLoader; + const sessions = Array.from({ length: 6 }).map((_, index) => ( + { + id: `e8a2892e-f2a3-429e-bd9e-442db8fc948${index}`, + current: true, + internal: false, + origin: '1.2.3.4:37170', + credentials: 'TOKEN', + credentials_data: { + parent: { + credentials: 'LOGIN_PASSWORD', + credentials_data: { + username: `user-${index}`, + }, + }, + }, + created_at: { + $date: 1692871227000, + }, + })); const createComponent = createComponentFactory({ component: SessionsCardComponent, - imports: [ - AppLoaderModule, - EntityModule, - IxTable2Module, - ], + imports: [AppLoaderModule, EntityModule, IxTable2Module, FakeFormatDateTimePipe], providers: [ mockWebsocket([ + mockCall('auth.sessions', sessions), + mockCall('auth.terminate_session'), mockCall('auth.terminate_other_sessions'), - mockCall('auth.sessions', []), ]), provideMockStore({ selectors: [ @@ -44,7 +63,7 @@ describe('SessionsCardComponent', () => { ], }), mockProvider(DialogService, { - confirm: () => of(true), + confirm: jest.fn(() => of(true)), }), mockProvider(IxSlideInService, { onClose$: of(), @@ -72,10 +91,36 @@ describe('SessionsCardComponent', () => { expect(spectator.inject(IxSlideInService).open).toHaveBeenCalledWith(TokenSettingsComponent); }); + it('terminates the session when corresponding Terminate is pressed', async () => { + const terminateButton = await loader.getHarness(IxIconHarness.with({ name: 'exit_to_app' })); + await terminateButton.click(); + + expect(spectator.inject(DialogService).confirm).toHaveBeenCalledWith({ + title: 'Terminate session', + message: 'Are you sure you want to terminate the session?', + }); + expect(spectator.inject(WebSocketService).call).toHaveBeenCalledWith('auth.terminate_session', ['e8a2892e-f2a3-429e-bd9e-442db8fc9480']); + }); + it('terminates other sessions when corresponding Terminate Other Sessions is pressed', async () => { const terminateButton = await loader.getHarness(MatButtonHarness.with({ text: 'Terminate Other Sessions' })); await terminateButton.click(); expect(spectator.inject(WebSocketService).call).toHaveBeenCalledWith('auth.terminate_other_sessions'); }); + + it('should show table rows', async () => { + const expectedRows = [ + ['Username', 'Start session time', ''], + ['user-0', '2023-08-24 13:00:27', ''], + ['user-1', '2023-08-24 13:00:27', ''], + ['user-2', '2023-08-24 13:00:27', ''], + ['user-3', '2023-08-24 13:00:27', ''], + ['user-4', '2023-08-24 13:00:27', ''], + ]; + + const table = await loader.getHarness(IxTable2Harness); + const cells = await table.getCellTexts(); + expect(cells).toEqual(expectedRows); + }); }); diff --git a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.ts b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.ts index 9ef2605381e..02e488f4349 100644 --- a/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.ts +++ b/src/app/pages/system/advanced/sessions/sessions-card/sessions-card.component.ts @@ -2,12 +2,13 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; -import { format, formatDuration, intervalToDuration } from 'date-fns'; +import { formatDuration, intervalToDuration } from 'date-fns'; import { filter, map } from 'rxjs/operators'; import { toLoadingState } from 'app/helpers/operators/to-loading-state.helper'; import { AuthSession, AuthSessionCredentialsData } from 'app/interfaces/auth-session.interface'; import { WebsocketError } from 'app/interfaces/websocket-error.interface'; import { ArrayDataProvider } from 'app/modules/ix-table2/array-data-provider'; +import { dateColumn } from 'app/modules/ix-table2/components/ix-table-body/cells/ix-cell-date/ix-cell-date.component'; import { textColumn } from 'app/modules/ix-table2/components/ix-table-body/cells/ix-cell-text/ix-cell-text.component'; import { createTable } from 'app/modules/ix-table2/utils'; import { AppLoaderService } from 'app/modules/loader/app-loader.service'; @@ -45,7 +46,7 @@ export class SessionsCardComponent { title: this.translate.instant('Username'), propertyName: 'credentials_data', }), - textColumn({ + dateColumn({ title: this.translate.instant('Start session time'), propertyName: 'created_at', }), @@ -134,10 +135,6 @@ export class SessionsCardComponent { }); } - getDate(date: number): string { - return format(date, 'Pp'); - } - getUsername(credentialsData: AuthSessionCredentialsData): string { if (credentialsData?.credentials_data) { return credentialsData.credentials_data.username || this.getUsername(credentialsData.credentials_data.parent); diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index bd65db2c178..1fbde3fa03f 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -3217,6 +3217,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index cc60db08e99..a2c028b8555 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -2524,6 +2524,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This value represents the threshold block size for including small file blocks into the special allocation class. Blocks smaller than or equal to this value will be assigned to the special allocation class while greater blocks will be assigned to the regular class. Valid values are zero or a power of two from 512B up to 1M. The default size is 0 which means no small file blocks will be allocated in the special class. Before setting this property, a special class vdev must be added to the pool. See zpool(8) for more details on the special allocation": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index 828a1cf34e8..d4e48aea185 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -1300,6 +1300,7 @@ "This node is currently processing a failover event.": "", "This operation might take a long time. It cannot be aborted once started. Proceed?": "", "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "Thread #": "", "Thread responsible for syncing db transactions not running on other node.": "", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 9cec1180964..731439bcd3b 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -3430,6 +3430,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index de4693912f9..28e1901505a 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -125,6 +125,7 @@ "Sysctl \"{name}\" deleted": "", "System Security": "", "System Security Settings Updated.": "", + "This session is current and cannot be terminated": "", "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "VDEVs": "", "Windows": "", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 38ef8bf2931..c34f0636c6e 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -3425,6 +3425,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index 2d05b665c9e..a3428094db0 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -3121,6 +3121,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 9eddee6695e..8bd84ed2fe6 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -3149,6 +3149,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 974589b81ed..6a1201d0d48 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -3645,6 +3645,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index cf76052ea1a..6a37a709b66 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -206,6 +206,7 @@ "The following disks have exported pools on them.\n Using those disks will make existing pools on them unable to be imported.\n You will lose any and all data in selected disks.": "", "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "This information is provided by the catalog maintainer.": "", + "This session is current and cannot be terminated": "", "Topology Summary": "", "Total Capacity": "", "Total Raw Capacity": "", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 06b900a1375..1d0b6ef7ca3 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -3562,6 +3562,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index f2af4b4df81..b91f6da171c 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -3584,6 +3584,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index c994f5cda10..bc20d3016c2 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -2757,6 +2757,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index be4e48c64a6..c47fe03e48b 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -1882,6 +1882,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This value represents the threshold block size for including small file blocks into the special allocation class. Blocks smaller than or equal to this value will be assigned to the special allocation class while greater blocks will be assigned to the regular class. Valid values are zero or a power of two from 512B up to 1M. The default size is 0 which means no small file blocks will be allocated in the special class. Before setting this property, a special class vdev must be added to the pool. See zpool(8) for more details on the special allocation": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index a87b1e170ec..9666c64a195 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -272,6 +272,7 @@ "The following disks have exported pools on them.\n Using those disks will make existing pools on them unable to be imported.\n You will lose any and all data in selected disks.": "", "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "This information is provided by the catalog maintainer.": "", + "This session is current and cannot be terminated": "", "Topology Summary": "", "Total Capacity": "", "Total Raw Capacity": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 6ff08e81b7e..fcdf7bfea4b 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -3651,6 +3651,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index 070b5968f9a..2d9de621a91 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -296,6 +296,7 @@ "The following disks have exported pools on them.\n Using those disks will make existing pools on them unable to be imported.\n You will lose any and all data in selected disks.": "", "The number of children must at the minimum accomodate the total number of disks required for the previous configuration options including parity drives.": "", "This information is provided by the catalog maintainer.": "", + "This session is current and cannot be terminated": "", "Topology Summary": "", "Total Capacity": "", "Total Raw Capacity": "", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 0b6ebbe4883..47bb2e800f5 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -2822,6 +2822,7 @@ "This option controls how metadata and alternate data streams read write to disks. Only enable this when the share configuration was migrated from the deprecated Apple Filing Protocol (AFP). Do not attempt to force a previous AFP share to behave like a pure SMB share or file corruption can occur.": "", "This pool contains the system dataset that stores critical data like debugging core files, encryption keys for pools, and Samba 4 metadata such as the user/group cache and share level permissions. Exporting this pool will transfer the system dataset to another available pool. If the only available pool is encrypted, that pool will no longer be able to be locked. When no other pools exist, the system dataset transfers back to the TrueNAS operating system device.": "", "This process continues in the background after closing this dialog.": "", + "This session is current and cannot be terminated": "", "This share is configured through TrueCommand": "", "This system cannot communicate externally.": "", "This system will restart when the update completes.": "", From 0d060051cc1fc5f5e0dfa3c605f07ec2a8498740 Mon Sep 17 00:00:00 2001 From: Jonathan Heindl Date: Mon, 28 Aug 2023 11:28:28 +0200 Subject: [PATCH 12/12] NAS-123683: fixed node version (#8665) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94618ab3295..75fce5ad460 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ NOTE: Pull requests are also generated as Docker images and can be used for test # Development requirements - yarn >= 1.12 - - Node.js >= 8.9 + - Node.js >= 14 - Running TrueNAS CORE or TrueNAS SCALE Nightly Machine (VM is fine)